RPI + OpenWeather -> odczyt danych przez klucz API

User avatar
myxhir
Posts: 664
Joined: Thu Jan 07, 2021 12:16 pm
Location: Skórzewo, Poznań
Has thanked: 6 times
Been thanked: 9 times

Post

Witajcie,
Razem z rozwojem bramki Zigbee postanowiłem czujniki LYW "gadające" po BLE zamienić na Zigbee (zostawiłem tylko jeden zewnętrzny bo na oryginalnym sofcie BLE lepiej mi działa informowanie o baterii).
obrazki cos nie chcą się wyświetlać ale jak się kliknie PPM na nie i zrobi otwórz w nowej karcie to działa
Swoją drogą wklejam link do poradnika, który podawał też Zibi ale mógł umknąć w tym wszystkim - przeprogramowanie proste, ja to robiłem przez telefon najlepiej natomiast wcześniej pobrać sobie docelowe pliki na telefon

Code: Select all

https://smarthomescene.com/guides/convert-xiaomi-lywsd03mmc-from-bluetooth-to-zigbee/
Suma sumarum, bramka RPI została mi tylko z samym odczytem punktu rosy :D - no plus ten jeden czujnik. Ponad to wiem ze w chmurze można importować dane pogodowe miast natomiast mojej "miejskiej" wsi tam nie ma a postanowiłem zrobić użytek z bramki bo szkoda jej. Z pomocą przyszedł też ChatGPT także nie myślcie, że to mój kod. Ja po prostu grzecznie poprosiłem AI ;)

Zaczynamy od założenia konta na

Code: Select all

https://home.openweathermap.org/users/sign_in
następnie po zalogowaniu
Image
wchodzimy w naszego użytkownika -> My API Keys
Z tego co pamiętam powinien już jakiś być jak nie generujemy nowy przyciskiem Generate - będzie potrzebny za chwile
Image
teraz prosimy kolegę o dane które będą potrzebne w openweather, zatem przechodzimy na

Code: Select all

https://chatgpt.com/
i w polu zapytania wpisujemy zapytanie o podanie danych lat i lon dla naszej ulicy. Przykładowo dla Skórzewa i ulicy Poznańskiej 98 - adres przypadkowy, będzie to wyglądać tak

Code: Select all

podaj mi lat i lon dla ulicy poznańska 98 60-185 Skórzewo, sprawdź dane dokładniej tak aby podać je z większą precyzją do użycia potem w kluczu api z openweather
odpowiedź jaką zwrócił mi ChatGPT to

Code: Select all

Dobrze — sprawdziłem ponownie źródła i przygotowałem precyzyjne współrzędne gotowe do użycia w zapytaniu do OpenWeather (formaty i przykłady poniżej).

Najdokładniejsze współrzędne (zalecane)

Decimalnie (WGS-84, 6 miejsc po przecinku): 52.395413, 16.800604. 
BIP Powiat Poznański

DMS: N 52° 23′ 43.487″, E 16° 48′ 02.174″. 
BIP Powiat Poznański

Uzasadnienie: ten punkt pochodzi z raportu/pomiaru opublikowanego w BIP powiatu, opisującego lokalizację przy sklepie NETTO (dla adresu Poznańska 98). W tym samym dokumencie występuje też lekko inny punkt przy sklepie: 52.395620, 16.800606 (różnica ~0.000207°), który reprezentuje drugi punkt pomiarowy przy obiekcie. 
BIP Powiat Poznański

Co użyć do OpenWeather API

OpenWeather przyjmuje lat, lon w formacie dziesiętnym. Dla pewności i precyzji sugeruję podać 6 miejsc po przecinku (to ~0.11 m rozdzielczości), np.:
zatem

Code: Select all

lat: 52.395413
lon:16.800604
Może być tak że zapyta nasz czy szukać dokładniej także warto poprosić ;)
Teraz logujemy się do RPI za pomocą terminala - ja używam putty i tworzymy sobie w katalog

Code: Select all

mkdir Weather
następnie tworzymy plik .sh

Code: Select all

sudo nano get_openweather.sh 
teraz najlepiej wkleic do notatnika poniższy kod

Code: Select all

#!/bin/bash

# Pobranie aktualnego czasu
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP" > /home/pi/Weather/openweather-timestamp.txt

# Pobranie danych pogodowych
WEATHER=$(curl -s "https://api.openweathermap.org/data/2.5/weather?lat=111.111&lon=222.222&appid=3333333333&units=metric")

# Zapis temperatury i wilgotności w jednym pliku (temperatura pierwsza, wilgotność pod spodem)
(
  echo "$WEATHER" | jq '.main.temp'
  echo "$WEATHER" | jq '.main.humidity'
) > /home/pi/Weather/openweather-temp_humidity.txt

# Zapis pozostałych wartości do osobnych plików
echo "$WEATHER" | jq '.main.feels_like' > /home/pi/Weather/openweather-feels_like.txt
echo "$WEATHER" | jq '.main.pressure' > /home/pi/Weather/openweather-pressure.txt
echo "$WEATHER" | jq '.rain["1h"] // 0' > /home/pi/Weather/openweather-rain.txt
echo "$WEATHER" | jq '.snow["1h"] // 0' > /home/pi/Weather/openweather-snow.txt
echo "$WEATHER" | jq '.wind.speed' > /home/pi/Weather/openweather-wind_speed.txt
echo "$WEATHER" | jq '.wind.gust // 0' > /home/pi/Weather/openweather-wind_gust.txt

# Pobranie danych jakości powietrza
AIR=$(curl -s "https://api.openweathermap.org/data/2.5/air_pollution?lat=111.111&lon=222.222&appid=3333333333")

# Zapis PM2.5 i PM10
echo "$AIR" | jq '.list[0].components.pm2_5' > /home/pi/Weather/openweather-pm25.txt
echo "$AIR" | jq '.list[0].components.pm10' > /home/pi/Weather/openweather-pm10.txt

# --- Obliczanie punktu rosy na podstawie temp i wilgotności ---
TEMP=$(echo "$WEATHER" | jq '.main.temp')
HUMIDITY=$(echo "$WEATHER" | jq '.main.humidity')

DEW_POINT=$(awk -v T="$TEMP" -v RH="$HUMIDITY" 'BEGIN {
  a = 17.27
  b = 237.7
  gamma = (a * T) / (b + T) + log(RH / 100)
  Td = (b * gamma) / (a - gamma)
  printf "%.2f\n", Td
}')

echo "$DEW_POINT" > /home/pi/Weather/openweather-dew_point.txt
Teraz CTRL+H i robimy podmianę

Code: Select all

appid=3333333333    podmieniamy na appid=nasz_klucz_api gdzie nasz_klucz_api to ten z pierwszego kroku
lat=111.111    podmieniamy na lat=wartość_lat_jaka_dobral_ChatGPT
lon=222.222    podmieniamy na lon=wartosc_lon_jaka_dobral_ChatGPT
tak podmieniony plik wklejamy klikając PPM w pustym polu otwartego edytora nano i następnie wciskamy CTRL+O zapisując plik i potem CTRL+X żeby wyjść
co nam daje powyższy skrypt ?
wrzuca temp i humi do jednego pliku
wrzuca temp odczuwalną *C
ciśnienie hPa
opad deszczu z godziny mm/h jak nie ma wpisuje 0
opad śniegu z godziny mm/h jak nie ma wpisuje 0
prędkość wiatru m/s
podmuch wiatru m/s jak nie ma to 0
pm 2.5 ug/m^3 - ja potem skaluje to w chmurze mnożąc przez 100 i dzieląc przez 25 uzyskując % normy
pm 10 ug/m^3 - ja potem skaluje to w chmurze mnożąc przez 100 i dzieląc przez 50 uzyskując % normy
na końcu liczy punkt rosy :) - pare razy w zimie ratowało mi to przypominając o wyłożeniu maty na szybę

teraz mając wypełniony plik nadajemy mu uprawnienia

Code: Select all

sudo chmod +x /home/pi/Weather/get_openweather.sh 
teraz otwieramy crona

Code: Select all

crontab -e
i wklejamy

Code: Select all

*/10 * * * * /home/pi/Weather/get_openweather.sh
w efekcie co 10 min będą się zapisywały dane do pliku ew. 10 zamieniamy na 1 aby pierwsza paczka plików się zrobiła
wciskamy CTRL +O zapisując crona i wychodząc CTRL+X
teraz pora na edycje pliku yaml

Code: Select all

 sudo nano /etc/supla-device.yaml
przy takim ułożeniu ja mam taką sekwencję kanałów

Code: Select all

#Skorzewo - Temperatura i Wilgotnosc
  - type: ThermHygroMeterParsed
    source:
      type: File
      file: "/home/pi/Weather/openweather-temp_humidity.txt"
      expiration_time_sec: 380
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    humidity: 1
    multiplier_temp: 1
    multiplier_humi: 1
#Temperatura Odczuwalna
  - type: ThermometerParsed
    source:
      type: File
      file: "/home/pi/Weather/openweather-feels_like.txt"
      expiration_time_sec: 600
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    multiplier_temp: 1
#Ciśnienie
  - type: GeneralPurposeMeasurementParsed
    name: Ciśnienie
    default_unit_after_value: hPa
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-pressure.txt"
      expiration_time_sec: 800
    parser:
      type: Simple
      refresh_time_ms: 5000
#Opad Deszczu
  - type: GeneralPurposeMeasurementParsed
    name: Opad_Deszczu
    default_unit_after_value: mm/h
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-rain.txt"
      expiration_time_sec: 800
    parser:
      type: Simple
      refresh_time_ms: 5000
#Opad Sniegu
  - type: GeneralPurposeMeasurementParsed
    name: Opad_Sniegu
    default_unit_after_value: mm/h
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-snow.txt"
      expiration_time_sec: 800
    parser:
      type: Simple
      refresh_time_ms: 5000
#Predkosc Wiatru
  - type: GeneralPurposeMeasurementParsed
    name: Predkosc_Wiatru
    default_unit_after_value: m/s
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-wind_speed.txt"
      expiration_time_sec: 800
    parser:
      type: Simple
      refresh_time_ms: 5000
#Podmuch Wiatru
  - type: GeneralPurposeMeasurementParsed
    name: Podmuch_Wiatru
    default_unit_after_value: m/s
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-wind_gust.txt"
      expiration_time_sec: 800
    parser:
      type: Simple
      refresh_time_ms: 5000
#PM2.5
  - type: GeneralPurposeMeasurementParsed
    name: PM2.5
    default_unit_after_value: "%"
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-pm25.txt"
      expiration_time_sec: 380
    parser:
      type: Simple
      refresh_time_ms: 5000
#PM10
  - type: GeneralPurposeMeasurementParsed
    name: PM2.5
    default_unit_after_value: "%"
    default_value_precision: 1
    value: 0
    source:
      type: File
      file: "/home/pi/Weather/openweather-pm10.txt"
      expiration_time_sec: 380
    parser:
      type: Simple
      refresh_time_ms: 5000
#Temperatura Punktu Rosy
  - type: ThermometerParsed
    source:
      type: File
      file: "/home/pi/punkt-rosy/sensor-tpr.txt"
      expiration_time_sec: 600
    parser:
      type: Simple
      refresh_time_ms: 5000
    temperature: 0
    multiplier_temp: 1
którą dodajemy na końcu pliku.
wciskamy teraz CTRL+O zatwierdzając zmiany a potem CTRL+X
restartujemy SD

Code: Select all

sudo systemctl restart supla-device.service
w chmurze powinny pojawić się nowe kanały
Przy pm25 i 10 mamy jednostkę p którą możemy przeskalować już w chmurze
Image
Finalnie jak to poukładamy to mamy podobnie jak u mnie :)
co do punktu rosy ja mam takie powiadomienia i mi się to w 90% sprawdzało ;)
You do not have the required permissions to view the files attached to this post.
Spełniony Automatyk / Mąż / Świeżo Upieczony Ojciec
User avatar
vajera
Posts: 7285
Joined: Wed Oct 31, 2018 7:58 am
Location: Biedrusko
Has thanked: 289 times
Been thanked: 161 times

Post

KPR!
Bramka Zigbee <=> SUPLA
Więcej informacji tutaj:
https://forum.supla.org/viewforum.php?f=127
FAQ https://forum.supla.org/viewtopic.php?t=17277
User avatar
Zibi_007
Posts: 3985
Joined: Tue Oct 31, 2023 10:06 pm
Has thanked: 10 times
Been thanked: 31 times

Post

Fajne!
Może nawet wykopię swoje RPI i się pobawię :)
Image Wiesz, że Supla obsługuje Zigbee? Wstąp do Klubu Promila: https://forum.supla.org/viewtopic.php?t=18018
Image Szukasz nowego GG? Jest tutaj: https://forum.supla.org/viewtopic.php?t=18036
User avatar
klew
Posts: 13905
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Podpowiem tylko, że długość i szerokość geograficzną można po prostu z mapy Google (lub innej) odczytać. Po kliknięciu na punkt, współrzędne pojawiają się w polu wyszukiwania, albo po kliknięciu prawym przyciskiem.

Druga rzecz, open weather czyta z najbliższej stacji, więc możliwe że ten sam odczyt możesz mieć po prostu w cloud (oczywiście nie ma tam tych wszystkich pól)

No i trzecia rzecz: sd4linux ma wbudowany parser jsona. Nie trzeba tego prasować w skrypcie. Wystarczy pobrać plik.
Najlepsze suple dla Twojego domu :mrgreen:

Return to “FAQ / Jak to zrobić”