Supla scripts - odczyt prognozy pogody

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
ciekawy_zycia
Posty: 42
Rejestracja: śr mar 06, 2019 8:35 am

sob mar 09, 2019 8:51 pm

Witam,
Chcialbym stworzyc nowy watek gdzie bedzie mozna udokumentowac jak pobierac dane dot prognozy pogody z ogolno dostepnych serwisow.

Ponizej kod ktory stworzylem ktory parsuje prognoze pogody z serwisu YR, w pierwszej lini ustalamy swoja lokalizacje, wynik mamy w tabeli prognoza ( w kazdym wierszu jest dzien, czas , opis, wiatr, kier_wiatru, temperaturai cisnienie)

Wynik wykonania:
Dnia 2019-03-09 o godz 22:00:00 bedzie Rain, opad wyniesie 1.1 mm, temp 5 wiatr 5.2 SW cisnienie 1002.6 hPa
Dnia 2019-03-10 o godz 00:00:00 bedzie Heavy rain, opad wyniesie 5.0 mm, temp 5 wiatr 5.3 SW cisnienie 1000.4 hPa
Dnia 2019-03-10 o godz 06:00:00 bedzie Partly cloudy, opad wyniesie 0 mm, temp 3 wiatr 9.3 WNW cisnienie 1003.3 hPa
Dnia 2019-03-10 o godz 12:00:00 bedzie Cloudy, opad wyniesie 0 mm, temp 7 wiatr 7.8 W cisnienie 1003.8 hPa
Dnia 2019-03-10 o godz 18:00:00 bedzie Rain, opad wyniesie 2.9 mm, temp 6 wiatr 2.5 SW cisnienie 1000.0 hPa
Dnia 2019-03-11 o godz 00:00:00 bedzie Heavy sleet, opad wyniesie 9.3 mm, temp 4 wiatr 2.5 NE cisnienie 993.5 hPa
Dnia 2019-03-11 o godz 06:00:00 bedzie Light rain, opad wyniesie 0.7 mm, temp 1 wiatr 6.5 WNW cisnienie 1001.3 hPa
Dnia 2019-03-11 o godz 12:00:00 bedzie Light rain, opad wyniesie 0.7 mm, temp 5 wiatr 5.5 W cisnienie 1006.1 hPa
Dnia 2019-03-11 o godz 18:00:00 bedzie Cloudy, opad wyniesie 0 mm, temp 2 wiatr 4.2 W cisnienie 1008.5 hPa
Dnia 2019-03-12 o godz 00:00:00 bedzie Partly cloudy, opad wyniesie 0 mm, temp 0 wiatr 4.3 W cisnienie 1012.1 hPa
Dnia 2019-03-12 o godz 06:00:00 bedzie Fair, opad wyniesie 0 mm, temp -1 wiatr 4.0 W cisnienie 1015.6 hPa
Dnia 2019-03-12 o godz 12:00:00 bedzie Partly cloudy, opad wyniesie 0 mm, temp 5 wiatr 5.2 W cisnienie 1017.6 hPa
Dnia 2019-03-12 o godz 19:00:00 bedzie Cloudy, opad wyniesie 0 mm, temp 0 wiatr 2.6 SSW cisnienie 1014.5 hPa
Dnia 2019-03-13 o godz 01:00:00 bedzie Cloudy, opad wyniesie 0 mm, temp 1 wiatr 5.3 SSE cisnienie 1009.1 hPa
Dnia 2019-03-13 o godz 07:00:00 bedzie Light rain, opad wyniesie 0.7 mm, temp 3 wiatr 6.4 SSW cisnienie 1005.2 hPa
Dnia 2019-03-13 o godz 13:00:00 bedzie Partly cloudy, opad wyniesie 0 mm, temp 7 wiatr 5.0 WSW cisnienie 1006.3 hPa

Kod

Kod: Zaznacz cały

{% set lokalizacja = 'http://www.yr.no/place/Poland/Other/RKS_Ursus_Warszawa/forecast_hour_by_hour.xml' %}
{% set prognozaXML= getUrl( lokalizacja ) | split('<time from="') %}
{% set prognoza = [] %}
{% set i = 1 %}
{% for item in prognozaXML %}
{% if i >1 %}
{% set dzien = item |split ('T')[0] %}
{% set czas = item |split ('T')[1] |split(' ')[0]|replace({'"' :''})%}
{% set opis = item| split ('name="')[1] | split('"')[0] %}
{% set opad = item| split ('precipitation value="')[1] | split('"')[0] %}
{% set kierunek= item| split ('code="')[1] | split('"')[0] %}
{% set predkosc = item| split ('mps="')[1] | split('"')[0] %}
{% set cisnienie = item| split ('unit="hPa" value="')[1] | split('"')[0] %}
{% set temp = item | split('<temperature unit="celsius" value="') [1] |split('"')[0] %}
{% set prognoza = prognoza | merge ([{ dzien: dzien, czas:czas, opis:opis, opad:opad, temperatura :temp, kierunek:kierunek,predkosc:predkosc, cisnienie:cisnienie}]) %}
{%endif %}
{%set i=i+1 %}
{% endfor %}
{% for item in prognoza %}
          Dnia {{item.dzien}} o godz {{item.czas}} bedzie {{item.opis}}, opad wyniesie {{item.opad}} mm, temp   {{item.temperatura}} wiatr {{item.predkosc}} {{item.kierunek}} cisnienie {{item.cisnienie}} hPa
{% endfor %}
Oczywiscie mozna moj kod wkleic do swojej sceny i pobrac wartosc z tabeli prognoza do tego zeby zrobic warunek np

Kod: Zaznacz cały

temp za ~3 godziny tj {{prognoza[3].czas}} bedzie {{prognoza[3].temperatura}} stopni celcjusza
albo w warunku dac:

Kod: Zaznacz cały

{{ prognoza[0].temperatura  <8}}
Bobek1983
Posty: 33
Rejestracja: pn sie 27, 2018 6:05 pm

pn lip 15, 2019 9:03 am

Czy jest możliwość na podstawie Twojego warunku sterowanie nawodnienie. Chciałbym moduł Yunshan podpiąć pod sterownik Rainbird w miejscu czujnika deszczu. W przypadku spełnienia warunku tj. był deszcz lub będzie w ciągu 15 godzin przekaźnik rozłączy styki czyli podlewanie nie wystąpi.... Da się to zrobić za pomocą skryptów fracz-a?
ciekawy_zycia
Posty: 42
Rejestracja: śr mar 06, 2019 8:35 am

pn lip 15, 2019 1:30 pm

tak jest to mozliwe, tj mozesz wykonac warunek (sprawdzenie pogody), ja licze to algortytmem ktory liczy jak dlugo podlewac opisalem parametry tego algorytmu to w watku o podlewaniu.
viewtopic.php?p=45404#p45404
myrcin
Posty: 41
Rejestracja: pt cze 07, 2019 9:08 am

pn wrz 30, 2019 8:45 pm

Próbowałem wykorzystać znaleziony tutaj kod do sprawdzania prognozy pogody. Chcę, zrobić prostą rzecz, jeśli opady całkowite przewidziane na dobę są/były wyższe niż X to Sonoff Basic wyłączy mi zasilanie pompy. Dzięki temu kiedy automatyka podlewania będzie próbowała podlać to woda nie poleci :)

Poniższy kod wykorzystałem w 'Odpowiedzi' i bardzo ładnie mi podaje całkowity deszcz.
Teraz w 'Warunku' wkleiłem ten sam kod i mam komunikat 'Warunek jest spełniony'. Nie rozumiem jaki warunek jest spełniony? Która konkretnie część jest spełniona?
Po usunięciu wszystkiego począwszy od {%set calydeszcz=0%} w dół 'Warunek nie jest spełniony'
Chciałbym aby warunkiem było całydeszcz > 2.
To na pewno jakiś banał ale zdaje się, że brakuje mi ogólnego zrozumienia działania warunków. Ktoś pomoże?

Kod: Zaznacz cały

{% set lokalizacja = 'https://www.yr.no/place/Poland/Masovia/J%C3%B3zef%C3%B3w/forecast.xml' %}
{% set prognozaXML= getUrl( lokalizacja ) | split('<time from="') %}
{% set prognoza = [] %}
{% set i = 1 %}
{% for item in prognozaXML %}
{% if i >1 %}
{% set dzien = item |split ('T')[0] %}
{% set czas = item |split ('T')[1] |split(' ')[0]|replace({'"' :''})%}
{% set opis = item| split ('name="')[1] | split('"')[0] %}
{% set opad = item| split ('precipitation value="')[1] | split('"')[0] %}
{% set kierunek= item| split ('code="')[1] | split('"')[0] %}
{% set predkosc = item| split ('mps="')[1] | split('"')[0] %}
{% set cisnienie = item| split ('unit="hPa" value="')[1] | split('"')[0] %}
{% set temp = item | split('<temperature unit="celsius" value="') [1] |split('"')[0] %}
{% set prognoza = prognoza | merge ([{ dzien: dzien, czas:czas, opis:opis, opad:opad, temperatura :temp, kierunek:kierunek,predkosc:predkosc, cisnienie:cisnienie}]) %}
{%endif %}
{%set i=i+1 %}
{% endfor %}

{%set calydeszcz=0%}

{%for item in prognoza %}
{%set calydeszcz = calydeszcz + item.opad%}
{%endfor %}
Awatar użytkownika
fracz
Posty: 1795
Rejestracja: pt paź 28, 2016 10:56 pm
Lokalizacja: Rybna

pn wrz 30, 2019 10:14 pm

Super!

Kod: Zaznacz cały

{% set lokalizacja = 'https://www.yr.no/place/Poland/Masovia/J%C3%B3zef%C3%B3w/forecast.xml' %}
{% set prognozaXML= getUrl( lokalizacja ) | split('<time from="') %}
{% set prognoza = [] %}
{% set i = 1 %}
{% for item in prognozaXML %}
{% if i >1 %}
{% set dzien = item |split ('T')[0] %}
{% set czas = item |split ('T')[1] |split(' ')[0]|replace({'"' :''})%}
{% set opis = item| split ('name="')[1] | split('"')[0] %}
{% set opad = item| split ('precipitation value="')[1] | split('"')[0] %}
{% set kierunek= item| split ('code="')[1] | split('"')[0] %}
{% set predkosc = item| split ('mps="')[1] | split('"')[0] %}
{% set cisnienie = item| split ('unit="hPa" value="')[1] | split('"')[0] %}
{% set temp = item | split('<temperature unit="celsius" value="') [1] |split('"')[0] %}
{% set prognoza = prognoza | merge ([{ dzien: dzien, czas:czas, opis:opis, opad:opad, temperatura :temp, kierunek:kierunek,predkosc:predkosc, cisnienie:cisnienie}]) %}
{%endif %}
{%set i=i+1 %}
{% endfor %}
{%set calydeszcz=0%}
{%for item in prognoza %}
{%set calydeszcz = calydeszcz + item.opad%}
{%endfor %}
{{ calydeszcz > 20 ? 1 : 0 }}
Ważne, żebyś nie miał pustych linii pomiędzy w warunku, bo inaczej to traktuje jako "coś prawdziwego" i spełnia warunek.

Dopisałem na końcu to co Cię interesuje.

EDIT: Wrzuciłem poprawkę, dzięki której już można pisać puste linie dla czytelności tego "kodu". Nie są one brane pod uwagę.
myrcin
Posty: 41
Rejestracja: pt cze 07, 2019 9:08 am

pt paź 04, 2019 6:53 pm

Dzięki za pomoc.

Możesz mi wyjaśnić co daje ? 1 : 0 w tej linijce którą dodałeś?

Kod: Zaznacz cały

{{ calydeszcz > 20 ? 1 : 0 }}
Awatar użytkownika
lesny8
Posty: 986
Rejestracja: pn gru 11, 2017 9:43 pm

pt paź 04, 2019 8:17 pm

Jest to instrukcja warunkowa.
Jeżeli warunek jest spełniony to zwracane jest 1, a jeśli nie to 0.
Pomóżcie proszę choć odrobinę
https://pomagam.pl/af3hwf6c
myrcin
Posty: 41
Rejestracja: pt cze 07, 2019 9:08 am

pt paź 04, 2019 8:24 pm

lesny8 pisze:
pt paź 04, 2019 8:17 pm
Jest to instrukcja warunkowa.
Jeżeli warunek jest spełniony to zwracane jest 1, a jeśli nie to 0.
Bardzo dziękuję!
ODPOWIEDZ