NEWS
Benötige Programmierhilfe Javascript
-
so hier ein neues skript mit einigen Neuerungen
- wie gehabt, das eine bisherige skript komplett ersetzen
- ich habe für die befehle einen neuen Datenpunkt eingeführt, den du anlegen musst. Typ Zeichenkette: 0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Command
Falls die Namen nicht passen, dann im Skript Zeile 3-5 anpassen - Zeilen 7-9 ggfs ebenfalls anpassen. Z7 ist der Gerätename deines Tors, Z8-9 die Verbindungsparameter
- Wenn Datenpunt(e) angelegt sind und das Skript läuft (da dürfte erst einmal nix im log kommen), dann iobroker in einem 2.browserfenster öffnen
- im 2.Fenster auf den Objekte-Tab gehen im Datenpunkt 0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Command
einen der folgenden Befehle eingeben: open, close, stop, lighton, lightoff
Groß/Kleinschreibung ist egal - sobald du eingegeben hast, müsste der Datenpunkt automatisch sich wieder auf leer stellen
- und im log im 1.browserfenster eine Menge Ausgaben erscheinen. Zum Test habe ich mal für jeden Detailschritt im Programm etwas eingebaut. Später kann man das wieder entfernen oder auskommentieren.
- Als Test machen wir das selbe wie das letzte mal
-> Tor offen, dann Befehl close eingeben
-> Tor geschlossen, dann open eingeben
-> Licht ist an, dann lightoff eingeben
-> Licht ist aus, dann lighton eingeben
ich habe mal die verschiedenen javascripot zeilen kommentiert, damit du nachvollziehen kannst was da so passiert
-
@oliverio Vielen Dank, hier die Ausgaben:
öffnen:
close:
Licht an:
Licht aus:
Bitte gib Bescheid wenn du weitere Zarbeit brauchst.
-
du musst leider nochmal. die console.debug anweisungen sind nicht im log erschienen.
hab wieder auf console.log umgestellt.es reicht erst mal eines. dann prüfen wir ob alles so abläuft wie gewünscht.
noch eins.
stoppe und starte bitte den javascript-adapter bevor du testest.
dass räumt die evtl. reste aus dem speicher die nur stören. -
@oliverio sagte in Benötige Programmierhilfe Javascript:
Kein Problem.
Öffnen:
Schließen:
Zur Info, VErbose ist noch aktiviert und die DPs für Status Licht, Tor werden nicht beschrieben.
-
@rushmed
schau mal an dem schraubenschlüssel oben rechts, ob da debug aus ist?
dadurch werden keine datenpunkte beschrieben. also es muss aus sein -
@oliverio Debug ist aus. Wie gesagt verbose war an. Habs mal deaktiviert und getastet, ändert nichts.
Das Leeren von 0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Command hat seit dus eingebaut hast immer geklappt.
Also geht Schreiben offensichtlich. -
ich habe nochmal die logausgabe um einen parameter erweitert und die timeout zeit auf 10 Sekunden erhöht.
Der Status der ankommt müsste schon richtig sein. In der Entscheidungsmatrix greift er aber nicht. Das prüfen wir damit.
Darüber hinaus kommt nur einmal "closing" und sonst nix. wenn dann wollen wir ja nach einer weile zumindest wissen das dann tatsächlich closed istkönntest du parallel bitte auch dieser Firma eine EMail senden, das sie dir eine aktualisierte API-Beschreibung senden? Deine verlinkte scheint ja nicht ganz aktuell zu sein.
Ich erhoffe mir, das da auch ein paar mehr Details zur generellen Statusabfrage drin steht.
Also am besten dem Hersteller und nicht irgendeinem Vertriebspartner. -
@oliverio Antwort von Marantec vom 03.06.2022 08:21:
Guten Tag Herr x, vielen Dank für Ihre Anfrage. Anbei erhalten Sie eine Übersicht der Befehle Status Code Tor ist geöffnet: S;'garageDoorName';open Tor ist geschlossen: S;'garageDoorName';closed Tor öffnet sich: S;'garageDoorName';opening Tor schließt sich: S;'garageDoorName';closing Antriebsbeleuchtung ist an: S;'garageDoorName';lightOn Antriebsbeleuchtung ist aus: S:'garageDoorName';lightOff Befehl Code Öffnen: C;'garageDoorName';open Schließen: C;'garageDoorName';close Stop: C;'garageDoorName';stop Antriebsbeleuchtung an: C;'garageDoorName';lightOn Antriebsbeleuchtung aus: C;'garageDoorName';lightOf garageDoorName = Der Name Ihres Tores Mit freundlichen Grüßen / Best regards Christian Pieper T +49 5247 705-221 · F +49 5247 705-234 service@marantec.de · www.marantec.com
Vermutlich fehlt beim letzten Befehl das zweite "f".
Open:
Close:
@oliverio sagte in Benötige Programmierhilfe Javascript:
Darüber hinaus kommt nur einmal "closing" und sonst nix. wenn dann wollen wir ja nach einer weile zumindest wissen das dann tatsächlich closed ist
Ja stimmt, die Bestätigung der Endlagen kommt nichtmehr an. Mit dem neuen Code auch nicht.
Auch die Datenpunkte bleiben leer.Nach dem Schließen bleibt die Lampe noch drei Minuten an. Die Bestätigung des Ausschaltens kommt jetzt auch nicht mehr an.
Soll ich verbose jetzt weiter aktiviert lassen oder nicht?
Danke vorab!
-
ja, 2 Probleme haben wir noch.
- der Vergleich zwischen
S;Gagentor;opening
und
S;Gagentor;opening
schlägt fehl, ob die beiden gleich sind.
- die Rückmeldung für den Abschluss der Aktion fehlt noch.
Wenn du sagst, das Licht bleibt noch 3 Minuten an, dann setzen wir den Timeout mal auf 4 Minuten,
Ersetze bitte die folgenden 2 Zeilen
var timeout = 10000; //timeout für Antwort vom Server var time2termination = 10000; //genereller Timeout falls gar keine Reaktion mehr kommt
mit
var timeout = 4*60*1000; //timeout für Antwort vom Server var time2termination = 4*60*1000; //genereller Timeout falls gar keine Reaktion mehr kommt
Du musst dann auch 4 Minuten Warten bis die Aktion abgeschlossen ist.
Auch nicht den javascript-adapter stoppen
Am Schluss muss im Log immerclient timeout
client terminatorEndstehen
Leider hat dir der Support einfach nur die Schlüsselworte mitgeteilt, aber auch nix zum Kommunikationsverhalten, was das Gerät macht wenn der Befehl close oder open gegeben wird.
Wird nur einmal opening gesendet, oder mehrfach?
Wie kann man den Status abfragen ohne einen Befehl zu geben, steht leider auch nirgendsBesser wäre eine API, bei der man Befehle geben kann und separat den Status abfragen kann,
So ist man viel flexibler.
Aber man sieht ja, das sie dir keine richtige API-Beschreibung gegeben haben, sondern nur die Befehlsauflistung.
Du hast ja nach API-Beschreibung gefragt?verbose erst mal so lassen. das stört nicht und gibt aktuell eher mehr informationen aus dem skriptablauf
- der Vergleich zwischen
-
@oliverio Zu1) Hast du da noch ne Idee? Ansonsten eürde es mir reichen wenn opening, closing, closed, lighton und lightoff in einem Datenpunkt landen. Dann werte ich die Status mit Blockly selber aus.
zu2) Habe das halboffene Tor zugefahren, lightoff kam an.
zu3) Nein ich habe nicht nach API gefragt. Ich wollte eine Anleitung zur Integration, sowie eine Liste möglicher Befehle.
Ich frage da nochmal nach, aber die Antwort wird lange dauern.Können wir bitte die Antwort von R; in einem DP ausgeben? Wäre aber nur nice to have und eigentlich nur bei der Einrichtung eines Antriebs interessant.
-
also von der Rückmeldung sind jetzt alle Informationen enthalten.
Auch wenn da wieder ein paar zuviele Abfragen gleichzeitig laufen (3 stück),
aber hier habe ich noch was gefunden an dem es gelegen haben könnte
bitte vor dem test den javascriptadapter einmal stoppen und wieder starten.warum das
S;Gagentor;opening
nicht gleich
S;Gagentor;opening
istich habe noch was entdeckt und einen zusätzlichen Befehl eingefügt. der sollte das Problem beheben
hat das letzte Schließen nur 11 Sekunden gedauert?
-
lightOn:
Open und Close sahen auch gut aus, hab aber erst heut abend Zeit um zu warten bis dasa licht aus geht.
Die Datenpunkte werden beschrieben. Super!
@rushmed sagte in Benötige Programmierhilfe Javascript:
zu2) Habe das halboffene Tor zugefahren, lightoff kam an.
Deswegen hat das Schließen weniger lange gedauert als sonst.
Warum war denn jetzt S;Gagentor;opening ungleich S;Gagentor;opening?
Ist es noch möglich Antworten von manuellen Eingaben (App, Fernbedienung und am Antrieb direkt) die nach time2termination passieren?
-
code nochmal umgestellt.
der client-dienst läuft jetzt solange das skript läuft
mit der Funktion send Message kannst du wie gehabt die Nachrichten senden
der client-dienst wird beendet, sobald das skript gestoppt wird
theoretisch müsste der client dienst nun auf alle nachrichten hören, die das garagentor sendet.
einen timeout gibt es nicht mehr, ausser das garagentor sendet, das ende ist. aber das hatten wir bisher noch nicht gesehen@rushmed sagte in Benötige Programmierhilfe Javascript:
Warum war denn jetzt S;Gagentor;opening ungleich S;Gagentor;opening?
Am Ende der Nachricht hat noch ein Zeilenumbruch gehangen. Das ist mir in den Lognachrichten entgangen. Der trim-Befehl filtert diese Zeichen dann raus.
Daher
S;Gagentor;opening\n ungleich S;Gagentor;opening\n ist eine Notation für die nicht sichtbaren Steuerzeichen, hier newline
var net = require('net'); var dp_door = "0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Status_Tor"; //door state var dp_light = "0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Status_Licht"; //light state var dp_cmd = "0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Command"; //Befehlsdatenpunkt: Mögliche Werte: open, close, stop, lighton, lightoff. Nach Beschreiben wird der Datenpunkt wieder auf leer gesetzt var deviceName = "Garagentor"; var host = "192.168.178.149"; var port = 2785; var client; function startClient() { client = new net.Socket(); // Erzeugen eines neuen Verbindungsobjekts client.connect(port, host, function() { // Gerät über host:port anwählen und Verbindung erzeugen console.log('cliend started'); }); client.on('data', function(data) { // Wenn daten ankommen, dann verarbeiten console.log('client received: ' + data + " for device: " + deviceName); var dataS = data.toString().trim(); // Datenbuffer in lesbaren Text umwandeln switch(dataS) { // je nach rückgabewert unterschiedliche Bearbeitung case "S;"+deviceName+";open": // wenn open setState(dp_door,"open"); // dann Datenpunkt setzen break; case "S;"+deviceName+";closed": setState(dp_door,"closed"); break; case "S;"+deviceName+";opening": setState(dp_door,"opening"); break; case "S;"+deviceName+";closing": setState(dp_door,"closing"); break; case "S;"+deviceName+";lightOn": setState(dp_light,"lightOn"); break; case "S;"+deviceName+";lightOff": setState(dp_light,"lightOff"); break; } }); client.on("error",(err)=>{ // wenn ein Fehler entsteht console.log("client error " + err.toString()); }); client.on("timeout",()=>{ // wenn timeout entsteht console.log("client timeout"); }); } function sendMessage(host, port, message) { return new Promise((resolve, reject) => { // Funktion ist asynchron, daher Rückgabe promise if (!client) { console.log("No Client available"); resolve("Error"); return; } client.write(message); resolve("OK"); }); } onStop (function(){ /* do something when script is stopped */ if (client) { console.log('client ended '); client.end(); } }, 1000); startClient(); on(dp_cmd, function (obj) { // trigger wenn datenpunkt beschrieben wird var cmd; if (!obj.state.ack) { // aber nur wenn es sich um einen unbestätigten wert handelt cmd = String(obj.state.val).toLowerCase(); // Datenpunktinhalt in Kleinbuchstaben umwandeln console.log('execute command: ' + cmd); switch(cmd) { // je nach Datenpunktinhalt verschiedene Befehle case "open": // wenn open sendMessage(host, port, "C;"+deviceName+";open"); // dann richtigen Befehl an Gerät senden break; case "close": sendMessage(host, port, "C;"+deviceName+";close"); break; case "stop": sendMessage(host, port, "C;"+deviceName+";stop"); break; case "lighton": sendMessage(host, port, "C;"+deviceName+";lightOn"); break; case "lightoff": sendMessage(host, port, "C;"+deviceName+";lightOff"); break; } setState(obj.id, {val: "", ack: true}); // datenpunkt auf leer als bestätigt setzen } });
-
@oliverio Ok, danke.
Ich würde heute Abend dann alle mögliche Szenarien durchtesten. Benötigst du noch Logs oder soll ich etwas bestimmtes testen? -
@rushmed
ne erst mal nicht, ausser es passiert etwas besonderes.bitte mal auch skript mehrmals starten und stoppen und dann schauen wieviele gleiche nachrichten kommen.
-
@oliverio Das läuft soweit klasse, supervielen Dank!
Nach Script Neustart, aus und an Schalten kann ich doppelte aber bisher auch nur doppelte Rückmeldungen provozieren.Kannst du bitte noch diese Meldungen noch aus dem Log entfernen:
javascript.0 (1961154) script.js.Garage: setForeignState(id=0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Status_Licht, state={"val":"lightOn","ack":false,"ts":1662055976502,"q":0,"from":"system.adapter.javascript.0","lc":1662055976502,"c":"script.js.Garage"})
-
@rushmed
das ist die verbose Einstellung, oben rechts im skript
wenn du die ausmachst, dann kommt die nicht mehr -
@oliverio Ok, probiere ich aus.
Könnte man Licht auch als einen boolschen Datenpunkt anlegen über den sowohl manuell gesteuert als auch die Status der Lampe zurück gegeben werden?Die Ausgabe von R; im LOG ist denke ich sinnvoll. Vor allem falls bei der ersten Einrichtung etwas schiefgeht. Vll. muss auch nicht R;OK in den LOG sondern nur die möglichen Fehler.
Anwort Bedeutung Error: Invalid command Ungültiger Befehl Error: Not enough parameters Error: Unknown garage Garage ist nicht bekannt. Kontrollieren Sie den Namen der Garage in ihrer Smart Home Anwendung oder in der maveo app.
Ich kann den Command DP nicht mit InfluxDB loggen, die Datenreihe bleibt leer. Wir der Wert so schnell zurück gesetzt dass Influx das nicht mitbekommt?
-
@rushmed said in Benötige Programmierhilfe Javascript:
@oliverio Ok, probiere ich aus.
Könnte man Licht auch als einen boolschen Datenpunkt anlegen über den sowohl manuell gesteuert als auch die Status der Lampe zurück gegeben werden?Theoretisch schon, aber du ja jetzt einen lesbaren Status
und ein Vergleich auf == "LightOn" oder auf == true
kommt auf das selbe herausDie Ausgabe von R; im LOG ist denke ich sinnvoll. Vor allem falls bei der ersten Einrichtung etwas schiefgeht. Vll. muss auch nicht R;OK in den LOG sondern nur die möglichen Fehler.
Da muss ich mal schauen. eigentlich wollte ich ja console.debug machen, aber das hat zu einem Fehler geführt. Gedacht war, das nicht zu viel im log erscheint, sondern nur wenn man das will.
wenn du einzelne Nachrichten ausschalten willst, dann kannst du vor dem Befehle console.log
das Kommentarzeichen // schreiben. Dann werden die Anweisungen nicht mehr ausgeführtAnwort Bedeutung Error: Invalid command Ungültiger Befehl Error: Not enough parameters Error: Unknown garage Garage ist nicht bekannt. Kontrollieren Sie den Namen der Garage in ihrer Smart Home Anwendung oder in der maveo app.
Ich kann den Command DP nicht mit InfluxDB loggen, die Datenreihe bleibt leer. Wir der Wert so schnell zurück gesetzt dass Influx das nicht mitbekommt?
Nein, InfluxDB wird nur bestätigte Nachrichten aufzeichnen.
Du schreibst den Befehl auch als unbestätigt rein. Musst du aber auch, der Trigger hört aktuell nur auf unbestätigte Nachrichten -
@oliverio OK danke, verbose deaktiviert, funktioniert.
@oliverio sagte in Benötige Programmierhilfe Javascript:
Theoretisch schon, aber du ja jetzt einen lesbaren Status
und ein Vergleich auf == "LightOn" oder auf == true
kommt auf das selbe herausIch brauche das für meine Alexas als ein Gerät (DP) der sowohl zum Steuern da ist als auch immer den aktuellen Status beinhaltet. Habe einen DP Lampe Garagentor angelgt den ich an und aus schalten kann. Den hab ich dann als Write für einen Alias Garagentorbeleuchtung eingetragen und Status Garagentorbeleuchtung als Read. Vom Status habe ich vorher die Ausgabe im Script auf true/false geändert. Das funktioniert nicht, vermutlich weil DP 0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Status_Licht als Typ Sting und nicht Boolean kommt. 0_userdata.0.Eigene_Datenpunkte.Garage.Garage_Status_Licht als boolean festzulegen geht auch nicht, dan meckert das Script.
@oliverio sagte in Benötige Programmierhilfe Javascript:
Da muss ich mal schauen. eigentlich wollte ich ja console.debug machen, aber das hat zu einem Fehler geführt. Gedacht war, das nicht zu viel im log erscheint, sondern nur wenn man das will.
wenn du einzelne Nachrichten ausschalten willst, dann kannst du vor dem Befehle console.log
das Kommentarzeichen // schreiben. Dann werden die Anweisungen nicht mehr ausgeführtSorry, Fehlalarm. Die Fehler erscheinen wir gewünscht im Log.
Hab das Resultat unserer Arbeit hier zusammengefasst.