Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Garagentor-Fernbedienung (ESP01 Javascript)

    NEWS

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    • Save The Date: ioBroker@Smart Living Forum Solingen, 14.06.

    Garagentor-Fernbedienung (ESP01 Javascript)

    This topic has been deleted. Only users with topic management privileges can see it.
    • MartinP
      MartinP last edited by MartinP

      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.

      b8081436-c06a-4ad8-a601-08a962c2418a-grafik.png

      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*/);
      }); 
      

      93d33f01-4d06-45dc-a906-f450e03ee63e-grafik.png

      MartinP 1 Reply Last reply Reply Quote 1
      • MartinP
        MartinP @MartinP last edited by

        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?

        MartinP 1 Reply Last reply Reply Quote 0
        • MartinP
          MartinP @MartinP last edited by MartinP

          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');
            }
          }); 
          
          MartinP 1 Reply Last reply Reply Quote 0
          • MartinP
            MartinP @MartinP last edited by MartinP

            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" vorab

            Oben 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

            MartinP 1 Reply Last reply Reply Quote 0
            • MartinP
              MartinP @MartinP last edited by

              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 ...

              https://tasmota.github.io/docs/devices/LC-Technology-WiFi-Relay/#lc-technology-wifi-relay-dual-relay-note-older-versions-of-this-board-used-a-baud-rate-of-9600-so-if-115200-doesnt-work-try-9600

              MartinP 1 Reply Last reply Reply Quote 0
              • MartinP
                MartinP @MartinP last edited by

                Seitdem ich der Fritzbox verboten habe, nach Gutdünken den 2,4 GHz Wifi-Kanal zu wechseln hat sich das Problem mit den Abstürzen verflüchtigt ...
                Monatelang ohne Probleme, solange das WLAN der Fritzbox nicht mal kurz weg ist ...

                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                716
                Online

                31.6k
                Users

                79.4k
                Topics

                1.3m
                Posts

                1
                6
                905
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo