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/Zaczynamy od założenia konta na
Code: Select all
https://home.openweathermap.org/users/sign_inwchodzimy 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
teraz prosimy kolegę o dane które będą potrzebne w openweather, zatem przechodzimy na
Code: Select all
https://chatgpt.com/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 openweatherCode: 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.:Code: Select all
lat: 52.395413
lon:16.800604Teraz logujemy się do RPI za pomocą terminala - ja używam putty i tworzymy sobie w katalog
Code: Select all
mkdir WeatherCode: Select all
sudo nano get_openweather.sh 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
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
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
teraz mając wypełniony plik nadajemy mu uprawnienia
Code: Select all
sudo chmod +x /home/pi/Weather/get_openweather.sh Code: Select all
crontab -eCode: Select all
*/10 * * * * /home/pi/Weather/get_openweather.shwciskamy 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
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: 1wciskamy teraz CTRL+O zatwierdzając zmiany a potem CTRL+X
restartujemy SD
Code: Select all
sudo systemctl restart supla-device.service
Przy pm25 i 10 mamy jednostkę p którą możemy przeskalować już w chmurze
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

