Gratulacje, super robota!
Przypomina mi się to co kiedyś @sztywniak robił z fibaro - to były czasy
Cześć!!
Dzięki za dobre słowo.
Czy próbowałeś odpalać skrypty z innego urządzenia niż to na którym był OM? pytam pod kątem RPi[/li][/list]
Tak. Na RPi jest Java, powinno działać. Niestety moje PI leży gdzieś zakurzone na półce. Może w weekend je odkurzę.
Ten skrypt jest w Javie jest dlatego, że OM jest napisany w Javie i było mi prościej napisać kod na podstawie zdekompilowanego kodu. Możliwe, że w weekend przepiszę to samo w PHP, które uruchamia się szybciej.
Wydaje mi się że twoje skrypty nie zastąpią moduły GATE. Z tego co wiem gate ma wysyłać polecenia REST do innych urządzeń, chyba nie ma planowanego Grenton API
Nie zastąpią? Potrzymaj mi piwo!!
Nie będzie to rozwiązanie tak dobre jak moduł Gate. Trochę sztukowane, ale jak coś jest głupie i działa ...
Podstawowym problem jest to, że nie namierzyłem jeszcze metody na Clu, która pozwoliłaby wysłać wiadomość do telefonu. Zawsze to telefon inicjalizuje połączenie a CLU odpowiada. Dlatego potrzebne jest miejsce, żeby zbierać komunikaty a skrypt będzie je na bieżąco pobierał. Np co sekundę, minutę, godzinę.
Po pierwsze potrzebujemy po stronie LUA coś na kształt stosu. Dwie funkcje.
Jedna pozwalająca na dodawanie elementów na stos.
function put(message)
-- inicjalizacja pustej tablicy globalnie
if (_G['messages'] == nil) then
_G['messages'] = {}
end
-- niestety nie ma biblioteki table na Grentonie
-- table.insert(_G['messages'], message);
_G['messages'][#_G['messages'] + 1] = message
end
Druga, zdejmująca wiadomości ze stosu:
local function get()
-- gdy pusto nil
if (_G['messages'][#_G['messages']] == nil) then
return nil
end
-- wiadomosc z samej gory
tmp = _G['messages'][#_G['messages']];
-- usuniecie pobranej wartosci
_G['messages'][#_G['messages']] = nil
return tmp
end
Jak to działa? Przykładowe wywołanie w zewnętrznym edytorze (mam zainstalowane lua 5.1 w systemie i większość kodu piszę na boku, dopiero jak działa to wrzucam do CLU)
put("test message")
print(get())
put ("test message 3")
put("test message 2")
print(get())
print(get())
Wynik:
test message
test message 2
test message 3
Dodałem te dwie funkcje jako "skrypty" na CLU.
Teraz na CLU dla jakiegoś zdarzenia na Clu muszę dodać wiadomość. Np. naciśnięcie przycisku lub gdy temperatura spadnie poniżej jakieś wartości na termostacie. Pozostanę przy przycisku.
Mój przycisk na zdarzeniu OnClick ma przypisane takie wywołanie: DOM->x200003152_DOUT1->Switch(0). Zamiast tego napiszę skrypt:
DOM->x200003152_DOUT1->Switch(0)
put("Swiatlo w pokoju ma stan: " .. DOM->x200003152_DOUT1->Value )
I nazwę go "light_switch" i przypiszę do OnClick w miejsce DOM->x200003152_DOUT1->Switch(0).
Teraz, gdy włączam światło w pokoju do mojej tablicy _G['messages'] dodawane są kolejne komunikaty. Włączyłem i wyłączyłem światło na digitalin parę razy.
Za pomocą mojego skryptu, mogę je pobierać wiadomości.
D:\testy>java -jar simple-client-1.0.jar -c properties-dist.xml -f get -ip 192.168.2.100 -p nil
Swiatlo w pokoju ma stan: 0.000000
D:\testy>java -jar simple-client-1.0.jar -c properties-dist.xml -f get -ip 192.168.2.100 -p nil
Swiatlo w pokoju ma stan: 1.000000
D:\testy>java -jar simple-client-1.0.jar -c properties-dist.xml -f get -ip 192.168.2.100 -p nil
nil
I teraz można z tego zrobić "rest" przez curl.
Np. tak:
java -jar simple-client-1.0.jar -c properties-dist.xml -f get -ip 192.168.2.100 -p nil | curl -d @- https://api.czegostam.com
Podsumowując:
- Oczywiście, przez moduł Gate obejdzie się bez drutowania.
- Da się za pomocą tego rozwiązania wysłać wiadomości przez http żeby zintegrować "rest api".
- Trzeba tylko odpytywać CLU co jakiś czas, czy przypadkiem nie ma nowej wiadomości w globalnej tablicy _G['messages'].
- W skrypcie put wypada dodać ograniczenie, że można tam przechować max 100 wiadomości, żeby nie zapełnić całej pamięci CLU.
- Będzie jakieś opóźnienie. Może się okazać, że CLU szybciej zapisuje niż worker czyta. Dlatego napisałem, że rozwiązanie da radę dla 80% przypadków. Gdy wymagasz natychmiastowego działania, to by trzeba było odpytywać CLU np. co sekundę. Chyba, że znajdę funkcję która wysyła wiadomość na podany adres ip. Wtedy nie będzie trzeba używać tego stosu.
Jeszcze raz dzięki czendler za pytania
Pozdrawiam,
T