Dzisiaj druga część artykułu poświęconego zarządzaniu zadaniami. Dzisiaj zajmiemy się tym co czyni nasz dom inteligentny czyli automatyzacjami. Omówimy to na przykładzie powiadomień bazujących na wcześniej zintegrowanym kalendarzu i na zdarzeniach w nim określonych. Jak łatwo się domyślić do poniższych ćwiczeń będziemy potrzebowali wiedzy zdobytej wcześniej. Wszystkich tych, którzy nie przeszli przez pierwszą część odsyłam do niej.

Aby w pełni wykorzystać możliwości automatyzacji zadań z kalendarza musimy najpierw przyjrzeć się encji stworzonej przez dany kalendarz i poznać jej elementy składowe. Zatem popatrzmy na przykładową encję z mojego kalendarza Formuły 1.

Jak widać powyżej, każda z encji kalendarza składa się z następujących właściwości (większość z nich jest oczywista ale opiszę wszystkie dla porządku):

  • message - odpowiada tytułowi zdarzenia w kalendarzu
  • all_day - czy zdarzenia jest całodzienne
  • start_time - czas rozpoczęcia zdarzenia
  • end_time - czas zakończenia zdarzenia
  • location - lokalizacja zdarzenia
  • description - opis zdarzenia
  • offset_reached - czy osiągneliśmy ustalony czas przed wydarzeniem

Z powyższych właściwości jedyną, która może budzić jakieś wątpliwości jest offset_reached. Jest to informacja czy dane zdarzenie osiągnęło czas startu zdarzenia wcześniejszy o podany offset. Czyli np. Jeżeli zdarzenie ma start rozpoczęcia na 13:00, a podany offset to 30 min. To właściwość offset_reached zmieni wartość na true o godzinie 12.30. Dzięki temu w łatwy sposób możemy określić w automatyzacji aby pewne rzeczy działy się wcześniej niż dokładny start zdarzenia.

No ale pozostaje pytanie w jaki sposób podajemy ten offset? No wiec podajemy go w tytule zdarzenia po umieszczeniu znacznika, który informuje o tym że liczba po tym znaczniku to właśnie nasza wartość offsetu. Standardowym znacznikiem są dwa wykrzykniki i myślnik. Czyli tytuł zdarzenia gdzie wartość offsetu to 30 minut powinien wyglądać podobnie do tego:

Formuła 1 Kwalifikacje !!-30

Jeżeli z jakiegoś powodu chcemy zmienić ten znacznik na coś innego niż !!- to dla każdego kalendarza w pliku google_calendars.yaml możemy zdefiniować wartość offsetu indywidualnie. Przykładowy wpis w pliku zmieniający offset na -- może wyglądać następująco:

- cal_id: "<id>@group.calendar.google.com"
  entities:
  - device_id: formula_1_calendar
    name: Formuła 1
    track: true
    offset: "--"

Ciekawym rozwiązaniem jest również używanie właściwości search, która ze wszystkich zdarzeń wyłapie tylko te, które w tytule zawierają wyszukiwaną frazę. Przykładowy wpis w pliku  google_calendars.yaml, który wyciągnie tylko zdarzenia kwalifikacji wygląda następująco:

- cal_id: "<id>@group.calendar.google.com"
  entities:
  - device_id: formula_1_calendar
    name: Formuła 1
    track: true
    search: "Kwalifikacje"

Oczywiście można łączyć właściwość search i offset w ramach jednej konfiguracji.

Mając całą powyższą wiedzę możemy teraz w łatwy sposób stworzyć automatyzację wykonującą się na 30 minut przed danym wydarzeniem. Wystarczy monitorować wartość właściwości offset_reached. Gdy przyjmie wartość true możemy uruchomić akcję np.: powiadomienie. Przykładowy proces w Node-RED może wyglądać następująco:

W pierwszym nodzie odczytujemy encję kalendarza przy użyciu nodu Events: state. Odczytaną encję przekazujemy do nodu typu Switch gdzie weryfikujemy wartość właściwości offset_reached. W przypadku gdy jest ona równa true uruchamiamy podproces Powiadomienia. Dla pewności poniżej podaje konfigurację pierwszych dwóch nodów:

Dodam jeszcze, że cała encja ma status off za wyjątkiem momentu kiedy jest jakieś aktywne zdarzenie. W takim przypadku przyjmuje status on. Czyli jeżeli mamy w kalendarzu zdarzenie zaplanowane od 13.00 do 14.00 to encja dokładnie w tym przedziale przyjmie wartość on. Wiedząc o tym w łatwy sposób możemy określić procesy, które mają wystartować dokładnie w momencie rozpoczęcia zdarzenia.

Mając powyższą wiedzę możemy uruchamiać dowolny proces bazując na kalendarzu. Na przykład poza prostym powiadomieniem możemy do kalendarza przenieść np.: zarządzanie harmonogramem automatycznego odkurzacza czy zmienić sposób działania systemu bezpieczeństwa gdy w kalendarzu jest informacja o tym, że jesteśmy na wakacjach. Tak naprawdę możemy wykonać dowolne inne czynności jakie nam przyjdą do głowy.

Na koniec pozostaje jeszcze pytanie co jeżeli nie możemy lub nie chcemy modyfikować tytułu zdarzenia? Wtedy z pomocą może nam przyjść nod function, w którym sami możemy wyliczyć czas przed rozpoczęciem zdarzenia bazując na wartości właściwości start_time.

Omawiam to bardziej szczegółowo na dołączonym do tego artykułu filmie.

Wszystkich którzy chcą dowiedzieć się więcej o użytych w procesie nodach, w szczególności Switch, Function i Podprocesie odsyłam do cyklu nauki Node-RED na moim kanale YouTube.

To tyle w temacie kalendarzy. Zachęcam do eksperymentowania i tradycyjnie komentarze są Wasze. Do następnego artykułu.