NEWS
Benötige Programmierhilfe Javascript
-
Hallo meine Herren,
ich hab' schon das ganze Forum und ebenso das internet durchsucht und komme einfach nicht weiter.
Mein Garagentorantrieb Zapf Marantec Maveo soll in ioBroker eingebunden werden.
Am weitesten bin ich bisher mit diesem Dokument:
1607975123876-installationshilfen-für-anwender-amp-entwickler-v7-20201211_125358-1.pdf
und ein paar Foreneinträgen gekommen.
Hatte auch schon einen Fred dazu erstellt aber der hat wohl niemanden interessiert der das Garagentor nich besitzt.Mei aktueller Stand ist, dass ich mit den Befehlen aus dem Dokument und bspw. diesem irgendwoher kopierten Script alle Funktionen schalten kann.
var net = require('net'); function sendMessage(host, port, message) { var client = net.connect({host: host, port: port}, function () { // 'connect' listener console.log('Verbindung hergestellt'); client.write(message); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('end', function () { console.log('Verbindung unterbrochen'); }); client.on('error', function (error) { console.error('error: ' + error); client.end(); }); } sendMessage('192.168.178.149', 2785, 'C;Garagentor;open')
Ich bekomme im Debug auch
R;OK
als Bestätigung.
Was mir jetzt noch fehlt ist die Statusmeldungen des Tors zu empfangen und in einen Datenpunkt zu schreiben.
Befehl Code Öffnen 'garageDoorName';open Schließen 'garageDoorName';close Stop 'garageDoorName';stop Antriebsbeleuchtung an 'garageDoorName';lightOn Antriebsbeleuchtung aus 'garageDoorName';lightOff Beim Senden von Befehlen erhält Ihre Smart Home Zentrale eine dieser vier Antworten von der maveo box
Ich habe leider garkeine Ahnung vom Programmieren.
Kann mir hier jemand helfen, bzw. das Script so erweitern dass auch die Abfrage des Status sowie das Schreiben in einen DP erfolgt?
Das wäre echt super! -
Was ist denn mit dem ioBroker.maveo Adapter?
-
@thomas-braun said in Benötige Programmierhilfe Javascript:
ioBroker.maveo
der scheint nur mit der amazon-cloud zu kommunizieren
die schlüsselbegriffe aus der beschreibung tauchen da auch nicht auf.
-
puh, da haben die sich nicht so viel mühe mit gemacht.
die ersten 4 Zustände hätte man mit genau einem status abfragen können, da sie sich gegenseitig ausschließen
und die letzten 2 schließen sich ebenfalls gegenseitig aus. und damit mit nur einer 2.abfrage es viel einfacher machen können.so musst du für den ersten status 4 anfragen losschicken, bevor du alles beurteilen kannst.
was kommt den zurück, wenn man 'garageDoorName';open sendet und das tor gerade was anderes macht wie offen zu sein? Als mögliche Antowrten sehe ich nur OK und die 3 Fehlermöglichkeiten -
@thomas-braun Der Adapter funktioniert (bei mir) nicht und läuft über die Cloud, das wäre für mich nicht erste wahl wenns lt. Hersteller auch direkt geht.
@OliverIO Dann passiert garnichts, ich bekomme nichtmal das OK zurück.
Es gib da noch eine Diskrepanz zwischen dem Dokument und den tatsächlich funktionierenden Befehlen.
Dok.:
Funktionierende Befehle:
C;Garagentor;open
C;Garagentor;close
C;Garagentor;stop
C;Garagentor;lightOn
C;Garagentor;lightOffBeim Senden dieser Befehle sind die folgenden Antworten möglich:
S;Garagentor;open
S;Garagentor;closed
S;Garagentor;opening
S;Garagentor;closing
S;Garagentor;lightOn
S;Garagentor;lightOff
Quelle1
Quelle2Hat @MIC hier vll. ne gute Idee?
-
Probiere es mal mit dieser angepassten Version der Funktion.
Die Datenpunktnamen von dp1 und dp2 müssen bereits existieren.
Als Typ für beides Zeichenkette nehmen.
Der Timeout ist in der Funktion mit 1000 milisekunden berücksichtigt.
Falls die Geräte zu langsam antworten, dann den Wert vergrößern.
Der Rückgabewert der Funktion sendMessage ist dann timeoutLogik wäre dann wie folgt:
var dp1 = "0_userdata.0.garagenstatus"; var dp2 = "0_userdata.0.lichtstatus"; var open = await sendMessage("192.168.178.149",2785,"'S;Garagentor;open"); var closed = await sendMessage("192.168.178.149",2785,"'S;Garagentor;closed"); var opening = await sendMessage("192.168.178.149",2785,"'S;Garagentor;opening"); var closing = await sendMessage("192.168.178.149",2785,"'S;Garagentor;closing"); var lighton = await sendMessage("192.168.178.149",2785,"'S;Garagentor;lightOn"); if (open=="OK") { setState(dp1,"open"); } if (closed =="OK") { setState(dp1,"closed"); } if (opening =="OK") { setState(dp1,"opening"); } if (closing =="OK") { setState(dp1,"closing"); } if (lighton =="OK") { setState(dp2,"An"); } else { setState(dp2,"Aus"); }
-
@oliverio OK, bei:
var net = require('net'); function sendMessage(host, port, message) { var timeout = 1000; return new Promise((resolve, reject) => { var client = new net.Socket(); client.connect(port, host, function() { //console.log('Connected'); client.setTimeout(timeout); client.write(message); }); client.on('data', function(data) { //console.log('Received: ' + data); resolve(data.toString()); }); client.on("error",(err)=>{ resolve(err); }); client.on("timeout",()=>{ resolve("timeout"); }); }); }
war keine Message dabei.
Habe:var net = require('net'); function sendMessage(host, port, message) { var timeout = 1000; return new Promise((resolve, reject) => { var client = new net.Socket(); client.connect(port, host, function() { //console.log('Connected'); client.setTimeout(timeout); client.write(message); }); client.on('data', function(data) { //console.log('Received: ' + data); resolve(data.toString()); }); client.on("error",(err)=>{ resolve(err); }); client.on("timeout",()=>{ resolve("timeout"); }); }); } sendMessage('192.168.178.149', 2785, 'C;Garagentor;open')
draus gemacht.
Beim ersten Mal ausführen kam:javascript.0 2022-08-27 23:34:41.595 info script.js.Garage: S;Garagentor;opening
im Log
--> großer Fortschritt!
Leider kam das wirklich nur bei der ersten Ausführung und dann nicht nochmal.
Die Variation des Timeouts +- eine Zehnerpotenz und +1000 haben keine Änderung gebracht.Was soll ich mit der Logik anfangen? Script?
Die DPs sind angelegt, bleiben leider leer.
-
@oliverio sagte in Benötige Programmierhilfe Javascript:
Der Rückgabewert der Funktion sendMessage ist dann timeout
Verstehe ich nicht.
-
@rushmed
das erste skript ist die wiederverwendbare funktiondas 2.skript ist die logik, wie die verschiedenen status abgefragt werden müssen, damit der ermittelte status in die beiden datenpunkte geschrieben werden.
du kannst mal aus der folgenden Zeile
//console.log('Received: ' + data);
das hier machen
console.log('Received: ' + data);
dann sollte in der skript konsole immer ausgegeben werden, wenn daten zurückommen.
das skript geht aktuell davon aus, das OK gesendet wird. falls das nicht stimmt, dann muss das im skript angepasst werden.@rushmed sagte in Benötige Programmierhilfe Javascript:
@oliverio sagte in Benötige Programmierhilfe Javascript:
Der Rückgabewert der Funktion sendMessage ist dann timeout
Verstehe ich nicht.
ich habe die funktion so erstellt, das wenn die abfrage zu lange dauert (oder halt auch nix zurückgibt) spätestens nach 1000 ms gestoppt wird. Anstatt OK oder leer gibt die funktion halt dann den Text timeout aus.
-
@oliverio Sehr gut!
Mit:var net = require('net'); function sendMessage(host, port, message) { var timeout = 1000; return new Promise((resolve, reject) => { var client = new net.Socket(); client.connect(port, host, function() { //console.log('Connected'); client.setTimeout(timeout); client.write(message); }); client.on('data', function(data) { console.log('Received: ' + data); resolve(data.toString()); }); client.on("error",(err)=>{ resolve(err); }); client.on("timeout",()=>{ resolve("timeout"); }); }); } sendMessage('192.168.178.149', 2785, 'C;Garagentor;open')
bekomme ich jetzt alle Status. Jeweils sechsmal im Log. "opening" während des Öffnens, "open" wenn geöffnet....
Supergeil!
Soll ich jetzt die Logik als eigenes Script anlegen oder wie bekomm ich die Ausgaben in eigene DPs?
Wie können wir die Anzahl der ausgaben vo sechs auf eins reduzieren? -
@rushmed
Ich verstehe nicht warum das 6 mal kommt, wenn dann 5 mal
Das 2.Skript kannst du einfach unter das erste kopieren
Wie schon erwähnt ist dort die Logik drin das die Werte in die datenpunkte (setState) geschrieben werden.
Poste bitte mal die Ausgabe des Skriptes -
@oliverio Ich habe jetzt Script "Garage1" mit deinen Änderungen für die Funktionen (funktioniert alles, danke).
und Script "Garage Logik":
Ist das ok?Der Fortschritt ist schonmal enorm. Es müssen nurnoch die Rückmeldungen in die DPs und die Wiederholungen gelöst werden. Wobei die Wiederholungen nur kosmetik sind.
Die DPs wurden nur einmal mit open beschrieben. -
@rushmed
Von blockly habe ich keine Ahnung -
@oliverio Wir sind auf nem richtig guten Weg, ich bin dir sehr dankbar!
Muss jetzt erstmal ins Bett, lass uns morgen weiter machen. -
@oliverio Ich habe jetzt für jeden Befehl deine Vorschläge für Funktion und Logik zusammengesetzt.
Hattest du dir das so gedacht?
Bspw.:
Damit kann ich alles schalten und die Antworten werden empfangen und im Log angezeigt.
Die Datenpunkte sind aber nur einmal am Anfang beschrieben worden und dann nicht mehr.
Was bedeutet:
@oliverio sagte in Benötige Programmierhilfe Javascript:
Der Rückgabewert der Funktion sendMessage ist dann timeou
-
@rushmed
Das Skript ist nur dafür da den Status abzufragen
Das steuern machen wir wenn das funktioniert
Du hast die beiden Teile korrekt zusammen kopiert
Eine Zeile die du selbst hinzugefügt hast muss noch raus. Ist aber für den Test nicht so schlimm.
Das Skript ist erst mal so gedacht das einmalig der Status ermittelt wird. Durch wiederholten Aufruf in einem noch zu wählenden Zeitabstand aktualisiert es dann regelmäßig.Am log finde ich aktuell noch komisch das sehr viele gleiche Einträge in sehr kurzer Zeit hintereinander steht
Um das zu überprüfen kannst du bitte noch den Client connect Teil mit dem folgenden tauschen
Eine Zeile davon habe ich angepasst.
Dann bitte das Script genau einmal laufen lassen und das Ergebnis hier wieder posten.client.connect(port, host, function() { console.log('send: ' + message); client.setTimeout(timeout); client.write(message); });
-
@oliverio Habe meine Message raus genommen und deine Anpassung einegfügt.
Funktion jetz wie folgt:
Hier das Ergebnis:
21:36:43.129 info javascript.0 (2205415) script.js.Garage_orig: send: 'S;Garagentor;open 21:36:44.154 info javascript.0 (2205415) script.js.Garage_orig: send: 'S;Garagentor;closed 21:36:45.176 info javascript.0 (2205415) script.js.Garage_orig: send: 'S;Garagentor;opening 21:36:46.194 info javascript.0 (2205415) script.js.Garage_orig: send: 'S;Garagentor;closing 21:36:47.206 info javascript.0 (2205415) script.js.Garage_orig: send: 'S;Garagentor;lightOn
Damit kommt nichts zurück. Ich der Status wird nur nach dem Senden der Steuerbefehle gesandt.
Bei 5 s Timeout passiert auch nichts.
Wenn ich die Message einfüge kommt die Antwort nach etwa 3 s. -
@rushmed
Füge bitte deinen steuerbefehl nochmal ein, führe das Skript aus und sende mir dann nochmal das log.
Wie du vermutest wird der Status wohl nur beim senden eines Befehls zurück gesendet.
Aber mal schauen was da steht
Wahrscheinlich muss man dann das Skript nochmal umstellen -
Kannst du bitte überall noch diesen Apostroph vor dem S; entfernen?
Das gehört da evtl nicht hin -
@oliverio Bitteschön: