스마트폰 (Mobile)

홈 어시스턴트 특정 센서의 일일 사용시간 집계하는 템플릿 정의 방법

날으는물고기 2024. 7. 22. 00:32

Home Assistant에서 특정 앱의 일일 사용 시간을 계산하기 위해서는 두 가지 센서의 정보를 활용할 수 있습니다. 이를 템플릿 센서를 사용하여 구현할 수 있습니다. 아래는 예제 템플릿 코드입니다.

1. 프리퀴지 센서 정의

온/오프 상태와 현재 실행 중인 앱 정보를 수집하는 센서를 정의합니다. 이 예제에서는 binary_sensor.phone_onsensor.current_app이라는 이름의 센서를 사용한다고 가정하겠습니다.

binary_sensor:
  - platform: mqtt
    name: "Phone On/Off Sensor"
    state_topic: "home/phone/state"
    payload_on: "ON"
    payload_off: "OFF"

sensor:
  - platform: mqtt
    name: "Current App Sensor"
    state_topic: "home/phone/current_app"

2. 앱별 사용 시간 추적

템플릿 센서를 사용하여 특정 앱의 사용 시간을 추적합니다. 이 예제에서는 app_usage_time이라는 템플릿 센서를 생성하여 하루 동안 각 앱의 사용 시간을 계산합니다.

sensor:
  - platform: template
    sensors:
      app_usage_time:
        friendly_name: "App Usage Time"
        unit_of_measurement: "minutes"
        value_template: >
          {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
          {% set current_app = states('sensor.current_app') %}
          {% set usage_time = namespace(apps={}) %}

          {% if phone_on and current_app != 'unknown' %}
            {% if usage_time.apps[current_app] is defined %}
              {% set usage_time.apps = usage_time.apps | merge({ current_app: usage_time.apps[current_app] + 1 }) %}
            {% else %}
              {% set usage_time.apps = usage_time.apps | merge({ current_app: 1 }) %}
            {% endif %}
          {% endif %}

          {% for app, time in usage_time.apps.items() %}
            {{ app }}: {{ time }} minutes
          {% endfor %}

이 템플릿은 현재 실행 중인 앱을 확인하고, 핸드폰이 켜져 있는 동안 매 분마다 실행 시간을 증가시킵니다. 최종적으로 앱별 사용 시간을 분 단위로 출력합니다.

3. 오토메이션 설정

위 템플릿 센서가 1분마다 업데이트되도록 자동화 설정을 추가합니다.

automation:
  - alias: Update App Usage Time
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.app_usage_time

앱별 사용 시간은 sensor.app_usage_time 센서에서 확인할 수 있습니다. 이 템플릿은 각 앱의 사용 시간을 추적하고 이를 분 단위로 계산합니다. 실제 환경에서는 MQTT 주제나 다른 상태 업데이트 방법을 사용하여 센서를 정확히 구성해야 합니다. 이를 통해 하루 동안 각 앱의 사용 시간을 모니터링하고 분석할 수 있습니다.

 

앱별 사용 시간을 센서의 속성으로 기록하고, 전체 사용 시간을 센서의 상태로 기록하기 위해 Home Assistant의 템플릿 센서를 활용할 수 있습니다. 이를 위해 앱별 사용 시간을 속성으로 저장하고, 전체 사용 시간을 센서의 상태로 저장하는 템플릿 센서를 작성할 수 있습니다.

 

아래는 이를 구현하기 위한 YAML 예제 코드입니다.

1. 센서 정의

sensor:
  - platform: template
    sensors:
      app_usage:
        friendly_name: "App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
          {% set current_app = states('sensor.current_app') %}
          {% set total_time = 0 %}
          {% set apps = states.sensor.app_usage.attributes.apps | default(dict()) %}

          {% if phone_on and current_app != 'unknown' %}
            {% if current_app in apps %}
              {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
            {% else %}
              {% set apps = apps | merge({current_app: 1}) %}
            {% endif %}
          {% endif %}

          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}

          {{ total_time }}
        attribute_templates:
          apps: >
            {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set apps = states.sensor.app_usage.attributes.apps | default(dict()) %}

            {% if phone_on and current_app != 'unknown' %}
              {% if current_app in apps %}
                {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
              {% else %}
                {% set apps = apps | merge({current_app: 1}) %}
              {% endif %}
            {% endif %}

            {{ apps }}

2. 오토메이션 설정

이 템플릿 센서가 1분마다 업데이트되도록 자동화 설정을 추가합니다.

automation:
  - alias: Update App Usage
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.app_usage
  1. value_template: 핸드폰이 켜져 있고 (binary_sensor.phone_onon 상태), 현재 실행 중인 앱 (sensor.current_app)이 알려진 경우, 각 앱의 사용 시간을 1분씩 증가시킵니다. 총 사용 시간은 모든 앱 사용 시간을 합산하여 계산됩니다.
  2. attribute_templates apps: 현재 실행 중인 앱의 사용 시간을 속성으로 저장합니다. 각 앱의 이름을 키로 하고, 사용 시간을 값으로 저장합니다.

앱별 사용 시간은 sensor.app_usage 센서의 속성 (attributes)에서 확인할 수 있으며, 전체 사용 시간은 센서의 상태 (state)에서 확인할 수 있습니다. 이 설정은 1분마다 업데이트되며, 핸드폰이 켜져 있을 때 현재 실행 중인 앱의 사용 시간을 추적합니다.

 

템플릿 센서는 Home Assistant가 상태를 자동으로 업데이트하도록 설정되어 있습니다. 그러나 추가적인 오토메이션을 통해 업데이트 빈도를 더 명확히 하거나 특정 조건에서 업데이트를 강제할 수 있습니다. 이 예제에서는 템플릿 센서가 자동으로 업데이트되도록 설정하고, 앱별 사용 시간을 속성으로 저장하고 전체 사용 시간을 상태로 저장하는 방법을 설명합니다.

템플릿 센서 정의

sensor:
  - platform: template
    sensors:
      app_usage:
        friendly_name: "App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
          {% set current_app = states('sensor.current_app') %}
          {% set apps = states.sensor.app_usage.attributes.apps | default(dict()) %}
          {% set total_time = 0 %}

          {% if phone_on and current_app != 'unknown' %}
            {% if current_app in apps %}
              {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
            {% else %}
              {% set apps = apps | merge({current_app: 1}) %}
            {% endif %}
          {% endif %}

          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}

          {{ total_time }}
        attribute_templates:
          apps: >
            {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set apps = states.sensor.app_usage.attributes.apps | default(dict()) %}

            {% if phone_on and current_app != 'unknown' %}
              {% if current_app in apps %}
                {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
              {% else %}
                {% set apps = apps | merge({current_app: 1}) %}
              {% endif %}
            {% endif %}

            {{ apps }}
  1. value_template: 현재 실행 중인 앱을 확인하고, 핸드폰이 켜져 있는 동안 각 앱의 사용 시간을 1분씩 증가시킵니다. 모든 앱의 사용 시간을 합산하여 전체 사용 시간을 계산합니다.
  2. attribute_templatesapps: 각 앱의 사용 시간을 속성으로 저장합니다. 앱 이름을 키로 하고 사용 시간을 값으로 저장합니다.

템플릿 센서는 기본적으로 상태가 변경될 때마다 자동으로 업데이트됩니다. 그러나 필요에 따라 특정 주기로 업데이트하도록 자동화를 추가할 수 있습니다.

automation:
  - alias: Force Update App Usage
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.app_usage

이 자동화는 매 분마다 sensor.app_usage 센서를 업데이트합니다.

  • 전체 사용 시간: sensor.app_usage 센서의 상태에서 확인할 수 있습니다.
  • 앱별 사용 시간: sensor.app_usage 센서의 속성(attributes)에서 확인할 수 있습니다.

이 설정을 통해 하루 동안 사용한 앱별 사용 시간을 추적하고, 이를 Home Assistant에서 모니터링할 수 있습니다.

 

하루 동안의 앱별 사용 시간을 특정 시점에 계산하여 표시하는 템플릿 센서를 만들기 위해서는, 하루 동안의 데이터를 수집한 후 특정 시점에 결과를 업데이트하는 방식으로 설정할 수 있습니다. 이를 위해서는 앱 사용 시간을 기록하는 별도의 센서와, 하루 동안의 데이터를 집계하여 특정 시점에 결과를 업데이트하는 템플릿 센서가 필요합니다.

1. 앱 사용 시간 기록을 위한 스크립트 및 헬퍼 센서 정의

input_text:
  app_usage_data:
    name: App Usage Data
    initial: '{}'

script:
  update_app_usage:
    sequence:
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: >
            {% set phone_on = is_state('binary_sensor.phone_on', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set apps = states('input_text.app_usage_data') | from_json | default({}) %}
            {% if phone_on and current_app != 'unknown' %}
              {% if current_app in apps %}
                {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
              {% else %}
                {% set apps = apps | merge({current_app: 1}) %}
              {% endif %}
            {% endif %}
            {{ apps | to_json }}

2. 매 분마다 스크립트를 실행하여 데이터를 업데이트하는 자동화

automation:
  - alias: Update App Usage Data
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - service: script.update_app_usage

3. 하루 동안의 사용 시간을 집계하여 특정 시점에 템플릿 센서에 업데이트하는 템플릿 센서 정의

sensor:
  - platform: template
    sensors:
      daily_app_usage:
        friendly_name: "Daily App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set apps = states('input_text.app_usage_data') | from_json %}
          {% set total_time = 0 %}
          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}
          {{ total_time }}
        attribute_templates:
          apps: >
            {{ states('input_text.app_usage_data') }}

4. 매일 자정에 결과를 업데이트하고 데이터를 초기화하는 자동화

automation:
  - alias: Update Daily App Usage
    trigger:
      - platform: time
        at: '00:00:00'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.daily_app_usage
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: '{}'
  1. input_text.app_usage_data: JSON 형식으로 앱별 사용 시간을 저장하는 헬퍼 센서입니다.
  2. script.update_app_usage: 현재 실행 중인 앱의 사용 시간을 업데이트하는 스크립트입니다.
  3. automation.Update App Usage Data: 매 분마다 실행되어 script.update_app_usage를 호출하여 데이터를 업데이트합니다.
  4. sensor.daily_app_usage: 하루 동안의 총 사용 시간과 앱별 사용 시간을 템플릿 센서의 상태와 속성으로 계산합니다.
  5. automation.Update Daily App Usage: 매일 자정에 sensor.daily_app_usage를 업데이트하고, input_text.app_usage_data를 초기화하여 다음 날의 데이터를 기록할 준비를 합니다.

이 설정을 통해 하루 동안의 앱별 사용 시간을 기록하고, 매일 자정에 하루 동안의 사용 시간을 집계하여 템플릿 센서에 업데이트할 수 있습니다.

 

Home Assistant에서 특정 시점에 하루 동안의 앱별 사용 시간을 계산하기 위해 히스토리 값을 이용하는 방법을 설명드리겠습니다. 이 방법에서는 history_stats 통합을 사용하여 특정 시간 동안의 센서 상태를 추적하고, 템플릿 센서를 사용하여 결과를 집계합니다.

1. 앱별 사용 시간 추적을 위한 history_stats 센서 정의

각 앱의 사용 시간을 추적하기 위해 history_stats 센서를 정의합니다. 여기서는 예시로 "App1"과 "App2" 두 개의 앱을 사용합니다.

sensor:
  - platform: history_stats
    name: App1 Usage Today
    entity_id: sensor.current_app
    state: 'app1'
    type: time
    start: '{{ now().replace(hour=0, minute=0, second=0) }}'
    end: '{{ now() }}'

  - platform: history_stats
    name: App2 Usage Today
    entity_id: sensor.current_app
    state: 'app2'
    type: time
    start: '{{ now().replace(hour=0, minute=0, second=0) }}'
    end: '{{ now() }}'

2. 하루 동안의 총 사용 시간을 집계하기 위한 템플릿 센서 정의

이제 각 앱의 사용 시간을 더하여 하루 동안의 총 사용 시간을 계산하는 템플릿 센서를 정의합니다.

sensor:
  - platform: template
    sensors:
      daily_app_usage:
        friendly_name: "Daily App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set app1_usage = states('sensor.app1_usage_today') | float %}
          {% set app2_usage = states('sensor.app2_usage_today') | float %}
          {{ (app1_usage + app2_usage) * 60 | round(0) }}
        attribute_templates:
          app1_usage: >
            {{ (states('sensor.app1_usage_today') | float * 60) | round(0) }}
          app2_usage: >
            {{ (states('sensor.app2_usage_today') | float * 60) | round(0) }}

템플릿 센서는 상태가 변경될 때마다 자동으로 업데이트되지만, 특정 시간에 결과를 확인하고 싶다면 자동화를 추가할 수 있습니다.

automation:
  - alias: Update Daily App Usage
    trigger:
      - platform: time
        at: '23:59:59'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.daily_app_usage
  1. history_stats 센서: 특정 앱이 하루 동안 사용된 시간을 추적합니다. 이 예제에서는 sensor.current_app 센서의 상태가 "app1" 또는 "app2"일 때의 사용 시간을 계산합니다.
  2. sensor.daily_app_usage: history_stats 센서의 값을 합산하여 하루 동안의 총 사용 시간을 계산하고, 각 앱의 사용 시간을 속성으로 저장합니다.
  3. 자동화: 하루의 끝에 sensor.daily_app_usage를 업데이트하여 최종 결과를 확인할 수 있습니다.

이 설정을 통해 히스토리 데이터를 활용하여 하루 동안의 앱별 사용 시간을 추적하고, 특정 시점에 결과를 계산할 수 있습니다. history_stats 통합은 자동으로 과거 데이터를 분석하므로, 별도의 데이터 초기화가 필요하지 않습니다.

 

모든 앱에 대해 사용 시간을 산출하도록 설정하고, 스위치가 on 상태일 때만 실행 중인 앱 센서의 값을 기반으로 사용 시간을 계산하는 방법을 설명드리겠습니다. 이 작업을 위해 Home Assistant의 템플릿 센서와 history_stats 통합을 조합하여 구현할 수 있습니다.

1. 앱 사용 시간 기록을 위한 history_stats 센서 정의

앱의 사용 시간을 동적으로 추적하기 위해서는 미리 정의된 앱 리스트를 사용하지 않고, 현재 실행 중인 앱에 따라 동적으로 history_stats 센서를 생성하는 방법이 필요합니다. 하지만 Home Assistant의 기본 기능으로는 동적으로 센서를 생성할 수 없습니다. 따라서 여기서는 스크립트를 사용해 데이터를 수집하고, 이를 템플릿 센서로 활용하는 방식으로 해결하겠습니다.

2. 스위치가 on 상태일 때 실행 중인 앱을 기록하는 스크립트 및 헬퍼 센서 정의

input_text:
  app_usage_data:
    name: App Usage Data
    initial: '{}'

script:
  update_app_usage:
    sequence:
      - condition: state
        entity_id: switch.phone_tracking
        state: 'on'
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: >
            {% set phone_on = is_state('switch.phone_tracking', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set apps = states('input_text.app_usage_data') | from_json | default({}) %}
            {% if phone_on and current_app != 'unknown' %}
              {% if current_app in apps %}
                {% set apps = apps | merge({current_app: apps[current_app] + 1}) %}
              {% else %}
                {% set apps = apps | merge({current_app: 1}) %}
              {% endif %}
            {% endif %}
            {{ apps | to_json }}

3. 매 분마다 스크립트를 실행하여 데이터를 업데이트하는 자동화

automation:
  - alias: Update App Usage Data
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - service: script.update_app_usage

4. 하루 동안의 사용 시간을 집계하여 특정 시점에 템플릿 센서에 업데이트하는 템플릿 센서 정의

sensor:
  - platform: template
    sensors:
      daily_app_usage:
        friendly_name: "Daily App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set apps = states('input_text.app_usage_data') | from_json %}
          {% set total_time = 0 %}
          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}
          {{ total_time }}
        attribute_templates:
          apps: >
            {% set apps = states('input_text.app_usage_data') | from_json %}
            {{ apps }}

5. 매일 자정에 결과를 업데이트하고 데이터를 초기화하는 자동화

automation:
  - alias: Update Daily App Usage
    trigger:
      - platform: time
        at: '00:00:00'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.daily_app_usage
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: '{}'
  1. input_text.app_usage_data: JSON 형식으로 앱별 사용 시간을 저장하는 헬퍼 센서입니다.
  2. script.update_app_usage: 스위치가 on 상태일 때 현재 실행 중인 앱의 사용 시간을 업데이트하는 스크립트입니다.
  3. automation.Update App Usage Data: 매 분마다 실행되어 script.update_app_usage를 호출하여 데이터를 업데이트합니다.
  4. sensor.daily_app_usage: 하루 동안의 총 사용 시간과 앱별 사용 시간을 템플릿 센서의 상태와 속성으로 계산합니다.
  5. automation.Update Daily App Usage: 매일 자정에 sensor.daily_app_usage를 업데이트하고, input_text.app_usage_data를 초기화하여 다음 날의 데이터를 기록할 준비를 합니다.

이 설정을 통해 다양한 앱에 대해 사용 시간을 기록하고, 스위치가 on 상태일 때만 실행 중인 앱의 사용 시간을 추적할 수 있습니다. 하루의 끝에 결과를 집계하고 초기화하여 다음 날의 데이터를 수집할 수 있도록 합니다.

 

실제 앱 사용 시간을 계산하기 위해, 앱 상태값이 변경될 때마다 시간을 기록하고 사용 시간을 계산하는 방식으로 구현할 수 있습니다.

  1. 앱 상태가 변경될 때마다 타임스탬프를 기록합니다.
  2. 이전 타임스탬프와 현재 타임스탬프를 비교하여 실제 사용 시간을 계산합니다.
  3. 하루 동안의 사용 시간을 집계합니다.

1. 타임스탬프와 사용 시간을 기록할 헬퍼 센서 정의

input_text:
  app_usage_data:
    name: App Usage Data
    initial: '{}'

  last_app_change:
    name: Last App Change Time
    initial: ''

  last_app:
    name: Last App
    initial: ''

2. 앱 상태가 변경될 때마다 타임스탬프를 기록하고 사용 시간을 계산하는 스크립트

script:
  update_app_usage:
    sequence:
      - condition: state
        entity_id: switch.phone_tracking
        state: 'on'
      - service: input_text.set_value
        data_template:
          entity_id: input_text.last_app_change
          value: "{{ now() }}"
      - service: input_text.set_value
        data_template:
          entity_id: input_text.last_app
          value: "{{ states('sensor.current_app') }}"
      - service: input_text.set_value
        data_template:
          entity_id: input_text.app_usage_data
          value: >
            {% set phone_on = is_state('switch.phone_tracking', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set last_app = states('input_text.last_app') %}
            {% set last_change = states('input_text.last_app_change') %}
            {% set apps = states('input_text.app_usage_data') | from_json | default({}) %}
            {% if phone_on and last_app != '' and current_app != last_app %}
              {% set time_diff = (as_timestamp(now()) - as_timestamp(last_change)) / 60 %}
              {% if last_app in apps %}
                {% set apps = apps | merge({last_app: apps[last_app] + time_diff}) %}
              {% else %}
                {% set apps = apps | merge({last_app: time_diff}) %}
              {% endif %}
            {% endif %}
            {{ apps | to_json }}

3. 앱 상태 변경을 감지하여 스크립트를 실행하는 자동화

automation:
  - alias: Update App Usage on Change
    trigger:
      - platform: state
        entity_id: sensor.current_app
    action:
      - service: script.update_app_usage

4. 하루 동안의 사용 시간을 집계하여 특정 시점에 템플릿 센서에 업데이트하는 템플릿 센서 정의

sensor:
  - platform: template
    sensors:
      daily_app_usage:
        friendly_name: "Daily App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set apps = states('input_text.app_usage_data') | from_json %}
          {% set total_time = 0 %}
          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}
          {{ total_time | round(2) }}
        attribute_templates:
          apps: >
            {% set apps = states('input_text.app_usage_data') | from_json %}
            {{ apps }}

5. 매일 자정에 결과를 업데이트하고 데이터를 초기화하는 자동화

automation:
  - alias: Reset Daily App Usage
    trigger:
      - platform: time
        at: '00:00:00'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.daily_app_usage
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: '{}'
      - service: input_text.set_value
        data:
          entity_id: input_text.last_app_change
          value: ''
      - service: input_text.set_value
        data:
          entity_id: input_text.last_app
          value: ''
  1. input_text 센서: 앱 사용 데이터를 JSON 형식으로 저장하며, last_app_changelast_app을 사용하여 마지막 앱 상태 변경 시점을 기록합니다.
  2. script.update_app_usage: 스위치가 on 상태일 때, 앱 상태가 변경되면 현재 시간을 기록하고 사용 시간을 계산하여 저장합니다.
  3. automation.Update App Usage on Change: sensor.current_app의 상태가 변경될 때마다 스크립트를 실행합니다.
  4. sensor.daily_app_usage: 하루 동안의 총 사용 시간과 앱별 사용 시간을 템플릿 센서의 상태와 속성으로 계산합니다.
  5. automation.Reset Daily App Usage: 매일 자정에 sensor.daily_app_usage를 업데이트하고, 헬퍼 센서들을 초기화합니다.

이 설정을 통해 실제 사용 시간을 계산하고, 앱 상태가 변경될 때마다 시간을 기록하여 하루 동안의 앱별 사용 시간을 정확히 추적할 수 있습니다.

 

스위치와 실행 중인 앱 정보 센서의 값이 변경될 때마다 트리거가 되고, 이를 통해 사용 시간을 산출하는 방식으로 설정을 변경하겠습니다. 이를 위해 두 센서의 값이 변경될 때마다 시간을 기록하고, 사용 시간을 계산하여 누적하는 방법을 사용합니다.

1. 헬퍼 센서 정의

앱 사용 시간과 관련된 데이터를 저장할 헬퍼 센서를 정의합니다.

input_text:
  app_usage_data:
    name: App Usage Data
    initial: '{}'

input_datetime:
  last_change_time:
    name: Last Change Time
    has_date: true
    has_time: true

input_text:
  last_app:
    name: Last App
    initial: ''

2. 스크립트 정의

앱 상태가 변경될 때마다 시간을 기록하고 사용 시간을 계산하는 스크립트를 정의합니다.

script:
  update_app_usage:
    sequence:
      - condition: state
        entity_id: switch.phone_tracking
        state: 'on'
      - service: input_datetime.set_datetime
        data:
          entity_id: input_datetime.last_change_time
          datetime: "{{ now().isoformat() }}"
      - service: input_text.set_value
        data_template:
          entity_id: input_text.last_app
          value: "{{ states('sensor.current_app') }}"
      - service: input_text.set_value
        data_template:
          entity_id: input_text.app_usage_data
          value: >
            {% set phone_on = is_state('switch.phone_tracking', 'on') %}
            {% set current_app = states('sensor.current_app') %}
            {% set last_app = states('input_text.last_app') %}
            {% set last_change = states('input_datetime.last_change_time') %}
            {% set apps = states('input_text.app_usage_data') | from_json | default({}) %}
            {% if phone_on and last_app != '' and current_app != last_app %}
              {% set time_diff = (as_timestamp(now()) - as_timestamp(last_change)) / 60 %}
              {% if last_app in apps %}
                {% set apps = apps | merge({last_app: apps[last_app] + time_diff}) %}
              {% else %}
                {% set apps = apps | merge({last_app: time_diff}) %}
              {% endif %}
            {% endif %}
            {{ apps | to_json }}

3. 자동화 설정

스위치와 앱 상태가 변경될 때마다 스크립트를 실행하도록 자동화를 설정합니다.

automation:
  - alias: Update App Usage on Change
    trigger:
      - platform: state
        entity_id: sensor.current_app
      - platform: state
        entity_id: switch.phone_tracking
    action:
      - service: script.update_app_usage

4. 하루 동안의 사용 시간을 집계하는 템플릿 센서 정의

하루 동안의 총 사용 시간과 앱별 사용 시간을 집계하는 템플릿 센서를 정의합니다.

sensor:
  - platform: template
    sensors:
      daily_app_usage:
        friendly_name: "Daily App Usage"
        unit_of_measurement: "minutes"
        value_template: >
          {% set apps = states('input_text.app_usage_data') | from_json %}
          {% set total_time = 0 %}
          {% for app, time in apps.items() %}
            {% set total_time = total_time + time %}
          {% endfor %}
          {{ total_time | round(2) }}
        attribute_templates:
          apps: >
            {% set apps = states('input_text.app_usage_data') | from_json %}
            {{ apps }}

5. 매일 자정에 결과를 업데이트하고 데이터를 초기화하는 자동화

매일 자정에 결과를 업데이트하고 데이터를 초기화하는 자동화를 추가합니다.

automation:
  - alias: Reset Daily App Usage
    trigger:
      - platform: time
        at: '00:00:00'
    action:
      - service: homeassistant.update_entity
        entity_id: sensor.daily_app_usage
      - service: input_text.set_value
        data:
          entity_id: input_text.app_usage_data
          value: '{}'
      - service: input_datetime.set_datetime
        data:
          entity_id: input_datetime.last_change_time
          datetime: "{{ now().replace(hour=0, minute=0, second=0).isoformat() }}"
      - service: input_text.set_value
        data:
          entity_id: input_text.last_app
          value: ''
  1. 헬퍼 센서 (input_textinput_datetime): 앱 사용 데이터를 JSON 형식으로 저장하며, 마지막 변경 시간을 기록합니다.
  2. script.update_app_usage: 스위치가 on 상태일 때 앱 상태가 변경되면 현재 시간을 기록하고 사용 시간을 계산하여 저장합니다.
  3. automation.Update App Usage on Change: sensor.current_app 또는 switch.phone_tracking의 상태가 변경될 때마다 스크립트를 실행합니다.
  4. sensor.daily_app_usage: 하루 동안의 총 사용 시간과 앱별 사용 시간을 템플릿 센서의 상태와 속성으로 계산합니다.
  5. automation.Reset Daily App Usage: 매일 자정에 sensor.daily_app_usage를 업데이트하고 헬퍼 센서를 초기화하여 다음 날의 데이터를 수집할 준비를 합니다.

이 설정을 통해 스위치가 켜져 있고 앱 상태가 변경될 때마다 실제 사용 시간을 계산하여 하루 동안의 앱별 사용 시간을 정확히 추적할 수 있습니다.

728x90