NEWS
Skript für Türöffner löst nicht aus
-
Hallo,
nach zwei Jahren versuche ich es nochmal.
Ich möchte meine Gartentür remote entriegeln.Was habe ich?
Ich habe ein Dahu Doorbell System VTO an der Tür VTH im Haus. Das funktioniert als Stand-Alone perfekt.
Für meine iobroker-Umgebung habe ich diverse Tabletts an der Wand und eine HABPanel Visualisierung drauf.
Den Videostream greife ich mir über Motion Eye ab, aber was bisher nicht läuft, ist ein Button, der mir die Gartentür entriegelt.
Im Browser kann ich per HTTP API die Tür wie folgt manuell entriegeln.http://user:password@192.168.178.60/cgi-bin/accessControl.cgi?action=openDoor&UserID=101&Type=Remote&channel=1
Deshalb habe ich einen Datenpunkt erstellt der bei auslösen des Buttons den Wert true setzt und ein JavaSkript für den http request gebastelt (zunächst mit Blockly probiert), das auf den Datenpunkt reagiert:
on({ id: [].concat(['0_userdata.0.Gartentuer.Trigger-Tueroeffner']), change: 'any' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") == true) { require("request")('http://user:password@192.168.178.60/cgi-bin/accessControl.cgi?action=openDoor&UserID=101&Type=Remote&channel=1').on("error", (e) => { console.error(e); }); setStateDelayed('0_userdata.0.Gartentuer.Trigger-Tueroeffner' /* Trigger-Tueroeffner */, false, true, 2000, false); } });
Leider reagiert der Türöffner überhaupt nicht.
Was man in den Objekten sehen kann, ist das bei Drücken des Buttons der Datenpunkt auf true wechselt und nach 2 Sekunden wieder auf false geht.Iobroker läuft auf einer virtuellen Debian 12 Installation, alle Adapter sind aktuell.
Architektur x64; Node.js v18.17.1; NPM 9.6.7; Aktive Instanzen 18Was übersehe ich?
Wer kann mir helfen? -
Dein Script sieht äußerst komisch vor.
Probier es so:
var request = require ('request'); on({id: "0_userdata.0.Gartentuer.Trigger-Tueroeffner'", val: true}, function() { request("http://user:password@192.168.178.60/cgi-bin/accessControl.cgi?action=openDoor&UserID=101&Type=Remote&channel=1"); setTimeout(function() { setState('0_userdata.0.Gartentuer.Trigger-Tueroeffner', false); } , 2000); });
-
@bahnuhr Vielen Dank. Ich habe das so umgesetzt.
Inzwischen glaube ich, dass das Skript funktioniert.
Wenn man im Browser den http Aufruf macht, gibt es im Return ein "ok". An den Tabletts sind die Popup Fenster geblockt. Dort geht der http Aufrauf dann auch ins leere.Unter folgendem Link wird mit Java für MQTT gelauscht. Dort habe ich in der DahuaVTO.js einen relevanten Abschnitt gefunden, soweit ich das überblicke.
link zu DahuaDoorbell2MQTT
in dem DahuaDoorbell2MQTT Projekt gibt es folgenden Abschnitt./** * Remotely triggers the relay 1 (e.g. to open an electric gate). * * In my VTO 2202 F this also triggers the voice announcing the the door has been opened. */ openDoor() { return this.digestClient .fetch( `http://${this.dahua_host}/cgi-bin/accessControl.cgi?action=openDoor&channel=1&UserID=101&Type=Remote` ) .then((r) => { if (r.ok) { console.info('Door relay triggered'); } else { console.error('Error triggering the door relay', e); } }) .catch(e => console.error('Connection error triggering the door relay')); }
Ich komme mit dem Thema digestClient nicht zurecht. Das übersteigt meine Kenntnisse.
Hier wird aber irgendwie darauf reagiert, dass es ein "ok" als Return gibt.
Kann man das irgendwie in Iobroker mit dem Skript ergänzend umsetzten?Vielen Dank für jegliche Hinweise.
-
Ich weiß nicht was du da machst.
Wenn der http Befehl per Browser geht, dann geht er auch mit request.Insofern bin ich jetzt raus.
Vielleicht kann jemand anders mit deinen Überlegungen etwas anfangen.
-
Wenn im Beispiel fetch() genutzt wird, könnte man das evtl. auch hier nutzen. Oder per execute ein curl oder wget absckicken.
Die Antwort der API könnte auch hinweisgebend sein.