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 | 温度単位 |
state | Weather 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つの異なる温度センサーを意図して作ったわけではありません。
このような重複を避けるため、
- 旧REST Sensorを残さない
- 同じTemplate Sensorを二重登録しない
template:を重複させない- 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を取得できている- 現在気温が表示される
- 気温の履歴が記録される
- 不要な
_2Entityが作られていない
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 により作成。