Dzisiaj chciałem się podzielić zastosowaną przeze mnie implementacją powiadomień push na sterowniku PLC Wago.
Powiadomienia są wysyłane za pośrednictwem serwisu
pushover.net oczywiście takich usług jest wiele ja akurat wybrałem tę.
W Pushover mamy 7 dniowy okres darmowy potem licencja kosztuje $5 i tu uwaga jednorazowo na platformę (android, iOS lub desktop), więc płacąc jednorazowo $5 na androida dożywotnio możemy odbierać powiadomienia na urządzeniach z androidem.
Komunikacja z API Pushover odbywa się za pośrednictwem protokołu HTTPS więc koniczne jest włączenie do projektu biblioteki
WagoLibHttps_01.lib, którą można pobrać ze strony Wago. Na wstępie warto sprawdzić wymaganą wersję firmwaru sterownika w dokumentacji biblioteki bo może okazać się konieczna aktualizacja (tak było w moim przypadku).
Zdefiniowałem blok funkcyjny postaci:
FUNCTION_BLOCK PUSHSEND
VAR_INPUT
xDoit : BOOL;
sMessage : STRING;
sPriority : STRING(2) := '0';
END_VAR
VAR
wState : WORD;
oHttpsPost : HTTPS_POST;
xHttpsSend : BOOL;
diError : DINT;
sStatus : STRING;
sReqData : STRING(200);
sHeaderData : STRING(105) := 'token=TOKEN&user=USER_KEY&retry=300&expire=3600&message=';
abResponse : ARRAY [0..gcHTTPS_dwRxBufferSize] OF BYTE;
END_VAR
sReqData := CONCAT (sHeaderData, sMessage);
sReqData := CONCAT (sReqData, '&priority=');
sReqData := CONCAT (sReqData, sPriority);
oHttpsPost(sServerName:='api.pushover.net',
sMethod:='/1/messages.json',
sContentType:='application/x-www-form-urlencoded',
pabReqData:=ADR(sReqData),
uiReqDataCount:=LEN(sReqData),
xSend:=xHttpsSend,
diError=> diError,
sStatus=> sStatus,
tTimeOut:= t#5s,
abContentData:=abResponse);
CASE wState OF
0: (* IDLE - wait for something to do *)
IF xDoIt THEN
xHttpsSend := TRUE; (* Send HTTPS-POST request *)
wState := 10;
END_IF
10: (* Wait for HTTPS-POST response data *)
IF NOT xHttpsSend THEN
wState := 999;
END_IF
999: (* *)
xDoIt := FALSE;
wState := 0;
END_CASE
Wartości dla TOKEN i USER_KEY należy wprowadzić zgodne z podanymi na koncie Pushover.
Blok przyjmuje 3 zmienne wejściowe, xDoit aktywuje wysłanie powiadomienia, sMessage to string z wiadomością, którą zobaczymy w powiadomieniu oraz sPriority opcjonalny priorytet jaki będzie nadany powiadomieniu push (dostępne wartości to -2, -1, 0, 1, 2 , uwaga wartości przekazujemy jako string).
Powyższy blok dopinam do każdego zdarzenia, które ma wysłać powiadomienie push, np. otwarcie bramy garażowej, włączenie alarmu, jakieś zdarzenie ze stacji pogodowej itp.
Działa to naprawdę wyśmienicie, powiadomienia dochodzą niemal natychmiast. Oprócz treści wiadomości i priorytetu można także opcjonalnie przekazać tytuł wiadomości, określony dźwięk jaki ma zostać odtworzony na urządzeniu, określić urządzenie lub grupę urządzeń na które ma zostać wysłane powiadomienie i inne rzeczy opisane w dokumentacji API Pushover.
Do powyższego bloku funkcyjnego warto dodać jeszcze funkcje ograniczającą ilość wysyłanych powiadomień w jednostce czasu aby po pierwsze nie zostać zaspamowanym powtarzającymi się powiadomieniami a po drugie żeby nie dostać bana z pushover.net.
Mam nadzieję, że ten opis będzie pomocny dla każdego szukającego sposobu implementacji powiadomień push na sterowniku Wago. Uwagi mile widziane.