일상생활 (EveryDay)

Home Assistant 모든 센서 속성(Attribute) 저장 및 자동화 재사용 방법

날으는물고기 2024. 6. 19. 00:23

2024.6: Dipping our toes in the world of AI using LLMs 🤖 - Home Assistant

먼저, Home Assistant에서 다양한 데이터를 저장하는 데 여러 방식을 사용합니다. 기본적으로, Home Assistant는 데이터를 저장하기 위해 SQLite 데이터베이스(home-assistant_v2.db)를 사용하지만, 일부 구성 정보와 시스템 관련 데이터는 .storage 폴더 아래의 JSON 파일에 저장합니다. .storage 폴더에 있는 파일들은 Home Assistant의 설정과 상태 정보를 저장하는데 사용되며, 주로 Home Assistant 시스템과 관련된 중요한 메타데이터를 포함합니다.

 

.storage 폴더에 있는 파일들은 다음과 같은 역할을 합니다.

  • core.analytics: 사용자의 Home Assistant 인스턴스에서 수집된 분석 데이터를 저장합니다.
  • core.area_registry: 장치들이 할당된 구역 정보를 저장합니다.
  • core.category_registry: 장치 카테고리 정보를 저장합니다.
  • core.config: Home Assistant의 기본 설정을 저장합니다.
  • core.config_entries: 통합 구성 요소 설정 및 인증 정보를 저장합니다.
  • core.device_registry: 네트워크에 연결된 모든 장치에 대한 정보를 저장합니다.
  • core.entity_registry: 각 엔티티(장치나 센서 등)에 대한 상세 정보를 저장합니다.
  • core.logger: 로그 설정을 저장합니다.
  • core.restore_state: Home Assistant 재시작 시 이전 상태를 복원하기 위한 정보를 저장합니다.
  • core.uuid: Home Assistant 인스턴스의 고유 식별자를 저장합니다.

이 파일들은 주로 시스템 설정과 관리를 위한 것이며, 사용자가 생성한 센서 데이터나 이벤트 데이터는 주로 home-assistant_v2.db 파일에 저장됩니다. 이 데이터베이스 파일은 시간이 지남에 따라 성능 저하를 일으킬 수 있기 때문에, 일부 사용자는 이를 MySQL, PostgreSQL 같은 외부 데이터베이스 시스템으로 마이그레이션하기도 합니다.

 

따라서, 센서 정보와 같은 실시간 데이터 또는 이벤트 데이터는 일반적으로 home-assistant_v2.db에서 관리되지만, 설정과 구성 관련 데이터는 .storage 폴더의 파일들에서 관리됩니다. 이 두 데이터 저장 방식의 구분은 Home Assistant의 운영에 중요한 역할을 합니다.

Home Assistant 자동화에 대한 설정은 automations.yaml 파일에 저장이 되는데 특정 트리거가 발생했을 때의 센서 attribute 값을 참조하고 싶다면, 트리거의 데이터를 사용하는 것이 좋습니다. Home Assistant에서는 트리거 객체 내에 trigger.to_statetrigger.from_state라는 속성을 제공하여 트리거 발생 직전과 직후의 상태를 알 수 있습니다. 이 속성들은 센서의 상태 변화와 관련된 정보를 포함하고 있어서, 트리거 시점의 attribute 값을 가져올 수 있습니다.

예를 들어, 센서의 attribute 값을 트리거 시점에서 참조하고 싶다면, 다음과 같은 방법으로 액션을 설정할 수 있습니다.

alias: "예제 자동화"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - service: notify.notify
    data:
      message: >
        {{
          trigger.to_state.attributes.your_attribute
        }}

이 예시에서는 sensor.your_sensor의 상태가 변할 때 트리거가 발생하고, trigger.to_state.attributes.your_attribute를 사용하여 트리거 발생 시점의 해당 attribute 값을 참조합니다. 이 값은 액션에서 사용될 메시지에 포함되어 있습니다.

 

이렇게 설정하면, 트리거 발생 시점의 attribute 값을 정확히 참조할 수 있어서, 값이 변경되는 도중에 발생할 수 있는 오작동을 방지할 수 있습니다. 만약 여러 attributes를 참조하거나 복잡한 데이터 처리가 필요한 경우, data_template를 사용하여 필요한 로직을 추가할 수 있습니다.

 

Home Assistant의 자동화 스크립트에서 trigger.to_state.attributes에 접근할 때는 두 가지 방식으로 attribute 값을 가져올 수 있습니다.

  1. Dot Notation: trigger.to_state.attributes.your_attribute 방식으로 점 표기법을 사용할 때는 속성 이름을 직접적으로 지정합니다. 이 방법은 속성 이름이 유효한 식별자일 경우에 사용하기 쉽습니다.
  2. Bracket Notation: trigger.to_state.attributes["your_attribute"] 방식으로 대괄호 표기법을 사용할 때는 속성 이름을 문자열로 지정합니다. 이 방법은 속성 이름에 공백이 포함되어 있거나 유효한 식별자로 사용할 수 없는 경우 유용합니다.

예를 들어, name이라는 attribute를 참조하려면 다음과 같이 사용할 수 있습니다.

alias: "예제 자동화"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - service: notify.notify
    data:
      message: >
        {{
          trigger.to_state.attributes["name"]
        }}

이렇게 설정하면, sensor.your_sensorname attribute가 변경될 때 이 값을 메시지로 전송하는 자동화를 구현할 수 있습니다. 대괄호 표기법은 attribute의 이름이 특수 문자를 포함하거나 예약어일 경우에 특히 유용하며, 자유롭게 사용할 수 있습니다.

 

Home Assistant 자동화에서 트리거 발생 시점에 다른 센서의 상태나 attributes를 변수에 저장하고 사용하는 방법은 자동화 스크립트 내에서 variables 섹션을 정의하여 구현할 수 있습니다. 이를 통해 특정 시점의 센서 데이터를 저장하고, 액션에서 이 데이터를 참조할 수 있습니다.

 

여기 예시로 다른 센서의 attribute 값을 변수에 저장하고 이를 액션에서 사용하는 방법을 보여드리겠습니다.

alias: "트리거 시점 센서 데이터 저장 예제"
trigger:
  - platform: state
    entity_id: sensor.trigger_sensor
variables:
  other_sensor_state: "{{ states('sensor.other_sensor') }}"
  other_sensor_attributes: "{{ state_attr('sensor.other_sensor', 'attribute_name') }}"
action:
  - service: notify.notify
    data:
      message: >
        트리거 센서의 상태는 {{ trigger.to_state.state }}이며,
        다른 센서의 저장된 상태는 {{ other_sensor_state }}입니다.
        저장된 attribute 값은 {{ other_sensor_attributes }}입니다.

이 예제에서는 다음과 같이 작동합니다.

  1. Trigger: sensor.trigger_sensor의 상태 변화가 트리거 역할을 합니다.
  2. Variables:
    • other_sensor_state: 트리거 시점에서 sensor.other_sensor의 상태를 저장합니다.
    • other_sensor_attributes: 트리거 시점에서 sensor.other_sensor의 특정 attribute 값을 저장합니다.
  3. Action: Notify 서비스를 사용하여 저장된 변수 값을 메시지로 전송합니다.

이 방법을 통해 트리거 발생 시점에 다른 센서의 상태와 attributes를 저장하고, 이후의 액션에서 언제든지 이 값을 참조하여 사용할 수 있습니다. 이런 방식은 트리거와 동시에 여러 센서의 데이터를 분석하거나 처리해야 할 때 특히 유용합니다.

 

Home Assistant의 비주얼 편집기 (UI editor)에서는 variables 설정을 직접 입력하는 옵션이 기본적으로 제공되지 않습니다. 비주얼 편집기는 자동화를 구성할 때 가장 일반적이고 널리 사용되는 옵션들을 제공하도록 설계되어 있으며, 특정 고급 기능들은 YAML 코드로 직접 편집해야만 사용할 수 있습니다.

 

따라서 variables을 사용하려면 다음과 같이 Home Assistant의 자동화 설정 파일(automations.yaml) 또는 Configuration > Automations & Scenes > "Edit in YAML" (자동화 및 장면 편집을 YAML에서) 옵션을 사용하여 YAML 코드로 직접 입력해야 합니다.

  1. Home Assistant의 설정으로 가기: 왼쪽 사이드바에서 Configuration (설정)을 선택합니다.
  2. Automations & Scenes (자동화 및 장면): 이 섹션을 클릭합니다.
  3. 자동화 편집: 자동화 목록에서 편집하려는 자동화를 찾아 Edit 버튼을 클릭합니다.
  4. YAML에서 편집: 오른쪽 상단에 있는 "Edit in YAML" 버튼을 클릭하여 YAML 편집 모드로 전환합니다.
  5. 코드 입력: 위에서 설명한 variables 예제 코드를 입력하거나 수정합니다.

YAML 코드 편집은 Home Assistant에서 더 세밀한 제어가 필요할 때 사용할 수 있는 강력한 도구입니다. 이 방식을 통해 자동화의 기능을 최대한 활용할 수 있으며, UI에서 제공하지 않는 많은 고급 설정을 적용할 수 있습니다. YAML 편집에 익숙해지면 Home Assistant의 자동화 가능성이 크게 확장됩니다.

 

Home Assistant에서 특정 센서의 모든 attributes를 한 번에 저장하려면 YAML 코드에서 state_attr 함수를 사용하여 해당 센서의 모든 attributes를 변수로 저장할 수 있습니다. 이렇게 저장된 변수는 자동화의 액션에서 활용할 수 있습니다.

다음은 모든 attributes를 저장하고 이후 액션에서 이를 활용하는 예시 자동화입니다.

alias: "모든 센서 속성 저장 예제"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
variables:
  all_attributes: "{{ state_attr('sensor.your_sensor', 'all') }}"
action:
  - service: notify.notify
    data:
      message: >
        트리거 센서의 모든 속성: {{ all_attributes }}

여기서 중요한 점은 state_attr('sensor.your_sensor', 'all') 부분입니다. 이 함수 호출은 sensor.your_sensor의 모든 attributes를 딕셔너리 형태로 가져오고, 이를 all_attributes 변수에 저장합니다.

 

액션 섹션에서 이 변수를 사용하는 방법

  • 이 변수는 액션에서 메시지를 보낼 때 문자열로 변환되어 전송됩니다. {{ all_attributes }}를 사용하여 메시지 내에 직접 포함시킬 수 있습니다.
  • 또는 특정 속성만 참조하고 싶다면, all_attributes.your_specific_attribute 또는 all_attributes['your_specific_attribute'] 형태로 접근할 수 있습니다.

 

이 예시 자동화 설정을 사용하면 트리거 발생 시점에 센서의 모든 attributes를 저장하고, 이후 액션에서 필요에 따라 이 정보를 사용할 수 있습니다. YAML 코드 편집을 통해 설정하면 Home Assistant의 비주얼 편집기에서 제공하지 않는 고급 기능들을 활용할 수 있습니다.

 

Home Assistant에서 특정 센서의 모든 attributes를 저장하고 이를 재사용하려면, 해당 센서의 전체 attribute 딕셔너리를 변수에 할당하고, 이를 액션에서 참조할 수 있습니다. 이를 위해 state_attr 함수를 사용하지만, 'all'이 아닌 센서 ID만을 인자로 사용하여 해당 센서의 모든 attributes를 가져올 수 있습니다.

 

다음은 자동화 예시로, 센서의 모든 attributes를 변수에 저장하고 액션에서 사용하는 방법을 보여줍니다.

alias: "모든 센서 속성 저장 및 재사용 예제"
description: "특정 센서의 모든 attributes를 저장하고 알림으로 전송"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
variables:
  all_sensor_attributes: "{{ state_attr('sensor.your_sensor') }}"
action:
  - service: notify.notify
    data:
      message: >
        트리거 센서의 모든 속성: {{ all_sensor_attributes | tojson }}

이 예제에서는 다음과 같은 방법으로 작동합니다.

  1. Trigger: sensor.your_sensor의 상태 변화가 발생할 때 자동화가 트리거됩니다.
  2. Variables:
    • all_sensor_attributes: sensor.your_sensor의 모든 attributes를 딕셔너리로 저장합니다. 이는 state_attr 함수를 사용하여 구현되며, 특별한 인자 없이 센서 ID만을 사용합니다.
  3. Action: Notify 서비스를 사용하여 저장된 변수를 메시지로 전송합니다. 여기서 tojson 필터를 사용하여 딕셔너리를 JSON 문자열로 변환하여 메시지가 더 읽기 쉽도록 만듭니다.

이 구성을 통해 센서의 모든 attributes를 트리거 발생 시점에 저장하고, 이후 액션에서 언제든지 이 정보를 참조할 수 있습니다. YAML 코드로 직접 입력해야 하며, 이 방법은 자동화를 통해 센서의 상태 변화를 효과적으로 모니터링하고 관련 데이터를 활용할 수 있게 해줍니다.

 

{{ state_attr('sensor.your_sensor') }}를 사용하여 저장된 센서의 모든 attributes에서 특정 attribute 값을 사용하려면, 변수에서 해당 attribute를 참조할 수 있습니다. 변수에 저장된 데이터는 Python의 딕셔너리와 유사하게 동작하므로, 필요한 attribute에 접근하기 위해 딕셔너리 접근 방식을 사용할 수 있습니다.

 

저장된 all_sensor_attributes 변수에서 특정 attribute를 사용하는 방법은 다음 두 가지 중 하나를 선택할 수 있습니다.

  1. Dot Notation (점 표기법): 이 방식은 attribute 이름이 유효한 Python 변수 이름 규칙을 따를 때 사용할 수 있습니다.
  2. Bracket Notation (대괄호 표기법): 이 방식은 attribute 이름에 공백, 특수 문자가 포함되어 있거나, Python의 키워드일 때 사용합니다.

예를 들어, temperature라는 attribute를 참조하고 싶다면, 다음과 같이 자동화 액션에서 사용할 수 있습니다.

alias: "모든 센서 속성 저장 및 재사용 예제"
description: "특정 센서의 모든 attributes를 저장하고 알림으로 전송"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
variables:
  all_sensor_attributes: "{{ states.sensor.your_sensor.attributes }}"
action:
  - service: notify.notify
    data:
      message: >
        트리거 센서의 모든 속성: {{ all_sensor_attributes | tojson }}

만약 attribute 이름이 예약어이거나 특수 문자를 포함하는 경우, 다음과 같이 대괄호 표기법을 사용합니다.

message: >
  센서의 값은 {{ all_sensor_attributes['special attribute'] }}입니다.

이 예시들을 통해 저장된 센서의 attributes에서 필요한 정보를 선택적으로 추출하고, 자동화 액션에서 이를 활용할 수 있습니다. 이 방법은 트리거 발생 시점의 데이터를 효과적으로 활용하고자 할 때 매우 유용합니다.

 

{{ all_sensor_attributes | tojson }}를 사용한 경우, tojson 필터는 Python 딕셔너리를 JSON 문자열로 변환합니다. 이렇게 JSON 문자열로 변환된 데이터는 텍스트 형식이므로, Home Assistant의 템플릿에서 직접적으로 데이터를 추출하거나 조작하는 것은 불가능합니다. JSON 문자열은 주로 로깅, 메시징, API 통신 등의 목적으로 사용됩니다.

 

만약 JSON 문자열에서 특정 데이터를 추출하고 싶다면, 변환 과정 전에 원하는 데이터를 추출해야 합니다. all_sensor_attributes 딕셔너리에서 특정 attribute 값을 직접 참조하고자 할 때는 tojson 필터 적용 전에 필요한 attribute를 선택해야 합니다.

 

예를 들어, temperature라는 attribute를 참조하고 싶다면, 다음과 같이 템플릿을 작성할 수 있습니다.

message: >
  센서의 온도는 {{ all_sensor_attributes.temperature }}도 입니다.

이 경우 all_sensor_attributes 변수에서 temperature attribute를 직접 참조합니다. 이렇게 하면 해당 값만을 사용할 수 있으며, 필요에 따라 여러 attribute를 조합하거나 조건문을 사용하여 복잡한 로직을 구현할 수 있습니다.

 

JSON 문자열로 변환된 후의 사용 예제

  • JSON 문자열로 저장된 후 다시 사용하고 싶다면, 이 문자열을 다시 파싱하고 조작해야 합니다. 이는 Home Assistant의 템플릿 엔진에서 직접적으로 지원하지 않기 때문에, 외부 시스템이나 스크립트를 통해 처리해야 합니다.

 

결론적으로, tojson 필터는 데이터를 표시하거나 외부로 전송할 때 유용하지만, 내부적으로 데이터를 조작하거나 추출할 목적으로는 사용하기 전에 필요한 데이터를 선택하는 것이 더 적절합니다.

 

Home Assistant에서 템플릿 변수 경고가 나타나는 이유는 대개 참조하려는 객체가 예상한 형식이 아니기 때문입니다. 이 경우, {{ active.friendly_name }}에서 active 변수가 문자열 객체로 취급되고 있어서 friendly_name이라는 속성을 찾을 수 없다는 경고가 발생합니다. 이는 active가 단순 문자열이거나 아직 정의되지 않은 상태에서 이 속성을 참조하려고 시도했기 때문일 수 있습니다.

 

Home Assistant의 템플릿 엔진을 사용하여 active 변수에 저장된 모든 속성을 순회하고 출력하는 예제를 만들어보겠습니다. 이러한 방식은 각 속성의 이름과 값을 확인하고자 할 때 유용합니다.

 

아래의 YAML 코드는 Home Assistant 자동화의 action 부분에 사용할 수 있으며, active 변수에 저장된 각 속성의 키(key)와 값을(value)를 순차적으로 나열합니다.

action:
  - service: notify.notify
    data:
      message: >
        {% for key, value in active.items() %}
          {{ key }}: {{ value }}
        {% endfor %}

이 템플릿은 notify.notify 서비스를 사용하여 메시지를 보내며, 메시지 내용은 active 딕셔너리의 모든 항목을 키와 값의 쌍으로 포함합니다. for 루프는 active.items()를 통해 각 항목을 순회하고, 각 키와 값을 문자열로 변환하여 출력합니다.

 

사용 방법

  1. 위의 예제를 자동화의 action 부분에 삽입하십시오.
  2. 필요에 따라 notify.notify 서비스를 사용자의 환경에 맞는 다른 통지 서비스로 대체하십시오.
  3. active 변수가 정의되어 있고, 센서의 attributes를 올바르게 참조하고 있는지 확인하십시오.

이 템플릿을 활용하여 자동화에서 active 변수에 저장된 모든 센서 속성을 간단하게 확인할 수 있습니다. 특히 디버깅 시 이 방법은 변수 내부의 데이터 구조를 이해하는 데 매우 유용합니다.

 

Home Assistant의 자동화에서 variables 구문을 사용해 변수를 정의할 때, 해당 변수가 딕셔너리로 저장되는 것이 기대되지만, 실제로 이러한 동작이 예상대로 이루어지지 않는 경우가 있을 수 있습니다.

 

Home Assistant의 variables 섹션에서 states 객체를 참조하여 특정 entity의 attributes를 저장하려고 할 때, 이 값들이 딕셔너리 형태로 저장되는 것이 정상적인 동작입니다. 그러나 여러분의 경우에는 이러한 동작이 제대로 이루어지지 않고 있는 것 같습니다. 이 문제의 원인을 정확히 찾기 위해 다음과 같은 접근 방식을 제안합니다.

 

디버깅 접근 방식

  1. 변수 출력 확인: 직접적으로 변수에 저장된 데이터를 출력해 보세요. 이를 통해 변수가 어떤 형태의 데이터를 갖고 있는지 확인할 수 있습니다.이는 active 변수가 실제로 어떤 데이터를 포함하고 있는지 확인하는 가장 직접적인 방법입니다.
    action:
      - service: persistent_notification.create
        data:
          title: "Variable Check"
          message: "{{ active }}"
  2. 템플릿 에디터 사용: Home Assistant의 템플릿 에디터를 사용하여 실시간으로 여러분의 템플릿 코드를 테스트해 보세요. 이 도구는 실시간으로 템플릿 결과를 보여주므로, 문제의 원인을 더 잘 이해하는 데 도움이 될 수 있습니다.
  3. 문서화 및 커뮤니티 자료 검토: Home Assistant의 공식 문서와 커뮤니티 포럼을 검토하여 비슷한 문제를 겪은 다른 사용자의 경험을 찾아보세요. 때때로, 특정 버전에서의 버그나 변경된 동작 때문에 예상치 못한 문제가 발생할 수 있습니다.
  4. Home Assistant 버전 확인: 사용 중인 Home Assistant의 버전에 따라서도 동작이 다를 수 있습니다.

variables 섹션에서 변수가 딕셔너리로 저장되어야 하는 것은 맞지만, 실제로 문제가 발생하는 경우가 있을 수 있습니다. 제안한 디버깅 방법을 통해 문제의 원인을 좀 더 정밀하게 분석해 볼 것을 권장합니다.

 

Home Assistant의 자동화에서 variables 섹션을 통해 특정 센서의 attributes를 배열로 저장하고 싶다면, 먼저 해당 데이터를 배열 형태로 변환해야 합니다. 그러나, 센서 attributes는 일반적으로 딕셔너리 형태로 저장되므로, 배열로 직접 변환하는 것은 표준적인 접근 방법이 아닙니다. 그래도 이를 배열로 저장하고 싶다면, key-value 쌍을 배열의 각 요소로 포함시키는 방식을 사용할 수 있습니다.

 

이를 위해서는 각 attribute의 key와 value를 tuple (또는 리스트) 형태로 배열에 저장하고, 이 배열을 변수에 할당할 수 있습니다. 다음은 이러한 접근 방식을 사용하는 예시입니다.

alias: "Convert Attributes to Array"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - variables:
      # 각 attribute를 (key, value) 형태의 tuple로 변환하여 배열에 저장
      active: >
        {{ states.sensor.your_sensor.attributes.items() | list }}
  - service: notify.notify
    data:
      message: >
        {% for item in active %}
          Key: {{ item[0] }}, Value: {{ item[1] }}
        {% endfor %}
  1. variables 섹션: active 변수는 sensor.your_sensor의 모든 attributes를 (key, value) 형태로 변환하고, 이를 리스트로 만듭니다. items() 메소드는 딕셔너리의 각 아이템을 튜플로 반환하며, list 필터를 사용하여 이들을 리스트로 변환합니다.
  2. 액션: 이 변수를 사용하여 notify.notify 서비스를 통해 각 key와 value를 메시지로 전송합니다. 각 튜플의 첫 번째 요소 (item[0])는 key, 두 번째 요소 (item[1])는 value입니다.

이 방법을 사용하면 원래의 딕셔너리 구조를 배열 형태로 변환하여 활용할 수 있으며, Home Assistant의 자동화 내에서 해당 데이터를 유연하게 사용할 수 있습니다.

 

Home Assistant의 자동화에서 변수를 active 배열로 정의하고, 각 attribute를 {"key": "attribute_name", "value": "attribute_value"} 형태로 저장하려면, 템플릿 기능을 사용해 각 attribute를 해당 형식의 딕셔너리로 변환하고, 이를 배열에 추가하는 로직을 구현해야 합니다. 이 방법은 Home Assistant의 YAML 구성에서 Jinja2 템플릿을 활용하여 실행할 수 있습니다.

 

아래 예제는 sensor.your_sensor의 모든 attributes를 {key: key_name, value: value} 형태로 변환하여 active 배열에 저장하는 자동화를 구현합니다.

alias: "Convert Attributes to Array of Key-Value Dictionaries"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - variables:
      active: >
        {{ states.sensor.your_sensor.attributes.items() | map('tojson') | list }}
  - service: notify.notify
    data:
      message: >
        Attributes as array of key-value pairs: {{ active }}
  1. variables 섹션
    • active: 여기서 states.sensor.your_sensor.attributes.items()는 모든 attributes를 (키, 값) 튜플의 리스트로 가져옵니다. map('tojson')은 각 튜플을 JSON 문자열로 변환하고, list는 이를 리스트로 만듭니다. 하지만 이는 JSON 문자열의 리스트를 생성하기 때문에, 키-값 형태의 딕셔너리 리스트를 생성하도록 수정이 필요합니다.
  2. 액션
    • notify.notify 서비스를 사용하여 active 변수 내용을 메시지로 전송합니다. 이 메시지는 각 attribute의 키와 값이 JSON 형태로 변환된 문자열로 표시됩니다.

위 예제는 실제로 JSON 문자열을 생성하므로, 요구사항에 맞게 각 attribute를 {key: key_name, value: value} 형태의 딕셔너리로 변환하는 코드로 수정해야 합니다. Jinja2의 기능을 활용해 실제로 원하는 형태로 딕셔너리를 구성하려면 다음과 같이 할 수 있습니다.

alias: "Convert Attributes to Array of Key-Value Dictionaries"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - variables:
      active: >
        [{% for key, value in states.sensor.your_sensor.attributes.items() %}
          {"key": "{{ key }}", "value": "{{ value | tojson | safe }}"}{% if not loop.last %}, {% endif %}
        {% endfor %}]
  - service: notify.notify
    data:
      message: >
        Attributes as array of key-value pairs: {{ active }}
  • 이 구성은 모든 attribute 값을 문자열로 처리합니다. 만약 값에 특수 문자나 JSON으로 인코딩되어야 하는 내용이 포함되어 있다면, tojson 필터와 safe 필터를 적절히 사용해야 합니다.
  • active 변수는 문자열 형태의 JSON 리스트를 저장하게 되며, 이를 통해 자동화 액션에서 쉽게 접근할 수 있습니다.

 

Home Assistant의 자동화에서 variables 섹션을 사용하여 sensor.your_sensor의 모든 attributes를 {"key": key_name, "value": attribute_value} 형태로 변환하여 active 배열에 저장하는 루프 돌리는 예제는 직접적인 리스트나 배열에 추가하는 방식으로는 YAML에서 지원하지 않습니다. YAML 스크립트와 Jinja 템플릿에서는 변수 값을 누적시키는 직접적인 방법이 제한적입니다. 그러나 이를 우회하여 구현하는 방법을 제공할 수 있습니다.

alias: "Store Attributes as Key-Value Pairs in List"
trigger:
  - platform: state
    entity_id: sensor.your_sensor
action:
  - variables:
      active: >
        {% set pairs = namespace(items=[]) %}
        {% for key, value in states.sensor.your_sensor.attributes.items() %}
          {% set pairs.items = pairs.items + [{'key': key, 'value': value}] %}
        {% endfor %}
        {{ pairs.items }}
  - service: notify.notify
    data:
      message: >
        {% for item in active %}
          Key: {{ item.key }}, Value: {{ item.value }}
        {% endfor %}
  1. 변수 설정: namespace를 사용하여 수정 가능한 객체를 생성하고, 이를 통해 리스트 items를 조작합니다. namespace는 Jinja2에서 변수를 함수나 루프 내에서 수정할 때 사용할 수 있는 방법을 제공합니다.
  2. 루프 처리: 모든 attributes를 순회하면서 각각의 키와 값을 딕셔너리 형태로 items 리스트에 추가합니다.
  3. 결과 출력: 생성된 리스트 active를 사용하여 각 아이템의 키와 값을 출력합니다.

이 방법은 Home Assistant의 자동화에서 제한적인 환경 내에서도 복잡한 데이터 구조를 조작할 수 있는 방법을 제공합니다. 직접 리스트에 아이템을 추가하는 기능은 Jinja2의 setnamespace를 사용하여 간접적으로 구현할 수 있습니다.

728x90