Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JS: Wie auf socket-Ergebnis warten?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.2k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

JS: Wie auf socket-Ergebnis warten?

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascriptblockly
3 Beiträge 2 Kommentatoren 161 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • O Offline
    O Offline
    oxident
    schrieb am zuletzt editiert von
    #1

    Hallo!

    Ich weiß, es ist eine schlechte Praxis, blockierende I/O-Operationen zu verwenden, aber ich möchte gerne eine bestimmte Ablaufsteuerung in einem Skript programmieren.
    Hierzu habe ich ein Blockly gebaut, welches in mehreren Schritten Wasser in der Heizung auffüllt:

    Prüfe Heizungsdruck
    Wenn zu niedrig -> Starte Logik:
    Schalte Pumpe aus
    Öffne Wasserventil bis Druck ok
    Schließe Ventil
    Schalte Pumpe ein

    Das lässt sich auch prima lösen, jedoch muss ich für die Pumpensteuerung einen Befehl per TCP-Socket an meine ebusd-Installation senden und auf das Ergebnis (ob es geklappt hat) reagieren.

    Hierzu nutze ich folgendes JavaScript:

    var net = require('net');
    
    function sendMessage(host, port, message) {
      var retry = 0;
      var finished = false;
    
      var client = net.connect({host:host, port: port}, function () {
      
        console.log('connected to server!');
        client.write(message);
      });
      client.on('data', function (data) {
          // OK: "done..."
          // Nicht OK: "ERR..."
          // Rückgabe nach "quit": "connection closed"
    
          if(data.toString().indexOf('connection closed')<0) {
    
          
            if(data.toString().indexOf('done')>=0) {
                
                log("eBus ok!", 'warn');
                client.write('quit\r\n');
                finished = true;
            } else {
                log("eBus: " + data.toString() + " versuche erneut", 'warn');
                retry++;
                if(retry<5) {
                    sleep(2000);
                    client.write(message);
                } else {
                    log("eBus FEHLER!", 'warn');
                    client.write('quit\r\n');
                    finished = true;
                }
                
            }
          }
    
        
        
      });
      client.on('end', function () {
        console.log('disconnected from server');
        finished = true;
      });
      client.on('error', function (error) {
        console.error('error: ' + error);
        client.end();
        finished = true;
      });
    }
    
    sendMessage('IP-Adresse', 8888, 'write -c MM1 MKModus Stand-By\r\n');
    

    Gerne würde ich das als JS-Funktion in Blockly nutzen, jedoch muss mir der Code dafür unbedingt das Ergebnis der ganzen Aktion zurückgeben. Im jetzigen Zustand erfolgt die Rückkehr nach SendMessage ja umgehend und ich weiß nicht, ob der Vorgang erfolgreich war.

    Habt ihr irgendeine Idee, wie man das lösen könnte?

    arteckA 1 Antwort Letzte Antwort
    0
    • O oxident

      Hallo!

      Ich weiß, es ist eine schlechte Praxis, blockierende I/O-Operationen zu verwenden, aber ich möchte gerne eine bestimmte Ablaufsteuerung in einem Skript programmieren.
      Hierzu habe ich ein Blockly gebaut, welches in mehreren Schritten Wasser in der Heizung auffüllt:

      Prüfe Heizungsdruck
      Wenn zu niedrig -> Starte Logik:
      Schalte Pumpe aus
      Öffne Wasserventil bis Druck ok
      Schließe Ventil
      Schalte Pumpe ein

      Das lässt sich auch prima lösen, jedoch muss ich für die Pumpensteuerung einen Befehl per TCP-Socket an meine ebusd-Installation senden und auf das Ergebnis (ob es geklappt hat) reagieren.

      Hierzu nutze ich folgendes JavaScript:

      var net = require('net');
      
      function sendMessage(host, port, message) {
        var retry = 0;
        var finished = false;
      
        var client = net.connect({host:host, port: port}, function () {
        
          console.log('connected to server!');
          client.write(message);
        });
        client.on('data', function (data) {
            // OK: "done..."
            // Nicht OK: "ERR..."
            // Rückgabe nach "quit": "connection closed"
      
            if(data.toString().indexOf('connection closed')<0) {
      
            
              if(data.toString().indexOf('done')>=0) {
                  
                  log("eBus ok!", 'warn');
                  client.write('quit\r\n');
                  finished = true;
              } else {
                  log("eBus: " + data.toString() + " versuche erneut", 'warn');
                  retry++;
                  if(retry<5) {
                      sleep(2000);
                      client.write(message);
                  } else {
                      log("eBus FEHLER!", 'warn');
                      client.write('quit\r\n');
                      finished = true;
                  }
                  
              }
            }
      
          
          
        });
        client.on('end', function () {
          console.log('disconnected from server');
          finished = true;
        });
        client.on('error', function (error) {
          console.error('error: ' + error);
          client.end();
          finished = true;
        });
      }
      
      sendMessage('IP-Adresse', 8888, 'write -c MM1 MKModus Stand-By\r\n');
      

      Gerne würde ich das als JS-Funktion in Blockly nutzen, jedoch muss mir der Code dafür unbedingt das Ergebnis der ganzen Aktion zurückgeben. Im jetzigen Zustand erfolgt die Rückkehr nach SendMessage ja umgehend und ich weiß nicht, ob der Vorgang erfolgreich war.

      Habt ihr irgendeine Idee, wie man das lösen könnte?

      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @oxident setzt dich mal mit await und async auseinander

      zigbee hab ich, zwave auch, nuc's genauso und HA auch

      O 1 Antwort Letzte Antwort
      1
      • arteckA arteck

        @oxident setzt dich mal mit await und async auseinander

        O Offline
        O Offline
        oxident
        schrieb am zuletzt editiert von
        #3

        @arteck Hatte gehofft, da drumherum zu kommen. Jetzt habe ich wohl keine Ausrede mehr ;-)

        1 Antwort Letzte Antwort
        0
        Antworten
        • In einem neuen Thema antworten
        Anmelden zum Antworten
        • Älteste zuerst
        • Neuste zuerst
        • Meiste Stimmen


        Support us

        ioBroker
        Community Adapters
        Donate

        734

        Online

        32.7k

        Benutzer

        82.4k

        Themen

        1.3m

        Beiträge
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Anmelden

        • Du hast noch kein Konto? Registrieren

        • Anmelden oder registrieren, um zu suchen
        • Erster Beitrag
          Letzter Beitrag
        0
        • Home
        • Aktuell
        • Tags
        • Ungelesen 0
        • Kategorien
        • Unreplied
        • Beliebt
        • GitHub
        • Docu
        • Hilfe