Creare un sensore weather (previsioni del tempo) da Meteo & Radar in Home Assistant
In questa guida cerco di spiegare passo-passo (diciamo per principianti) come creare un'entità di tipo "weather" (previsioni del tempo) in Home Assistant, prendendo i dati dal sito Meteo & Radar (Meteo & Radar Italia (meteoeradar.it)).
EDIT 13/04/2023: ho aggiunto il punto 8. che "ottimizza" il codice sfruttando la nuova funzionalità "macro" (disponibile da HA 2023.4.0)
EDIT 26/08/2023: ho rafforzato il codice del sensore weather (resiste meglio all'assenza di attributi) e inserito la nuova sintassi dei sensori command_line
EDIT 26/11/2023: gestita anche la neve (precipitazioni di tipo "snow")Da quanto ho avuto modo di verificare nelle ultime 2 settimane, Meteo & Radar fornisce delle previsioni tra le più affidabili (confrontato con 3B Meteo, IlMeteo.it e Meteo Aeronautica), è più facile da integrare degli altri ed offre dati sia su base giornaliera, che oraria (oltre che per "fase" della giornata: mattino, pomeriggio, sera e notte).
Come sempre cercherò di scrivere un articolo come piace a me: inserirò le informazioni necessarie senza dilungarmi troppo, senza continue ripetizioni (in stile SEO) e andando al punto, ma inserendo le informazioni che è necessario sapere (per capire cosa si sta facendo).
Come prima cosa, naturalmente, dovete avere un’installazione di Home Assistant funzionante e correttamente configurata.
1. Configurazione tipo (HW/SW)
Nel mio caso mi trovo nella seguente situazione (cioè, se avete la mia stessa configurazione e seguite la guida, vi garantisco che funziona):
- Raspberry Pi 4 – 8 GB
- Home Assistant 2023.4.2
- Supervisor 2023.04.0
- Operating System 9.5
2. Prerequisiti
Come già detto dovete avere:
- Installazione di Home Assistant (qualunque tipologia) funzionante
3. Breve introduzione/spiegazione e avvertenze
4. Trovare gli API Endpoint
- Premendo sulla tastiera il tasto F12
- Premendo sulla tastiera contemporaneamente i tasti Ctrl+Shift+I
- Usando il menu come da immagine qui sotto
Se non è visibile, cliccate sul simbolo ">>" che vi mostrerà l'elenco di tutte le schede, anche quelle "nascoste"
https://api-web.wo-cloud.com/weather/nowcast/v6?astro_latitude=45.06&astro_longitude=9.68&c=xYzxyzxyz==&grid_latitude=45.06&grid_longitude=9.68&language=it&location_id=16084&system_of_measurement=metric&timeformat=HH:mm&timezone=Europe/Rome&windunit=kmh
5. Creare i sensori REST
rest:
####################################################
# #
# METEO #
# #
####################################################
- resource: MIO_URL_ACTUAL
scan_interval: 600
timeout: 60
headers:
Content-Type: application/json
sensor:
- name: MeteoRadar Current pressure
value_template: "{{ value_json.current.air_pressure.hpa }}"
unit_of_measurement: hPa
device_class: atmospheric_pressure
- name: MeteoRadar Current dew point
value_template: "{{ value_json.current.dew_point.celsius }}"
unit_of_measurement: °C
device_class: temperature
- name: MeteoRadar Current humidity
value_template: "{{ value_json.current.humidity * 100 }}"
unit_of_measurement: "%"
device_class: humidity
- name: MeteoRadar Current precipitation probability
value_template: "{{ value_json.current.precipitation.probability * 100 }}"
unit_of_measurement: "%"
- name: MeteoRadar Current smog level
value_template: "{{ value_json.current.smog_level }}"
- name: MeteoRadar Current sunrise
value_template: "{{ value_json.current.sun.rise }}"
device_class: timestamp
- name: MeteoRadar Current sunset
value_template: "{{ value_json.current.sun.set }}"
device_class: timestamp
- name: MeteoRadar Current solar elevation
value_template: "{{ value_json.current.sun.solar_elevation }}"
unit_of_measurement: "°"
- name: MeteoRadar Current weather symbol
value_template: "{{ value_json.current.symbol }}"
- name: MeteoRadar Current air temperature
value_template: "{{ value_json.current.temperature.air }}"
unit_of_measurement: °C
device_class: temperature
- name: MeteoRadar Current apparent temperature
value_template: "{{ value_json.current.temperature.apparent }}"
unit_of_measurement: °C
device_class: temperature
- name: MeteoRadar Current wind direction
value_template: "{{ value_json.current.wind.direction }}"
unit_of_measurement: °
- name: MeteoRadar Current wind speed
value_template: "{{ value_json.current.wind.speed.meter_per_second.value }}"
unit_of_measurement: m/s
device_class: speed
- name: MeteoRadar Current weather
value_template: "{{ value_json.current.weather_condition_image }}"
- name: MeteoRadar Trend description
value_template: "{{ value_json.trend.description }}"
- MIO_URL_ACTUAL l'URL che abbiamo incollato prima nel blocco note (quello riferito alla situazione attuale). Per intenderci quello che comincia con "https://api-web.wo-cloud.com/weather/nowcast/v6?"
6. Creare il sensore COMMAND_LINE
sensor:
- platform: command_line
name: MeteoRadar Forecast Raw Data
scan_interval: 3600
command: >
echo "{\"forecast\":" $(
curl
-s
'MIO_URL_FORECAST'
) "}"
value_template: >
{{ value_json.forecast | length }}
json_attributes:
- forecast
- MIO_URL_FORECAST l'URL che abbiamo incollato prima nel blocco note (quello riferito alle previsioni). Per intenderci quello che comincia con "https://api-app.wetteronline.de/app/weather/forecast?".
ATTENZIONE a non togliere gli apici quando si sostituisce MIO_URL_FORECAST con l'URL vero e proprio
command_line:
- sensor:
name: MeteoRadar Forecast Raw Data
scan_interval: 3600
command: >
echo "{\"forecast\":" $(
curl
-s
'MIO_URL_FORECAST'
) "}"
value_template: >
{{ value_json.forecast | length }}
json_attributes:
- forecast
7. Creare l'entità "weather"
- "Esteticamente" il codice non mi piace: c'è una ripetizione che non sono riuscito ad eliminare, perché le variabili "globali" al momento sono disponibili solo negli script, mentre altrove le variabili hanno come scope solo il template in cui risiedono. Per cui se avete consigli su come fare per evitare di avere la lista del mapping duplicata, fatemelo sapere che tutti i consigli sono ben accetti
La lista degli stati mappati l'ho ricavata io andando un po' a cercare condizioni climatiche in giro per l'Europa, un po' ad intuito... Sicuramente ne mancano! Ad esempio non sono riuscito a capire come mappare la nebbia. Quindi tenete conto che potrebbero risultare giorni senza "icona".
Ora dovrebbe essere completa
weather:
- platform: template
name: "MeteoRadar Weather"
unique_id: dc924bf6-5190-4c60-a44e-d254ba4472ee
condition_template: >
{% set climate_conditions = {
'so____': 'sunny',
'mo____': 'clear-night',
'ms____': 'sunny',
'bwr1__': 'pouring',
'bwr2__': 'rainy',
'bwr3__': 'rainy',
'mwr1__': 'pouring',
'mwr2__': 'rainy',
'mwr3__': 'rainy',
'bws1__': 'pouring',
'bws2__': 'rainy',
'bws3__': 'rainy',
'mws1__': 'pouring',
'mws2__': 'rainy',
'mws3__': 'rainy',
'wbs1__': 'pouring',
'wbs2__': 'rainy',
'wbs3__': 'rainy',
'mbs1__': 'pouring',
'mbs2__': 'rainy',
'mbs3__': 'rainy',
'bds1__': 'pouring',
'bds2__': 'rainy',
'bds3__': 'rainy',
'mds1__': 'pouring',
'mds2__': 'rainy',
'mds3__': 'rainy',
'bdr1__': 'pouring',
'bdr2__': 'rainy',
'bdr3__': 'rainy',
'mdr1__': 'pouring',
'mdr2__': 'rainy',
'mdr3__': 'rainy',
'wbr1__': 'rainy',
'wbr2__': 'rainy',
'wbr3__': 'rainy',
'mbr1__': 'rainy',
'mbr2__': 'rainy',
'mbr3__': 'rainy',
'wb____': 'partlycloudy',
'mb____': 'partlycloudy',
'mm____': 'partlycloudy',
'bw____': 'cloudy',
'mw____': 'cloudy',
'bd____': 'cloudy',
'md____': 'cloudy',
'bwg1__': 'lightning-rainy',
'bwg2__': 'lightning-rainy',
'bwg3__': 'lightning-rainy',
'mwg1__': 'lightning-rainy',
'mwg2__': 'lightning-rainy',
'mwg3__': 'lightning-rainy',
'bdg1__': 'lightning-rainy',
'bdg2__': 'lightning-rainy',
'bdg3__': 'lightning-rainy',
'mdg1__': 'lightning-rainy',
'mdg2__': 'lightning-rainy',
'mdg3__': 'lightning-rainy',
'mbg1__': 'lightning-rainy',
'mbg2__': 'lightning-rainy',
'mbg3__': 'lightning-rainy',
'bwsrs1': 'lightning-rainy',
'bwsrs2': 'lightning-rainy',
'bwsrs3': 'lightning-rainy',
'mwsrs1': 'lightning-rainy',
'mwsrs2': 'lightning-rainy',
'mwsrs3': 'lightning-rainy',
'wbg1__': 'lightning-rainy',
'wbg2__': 'lightning-rainy',
'wbg3__': 'lightning-rainy',
'bdsns1': 'snowy',
'bdsns2': 'snowy',
'bdsns3': 'snowy',
'mdsns1': 'snowy',
'mdsns2': 'snowy',
'mdsns3': 'snowy',
'bdsn1_': 'snowy',
'bdsn2_': 'snowy',
'bdsn3_': 'snowy',
'mdsn1_': 'snowy',
'mdsn2_': 'snowy',
'mdsn3_': 'snowy',
'bwsn1_': 'snowy',
'bwsn2_': 'snowy',
'bwsnm_': 'snowy',
'mwsn1_': 'snowy',
'mwsn2_': 'snowy',
'mwsn3_': 'snowy',
'bwsns1': 'snowy',
'bwsns2': 'snowy',
'bwsns3': 'snowy',
'mwsns1': 'snowy',
'mwsns2': 'snowy',
'mwsns3': 'snowy',
'wbsg__': 'snowy',
'mbsg__': 'snowy',
'wbsn1_': 'snowy',
'wbsn2_': 'snowy',
'wbsn3_': 'snowy',
'mbsn1_': 'snowy',
'mbsn2_': 'snowy',
'mbsn3_': 'snowy',
'wbsns1': 'snowy',
'wbsns2': 'snowy',
'wbsns3': 'snowy',
'mbsns1': 'snowy',
'mbsns2': 'snowy',
'mbsns3': 'snowy',
'bdgr1_': 'snowy-rainy',
'bdgr2_': 'snowy-rainy',
'mdgr1_': 'snowy-rainy',
'mdgr2_': 'snowy-rainy',
'bdsr1_': 'snowy-rainy',
'bdsr2_': 'snowy-rainy',
'bdsr3_': 'snowy-rainy',
'mdsr1_': 'snowy-rainy',
'mdsr2_': 'snowy-rainy',
'mdsr3_': 'snowy-rainy',
'bdsrs1': 'snowy-rainy',
'bdsrs2': 'snowy-rainy',
'bdsrs3': 'snowy-rainy',
'mdsrs1': 'snowy-rainy',
'mdsrs2': 'snowy-rainy',
'mdsrs3': 'snowy-rainy',
'bwgr1_': 'snowy-rainy',
'bwgr2_': 'snowy-rainy',
'mwgr1_': 'snowy-rainy',
'mwgr2_': 'snowy-rainy',
'bwsr1_': 'snowy-rainy',
'bwsr2_': 'snowy-rainy',
'bwsr3_': 'snowy-rainy',
'mwsr1_': 'snowy-rainy',
'mwsr2_': 'snowy-rainy',
'mwsr3_': 'snowy-rainy',
'wbgr1_': 'snowy-rainy',
'wbgr2_': 'snowy-rainy',
'mbgr1_': 'snowy-rainy',
'mbgr2_': 'snowy-rainy',
'wbsr1_': 'snowy-rainy',
'wbsr2_': 'snowy-rainy',
'wbsr3_': 'snowy-rainy',
'mbsr1_': 'snowy-rainy',
'mbsr2_': 'snowy-rainy',
'mbsr3_': 'snowy-rainy',
'wbsrs1': 'snowy-rainy',
'wbsrs2': 'snowy-rainy',
'wbsrs3': 'snowy-rainy',
'mbsrs1': 'snowy-rainy',
'mbsrs2': 'snowy-rainy',
'mbsrs3': 'snowy-rainy',
'bdsg__': 'snowy',
'mdsg__': 'snowy',
'bwsg__': 'snowy',
'mwsg__': 'snowy',
'nb____': 'fog',
'nm____': 'fog',
'ns____': 'fog',
} %}
{{ climate_conditions[states('sensor.meteoradar_current_weather_symbol')] }}
temperature_template: "{{ states('sensor.meteoradar_current_air_temperature') | float }}"
temperature_unit: "°C"
humidity_template: "{{ states('sensor.meteoradar_current_humidity') | float }}"
pressure_template: "{{ states('sensor.meteoradar_current_pressure') | float }}"
pressure_unit: "hPa"
wind_speed_template: "{{ states('sensor.meteoradar_current_wind_speed') | float }}"
wind_speed_unit: "m/s"
wind_bearing_template: "{{ states('sensor.meteoradar_current_wind_direction') | float }}"
precipitation_unit: "mm"
forecast_template: >
{% set mainArray = namespace (z=[]) %}
{% set climate_conditions = {
'so____': 'sunny',
'mo____': 'clear-night',
'ms____': 'sunny',
'bwr1__': 'pouring',
'bwr2__': 'rainy',
'bwr3__': 'rainy',
'mwr1__': 'pouring',
'mwr2__': 'rainy',
'mwr3__': 'rainy',
'bws1__': 'pouring',
'bws2__': 'rainy',
'bws3__': 'rainy',
'mws1__': 'pouring',
'mws2__': 'rainy',
'mws3__': 'rainy',
'wbs1__': 'pouring',
'wbs2__': 'rainy',
'wbs3__': 'rainy',
'mbs1__': 'pouring',
'mbs2__': 'rainy',
'mbs3__': 'rainy',
'bds1__': 'pouring',
'bds2__': 'rainy',
'bds3__': 'rainy',
'mds1__': 'pouring',
'mds2__': 'rainy',
'mds3__': 'rainy',
'bdr1__': 'pouring',
'bdr2__': 'rainy',
'bdr3__': 'rainy',
'mdr1__': 'pouring',
'mdr2__': 'rainy',
'mdr3__': 'rainy',
'wbr1__': 'rainy',
'wbr2__': 'rainy',
'wbr3__': 'rainy',
'mbr1__': 'rainy',
'mbr2__': 'rainy',
'mbr3__': 'rainy',
'wb____': 'partlycloudy',
'mb____': 'partlycloudy',
'mm____': 'partlycloudy',
'bw____': 'cloudy',
'mw____': 'cloudy',
'bd____': 'cloudy',
'md____': 'cloudy',
'bwg1__': 'lightning-rainy',
'bwg2__': 'lightning-rainy',
'bwg3__': 'lightning-rainy',
'mwg1__': 'lightning-rainy',
'mwg2__': 'lightning-rainy',
'mwg3__': 'lightning-rainy',
'bdg1__': 'lightning-rainy',
'bdg2__': 'lightning-rainy',
'bdg3__': 'lightning-rainy',
'mdg1__': 'lightning-rainy',
'mdg2__': 'lightning-rainy',
'mdg3__': 'lightning-rainy',
'mbg1__': 'lightning-rainy',
'mbg2__': 'lightning-rainy',
'mbg3__': 'lightning-rainy',
'bwsrs1': 'lightning-rainy',
'bwsrs2': 'lightning-rainy',
'bwsrs3': 'lightning-rainy',
'mwsrs1': 'lightning-rainy',
'mwsrs2': 'lightning-rainy',
'mwsrs3': 'lightning-rainy',
'wbg1__': 'lightning-rainy',
'wbg2__': 'lightning-rainy',
'wbg3__': 'lightning-rainy',
'bdsns1': 'snowy',
'bdsns2': 'snowy',
'bdsns3': 'snowy',
'mdsns1': 'snowy',
'mdsns2': 'snowy',
'mdsns3': 'snowy',
'bdsn1_': 'snowy',
'bdsn2_': 'snowy',
'bdsn3_': 'snowy',
'mdsn1_': 'snowy',
'mdsn2_': 'snowy',
'mdsn3_': 'snowy',
'bwsn1_': 'snowy',
'bwsn2_': 'snowy',
'bwsnm_': 'snowy',
'mwsn1_': 'snowy',
'mwsn2_': 'snowy',
'mwsn3_': 'snowy',
'bwsns1': 'snowy',
'bwsns2': 'snowy',
'bwsns3': 'snowy',
'mwsns1': 'snowy',
'mwsns2': 'snowy',
'mwsns3': 'snowy',
'wbsg__': 'snowy',
'mbsg__': 'snowy',
'wbsn1_': 'snowy',
'wbsn2_': 'snowy',
'wbsn3_': 'snowy',
'mbsn1_': 'snowy',
'mbsn2_': 'snowy',
'mbsn3_': 'snowy',
'wbsns1': 'snowy',
'wbsns2': 'snowy',
'wbsns3': 'snowy',
'mbsns1': 'snowy',
'mbsns2': 'snowy',
'mbsns3': 'snowy',
'bdgr1_': 'snowy-rainy',
'bdgr2_': 'snowy-rainy',
'mdgr1_': 'snowy-rainy',
'mdgr2_': 'snowy-rainy',
'bdsr1_': 'snowy-rainy',
'bdsr2_': 'snowy-rainy',
'bdsr3_': 'snowy-rainy',
'mdsr1_': 'snowy-rainy',
'mdsr2_': 'snowy-rainy',
'mdsr3_': 'snowy-rainy',
'bdsrs1': 'snowy-rainy',
'bdsrs2': 'snowy-rainy',
'bdsrs3': 'snowy-rainy',
'mdsrs1': 'snowy-rainy',
'mdsrs2': 'snowy-rainy',
'mdsrs3': 'snowy-rainy',
'bwgr1_': 'snowy-rainy',
'bwgr2_': 'snowy-rainy',
'mwgr1_': 'snowy-rainy',
'mwgr2_': 'snowy-rainy',
'bwsr1_': 'snowy-rainy',
'bwsr2_': 'snowy-rainy',
'bwsr3_': 'snowy-rainy',
'mwsr1_': 'snowy-rainy',
'mwsr2_': 'snowy-rainy',
'mwsr3_': 'snowy-rainy',
'wbgr1_': 'snowy-rainy',
'wbgr2_': 'snowy-rainy',
'mbgr1_': 'snowy-rainy',
'mbgr2_': 'snowy-rainy',
'wbsr1_': 'snowy-rainy',
'wbsr2_': 'snowy-rainy',
'wbsr3_': 'snowy-rainy',
'mbsr1_': 'snowy-rainy',
'mbsr2_': 'snowy-rainy',
'mbsr3_': 'snowy-rainy',
'wbsrs1': 'snowy-rainy',
'wbsrs2': 'snowy-rainy',
'wbsrs3': 'snowy-rainy',
'mbsrs1': 'snowy-rainy',
'mbsrs2': 'snowy-rainy',
'mbsrs3': 'snowy-rainy',
'bdsg__': 'snowy',
'mdsg__': 'snowy',
'bwsg__': 'snowy',
'mwsg__': 'snowy',
'nb____': 'fog',
'nm____': 'fog',
'ns____': 'fog',
} %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': climate_conditions[i.symbol],
'datetime': as_datetime(as_timestamp(i.date) + (2*3600)).isoformat(),
'wind_bearing': i.wind.direction,
'temperature': i.temperature.max.air,
'templow': i.temperature.min.air,
'wind_speed': i.wind.speed.meter_per_second.value,
'precipitation': precipitation,
'precipitation_probability': i.precipitation.probability,
'pressure': i.air_pressure.hpa
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
8. Miglioria usando le MACRO
{% macro translate_weather_state(meteoradar_symbol) -%}
{%- set climate_conditions = {
'so____': 'sunny',
'mo____': 'clear-night',
'ms____': 'sunny',
'bwr1__': 'pouring',
'bwr2__': 'rainy',
'bwr3__': 'rainy',
'mwr1__': 'pouring',
'mwr2__': 'rainy',
'mwr3__': 'rainy',
'bws1__': 'pouring',
'bws2__': 'rainy',
'bws3__': 'rainy',
'mws1__': 'pouring',
'mws2__': 'rainy',
'mws3__': 'rainy',
'wbs1__': 'pouring',
'wbs2__': 'rainy',
'wbs3__': 'rainy',
'mbs1__': 'pouring',
'mbs2__': 'rainy',
'mbs3__': 'rainy',
'bds1__': 'pouring',
'bds2__': 'rainy',
'bds3__': 'rainy',
'mds1__': 'pouring',
'mds2__': 'rainy',
'mds3__': 'rainy',
'bdr1__': 'pouring',
'bdr2__': 'rainy',
'bdr3__': 'rainy',
'mdr1__': 'pouring',
'mdr2__': 'rainy',
'mdr3__': 'rainy',
'wbr1__': 'rainy',
'wbr2__': 'rainy',
'wbr3__': 'rainy',
'mbr1__': 'rainy',
'mbr2__': 'rainy',
'mbr3__': 'rainy',
'wb____': 'partlycloudy',
'mb____': 'partlycloudy',
'mm____': 'partlycloudy',
'bw____': 'cloudy',
'mw____': 'cloudy',
'bd____': 'cloudy',
'md____': 'cloudy',
'bwg1__': 'lightning-rainy',
'bwg2__': 'lightning-rainy',
'bwg3__': 'lightning-rainy',
'mwg1__': 'lightning-rainy',
'mwg2__': 'lightning-rainy',
'mwg3__': 'lightning-rainy',
'bdg1__': 'lightning-rainy',
'bdg2__': 'lightning-rainy',
'bdg3__': 'lightning-rainy',
'mdg1__': 'lightning-rainy',
'mdg2__': 'lightning-rainy',
'mdg3__': 'lightning-rainy',
'mbg1__': 'lightning-rainy',
'mbg2__': 'lightning-rainy',
'mbg3__': 'lightning-rainy',
'bwsrs1': 'lightning-rainy',
'bwsrs2': 'lightning-rainy',
'bwsrs3': 'lightning-rainy',
'mwsrs1': 'lightning-rainy',
'mwsrs2': 'lightning-rainy',
'mwsrs3': 'lightning-rainy',
'wbg1__': 'lightning-rainy',
'wbg2__': 'lightning-rainy',
'wbg3__': 'lightning-rainy',
'bdsns1': 'snowy',
'bdsns2': 'snowy',
'bdsns3': 'snowy',
'mdsns1': 'snowy',
'mdsns2': 'snowy',
'mdsns3': 'snowy',
'bdsn1_': 'snowy',
'bdsn2_': 'snowy',
'bdsn3_': 'snowy',
'mdsn1_': 'snowy',
'mdsn2_': 'snowy',
'mdsn3_': 'snowy',
'bwsn1_': 'snowy',
'bwsn2_': 'snowy',
'bwsnm_': 'snowy',
'mwsn1_': 'snowy',
'mwsn2_': 'snowy',
'mwsn3_': 'snowy',
'bwsns1': 'snowy',
'bwsns2': 'snowy',
'bwsns3': 'snowy',
'mwsns1': 'snowy',
'mwsns2': 'snowy',
'mwsns3': 'snowy',
'wbsg__': 'snowy',
'mbsg__': 'snowy',
'wbsn1_': 'snowy',
'wbsn2_': 'snowy',
'wbsn3_': 'snowy',
'mbsn1_': 'snowy',
'mbsn2_': 'snowy',
'mbsn3_': 'snowy',
'wbsns1': 'snowy',
'wbsns2': 'snowy',
'wbsns3': 'snowy',
'mbsns1': 'snowy',
'mbsns2': 'snowy',
'mbsns3': 'snowy',
'bdgr1_': 'snowy-rainy',
'bdgr2_': 'snowy-rainy',
'mdgr1_': 'snowy-rainy',
'mdgr2_': 'snowy-rainy',
'bdsr1_': 'snowy-rainy',
'bdsr2_': 'snowy-rainy',
'bdsr3_': 'snowy-rainy',
'mdsr1_': 'snowy-rainy',
'mdsr2_': 'snowy-rainy',
'mdsr3_': 'snowy-rainy',
'bdsrs1': 'snowy-rainy',
'bdsrs2': 'snowy-rainy',
'bdsrs3': 'snowy-rainy',
'mdsrs1': 'snowy-rainy',
'mdsrs2': 'snowy-rainy',
'mdsrs3': 'snowy-rainy',
'bwgr1_': 'snowy-rainy',
'bwgr2_': 'snowy-rainy',
'mwgr1_': 'snowy-rainy',
'mwgr2_': 'snowy-rainy',
'bwsr1_': 'snowy-rainy',
'bwsr2_': 'snowy-rainy',
'bwsr3_': 'snowy-rainy',
'mwsr1_': 'snowy-rainy',
'mwsr2_': 'snowy-rainy',
'mwsr3_': 'snowy-rainy',
'wbgr1_': 'snowy-rainy',
'wbgr2_': 'snowy-rainy',
'mbgr1_': 'snowy-rainy',
'mbgr2_': 'snowy-rainy',
'wbsr1_': 'snowy-rainy',
'wbsr2_': 'snowy-rainy',
'wbsr3_': 'snowy-rainy',
'mbsr1_': 'snowy-rainy',
'mbsr2_': 'snowy-rainy',
'mbsr3_': 'snowy-rainy',
'wbsrs1': 'snowy-rainy',
'wbsrs2': 'snowy-rainy',
'wbsrs3': 'snowy-rainy',
'mbsrs1': 'snowy-rainy',
'mbsrs2': 'snowy-rainy',
'mbsrs3': 'snowy-rainy',
'bdsg__': 'snowy',
'mdsg__': 'snowy',
'bwsg__': 'snowy',
'mwsg__': 'snowy',
'nb____': 'fog',
'nm____': 'fog',
'ns____': 'fog',
} -%}
{{ climate_conditions[meteoradar_symbol] }}
{%- endmacro -%}
weather:
- platform: template
name: "MeteoRadar Weather"
unique_id: dc924bf6-5190-4c60-a44e-d254ba4472ee
condition_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{{ translate_weather_state(states('sensor.meteoradar_current_weather_symbol')) }}
temperature_template: "{{ states('sensor.meteoradar_current_air_temperature') | float }}"
temperature_unit: "°C"
humidity_template: "{{ states('sensor.meteoradar_current_humidity') | float }}"
pressure_template: "{{ states('sensor.meteoradar_current_pressure') | float }}"
pressure_unit: "hPa"
wind_speed_template: "{{ states('sensor.meteoradar_current_wind_speed') | float }}"
wind_speed_unit: "m/s"
wind_bearing_template: "{{ states('sensor.meteoradar_current_wind_direction') | float }}"
precipitation_unit: "mm"
forecast_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(i.symbol),
'datetime': as_datetime(as_timestamp(i.date) + (2*3600)).isoformat(),
'wind_bearing': i.wind.direction,
'temperature': i.temperature.max.air | float | round(1),
'templow': i.temperature.min.air | float | round(1),
'wind_speed': i.wind.speed.meter_per_second.value | float,
'precipitation': precipitation,
'precipitation_probability': i.precipitation.probability,
'pressure': i.air_pressure.hpa
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
weather:
- platform: template
name: "MeteoRadar Weather"
unique_id: dc924bf6-5190-4c60-a44e-d254ba4472ee
condition_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{{ translate_weather_state(states('sensor.meteoradar_current_weather_symbol')) }}
temperature_template: "{{ states('sensor.meteoradar_current_air_temperature') | float | round(1) }}"
temperature_unit: "°C"
humidity_template: "{{ states('sensor.meteoradar_current_humidity') | float }}"
pressure_template: "{{ states('sensor.meteoradar_current_pressure') | float }}"
pressure_unit: "hPa"
wind_speed_template: "{{ states('sensor.meteoradar_current_wind_speed') | float }}"
wind_speed_unit: "m/s"
wind_bearing_template: "{{ states('sensor.meteoradar_current_wind_direction') | float }}"
precipitation_unit: "mm"
forecast_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% if i.precipitation.type == 'rain' %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif i.precipitation.type == 'snow' %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(i.symbol),
'datetime': as_datetime(as_timestamp(i.date)).timestamp() | timestamp_local,
'humidity': i.humidity * 100,
'precipitation_probability': i.precipitation.probability,
'precipitation': precipitation,
'pressure': i.air_pressure.hpa,
'temperature': i.temperature.max.air | float | round(1),
'templow': i.temperature.min.air | float | round(1),
'wind_bearing': i.wind.direction,
'wind_speed': i.wind.speed.meter_per_second.value | float,
'uv_index': i.uv_index.value,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
forecast_daily_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% if i.precipitation.type == 'rain' %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif i.precipitation.type == 'snow' %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(i.symbol),
'datetime': as_datetime(as_timestamp(i.date)).timestamp() | timestamp_local,
'humidity': i.humidity * 100,
'precipitation_probability': i.precipitation.probability,
'precipitation': precipitation,
'pressure': i.air_pressure.hpa,
'temperature': i.temperature.max.air | float | round(1),
'templow': i.temperature.min.air | float | round(1),
'wind_bearing': i.wind.direction,
'wind_speed': i.wind.speed.meter_per_second.value | float,
'uv_index': i.uv_index.value,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
forecast_hourly_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% for h in i.dayparts -%}
{% set precipitation = 0 -%}
{% if "details" in h.precipitation -%}
{% if h.precipitation.type == 'rain' %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif h.precipitation.type == 'snow' %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(h.symbol),
'datetime': as_datetime(as_timestamp(h.date)).timestamp() | timestamp_local,
'humidity': h.humidity * 100,
'precipitation_probability': h.precipitation.probability,
'precipitation': precipitation,
'pressure': h.air_pressure.hpa,
'temperature': h.temperature.air | float | round(1),
'native_apparent_temperature': h.temperature.apparent | float | round(1),
'wind_bearing': h.wind.direction,
'wind_speed': h.wind.speed.meter_per_second.value | float,
'native_dew_point': h.dew_point.celsius | float,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{% endfor %}
{{ mainArray.z }}
weather:
- platform: template
name: "MeteoRadar Weather"
unique_id: dc924bf6-5190-4c60-a44e-d254ba4472ee
condition_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{{ translate_weather_state(states('sensor.meteoradar_current_weather_symbol')) }}
temperature_template: "{{ states('sensor.meteoradar_current_air_temperature') | float | round(1) }}"
temperature_unit: "°C"
humidity_template: "{{ states('sensor.meteoradar_current_humidity') | float }}"
pressure_template: "{{ states('sensor.meteoradar_current_pressure') | float }}"
pressure_unit: "hPa"
wind_speed_template: "{{ states('sensor.meteoradar_current_wind_speed') | float }}"
wind_speed_unit: "m/s"
wind_bearing_template: "{{ states('sensor.meteoradar_current_wind_direction') | float }}"
precipitation_unit: "mm"
forecast_daily_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% if i.precipitation.type == 'rain' %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif i.precipitation.type == 'snow' %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(i.symbol),
'datetime': as_datetime(as_timestamp(i.date)).timestamp() | timestamp_local,
'humidity': i.humidity * 100,
'precipitation_probability': i.precipitation.probability,
'precipitation': precipitation,
'pressure': i.air_pressure.hpa,
'temperature': i.temperature.max.air | float | round(1),
'templow': i.temperature.min.air | float | round(1),
'wind_bearing': i.wind.direction,
'wind_speed': i.wind.speed.meter_per_second.value | float,
'uv_index': i.uv_index.value,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
forecast_hourly_template: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% for h in i.dayparts -%}
{% set precipitation = 0 -%}
{% if "details" in h.precipitation -%}
{% if h.precipitation.type == 'rain' %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif h.precipitation.type == 'snow' %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(h.symbol),
'datetime': as_datetime(as_timestamp(h.date)).timestamp() | timestamp_local,
'humidity': h.humidity * 100,
'precipitation_probability': h.precipitation.probability,
'precipitation': precipitation,
'pressure': h.air_pressure.hpa,
'temperature': h.temperature.air | float | round(1),
'native_apparent_temperature': h.temperature.apparent | float | round(1),
'wind_bearing': h.wind.direction,
'wind_speed': h.wind.speed.meter_per_second.value | float,
'native_dew_point': h.dew_point.celsius | float,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{% endfor %}
{{ mainArray.z }}
template:
- trigger:
- platform: state
entity_id:
- sensor.meteoradar_forecast_raw_data
not_to:
- "unknown"
- "unavailable"
sensor:
- name: "MeteoRadar Weather Forecast Daily"
unique_id: 66a04e2b-2603-400a-8f13-1b92f3a03c52
state: "{{ now() }}"
attributes:
forecast: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% set precipitation = 0 -%}
{% if "details" in i.precipitation -%}
{% if i.precipitation.type == 'rain' %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = i.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif i.precipitation.type == 'snow' %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = i.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(i.symbol),
'datetime': as_datetime(as_timestamp(i.date)).timestamp() | timestamp_local,
'humidity': i.humidity * 100,
'precipitation_probability': i.precipitation.probability,
'precipitation': precipitation,
'pressure': i.air_pressure.hpa,
'temperature': i.temperature.max.air | float | round(1),
'templow': i.temperature.min.air | float | round(1),
'wind_bearing': i.wind.direction,
'wind_speed': i.wind.speed.meter_per_second.value | float,
'uv_index': i.uv_index.value,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{{ mainArray.z }}
forecast_hourly: >
{% from 'meteoradar.jinja' import translate_weather_state %}
{% set mainArray = namespace (z=[]) %}
{% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
{% for h in i.dayparts -%}
{% set precipitation = 0 -%}
{% if "details" in h.precipitation -%}
{% if h.precipitation.type == 'rain' %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_end -%}
{% if precipitation is defined %}
{% else %}
{% set precipitation = h.precipitation.details.rainfall_amount.millimeter.interval_begin -%}
{% endif %}
{% elif h.precipitation.type == 'snow' %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_end -%}
{% if precipitation is defined %}
{% set precipitation = precipitation * 10 -%}
{% else %}
{% set precipitation = h.precipitation.details.snow_height.centimeter.interval_begin * 10 -%}
{% endif %}
{% endif %}
{% endif -%}
{% set singleObj =
{
'condition': translate_weather_state(h.symbol),
'datetime': as_datetime(as_timestamp(h.date)).timestamp() | timestamp_local,
'humidity': h.humidity * 100,
'precipitation_probability': h.precipitation.probability,
'precipitation': precipitation,
'pressure': h.air_pressure.hpa,
'temperature': h.temperature.air | float | round(1),
'native_apparent_temperature': h.temperature.apparent | float | round(1),
'wind_bearing': h.wind.direction,
'wind_speed': h.wind.speed.meter_per_second.value | float,
'native_dew_point': h.dew_point.celsius | float,
} %}
{% set mainArray.z = mainArray.z + [singleObj] %}
{% endfor %}
{% endfor %}
{{ mainArray.z }}
Ciao sto cercando di usare tutto questo integrandolo con My Garden, cortesemente, come faccio a trovare il sensore che mi dica la piaggia che cade in mm ?
RispondiEliminaCiao Saverio, scusa ma non mi è arrivata la notifica del commento. Spiegami meglio cosa vuoi fare e cosa ti serve, perché non mi è chiaro (non so cosa sia My Garden e la ricerca su Google non aiuta)
EliminaCiao, ho aggiornato l'integrazione per supportare l'ultima versione di HA e non riesco a visualizzare più le previsioni nella custom weather-card che utilizzo (https://github.com/bramkragten/weather-card). Si può fare qualcosa? Grazie in anticipo.
RispondiEliminaCiao, se vai nella lista delle entità e cerchi "weather.meteoradar_weather", dovresti vedere l'entità meteo. Funziona correttamente? Vedi le previsioni giornaliere e orarie?
EliminaSi si, è tutto ok anche con la card meteo nativa di HA. E' solo con quella che ti ho linkato il problema ed è per questo che mi pare strano.
EliminaMi viene da pensare che non abbiano ancora aggiornato il componente alla nuova struttura del compoente Weather di HA. Stai usando la verisone beta (v2.0.0b0)?
EliminaPerchè la stabile vedo che è ferma al 2020
Utilizzo l'ultima versione beta, per farti capire meglio ti mostro un immagine:
Eliminahttps://pasteboard.co/rcTECd4mTTk8.jpg
Quella sulla sinistra è la card meteo "nativa" di HA che utilizza la tua integrazione Meteoradar, quella al centro è la custom weather card che utilizza 'integrazione meteo nativa di HA mentre quella sulla destra è la custom weather card che utilizza la tua integrazione Meteoradar. Naturalmente in entrambi i due ultimi casi sono attive le visualizzazioni degli stessi elementi. Non so davvero che pesci prendere, credo che comunque il problema sia più della custom card che della tua integrazione. Grazie per il supporto.
Ho provato a dare un'occhiata ad altre integrazioni di HA, a quanto pare molte (tra cui met.no, quella "ufficiale") tengono entrambi i sistemi, sia il meteodo vecchio che quello nuovo. Penso che la custom card non supporti ancora il sistema nuovo, però puoi provare questa versione di codice per il sensore meteo e dirmi se funziona: https://pastebin.com/siT462DQ
EliminaGrazie mille! con questa versione funziona perfettamente come prima.
EliminaOttimo, allora poi aggiorno anche il blog (appena ho tempo), se lo fanno quelli di HA di usare un sistema ibrido, non vedo perchè non dovrei farlo pure io 😁
EliminaGrazie
Ciao Andrea, innanzitutto grazie per condividere la tua esperienza in maniera cosìben fatta. Ho seguito la tua guida ma, avrò sbagliato qualche cosa perchè cliccando sull'entità weather_meteoradar non leggo tutte le informazioni che nvece vedo nei tuoi screenshot.
RispondiEliminaLeggo infatti i seguenti dati: Temperatura, Pressione atmosferica, umidità e velocità del vento. Non leggo, invece, le informazioni sulla riga "MeteoRadar Weather" (mi da solo sconosciuto) e le previsioni.
Dov'è, secondo te, che posso avere sbagliato? per Il sensore di "appoggio" ho copiato il tuo codice codice in un file con estensione.yaml all'interno della cartella packages, può essere questo il problema?
Ciao e grazie
Ciao, avevo già affrontato questo problema con un altro utente. Chiaramente i componenti da interfaccia (lovelace) non possono chiamare servizi, quindi si è presentato il problema che avevo paventato: per poter gestire dei componenti che mostrano le previsioni, è necessario sviluppare tutta la parte di backend in un custom component o con un'integrazione (follia).
EliminaQuindi in realtà non c'è molto da fare, se non usare lo stesso metodo che al momento usano direttamente gli sviluppatori di HA: fregarsene del "deprecato" e usare anche l'attributo "forecast_template". Comparirà l'avviso nei log, ma al momento è solo un avviso senza una data di scadenza.
Se prendi la versione aggiornata del codice dovrebbe risolvere il tuo problema (poi si vedrà)
Ciao Andrea, grazie mille per la tua guida anzitutto. Utilizzo la tua integrazione da un pò , ma da qualche settimana non mi funziona più la visualizzazione dei dati delle previsioni.
EliminaSpulciando i log, vedo che lui riceve un `None` quando cerca di accedere all'attributo `attributes` del sensor `sensor.meteoradar_forecast_raw_data.attributes.forecast` e quindi ovviamente l'iterazione che viene fatta, fallisce ` {% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
`. Nello specifico l'eccezione è :
```
ERROR (MainThread) [homeassistant.helpers.template] Template variable error: 'None' has no attribute 'attributes' when rendering '{% from 'meteoradar.jinja' import translate_weather_state %} {% set mainArray = namespace (z=[]) %} {% for i in states.sensor.meteoradar_forecast_raw_data.attributes.forecast -%}
```
Ti ringrazio in anticipo per tutto!
Ciao Luca, molto strano come comportamento. Hai un altro errore nei log legato al recupero dei dati del command line sensor?
EliminaSe guardi dalla lista delle entità, che valore ha meteoradar_forecast_raw_data ?
Ciao Andrea, è proprio questo il problema, non ho `meteoradar_forecast_raw_data` nelle mie entities
EliminaCiao Andrea, lascia perdere, come sempre era un problema tra sedia e tastiera. Mi ero dimenticato di riscrivere il sensore nel nuovo formato :( . Ora funziona tutto e scusami per il disturbo
RispondiEliminaOk, meglio così allora ^_^
EliminaA volte sono cose banali di cui non ci si accorge fino a che non ci si riguarda per la 100esima volta
Ciao, grazie per la suer guida, ma non son riuscito ad arrivare a capo. La mia situazione dovrebbe essere addirittura più semplice, ma mi mancano le basi per capire come modificare i passaggi. Sono iscritto al gruppo Home Assistant su Facebook, ma il post che hai linkato non riesco a vederlo, non mi si apre, si apre solo il gruppo. Ma veniamo a noi, io ero partito da questo post https://www.facebook.com/share/p/1tW2AZzYFXK2dnoN/ dove un utente ha estrapolato e creato i sensori dal bollettino dell'Arpav. Io son riuscito a modificare quel file yaml, implementando tutti i dati disponibili, ma li mi fermo. Vorrei creare l'entità weather come spieghi tu, m non ho capito se sia fattibile.
RispondiEliminaDunque, ho dato un'occhiata alla formattazione dell'XML indicato in quel post e, secondo me, è molto difficile creare un sensore weather da quei dati per un semplice motivo: sono testuali. Sono fatti per essere letti da un essere umano, non per essere interpretati dal codice, quindi vanno parsati in maniera un po' complicata.
EliminaSe vuoi comunque cimentarti nell'impresa, puoi iniziare cercando di implementare un sensore weather che abbia solo il parametro "condition_template", che va valorizzato
con questi dati: https://www.arpa.veneto.it/previsioni/it/xml/bollettino_utenti.xml
In pratica potresti basarti sul sensore "arpav_simbolo0" per mappare le varie immagini (ad esempio "a2.png") con gli stati accettati da HA. Man mano implementi gli altri.
Però ho visto che c'è anche una versione in formato più utile al tuo scopo: https://wwwold.arpa.veneto.it/previsioni/it/xml/bollettino_widget.xml
Con questo dovrebbe essere molto più facile estrapolare i dati. Tipo:
sensor:
- platform: rest
resource: https://wwwold.arpa.veneto.it/previsioni/it/xml/bollettino_widget.xml
name: arpav_simbolo0
value_template: "{{ value_json.bulletin.meteograms.meteogram[states('sensor.arpav_zona_id')|int].days.day[0].sky['@img'] }}"
scan_interval: 600
Grazie della risposta! Tutto decisamente troppo fuori dalle mie conoscenze :-) Pensa che tutto sto bordello volevo farlo semplicemente per fare una card con il meteo. Ho pensato di poter fare una entità weather così da poterla usare al posto della weather.forecast, in modo da avere quindi poi la possibilità di usare integrazioni già create e disponibili in rete.
Eliminaho provato ad aggiungere il codice che mi hai scritto, lo crea il sensore, ma mi rimane come sconosciuto. Penso le mie conoscenze siano troppo limitate per affrontare una cosa del genere
Eh, quello che volevi fare non è sbagliato, anzi. Solo che è un po' complicato perchè bisogna andare a mappare e interpretare tutti gli stati. Purtroppo non c'è qualcosa di già pronto, magari la persona che aveva creato il package originale ha già fatto (anche se non l'ha pubblicato) un altro package per l'entità weather, si può provare a sentire lui
EliminaPurtroppo come avrai visto ho ripescato un post su FB di 3 anni fa, e nessuno di quelli che hanno partecipato al post sono intervenuti, ne l'autore ne nessun altro. Nel frattempo son riuscito a far comparire il sensore come mi avevi scritto, ma non ho capito come dovrei procedere per fare il tutto. Se è una procedura lunga non mi spaventa, se complessa invece mi spaventa di più. Nel file che dici tu chiamato widget, vedo che ci sarebbero questi dati
EliminaCoperto
Piogge modeste per ognuno dei 7 momenti (5 mezze giornate e 2 giornata per arrivare a coprire i 5 giorni). I dati sarebbero sufficienti per costruire il sensore weather? Avresti voglia di spiegarmi come? Non ho capito cosa cambi da usare questo file invece dell'altro, e nemmeno come potrei poi usare miei file locali al posto delle immagini di Arpav, ma quello sarebbe un passaggio successivo.
Ho provato a chiedere nella community home assistant https://community.home-assistant.io/t/how-to-create-a-forecast-entity-from-a-weather-report-in-xml/693948/4 e addirittura mi rispondono che non è possibile creare un entità forecast da altri sensori... vorrei contraddirli, ma mi mancano le conoscenze. Se avrai voglia di spiegarmi come, io ci provo anche, ma se è impossibile, allora mi arrendo :-) grazie cmq
EliminaPurtroppo non è molto facile da spiegare. Il sensore che ti ho messo come esempio nell'altro commento, ti dà un "simbolo" che corrisponde a una condizione atmosferica. Devi mapparli tutti (e già qui c'è da capire se da qualche parte si trova l'elenco completo) come ho fatto io nella macro "translate_weather_state()". Poi ci sono poche altre informazioni (dipende anche dalla zona, vedo che zone diverse hanno informazioni diverse), che puoi mappare. C'è sicuramente la data che puoi prendere con
Eliminavalue_json.bulletin.meteograms.meteogram[states('sensor.arpav_zona_id')|int].days.day[0]['@date']
mentre l'ora la devi "simulare" da "am" e "pm" (tipo che se trovi "am" metti 02:00, e se trovi "pm" metti 14:00, ad esempio). Poi puoi prendere la probabilità di pioggia con
value_json.bulletin.meteograms.meteogram[states('sensor.arpav_zona_id')|int].days.day[0].rain['@perc']
e la quantità la devi desumere mappando invece
value_json.bulletin.meteograms.meteogram[states('sensor.arpav_zona_id')|int].days.day[0].rain
come faresti con i simboli. Poi devi mettere tutti questi dati che ottieni nei vari template del sensore weather (o nel forecast_template per le previsioni).
Però non è facile da spiegare, bisogna avere un po' di conoscenze e soprattutto molto tempo da dedicare ai vari tentativi per far funzionare il tutto. Io ti aiuterei volentieri, ma purtroppo di tempo in questo periodo non ne ho
sei stato già molto gentile, ci proverò sicuramente, un po' alla volta voglio vedere se ci riesco
EliminaCiao, grazie per aver condiviso il tuo codice. Ho visto che sul sito "meteoeradar.it" sono presenti anche le previsioni orarie per le prossime 24h, sarebbe difficile inserirle nel tuo codice? in modo da renderlo identico a quelli già integrati in HA (tipo forecast.weather e simili) :) Tnks.
EliminaCiao Michele, cosa intendi esattamente? Perchè l'entità weather espone già le previsioni "orarie" (a blocchi di 6 ore) 🤔
Eliminaintendevo queste previsioni orarie: https://ibb.co/BZ516by ora vedo questo nella radar weather https://ibb.co/HHScymg mentre con integrazione di HA vedo anche le previsioni orarie https://ibb.co/j5VngGR (ho messo link agli screenshot dato che non è consentito postare img) . non vedo il sensore con le previsioni a blocchi di sei ora forse ho sbagliato a inserire parti del codice?
EliminaSei sicuro di aver preso la versione giusta e non quella per la vecchia versione di HA? Dovrebbe risultarti così: https://ibb.co/K0vzFTr
EliminaPer le previsioni orarie effettive (queste sono ogni 6 ore) devo vedere se le hanno aggiunte al codice che restituiscono
intanto ti ringrazio per aver condiviso il tuo codice, l'ho inserito in una card weather (ho utilizzato il tuo codice al punto 7, quello successivo al pt. 8 non mi funziona in nessun modo) animata che utilizzavo in precedenza la "Platinum Weather Card" (qui il git https://github.com/Makin-Things/platinum-weather-card ) con alcuni adattamenti dovuti alle diverse modalità di visualizzazione dei vari stati, es. l'umidità e il last update ecc. (c'è ancora qualche errore sulla visualizzazione degli stati relativi all'intensità dello stato "rainy" ma nulla di rilevante), qui il video della card https://youtu.be/sI1i3n9vdk0 e qui il codice del package: https://pastebin.com/CCqaCMnp e qui il codice del sensore ( https://pastebin.com/0FpdgGwu )
EliminaOk, allora è "normale" che non ti mostri i dati orari, perchè il codice al punto 7 è per una versione di HA che ancora non integrava la possibilità di avere le previsioni orarie. Quello che è strano è che non ti funzioni il codice del punto 8.
EliminaChe errore ti dà?
pur avendo inserito il file per le macro nella cartella "custom_template" mi visualizza uno "stato" di "sconosciuto" con in img che ti allego: https://ibb.co/FXct8r0 , uso OA OS aggiornato all'ultima versione 2024 ed ho provato il codice al punto 8 per entrambe le versioni (pre e post 2023.9.0) senza fortuna, sbaglio io sicuramente qualcosa.
EliminaQuesto commento è stato eliminato dall'autore.
EliminaQuesto commento è stato eliminato dall'autore.
Eliminaho sistemato, avevo la dir custom_templates forse corrotta dopo il ripristino di un backup e non mi permetteva di leggere i file jinja caricati all'interno, l'ho eliminata e ricreata ed è andato tutto ok :) https://ibb.co/5RXGD7h
EliminaAh, ottimo! Stranissima cosa, comunque 🤔
EliminaEra chiaro che non ti caricasse il modulo dall'errore che avevi, ma non avrei mai pensato che fosse da eliminare la cartella e ricrearla
infatti stavo uscendo pazzo avrò riletto il codice 100 volte :) riguardo i dati orari ho visto che Mereto&Radar fornisce anche i dati con intervalli di 1 h giornaliera (e non di 6) trovi il link come hai spiegato tu nel post con indicazione "hourcast" (https://api-app.wetteronline.de/app/weather/hourcast?av....) questo permette di avere una previsione oraria con intervalli di 1 ora molto utile per me che la utilizzo per le automazioni per la gestione efficiente dell'autoconsumo da fotovoltaico. ho integrato il tuo codice come in figura: https://ibb.co/sJQwFrC
EliminaCiao, sai se è possibile estrapolare la percentuale di copertura nuvolosa? o la luminosità sempre in percentuale...Grazie!!
Elimina@Michele Mercuri
EliminaOttimo, grazie. Quando ho tempo magari lo aggiungo al blog 👍
@delumerlino
Mas ono informazioni che vedi da qualche parte nella pagina web di Meteoradar? Perché io non ho trovato quest informazioni anche scorrendo la pagina 🤔
@Michele Mercuri
Eliminagentilmente puoi indicare il codice che hai integrato per visualizzare i dati ogni ora ?
Grazie
eccolo, è l'intero codice, rest + command_line + weather sensor ma c'è un minimo di commento quindi lo vedrai ;) https://pastebin.com/bbTvBibc
Elimina@AF - My Tech Blog
RispondiEliminain effetti non c'è controllando bene...
Sarebbe carino integrare anche in una iframe card anche il radar ma tira dentro anche icone non necessarie...
@delumerlino devi integrare quello tedesco la versione ita non va. https://ibb.co/Lpgh6nV
Eliminacon il nuovo update 2024.4.0 il "forecast_template:" è stato definitivamente deprecato, quindi il sensore smette di funzionare :(
RispondiEliminaOk, in giornata aggiorno il blog. Però torniamo al punto di partenza: le weather card personalizzate smetteranno di funzionare. Sono curioso di vedere come pensano di gestire la cosa.
EliminaPS: non capisco perchè questa smania di rimuovere le proprietà, invece di farle coesistere
Infatti mi sembra una scelta alquanto singolare. Mi dispiace doverla abbandonare pure io (dopo una intera giornata impiegata per configurarla a dovere :(
EliminaCiao quindi scusate, come possiamo ovviare al problema che non viene più letta l'entità "meteoradar weather"? Ho delle attivazioni in risposta ai dati di questa identità, come la chiusura delle tapparelle in caso di temporali, aiutateci grazie
EliminaPuoi usare il "sensore di appoggio" al posto dell'entità weather. L'attributo forecast funziona allo stesso modo.
EliminaGrazie, scusa l'ignoranza cosa intendi parli di "sensor.meteoradar_current_weather" ?
EliminaQuesto commento è stato eliminato dall'autore.
EliminaNo, intendo sensor.meteoradar_weather_forecast_daily che corrisponde all'attributo forcast
EliminaOk immaginavo, però quello mi dà come stato "unknown", c'è qualcosa che non và allora...
EliminaL'entità weather di meteoradar funziona correttamente e puoi usarla tranquillamente nelle automazioni. Quello che non funziona più sono le card meteo personalizzate (io sto usando quella ufficiale, l'unica che funziona per ora)
EliminaAnche a me dava stato "unknown" solo riavviando HA è partito 😁
EliminaAh, si giusto. Essendo un trigger sensor, si aggiorna solo quando si verifica l'evento. Quindi appena lo crei rimane unknown fino al successivo aggiornamento del sensore rest. Riavviando si forza l'aggiornamento e quindi va a posto, dovrebbe bastare semplicemente aggiornare (dai developer tools) i sensori rest e command line 👍
EliminaBuongiorno e grazie per aver condiviso il tuo lavoro. Essendo anch'io interessato ad integrare in HA i dati di Meteo & Radar ho seguito la guida ma mi sono fermato subito al punto 4 perché applicando il filtro indicato non risultano file di tipo xhr. Ci sono solo file con nome v9?astro_latitude... fetch. Dove sbaglio?
RispondiEliminaBuongiorno Filippo, è corretto quello che vedi, stai facendo correttamente. Se clicchi con il tasto destro su "v9?astro_latitude=..." o su "forecast?av=..." dovresti trovare l'opzione "Copia URL" che ti permette di copiare l'indirizzo completo da incollare in HA
EliminaCiao, è possibile estrarre i dati di pioggia in mm? Grazie mille!!
RispondiEliminanel sensore sensor.meteoradar_weather_forecast_daily hai già i dati pronti per quello che ti serve, compresi i mm previsti
EliminaGrazie ho visto, ma come posso estrapolarli in un sensore? o meglio, avere la quantità di pioggia accumulata nelle 24h?
EliminaNon puoi avere la quantità di pioggia accumulata nelle ultime 24 ore, perchè questo sistema restituisce le previsioni, e non lo "storico" (non so se c'è qualche API di Meteo&Radar che lo fa, bisognerebbe controllare).
EliminaPer sapere la quantità di precipitazioni previste per la giornata odierna puoi fare in questo modo (giusto come esempio):
{{ state_attr('sensor.meteoradar_weather_forecast_daily', 'forecast')[0].precipitation }}
Ecco perchè non le vedo....mi manca proprio il sensore meteoradar_weather_forecast_daily, ho solo il raw_data....ripasso l'integrazione per vedere cosa ho perso...
EliminaE' nell'ultimissimo template che vedi
EliminaCiao, purtroppo non riesco a trovare la voce "v6?astro_latitude" nella pagina del meteo. Ho provato a ricaricare la pagina e cambiare browser ma nessuna fortuna ):
RispondiEliminaGrazie in anticipo per ogni aiuto
Ciao, prova a cercare solo "?astro_latitude", ho visto che il "v6" è un numero di versione, quindi ogni volta che fanno un rilascio lo incrementano. Probabilmente ora è "v10" o più.
Elimina