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

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

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

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: 55
Rejestracja: pt cze 07, 2019 9:08 am

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: 2256
Rejestracja: pt paź 28, 2016 10:56 pm
Lokalizacja: Kraków

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: 55
Rejestracja: pt cze 07, 2019 9:08 am

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: 2803
Rejestracja: pn gru 11, 2017 9:43 pm

Jest to instrukcja warunkowa.
Jeżeli warunek jest spełniony to zwracane jest 1, a jeśli nie to 0.
Czekam na kolejne Supla Offline Party 👍
myrcin
Posty: 55
Rejestracja: pt cze 07, 2019 9:08 am

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ę!
MiSiOr
Posty: 3
Rejestracja: sob mar 07, 2020 12:16 pm

Trochę pracy i chyba mam to.
Przekaźnik wpięty pod czujnik deszczu do sterownika Hunter.

IFTTT - codziennie o 4:00 "usługa Date & Time" wywołuję url "usługa WEBHOOKS" sceny 1
Scena 1 - Czujnik deszczu - podlewanie.

Kod: Zaznacz cały

{% set lokalizacja = 'https://www.yr.no/sted/Polen/Lillepolen/K%C4%99ty/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 > 10 ? 1 : 0 }}

Jak będzie deszcz >10 to warunek się spełni, w Akcji załączę przekaźnik i sterownik będzie myślał że jest deszcz i nie załączy podlewania.

Aby wyłączyć przekaźnik, IFTTT - codziennie o 8:00 "usługa Date & Time" wywołuję url "usługa WEBHOOKS" sceny 2
Scena 2 - Czujnik deszczu - podlewanie, wyłączenie czujnika.
Różnica w warunku jest niewielka,

Kod: Zaznacz cały

{{ calydeszcz < 10 ? 1 : 0 }}
. Jeżeli deszcz jest >10 to warunek się spełni, wykona się Akcja wyłączenie przekaźnika, czyli tak jakby reset ustawień i oczekiwanie na następni dzień.

Jak tylko będę miał części zasilacza, montuję w puszce podlewania.

Mam teraz pytanie, bo jestem noga w programowaniu.

Jak połączyć warunki temperatury i opadu deszczu? Chcę dla wykonania akcji ustawić temperaturę 7 stopni i opad 10mm.

Dzięki :)
mickiewisz
Posty: 1
Rejestracja: czw lip 08, 2021 11:07 am

Hej,

podłącze się z małym pytaniem.
Czy ten skrypt sprawdza coś więcej niż opad?
Jakoś nie mogę go rozgryźć. Zdaje się, że jest to język zapytań Twig, ale jakoś tego nie ogarniam.

Mogę prosić o małe wyjaśnienie, co do działania tego skryptu?

Pozdrawiam
Adam
ODPOWIEDZ

Wróć do „Pomysły i koncepcje”