Integrowanie z HA stacji pogodowych obsługujących wysyłanie danych do Weather Underground

Dla stacji pogodowych mających opcję wysyłania danych do serwisu

istnieje od jakiegoś czasu Komponent niestandardowy

niedawno (hmm na początku grudnia 2022?) wyszła jego ulepszona wersja 1.x która daje się teraz instalować z HACS oraz przede wszystkim obsługuje nowy format zapisu konfiguracji w HA - ten z użyciem platform: (użytkownicy MQTT już chyba wiedzą o co chodzi :stuck_out_tongue: ).
Szczerze mówiąc nie jestem pewien, czy jest on standardowym repozytorium w HACS (raczej nie) w każdym razie można go dodać, jeśli go nie znajdziemy, przez dodanie repo do kategorii Integracji:
https://github.com/cytech/Home-Assistant-wundergroundpws

Do konkretu (edit: UWAGA, to dotyczy tylko wersji 1.x, obecnie dostępna jest wersja 2.x - kolejny post)

  1. W ogóle to warto zamontować stację w jakimś sensownym miejscu, świetny poradnik w FAQ WU:
    Installing Your Personal Weather Station | Weather Underground

  2. W każdym razie jeśli stacja ma możliwość wysyłania danych do WU to zapewne odpowiednia informacja jak to ogarnąć jest w jej instrukcji…

  3. Jeśli nie mamy konta WU to warto je najpierw utworzyć - to ułatwia w niektórych stacjach (a raczej ich odbiornikach z funkcją WiFi) konfigurację - w mojej opisywanej tam trzeba było to dość szybko ogarnąć, bo (o ile dobrze pamiętam - robiłem to kilka miesięcy temu) AP odbiornika jest dostępny tylko przez jakieś kilkadziesiąt sekund po aktywacji trybu konfiguracji (potem AP znika i rypanie się z całą konfiguracją od nowa, bo po połączeniu się z naszym WiFi w trybie klienta, już nie ma interfejsu webowego…).

  4. Po zainstalowaniu Komponentu z HACS

  5. restartujemy HA (to chyba oczywiste),

  6. następnie dodajemy do configuration.yaml (lub dla zaawansowanych w załączanym innym pliku) następujące wpisy (to jest maksimum co można uzyskać, jeśli stacja jest nieco bardziej uproszczona, to trzeba wywalić zbędne linijki)

wundergroundpws:
  api_key: 0123456789abcdef0123456789abcdef # 32-znakowy token = klucz API
  pws_id: ID_stacji # chodzi o ten nadany przy rejestracji stacji w WU
  numeric_precision: decimal
  lang: pl-PL

sensor:
  - platform: wundergroundpws
    monitored_conditions:
      # odczytane z PWS (ale przesłane przez chmurę)
      - stationID
      - elev
      - neighborhood
      - obsTimeLocal
      - temp
      - humidity
      - pressure
      - dewpt
      - heatIndex
      - solarRadiation
      - uv
      - winddir
      - windDirectionName
      - windGust
      - windSpeed
      - windChill
      - precipTotal
      - precipRate
      # wygenerowana prognoza dla lokalizacji naszej stacji PWS
      - precip_1d
      - precip_chance_1d
      - precip_chance_1n
      - precip_chance_2d
      - precip_chance_2n
      - precip_chance_3d
      - precip_chance_3n
      - precip_chance_4d
      - precip_chance_4n
      - precip_chance_5d
      - precip_chance_5n
      - temp_high_1d
      - temp_high_2d
      - temp_high_3d
      - temp_high_4d
      - temp_high_5d
      - temp_low_1d
      - temp_low_2d
      - temp_low_3d
      - temp_low_4d
      - temp_low_5d
      - wind_1d
      - wind_2d
      - wind_3d
      - wind_4d
      - wind_5d
      - weather_1d
      - weather_1n
      - weather_2d
      - weather_2n
      - weather_3d
      - weather_3n
      - weather_4d
      - weather_4n
      - weather_5d
      - weather_5n
	
weather:
  - platform: wundergroundpws
  1. restartujemy HA

  2. po odczekaniu aż pojawią się dane (>5 min.) można stworzyć sobie jakąś kartę, na obrazku taki nieco tasiemiec z telefonu by pokazać co można uzyskać (widać też, że niektóre prognozy ulegają przedawnieniu wieczorem, niektóre inne rano, robiłem dziś aktualizację do nowej wersji Komponentu niestandardowego i to tez mogło mieć jakiś wpływ, ale zasadniczo przedawnienie prognoz jest normalne), część nazw encji sobie przetłumaczyłem, “z pudełka” dostajemy wersję angielską, po wybraniu języka polskiego w konfiguracji dostajemy tekstowe prognozy po polsku

Parę przykładów jak wyglądają dane z ostatniej doby (na wykresach dziura gdy zajmowałem się aktualizacją konfiguracji, bo upgrade ze starej wersji nie było “plug and play”)

wilgot_2022-12-26_23-19

prom_slon_2022-12-26_23-16

uv_2022-12-26_23-21

kier_wiatr_2022-12-26_23-18

Jedyna zdrada to jednostka ciśnienia (mbar zamiast hPa chociaż jest to 1:1)


3 zdania na koniec
Kiedyś była standardowa integracja WU w HA, ale IBM postanowił dzielić się danymi tylko z osobami wysyłającymi im dane i oficjalna Integracja zniknęła. Obecnie na darmowym koncie możemy z całą pewnością mieć jedną stację pogodową - w ich terminologii to PWS (niestety jakie są konkretnie obecne warunki nie mogę się doszukać, może można mieć więcej stacji? ale kojarzę ograniczenie do jednej).
Drugie ograniczenie (na koncie darmowym, jak jest na płatnych nie wiem) to konieczność resetowania klucza API (tokena) co pół roku


Ogólne warunki korzystania z serwisów WU na które trzeba się zgodzić przed wygenerowaniem klucza API (oraz przy jego powtórnym generowaniu).

2 polubienia

A jakbym chciał w HA tylko parę danych ze stacji sąsiada to też muszę api i rejestrować się czy można to prościej ogarnąć?

To wtedy chyba musisz zapłacić za dostęp do danych (z tego co pamiętam kwota była jakaś oderwana od rzeczywistości, ale mogło chodzić o inny serwis, bo kombinowałem na różne sposoby).

Nie będę oszukiwał nie wiem jak jest konkretnie, załóż konto, sprawdź (to chyba jedyna metoda by się dowiedzieć szczegółów, bo sam nie chcę kombinować nic na swoim koncie), ale z całą pewnością nie wysyłając danych z własnej PWS nie otrzymasz klucza API umożliwiającego pobieranie danych (to był powód dla którego integracja WU zniknęła z HA).

Możesz popróbować platformą scrape.

Jeśli chcesz poszukać danych “od pobliskiego sąsiada” to sugeruję też popatrzeć na stacje Airly - one eksponują m. in. zwykle ciśnienie temperaturę i wilgotność.

A jeśli chodzi o dane interpolowane, to w miarę sensownie wypada Weatherbit (testuję go już kilka lat i akurat ze względu na specyficzną lokalizację interesującego mnie miejsca nie ma 100% trafienia, ale jest całkiem nieźle).
Tu masz porównanie lokalnego pomiaru i Weatherbit (temperatura i wilgotność)

Aktualizacja wyżej opisywanego komponentu niestandardowego

opisana jest tutaj

do instalacji można użyć HACS dodając repozytorium niestandardowe, niestety nie ma opcji prostej migracji z wersji 1.x ani wcześniejszej 0.x
należy usunąć starą konfigurację i usunąć pliki (można odinstalować z poziomu HACS jeśli tak była instalowana starsza wersja), wymaga to paru restartów, w zasadzie jedyne czego potrzeba z dawnej instalacji to klucza API (tokena, trzeba go odnawiać co pół roku, bo wygasa…) oraz identyfikatora stacji.

Teoretycznie można by zmienić nazwy encji w wersji 1.x na takie jak będą w 2.x (jedynie bieżące wskazania dałby się tą drogą zmigrować) i tą drogą zrobić migrację (a nie jak zaleca autor) - wtedy nie utracimy historii, niestety po fakcie już mi się nie chce robić downgrade, by potem zrobić upgrade…

Jeśli komuś się to może przydać, to w YAMLu tej prostej karty mamy wszystkie potencjalnie dostępne w wersji 2.0.1 (w v1.x u mnie encje poszczególnych prognoz działają, w v2.0.1 działa tylko ogólna prognoza, której nie było dotychczas, edit: w 2.x encje cząstkowych prognoz są po prostu domyślnie wyłączone - trzeba je włączyć, niestety wciąż brak temperatury odczuwalnej w bieżących wskazaniach…), w miejscu gdzie w wersjach 1.x był człon wupws teraz mamy identyfikator swojej stacji pisanym małymi l iterami więc tekst: lowercasestationid należy zastąpić, przykładowo dla ID: IMILOT7 to byłby imilot7,

type: entities
entities:
  - entity: sensor.lowercasestationid_station_id
  - entity: sensor.lowercasestationid_neighborhood
  - entity: sensor.lowercasestationid_elevation
  - entity: sensor.lowercasestationid_local_observation_time
  - type: section
  - entity: sensor.lowercasestationid_temperature
  - entity: sensor.lowercasestationid_windchill
  - entity: sensor.lowercasestationid_heat_index
  - entity: sensor.lowercasestationid_dewpoint
  - entity: sensor.lowercasestationid_relative_humidity
  - entity: sensor.lowercasestationid_wind_direction_cardinal
  - entity: sensor.lowercasestationid_wind_direction_degrees
  - entity: sensor.lowercasestationid_wind_speed
  - entity: sensor.lowercasestationid_wind_gust
  - entity: sensor.lowercasestationid_precipitation_today
  - entity: sensor.lowercasestationid_precipitation_rate
  - entity: sensor.lowercasestationid_pressure
  - entity: sensor.lowercasestationid_solar_radiation
  - entity: sensor.lowercasestationid_uv_index
  - type: section
  - entity: weather.lowercasestationid
  - type: section
  - entity: sensor.lowercasestationid_weather_summary_0
  - entity: sensor.lowercasestationid_weather_summary_1
  - entity: sensor.lowercasestationid_weather_summary_2
  - entity: sensor.lowercasestationid_weather_summary_3
  - entity: sensor.lowercasestationid_weather_summary_4
  - entity: sensor.lowercasestationid_forecast_summary_0d
  - entity: sensor.lowercasestationid_forecast_summary_1n
  - entity: sensor.lowercasestationid_forecast_summary_2d
  - entity: sensor.lowercasestationid_forecast_summary_3n
  - entity: sensor.lowercasestationid_forecast_summary_4d
  - entity: sensor.lowercasestationid_forecast_summary_5n
  - entity: sensor.lowercasestationid_forecast_summary_6d
  - entity: sensor.lowercasestationid_forecast_summary_7n
  - entity: sensor.lowercasestationid_forecast_summary_8d
  - entity: sensor.lowercasestationid_forecast_summary_9n
  - entity: sensor.lowercasestationid_forecast_temperature_0d
  - entity: sensor.lowercasestationid_forecast_temperature_1n
  - entity: sensor.lowercasestationid_forecast_temperature_2d
  - entity: sensor.lowercasestationid_forecast_temperature_3n
  - entity: sensor.lowercasestationid_forecast_temperature_4d
  - entity: sensor.lowercasestationid_forecast_temperature_5n
  - entity: sensor.lowercasestationid_forecast_temperature_6d
  - entity: sensor.lowercasestationid_forecast_temperature_7n
  - entity: sensor.lowercasestationid_forecast_temperature_8d
  - entity: sensor.lowercasestationid_forecast_temperature_9n
  - entity: sensor.lowercasestationid_forecast_average_wind_0d
  - entity: sensor.lowercasestationid_forecast_average_wind_1n
  - entity: sensor.lowercasestationid_forecast_average_wind_2d
  - entity: sensor.lowercasestationid_forecast_average_wind_3n
  - entity: sensor.lowercasestationid_forecast_average_wind_4d
  - entity: sensor.lowercasestationid_forecast_average_wind_5n
  - entity: sensor.lowercasestationid_forecast_average_wind_6d
  - entity: sensor.lowercasestationid_forecast_average_wind_7n
  - entity: sensor.lowercasestationid_forecast_average_wind_8d
  - entity: sensor.lowercasestationid_forecast_average_wind_9n
  - entity: sensor.lowercasestationid_precipitation_amount_0d
  - entity: sensor.lowercasestationid_precipitation_amount_1n
  - entity: sensor.lowercasestationid_precipitation_amount_2d
  - entity: sensor.lowercasestationid_precipitation_amount_3n
  - entity: sensor.lowercasestationid_precipitation_amount_4d
  - entity: sensor.lowercasestationid_precipitation_amount_5n
  - entity: sensor.lowercasestationid_precipitation_amount_6d
  - entity: sensor.lowercasestationid_precipitation_amount_7n
  - entity: sensor.lowercasestationid_precipitation_amount_8d
  - entity: sensor.lowercasestationid_precipitation_amount_9n
  - entity: sensor.lowercasestationid_precipitation_probability_0d
  - entity: sensor.lowercasestationid_precipitation_probability_1n
  - entity: sensor.lowercasestationid_precipitation_probability_2d
  - entity: sensor.lowercasestationid_precipitation_probability_3n
  - entity: sensor.lowercasestationid_precipitation_probability_4d
  - entity: sensor.lowercasestationid_precipitation_probability_5n
  - entity: sensor.lowercasestationid_precipitation_probability_6d
  - entity: sensor.lowercasestationid_precipitation_probability_7n
  - entity: sensor.lowercasestationid_precipitation_probability_8d
  - entity: sensor.lowercasestationid_precipitation_probability_9n
  - entity: sensor.lowercasestationid_snow_amount_0
  - entity: sensor.lowercasestationid_snow_amount_1
  - entity: sensor.lowercasestationid_snow_amount_2
  - entity: sensor.lowercasestationid_snow_amount_3
  - entity: sensor.lowercasestationid_snow_amount_4

ponieważ encje prognozy się całkiem pozmieniały, to sugeruję trik ze zmianą nazwy jedynie dla sensorów aktualnych wskazań.
Stare nazwy encji były krótsze często bez znaku “_” (tzw. podłoga) w końcowej członie nazwy, więc chyba nie będzie problemu z ich identyfikacją.