Home Assistant World Clock & Weather Dashboard 第7章


Chapter 7

Template Sensor Configuration

Template Sensor の構築

7.1 本章の目的

Chapter 6では、Open-Meteoから16都市のWeather Entityを取得しました。

本章では、それぞれのWeather Entityから現在気温だけを取り出し、温度センサーとして利用できるTemplate Sensorを作成します。

例えば東京の場合、

weather.tokyo

が持っている、

temperature

を取り出して、

sensor.weather_tokyo

というセンサーを作ります。


7.2 なぜTemplate Sensorを使用するのか

Open-MeteoのWeather Entityには、気温だけでなく複数の気象情報が含まれています。

Version 1.3では、その中から現在気温を取り出して、Dashboardで扱いやすい温度センサーにします。

構造は次のとおりです。

Open-Meteo
     │
     ▼
weather.tokyo
     │
     │ temperature
     ▼
Template Sensor
     │
     ▼
sensor.weather_tokyo

この方式にすることで、Dashboard側では単純に、

sensor.weather_tokyo

として現在気温を扱えます。


7.3 Version 1.3のTemplate Sensor

Template Sensorの基本形は次のとおりです。

template:
  - sensor:
      - name: weather_tokyo
        unique_id: weather_tokyo
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.tokyo', 'temperature') }}"

それぞれの項目には役割があります。

項目役割
nameセンサー名
unique_idセンサーを一意に識別するID
device_class温度センサーとして扱う
state_class測定値として扱う
unit_of_measurement温度単位
stateWeather Entityから気温を取得

7.4 state の意味

最も重要なのがこの部分です。

state: "{{ state_attr('weather.tokyo', 'temperature') }}"

これは、

weather.tokyo の temperature 属性を取得する

という意味です。

つまり、

weather.tokyo
      │
      └── temperature
              ↓
          Template Sensor

となります。


7.5 16都市のTemplate Sensor

Version 1.3では、次の16個を作成します。

template:
  - sensor:

      - name: weather_tokyo
        unique_id: weather_tokyo
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.tokyo', 'temperature') }}"

      - name: weather_london
        unique_id: weather_london
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.london', 'temperature') }}"

      - name: weather_paris
        unique_id: weather_paris
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.paris', 'temperature') }}"

      - name: weather_new_york
        unique_id: weather_new_york
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.new_york', 'temperature') }}"

      - name: weather_los_angeles
        unique_id: weather_los_angeles
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.los_angeles', 'temperature') }}"

      - name: weather_berlin
        unique_id: weather_berlin
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.berlin', 'temperature') }}"

      - name: weather_moscow
        unique_id: weather_moscow
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.moscow', 'temperature') }}"

      - name: weather_singapore
        unique_id: weather_singapore
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.singapore', 'temperature') }}"

      - name: weather_sydney
        unique_id: weather_sydney
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.sydney', 'temperature') }}"

      - name: weather_beijing
        unique_id: weather_beijing
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.beijing', 'temperature') }}"

      - name: weather_cape_town
        unique_id: weather_cape_town
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.cape_town', 'temperature') }}"

      - name: weather_dubai
        unique_id: weather_dubai
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.dubai', 'temperature') }}"

      - name: weather_sao_paulo
        unique_id: weather_sao_paulo
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.sao_paulo', 'temperature') }}"

      - name: weather_dallas
        unique_id: weather_dallas
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.dallas', 'temperature') }}"

      - name: weather_oslo
        unique_id: weather_oslo
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.oslo', 'temperature') }}"

      - name: weather_delhi
        unique_id: weather_delhi
        device_class: temperature
        state_class: measurement
        unit_of_measurement: "°C"
        state: "{{ state_attr('weather.delhi', 'temperature') }}"

7.6 configuration.yamlへの追加位置

この設定は、

configuration.yaml

に追加します。

Version 1.3の基本構造は次のようになります。

# Loads default set of integrations. Do not remove.
default_config:

# Load frontend themes from the themes folder
frontend:
  themes: !include_dir_merge_named themes

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

template:
  - sensor:
      # 16都市のTemplate Sensor
      ...
      
http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 172.30.33.0/24

重要

template: は1回だけ記述します。

その中に16個の sensor: を並べます。


7.7 旧REST Sensorは使用しない

Version 1.2では、

sensor:
  - platform: rest

によって気温を取得していました。

Version 1.3では、この方式を廃止します。

したがって、Version 1.3の configuration.yaml に、

sensor:
  - platform: rest

を追加してはいけません。

今回採用する方式は、

Open-Meteo
    ↓
weather.xxx
    ↓
Template Sensor
    ↓
sensor.weather_xxx

です。


7.8 sensor.weather_xxx の確認

YAMLを保存したら、Home Assistantの設定チェックを行います。

問題がなければHome Assistantを再起動します。

再起動後、

開発者ツール → 状態

または、

設定 → デバイスとサービス → エンティティ

から確認します。

例えば、

sensor.weather_tokyo

を検索します。

正常に作成されていれば、現在の気温が状態として表示されます。


7.9 Template Sensorの確認

例えば東京の場合、

sensor.weather_tokyo

を開きます。

次のような情報が確認できれば正常です。

デバイスクラス:Temperature
単位:°C
状態クラス:Measurement

また、現在の状態に気温が表示されます。


7.10 Unique IDについて

Version 1.3では、

unique_id: weather_tokyo

を設定しています。

これは非常に重要です。

Unique IDが設定されていることで、Home AssistantからそのEntityをUI上で管理できるようになります。

例えばEntityの設定画面を開いたときに、

エンティティID
sensor.weather_tokyo

として管理できます。

Version 1.3では、新しく作成するTemplate Sensorには必ずUnique IDを設定することを基本とします。


7.11 Entity IDについて

name と unique_id を、

name: weather_tokyo
unique_id: weather_tokyo

とした場合、通常は、

sensor.weather_tokyo

というEntity IDになります。

ただしHome Assistantでは、既存Entityとの重複などによって別のEntity IDが生成される場合があります。

そのため、最終的には必ず、

設定 → デバイスとサービス → エンティティ

で実際のEntity IDを確認します。

Version 1.3では、Dashboardから参照するEntity IDを実際の登録状態と一致させます。


7.12 _2 を作らないための原則

Version 1.3の新規構築では、不要な重複Entityを作らないことが重要です。

例えば、

sensor.weather_tokyo
sensor.weather_tokyo_2

のような状態になった場合、2つの異なる温度センサーを意図して作ったわけではありません。

このような重複を避けるため、

  1. 旧REST Sensorを残さない
  2. 同じTemplate Sensorを二重登録しない
  3. template: を重複させない
  4. Entity IDを作成後に確認する

ことを基本とします。


7.13 16都市の確認

最終的に次の16個のTemplate Sensorが存在することを確認します。

sensor.weather_tokyo
sensor.weather_london
sensor.weather_paris
sensor.weather_new_york
sensor.weather_los_angeles
sensor.weather_berlin
sensor.weather_moscow
sensor.weather_singapore
sensor.weather_sydney
sensor.weather_beijing
sensor.weather_cape_town
sensor.weather_dubai
sensor.weather_sao_paulo
sensor.weather_dallas
sensor.weather_oslo
sensor.weather_delhi

ここでも、Home Assistantに実際に登録されたEntity IDを確認してください。


7.14 気温履歴について

Template Sensorに、

state_class: measurement

を設定しているため、現在気温は測定値として扱われます。

その結果、

sensor.weather_tokyo

の履歴をHome Assistantの履歴画面で確認できるようになります。

Dashboardから都市カードをクリックしたときに、このEntityの詳細を表示させれば、気温の履歴を確認できます。

これがVersion 1.3の重要なポイントです。


7.15 Chapter 7 完成条件

次の条件を満たせば、Template Sensorの構築は完了です。

  • template: が正しく記述されている
  • 16都市のTemplate Sensorが作成されている
  • 各SensorにUnique IDがある
  • device_class: temperature が設定されている
  • state_class: measurement が設定されている
  • 単位が °C になっている
  • weather.xxx からtemperatureを取得できている
  • 現在気温が表示される
  • 気温の履歴が記録される
  • 不要な _2 Entityが作られていない

Chapter 7 Summary

ここまでで、Version 1.3の気温取得部分が完成しました。

全体の流れは、

          Open-Meteo
               │
               ▼
        weather.tokyo
               │
               │ temperature
               ▼
        Template Sensor
               │
               ▼
     sensor.weather_tokyo
               │
               ▼
          Dashboard

となります。

16都市についても同じ構造になります。

weather.xxx
     ↓
temperature
     ↓
sensor.weather_xxx

という統一されたルールになっていることが、Version 1.3の大きなポイントです。


次章

Chapter 8

Dashboard Construction

いよいよここから、画面を作ります。

Chapter 8では、

ビュー → パネル → Gridカード → button-card

というVersion 1.3で決定した構成を使い、

🇯🇵 東京
09:35  28℃

のような都市カードを16個配置します。

さらに、

states[entity.entity_id]

による時刻取得と、

states['sensor.weather_tokyo']

による気温取得を整理し、20~30都市へ増やす場合にも追加しやすい形に仕上げます。

ここからいよいよ、これまで作ってきたものが一つの「世界時計&気温ダッシュボード」になっていきます。


※ChatGPT により作成。