Grenton - API / Komunikacja z telefonem

  • 10 Odpowiedzi
  • 4417 Wyświetleń

0 użytkowników i 1 Gość przegląda ten wątek.

*

Offline T

  • ** 27
  • 2
  • Nazwa i wersja ID: T
Grenton - API / Komunikacja z telefonem
« dnia: 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






*

Offline janosick

  • ** 51
  • 0
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #1 dnia: Grudzień 03, 2017, 11:51:31 pm »
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...
*

Offline T

  • ** 27
  • 2
  • Nazwa i wersja ID: T
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #2 dnia: Grudzień 04, 2017, 12:04:17 am »
@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.

*

Offline janosick

  • ** 51
  • 0
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #3 dnia: Grudzień 04, 2017, 08:09:52 am »
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 ;)
*

Offline andre

  • Moderator Globalny
  • ***** 258
  • 3
  • Nazwa i wersja ID: HA(AIS)+HC2 4.570,GRENTON1.0+LK v2.0+BLE+RPi...
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #4 dnia: Grudzień 07, 2017, 01:02:32 am »
@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
Cytuj
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.
*

Offline T

  • ** 27
  • 2
  • Nazwa i wersja ID: T
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #5 dnia: Grudzień 07, 2017, 01:30:42 am »
@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
Cytuj
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.



*

Offline T

  • ** 27
  • 2
  • Nazwa i wersja ID: T
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #6 dnia: Grudzień 09, 2017, 03:54:51 pm »
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






*

Offline czendler

  • ** 35
  • 2
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #7 dnia: Grudzień 11, 2017, 09:35:24 am »
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
fibaro
*

Offline T

  • ** 27
  • 2
  • Nazwa i wersja ID: T
Odp: Grenton - API / Komunikacja z telefonem
« Odpowiedź #8 dnia: Grudzień 12, 2017, 12:52:11 am »
    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
     
    *

    Offline T

    • ** 27
    • 2
    • Nazwa i wersja ID: T
    Odp: Grenton - API / Komunikacja z telefonem
    « Odpowiedź #9 dnia: Grudzień 17, 2017, 12:20:43 am »
    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
    *

    Offline Rybczyk

    • * 21
    • 0
    Odp: Grenton - API / Komunikacja z telefonem
    « Odpowiedź #10 dnia: Grudzień 17, 2017, 06:03:56 pm »
    Świetna robota. Trzymam kciuki za integrację z Openhab.