Neuer Adapter: ioBroker.stiebel-lwz / ioBroker.stiebel-isg

Wie man einen Adapter entwickelt, oder wie man debuggen kann.
Antworten
darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Neuer Adapter: ioBroker.stiebel-lwz / ioBroker.stiebel-isg

Beitrag von darkiop » 18.05.2018, 23:10

Michael (unltdnetworx) hat einen ähnlichen Adapter erstellt, ihr findet ihn hier. Meine Entwicklung wird damit erstmal pausiert.

https://github.com/unltdnetworx/ioBroker.stiebel-isg

Die Diskussion dazu findet in diesem Thread statt.

=======================================================

Habe meine ersten Gehversuche in der Adaptererstellung hinter mir, ging einfacher wie gedacht.
Aufbauend auf https://github.com/darkiop/iobroker.isg habe ich nun den Adapter https://github.com/darkiop/ioBroker.stiebel-lwz erstellt.

Wäre super wenn die Erfahrenen da mal drüber schauen würden und ggf. Kritik liefern :)

Danke und einen schönen Abend,

Thorsten
Zuletzt geändert von darkiop am 22.09.2018, 06:12, insgesamt 1-mal geändert.
Grüße Thorsten

Benutzeravatar
Jey Cee
guru
Beiträge: 1629
Registriert: 22.12.2014, 17:00

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von Jey Cee » 19.05.2018, 07:18

Hi darkiop,

ich hab mir den Adapter mal angeschaut.
Erstmal Grundlegendes, du solltest statt var für die Definition von Variablen und Konstanten let und const verwenden. Das ist EcmaScript 6 Syntax, das ist der Standard hinter JavaScript.

let definiert Variablen die immer innerhalb eines Blocks zur Verfügung stehen und damit ist auch ganz klar wo sie verfügbar ist. Bei var ist das nicht so klar abgegrenzt, was bei einem größeren Projekt zu Fehlern führen kann.

const erhält bei der Initialisierung einen Wert der nicht geändert werden kann. Wie let steht es Blockweise zur Verfügung.


Dein Code an sich sieht OK aus. Wenn du Objekte anlegst solltest du möglichst genau definieren was es für ein Objekt ist und welche Eigenschaften es hat. Das erleichtert später die Arbeit in iobroker.

Du kannst zum Beispiel min und max definieren, dann akzeptiert iobroker nur Werte innerhalb dieses Bereichs.
Das steht relativ Ausführlich in der Adapter Development Dokumentation.

Außerdem gibt es die Möglichkeit Objekte die vom Adapter immer benötigt werden in der io-package.json zu definieren. Das erspart etwas code.


Ich würde dir aber Empfehlen nicht den Umweg über das Bash Script zu gehen. Der Direkte weg geht über die nodejs Funktion request, damit sendest du den Befehl an die PHP.
Und die case Funktion heißt in JS Switch.

Gruß
Jey Cee

Gesendet von meinem m8 mit Tapatalk


darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 19.05.2018, 12:07

Super, vielen Dank - const und let habe ich bereits eingebaut. Aktuell bin ich dran das Bash Skript über request zu abzulösen.

Stehe allerdings gerade auf dem Schlauch und bekomme

--data-urlencode "data=[{\"name\":\"$1\",\"value\":\"$2\"}]"

und

--data "make=send"

nicht implementiert.

Hier noch der Link zum Bash-Skript, da ist der curl Aufruf zu sehen.
https://github.com/darkiop/ioBroker.sti ... isg_set.sh

Code: Alles auswählen

        // TODO request instead of isg_set.sh
        // https://www.npmjs.com/package/request
        var options = {
            url: 'http://' + $isgIP + '/save.php',
            method: 'POST',
            jar: true, // cookies
            gzip: true,
            headers: {
                'Accept': 'text/plain, */*; q=0.01',
                'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
                'Host': 'isg',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
                'Referer': 'http://isg/',
                'Content-Type': 'application/x-www-form-urlencoded',
                'X-Requested-With': 'XMLHttpRequest',
                'Connection': 'keep-alive',
                'Pragma': 'no-cache',
                'Cache-Control': 'no-cache',

            }
        };

        // --data-urlencode "data=[{\"name\":\"$1\",\"value\":\"$2\"}]"
        // --data "make=send" \
        
        function callback(error, response, body) {
            if (!error && response.statusCode == 200) {
                adapter.log.info('stateChange ' + body);
            }
        }
        
        request(options, callback);
Grüße Thorsten

Benutzeravatar
Jey Cee
guru
Beiträge: 1629
Registriert: 22.12.2014, 17:00

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von Jey Cee » 19.05.2018, 16:13

Das hier sollte dir bei URL encode weiterhelfen: https://stackoverflow.com/questions/425 ... ess-module

Und data-send solltest du nicht brauchen.

Gesendet von meinem m8 mit Tapatalk


Benutzeravatar
apollon77
guru
Beiträge: 6581
Registriert: 10.04.2015, 12:27

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von apollon77 » 01.06.2018, 22:13

Ich habe auch mal drüber geschaut. Hier noch ein bissl Feedback:
- Wenn du keine Widgets oder www Teile implementiert (beides optional) dann Verzeichnisse entfernen
- Bitte bei Travis-CI/Appveyor regsitrieren mit GitHub Account und dann Projekt aktivieren und einen commit machen. Ab dann laufen die Tests bei jedem Commit
- In io-package.js im Bereichn "native" müssen die Testeinträge raus und durch deine Admin-Variablen mit Defaultwerten ersetzt werden
- In io.package das restartAdapters raus wenn kein Widget dabei ist
. in io.package als Adaptertyp etwas passenderes als "general" setzen bitte. Liste: http://download.iobroker.net/list.html
- Es wäre denke sinnvoll die States etwas "Endkundenfreundlicher" zu bennennals aktuell und auch mit read/write und ggf erlaubten Werten u.ä. zu arbeiten. Aktuell kann der User da alles reinschreiben was er will ... Hm :-)

Ingo
How-to:
* Debug-Log für einen Adapter/Instanz einschalten? -> Instanzen -> Expertenomodus -> Spalte Loglevel/Log-Stufe

Qlink
professional
Beiträge: 285
Registriert: 26.04.2015, 21:24

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von Qlink » 18.06.2018, 15:44

Hi darkiop,

ich hätte heute mal den lwz Adapter hinzugefügt.

Leider läuft er nicht. Ich bekomme folgende Fehlermeldung im Log:

Code: Alles auswählen

host.iobroker	2018-06-18 16:43:13.746	info	Restart adapter system.adapter.stiebel-lwz.0 because enabled
host.iobroker	2018-06-18 16:43:13.746	error	instance system.adapter.stiebel-lwz.0 terminated with code 1 ()
host.iobroker	2018-06-18 16:43:13.371	info	instance system.adapter.stiebel-lwz.0 started with pid 804
host.iobroker	2018-06-18 16:42:43.366	info	Restart adapter system.adapter.stiebel-lwz.0 because enabled
host.iobroker	2018-06-18 16:42:43.366	error	instance system.adapter.stiebel-lwz.0 terminated with code 1 ()
host.iobroker	2018-06-18 16:42:42.928	info	instance system.adapter.stiebel-lwz.0 started with pid 2296
host.iobroker	2018-06-18 16:42:12.930	info	Restart adapter system.adapter.stiebel-lwz.0 because enabled
host.iobroker	2018-06-18 16:42:12.930	error	instance system.adapter.stiebel-lwz.0 terminated with code 1 ()
host.iobroker	2018-06-18 16:42:12.602	info	instance system.adapter.stiebel-lwz.0 started with pid 700
host.iobroker	2018-06-18 16:41:42.596	info	Restart adapter system.adapter.stiebel-lwz.0 because enabled
host.iobroker	2018-06-18 16:41:42.596	error	instance system.adapter.stiebel-lwz.0 terminated with code 1 ()
host.iobroker	2018-06-18 16:41:42.049	info	instance system.adapter.stiebel-lwz.0 started with pid 1936
host.iobroker	2018-06-18 16:41:12.024	info	Restart adapter system.adapter.stiebel-lwz.0 because enabled
host.iobroker	2018-06-18 16:41:12.024	error	instance system.adapter.stiebel-lwz.0 terminated with code 1 ()
host.iobroker	2018-06-18 16:41:11.684	info	instance system.adapter.stiebel-lwz.0 started with pid 3036
Auch wenn ich auf debug umstelle erhalte ich nicht mehr infos ...

Hast du eine Idee was das Problem sein kann ?

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 18.06.2018, 18:19

Hey, sagt mir leider nichts. Hatte auch noch keine Zeit bisher die oben genannten Anmerkungen einzubauen. Mal schauen, vielleicht im Laufe der Woche. Der Adapter ist ja aktuell auch nur ein erster Wurf und noch sehr Ausbaufähig :)
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 22.06.2018, 11:55

@apollon77: Habe deine ersten Anmerkungen eingebaut und auch meinen GH Account mit Travis-CI/Appveyor verknüpft. Passt das so?

An das umbenennen der States gehe ich noch. Bei dem read/write und erlaubten Werte Thema bräuchte ich Unterstützung ;)
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 22.06.2018, 13:17

Denke du meinst das so?

https://github.com/darkiop/ioBroker.sti ... 4d1bbba2b4

Hab nun einen DP aus der for schleife genommen und mit Standardwerten versehen. Wie würde das dann bei den Zahlenwerten auszusehen haben?

Danke und Gruß, Thorsten
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 24.06.2018, 15:01

Und noch eine ganz andere Frage:

Wenn ich den Adapter mittels git direkt in /opt/iobroker/node_modules/iobroker.stiebel-lwz clone und danach dann über den Admin die Instanz erzeuge, funktioniert das setzen der Parameter über die Datenpunkte leider nicht. Laut Log werden sie zwar gesetzt - aber an der LWZ kommt nichts an. Installiere ich den Adapter über den Admin über die Github URL und erzeuge dann die Instanz funktioniert das. Hier habe ich dann aber kein Git Repo und behelfe mir aktuell dadurch, das ich dieses dann paralell an einem anderen Ort clone und via copy & paste dann die Änderungen im /opt/iobroker Ordner einfüge.

Was muss hier noch getan werden damit auch ein 'clone' zu einem funktionalen Adapter/Instanz führt? Ein 'npm install' im Adapter Ordner hat mir leider auch nicht geholfen.

Grüße und noch einen schönen Sonntag!
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 26.06.2018, 15:47

Vieleicht kann auch noch jemand den Thread hier in das Entwicklungsforum schieben - ioBroker.vis Adapter Forum war wohl die falsche wahl damals :)
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 26.06.2018, 19:03

Ich komme aktuell mit der Umsetzung mittels request nicht weiter. Habe, um das ganz zu testen, die neue function für den request Vorgang in folgende Datei [1] gepackt und mittels NODE_DEBUG=request node test-node.js ausgführt.

Ergebnis ist folgendes:

Code: Alles auswählen

REQUEST { url: 'http://isg/save.php',
  method: 'POST',
  form: { name: 'val39s', value: '11' },
  headers:
   { Host: 'isg',
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
     Accept: 'text/plain, */*; q=0.01',
     'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
     Referer: 'http://isg/',
     'Content-Type': 'application/x-www-form-urlencoded',
     'X-Requested-With': 'XMLHttpRequest',
     Connection: 'keep-alive',
     Pragma: 'no-cache',
     'Cache-Control': 'no-cache' },
  gzip: true,
  jar: true,
  callback: [Function: callback] }
REQUEST make request http://isg/save.php
REQUEST onRequestResponse http://isg/save.php 200 { 'transfer-encoding': 'chunked',
  'x-powered-by': 'PHP/5.3.0',
  'set-cookie': [ 'PHPSESSID=144fc5b9ed3fb331b498eacdefd3d940; path=/' ],
  expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
  'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
  pragma: 'no-cache',
  'content-type': 'application/json',
  date: 'Tue, 26 Jun 2018 17:59:57 GMT',
  server: 'lighttpd/1.4.19' }
REQUEST reading response's body
REQUEST finish init function http://isg/save.php
REQUEST response end http://isg/save.php 200 { 'transfer-encoding': 'chunked',
  'x-powered-by': 'PHP/5.3.0',
  'set-cookie': [ 'PHPSESSID=144fc5b9ed3fb331b498eacdefd3d940; path=/' ],
  expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
  'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0',
  pragma: 'no-cache',
  'content-type': 'application/json',
  date: 'Tue, 26 Jun 2018 17:59:57 GMT',
  server: 'lighttpd/1.4.19' }
REQUEST end event http://isg/save.php
REQUEST has body http://isg/save.php 78
REQUEST emitting complete http://isg/save.php
REQUEST RESULTS: null 200 {"success":true,"message":"Die Einstellungen wurden erfolgreich gespeichert."}
Allerdings wirt der neue Wert nicht auf dem empfangenden System übernommen. Ich vermute mal hier stimmt noch etwas mit den überlieferten Daten nicht. In dem bisherigen Bash-Script war der JSON String so aufgebaut:

data=[{\"name\":\"$1\",\"value\":\"$2\"}]

Jemand eine Idee was hier noch zu tun ist?

[1] https://github.com/darkiop/ioBroker.sti ... request.js
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 29.06.2018, 12:34

Hallo zusammen, muss den Thread nochmal nach oben schieben. Hätte am WE etwas Zeit um mich weiter um den Adapter zu kümmern - allerdings stecke ich aktuell durch die oben beschrieben Fragen in einer Sackgasse ... ;)

Grüße Thorsten
Grüße Thorsten

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 05.07.2018, 17:54

Die Frage mit den Min/Max Werten in der io-package.json hat sich erledigt - habe ich gerade ins Repo geladen - abschauen bei anderen Adaptern kann hilfreich sein ;)

Die Frage mit dem git clone ebenfalls - auf meiner Testumgebung funktioniert das jetzt wie gewünscht.

Offene Fragen wären jetzt noch der Teil mit dem JS request anstatt meinen Bash Skript und ein funktionales automatisches Testen bei pushs.

Die aktuellen Werte aus der Weboberfläche ziehe ich mir momentan ebenfalls über ein Bash Skript in die CCU:

https://github.com/darkiop/ioBroker.sti ... -to-ccu.sh

Auch das würde ich gerne in den Adapter integrieren - hier fehlt mir noch die Idee wie und mit welchen Mitteln ich das am besten mache.
Grüße Thorsten

nikmaier
starter
Beiträge: 69
Registriert: 26.03.2018, 16:00

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von nikmaier » 08.07.2018, 10:15

Hallo,
erstmal vielen Dank für die Arbeit, suche auch schön länger ein fertiges Script für IOBroker, habe das jetzt mal getestet.
Ich scheitere aber leider schon an der Installation.
Ich gebe das hier ein:

Code: Alles auswählen

cd /opt/iobroker

iobroker stop

npm install iobroker.stiebel-lwz@0.0.3 --production

iobroker upload stiebel-lwz

iobroker start
Es taucht aber weder eine Instanz, noch Objekte auf.

Und dann hätte ich noch die Frage ob du die Datei für die CCU nochmal uploaden kannst, der Link funtioniert nicht:

https://github.com/darkiop/ioBroker.sti ... -to-ccu.sh

Da ich auch eine CCU habe, würde ich auch gerne erstmal die Daten in die CCU importieren.

Danke im Voraus.
Dateianhänge
Installation.JPG

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 08.07.2018, 14:11

Hi,

habe etwas aufgeräumt im Repo, die Skripte für die CCU liegen nun hier:

https://github.com/darkiop/ioBroker.sti ... mp/scripts

Installiere den Adapter über die Github URL direkt über den Admin. Dann im Tab Adapter nach LWZ suchen und eine Instanz erstellen.

Der Adapter ist aktuell sehr zweckmäßig und ich habe selbst noch so einige Probleme - aber es geht in kleinen Schritten vorwärts ;)
Grüße Thorsten

nikmaier
starter
Beiträge: 69
Registriert: 26.03.2018, 16:00

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von nikmaier » 09.07.2018, 07:58

darkiop hat geschrieben:
08.07.2018, 14:11
Dann im Tab Adapter nach LWZ suchen und eine Instanz erstellen.
Das war das Problem, danke dir jetzt hab ich den Adapter drin, habe die Betriebsart auf "Automatik" gestellt.
Er übernimmt aber noch keine Daten.
Kann ich irgendwie überprüfen an was es liegt bzw. warum er noch keine Daten zieht?

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 09.07.2018, 10:53

Also beim Start des Adapters sollte er sich für das Objekt Betriebsart den aktuellen Status ziehen. Vorausgesetzt du hast kein Benutzer/Passwort im ISGweb hinterlegt und das ISGweb ist auf der Version 8.5.6 (nur mit dieser kann ich testen).

Versuche mal auf der Shell direkt über

Code: Alles auswählen

bash /opt/iobroker/node_modules/iobroker.stiebel-lwz/isg_set.sh 192.168.1.100 BETRIEBSART WARMWASSER
den Befehl abzusetzen - statt WARMWASSER für die Automatik nimmst du AUTOMATIK. Die IP entsprechend ersetzen.
Grüße Thorsten

nikmaier
starter
Beiträge: 69
Registriert: 26.03.2018, 16:00

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von nikmaier » 09.07.2018, 12:31

Ah jetzt funktioniert es, habe zwar zum test schon das Kennwort raus, hat er aber anscheinend nicht ganz übernommen.
Jetzt übernimmt er auch die Daten. Cool, danke.

Hätte jetzt noch zwei Sachen:

1. Ist es irgendwie möglich die Daten auch mit Kennwort abzugreifen?

2. Momentan sind ja nur die "Steuerungs"-Sachen wie Betriebsart, Lüftung usw. möglich, wird es in Zukunft noch möglich sein, alle anderen Werte zu loggen?

darkiop
professional
Beiträge: 141
Registriert: 02.02.2018, 22:16

Re: Neuer Adapter: ioBroker.stiebel-lwz

Beitrag von darkiop » 09.07.2018, 13:17

Das mit User/PW sollte machbar sein - ist sicher mal geplant, ich schreibs mal auf die TODO :)

Die anderen Parameter kann man ebenfalls setzen, da der Adapter aber noch in einem sehr frühen Stadium ist, habe ich nur diese 4 bisher eingebaut.

Alle weiteren habe ich aber bereits extrahiert und hier notiert:

https://github.com/darkiop/ioBroker.sti ... ameters.md

Habe allerdings noch ein paar grundlegende Problemchen, wenn das alles geht dann kann ich auch mit den Parametern in die Breite gehen. Als nächstes würde ich gerne das auslesen der aktuellen Parameter aus dem ISGweb angehen wollen.
Grüße Thorsten

Antworten