NEWS
Garagentor-Fernbedienung (ESP01 Javascript)
-
Hallo, das ESP01 basierte "LC Technology Wifi Relay X2" Doppel-Relais-Modul gibt es für ein paar Euro im Internet aus den üblichen Quellen von verschiedenen Lieferanten.
Ich habe es vor Jahren an den elektrischen Garagentorantrieb angeschlossen, um die bei einem Sturz kaputtgegangene Fernbedienung des Tors durch eine Smartphone-App zu ersetzen.
Der Torantrieb hat Anschlussklemmen für einen externen Taster, wo eines der Relais des ESP-Moduls mit einem Puls einen Taster simulieren kann. Der Puls muss eine "ausreichende" Länge haben, da das Tor stehenbleibt, wenn der entsprechende Endschalter noch nicht "frei" ist.Das Ding ist im Haus-WLAN integriert, und lässt sich aus der Garageneinfahrt mit dem Smartphone erreichen.
Nun habe ich experimentiert, mit dem Ziel. die original Firmware nicht durch etwas anderes zu ersetzen, da die Familie sich mit der App zur Bedienung des Relais auf dem Smartphone gerade angefreundet hat. ZUSÄTZLICH soll die Möglichkeit bestehen, das Tor über ioBroker zu steuern...
Folgend das erste Stück Javascript-Code, das das Ding aus ioBroker ansteuern kann, ohne dass man auf der anderen Seite Tasmota auf den ESP01 spielt, oder eine eigene MQTT Firmware für den ESP01 schreibt ...
Voraussetzung ist, dass man das Modul vorher schon in sein WLAN eingebucht bekommen hat...
Getestet habe ich das Skript erst zum Schluss mit dem Garagentor-Antrieb ...
Erste Versuche mit meinem Linux-PC und der Kommandozeile"nc -l 8080 | hexdump -C"
EDIT: Hier die aktuelle Version des Skripts. Das lässt sich dann direkt aus Vis ansprechen:
var net = require('net'); function PulseLcTechRel(host, port, rel_no) { var client = net.connect({host: host, port: port}, function () { // 'connect' listener var arr = new Uint8Array(4); console.log('connected to LAN-Relais!, send On Message'); arr[0]=0xA0; // command arr[1]=rel_no; // relais number arr[2]=1; // on arr[3]=arr[0]+arr[1]+arr[2]; // checksum client.write(arr); setTimeout(function() { // Code, der erst nach 2 Sekunden ausgeführt wird, coomand and no same arr[2]=0; // off arr[3]=arr[0]+arr[1]+arr[2]; // checksum client.write(arr); console.log("Off Message sent"); // client.close(); howto? client.end(); }, 2000); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('end', function () { console.log('disconnected from LAN-Relais'); }); client.on('error', function (error) { console.error('error: ' + error); client.end(); }); } // On change on('0_userdata.0.Puls-Garagentor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) PulseLcTechRel('192.168.2.47', '8080', 1); // PulseLcTechRel('192.168.2.26', '8080', 1); setState('0_userdata.0.Puls-Garagentor', false, true/*ack*/); }); // On change on('0_userdata.0.Puls-Rolltor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) PulseLcTechRel('192.168.2.47', '8080', 2); // PulseLcTechRel('192.168.2.26', '8080', 1); setState('0_userdata.0.Puls-Rolltor', false, true/*ack*/); });
-
Inzwischen läuft das Script schon einige Zeit.
Werde wahrscheinlich noch etwas an der VIS-Darstellung arbeiten müssen.
Es muss nicht absolut perfekt aussehen, aber derzeit ist die Bedienung doch etwas "Blindflug".Es gibt kaum eine Rückmeldung, ob der Touch der "Taste" auf dem Smartphone-Screen erkannt wurde.
Etwas unbeholfen habe ich die Betätigung durch den Text für "HTML bei 'true'" sichtbar machen wollen.
Damit man das aber verfolgen kann, müsste ich im Javascript wohl das Zurücksetzen auf "false" mit einem Timer verzögern - derzeit sieht man es schon nicht mehr, wenn man den Finger vom Knopf genommen hat ...Hat jemand Tipps wie man das einfach besser sichtbar machen kann?
-
Antworte mal selber.
Habe ein paar kleine Umbauten gemacht
Hier das aktualisierte Skript - schreibt nun Relais und Zustand des Datenpunkts parallel - dann sieht man auch etwas ...
var net = require('net'); /** function PulseLcTechRelEx(host, port, rel_no, datapath) causes a 2 second pulse on LcTec relay board relay in parallel to manipulation of relais, the boolean at datapath is manipulated @brief set a ESP01 based LCTec Relais @param [in] host - the ip address or name of host (i.e. ESP01 board) to address (eg 192.168.5.6) @param [in] port - the port to use to connect (e.g. 8080) @param [in] rel_no - the relay number, either 1 or 2 @param [in] datapath - the path to manipulate */ function PulseLcTechRelEx(host, port, rel_no, datapath) { var client = net.connect({host: host, port: port}, function () { // 'connect' listener var arr = new Uint8Array(4); console.log('connected to LAN-Relais!, send On Message'); arr[0]=0xA0; // command arr[1]=rel_no; // relais number arr[2]=1; // on arr[3]=arr[0]+arr[1]+arr[2]; // checksum // set relay client.write(arr); // manipulate datapath setState(datapath, true, true/*ack*/); setTimeout(function() { // Code, der erst nach 2 Sekunden ausgeführt wird, coomand and no same arr[2]=0; // off arr[3]=arr[0]+arr[1]+arr[2]; // checksum // reset relay client.write(arr); console.log("Off Message sent"); // reset bool at datapath setState(datapath, false, true/*ack*/); // client.close(); howto? client.end(); }, 2000); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('end', function () { console.log('disconnected from LAN-Relais'); }); client.on('error', function (error) { console.error('error setting ' + datapath + ' - ' + error); setState(datapath, false, true/*ack*/); client.end(); }); var net = require('net'); /** function PulseLcTechRelEx(host, port, rel_no, datapath) causes a 2 second pulse on LcTec relay board relay in parallel to manipulation of relais, the boolean at datapath is manipulated @brief set a ESP01 based LCTec Relais @param [in] host - the ip address or name of host (i.e. ESP01 board) to address (eg 192.168.5.6) @param [in] port - the port to use to connect (e.g. 8080) @param [in] rel_no - the relay number, either 1 or 2 @param [in] datapath - the path to manipulate */ function PulseLcTechRelEx(host, port, rel_no, datapath) { var client = net.connect({host: host, port: port}, function () { // 'connect' listener var arr = new Uint8Array(4); console.log('connected to LAN-Relais!, send On Message'); arr[0]=0xA0; // command arr[1]=rel_no; // relais number arr[2]=1; // on arr[3]=arr[0]+arr[1]+arr[2]; // checksum // set relay client.write(arr); // manipulate datapath setState(datapath, true, true/*ack*/); setTimeout(function() { // Code, der erst nach 2 Sekunden ausgeführt wird, coomand and no same arr[2]=0; // off arr[3]=arr[0]+arr[1]+arr[2]; // checksum // reset relay client.write(arr); console.log("Off Message sent"); // reset bool at datapath setState(datapath, false, true/*ack*/); // client.close(); howto? client.end(); }, 2000); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('data', function (data) { console.log(data.toString()); client.end(); }); client.on('end', function () { console.log('disconnected from LAN-Relais'); }); client.on('error', function (error) { console.error('error: ' + error); client.end(); }); } // On change on('0_userdata.0.Puls-Garagentor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.47', '8080', 1, '0_userdata.0.Puls-Garagentor'); } }); // On change on('0_userdata.0.Puls-Rolltor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.47', '8080', 2, '0_userdata.0.Puls-Rolltor'); } }); // On change on('0_userdata.0.Puls-Test', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.26', '8080', 1, '0_userdata.0.Puls-Test'); } }); } // On change on('0_userdata.0.Puls-Garagentor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.47', '8080', 1, '0_userdata.0.Puls-Garagentor'); } }); // On change on('0_userdata.0.Puls-Rolltor', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.47', '8080', 2, '0_userdata.0.Puls-Rolltor'); } }); // On change on('0_userdata.0.Puls-Test', function (obj) { if ( (obj.state.val ==true) && ( obj.state != obj.oldState)) { PulseLcTechRelEx('192.168.2.26', '8080', 1, '0_userdata.0.Puls-Test'); } });
-
hier noch ein besserer Test-Sparringspartner für die Linux-Kommandozeile
artin@martin-D2836-S1:/usr/local/share/ca-certificates$ nc -I4 -k -l 8080 |xxd -c4 -p -u A00101A2 A00100A1 A00101A2 A00100A1
netcat server auf Port 8080 (-l 8080)
läuft weiter, wenn client Verbindung trennt (-k)Filter xxd (Hexdump)
4 Bytes pro Zeile (=telegrammlänge, mit "-c4")
plain output (-p) -> keine "Adresse" vorabOben habe ich zweimal den entsprechende Knopf in VIS aktiviert
Bisher ist es mir nicht gelungen, mit dem Tool "ts" auch einen Timestamp in die Zeilen hereinzufummeln
-
Leider scheint das Modul einen schwer nachvollziehbaren Hang zum Absturz zu entwickeln. Alle paar Tage reagiert das Modul nicht mehr auf die abgesetzten Telegramme.
Bisher hatte ich dann immer das USB-Steckernetzteil, was das System mit Energie versorgt ein paar Sekunden herausgezogen, und dann wieder eingesteckt.
Beim letzten Problem hatte ich aber schon eine Vorsorge getroffen, und die IPv4 Adresse des Moduls im Ping-Adapter überwachen lassen - der zeigte kein Problem an, und auch manuell ließ sich das Modul anpingen ...Es wird unter den Umständen wohl schwierig, den "Abgeschmiert" Zustand des Moduls von außen zu detektieren.
An der seriellen Schnittstelle des per WLAN mit meinem Skript kommunizierenden ESP01 hängt ein weiterer Microcontroller, der wiederum die Relais ansteuert. Entweder hängt es in der Kommunikation dieses Microcontrollers mit dem ESP01, oder die Firmware auf diesem Microcontroller hat sich aufgehängt ...
Werde an zwei Fronten versuchen, den Fehler zu beseitigen:
- Hardware: Eventuell mit Stützkondensatoren o. Ä. die Qualität der Spannungsversorgung verbessern.
- Mein Javascript: Mit irgendwelchen "Aufweck-Telegrammen" den sekundären Microcontroller versuchen, aus seinem Schlaf zu wecken...
Bevor ich mich an die Software mache werde ich aber wohl noch ein paar Abstürze des Moduls abwarten, und schauen, ob immer das gleiche Fehlerbild auftritt...
Vielleicht sollte ich auch einfach probieren, Tasmota draufzuflashen ...