Forum użytkowników automatyki budynkowej
Inne => Grenton => Wątek zaczęty przez: T w Grudzień 03, 2017, 05:14:10 pm
-
Cześć,
Miałem kilka wolnych godzin i ostatecznie udało mi się zrozumieć jak działa szyfrowanie w Grentonie. Szczegółowy opis i linki do kodu pod adresem:
http://domktorymysli.pl/2017/12/grenton-komunikacja-2/
TL/DR
- to nie hackowanie to inżynieria wsteczna.
- prawdopodobnie da się wyłączyć szyfrowanie na Clu z poziomu OMa w właściwościach projektu.
- póki nie ma modułu Gate, można stworzyć tymczasową integrację z innymi systemami używając API do komunikacji z telefonem.
- link do kodu na github: https://github.com/Domktorymysli.
Co dalej?
- postaram się udokumentować API.
- jak znajdę trochę czasu to poprawię klienta i napiszę instrukcję.
- @andre pamiętam o Tobie, w tej chwili wydaje mi się, że bardzo łatwo pobierać informację o temperaturze z Clu i zrobić na podstawie tych danych wykres. Jak będę miał chwilę to opiszę jak to zrobić.
- może napiszę adapter Grentona dla Domoticz :D
Pozdrawiam,
T
-
Ogromne brawa
Mam nadzieję że uda Ci się usprawnić komunikację Grentona ze światem zewnętrznym za pomoca Domoticza, bo producent jest nierychliwy - o Gate była oficjalnie mowa już półtora roku temu, nie wspominając o takiej podstawowej rzeczy jako powiadomienia push np...
-
@janosick
Dzięki za dobre słowo. Na razie czytam dokumentację Domoticza. Może mi się uda coś napisać, zanim zostanie wydany moduł Gate? :D
@andre
Żeby odczytać temperaturę do wykresów. W LUA musisz napisać skrypt np. taki:
temperatureSensorOne = DOM->x113247182_ONEW_SENSOR1->Value
temperatureSensorTwo = DOM->x154160907_ONEW_SENSOR1->Value
return "{\"t1\":" .. temperatureSensorOne .. ",\"t2\":" .. temperatureSensorTwo .. "}"
Gdzie wynik to np. JSON, XML czy jakiś Twój własny format. Musisz nazwać tę funkcję np. "test"
I za pomocą klienta (https://github.com/Domktorymysli/grenton-simple-client/blob/master/src/main/java/com/github/domktorymysli/grenton/simple_client/App.java) wysłać request do CLU. np. taki:
req:192.168.1.104:00e347:test(nil)
Gdzie "192.168.1.104" to adres ip na który clu odpowie. "00e347" to id requestu generowane losowo.
Potem na IP 192.168.1.104 port z którego wysłano wiadomość (tu widzę problem, bo to nie jest jeszcze nigdzie zdefiniowane :) ), CLU odpowie np. tak:
resp:192.168.2.200:0000e347:{"t1":23.500000,"t2":23.500000}
Pamiętaj, że limit na wiadomość to 2000 bajtów. Może w ciągu przyszłego tygodnia napiszę klienta, który będzie działał w dwie strony.
-
Super.
Generalnie takie RPi z zainstalowanym Domoticzem albo OpenHab byłoby świetnym magazynem na dane czyli np. historię temperatur i innych rzeczy. Czyli to o co chodzi andre. Bez potrzeby zewnętrznego Thingspeak'a.
Bardzo mocno Ci dopinguję, ja niestety jestem bardziej hardware niż software ;)
-
@T
Dziękuję za napisanie klienta, będzie trochę problem z testami bo domownicy protestują po restartach, natomiast integracja z Domoticz to świetny pomysł dla rozszerzenia integracji.
Ogólnie robisz wielką przysługę dla wszystkich użytkowników i firmy w sprawie zwiększenia bezpieczeństwa systemu zakładając, że ktoś od Grentona analizuje twoje wpisy a w to nie wątpię.
@janosick
RPi z zainstalowanym Domoticzem albo OpenHab byłoby świetnym magazynem na dane
W planach Grentona przewidziana jest chyba chmura i statystyki ale zaleta "swoich" danych jest nie do przecenienia.
-
@T
Dziękuję za napisanie klienta, będzie trochę problem z testami bo domownicy protestują po restartach, natomiast integracja z Domoticz to świetny pomysł dla rozszerzenia integracji.
Ogólnie robisz wielką przysługę dla wszystkich użytkowników i firmy w sprawie zwiększenia bezpieczeństwa systemu zakładając, że ktoś od Grentona analizuje twoje wpisy a w to nie wątpię.
@janosick
RPi z zainstalowanym Domoticzem albo OpenHab byłoby świetnym magazynem na dane
W planach Grentona przewidziana jest chyba chmura i statystyki ale zaleta "swoich" danych jest nie do przecenienia.
Z testami możesz się wstrzymać. To co zrobiłem, to komunikacja w jedną stronę. Mam już rozwiązanie działające dwie strony, ale muszę jeszcze nad nim chwilę posiedzieć. Myślę, że w weekend wrzucę dokładną instrukcję jak wszystko w miarę bezboleśnie odpalić.
Co do Domoticza to istnieją dwie opcje: plugin w Pythonie i plugin w c. Na tę chwilę będę celował w Pythona.
-
Cześć,
Z góry chciałem przeprosić, pisane na kolanie, ale mam mało czasu.
Skończyłem pisać pierwszą wersję klienta, który pozwala na wywołanie skryptów z CLU za pomocą komputera.
Pełny opis tutaj: http://domktorymysli.pl/2017/12/wlasny-modul-gate/
TL/DR
Popatrz na repo: https://github.com/Domktorymysli
ściągnij jara: http://domktorymysli.pl/files/simple-client-1.0.jar
stwórz własny plik konfiguracyjny podobny do tego: https://github.com/Domktorymysli/grenton-simple-client/blob/master/properties-dist.xml
uruchom:
java -jar simple-client-1.0.jar -c properties-dist.xml -f hello_world -ip 192.168.2.100 -p nil
otrzymasz odpowiedź: hello world
Możesz napisać skrypt i pobierać dane z CLU np. w celu ich logowania. Możesz wywoływać sceny, bo dostałeś maila na telefon. Co tylko chcesz.
Pozdrawiam,
T
-
Gratulacje, super robota!
Przypomina mi się to co kiedyś @sztywniak robił z fibaro - to były czasy :'(
Kilka uwag odemnie:
- 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 :(
- Czy próbowałeś odpalać skrypty z innego urządzenia niż to na którym był OM? pytam pod kątem RPi
-
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
-
Cześć,
Przepisałem klienta na PHP. Na RPi włącza się szybciej niż Java. Pisałem to na php 7.1 ale na PHP >=5.6 powinno działać.
https://github.com/Domktorymysli/grenton-client-php
D:\Domktorymysli\grenton-php\examples\simple_client>php simple_client.php grenton:exec --help
Usage:
grenton:exec [options] [--] <c>
Arguments:
c Plik konfiguracyjny. Zobacz przykladowy plik properties-dist.xml
Options:
-f, --function=FUNCTION Nazwa funkcji na CLU
-p, --parameters=PARAMETERS Parametry funkcji, oddzielone spacją (multiple values allowed)
-i, --i=I Ip zwrotne
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
Help:
Skrypt pozwalający na zdalne wywoływanie funkcji na CLU firmy Grenton.
Przykładowe wywołanie:
php simple_client.php grenton:exec ../properties-dist.xml -f test -p param1 -p param2 -i 10.20.30.41
Sprawdziłem też Domoticz i OpenHab. Postanowiłem, że z integracją Grentona będę celował w OpenHab. Głównie dlatego, że jest w Javie i wydaje się bardziej stabilny niż Domoticz. Może się mylę?
Wygląda na to, że będę musiał dopisać własną warstwę między Grentonem a OpenHab w LUA. Coś na kształt toolkita dla Fibaro (https://github.com/Krikroff77/Fibaro-HC2-Lua-Framework).
Taki toolkit pozwalałby na następujące rzeczy:
- serailizowanie / deserializowanie obiektów do JSONa
- discovery - pobranie wszystkich pobranych urządzeń do Clu id / typ. Wygląda na to, że nie da się pobrać nazwy nadanej w OM.
- dodanie prostej kolejki fifo dla wiadomości które są nadawane z CLU (chyba, że znajdę sposób na wysłanie wiadomości z Clu. Coś na kształt Fibaro Net.*)
- pewnie mnóstwo rzeczy o których jeszcze nie wiem :)
Pozdrawiam,
T
-
Świetna robota. Trzymam kciuki za integrację z Openhab.