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. JavaScript
  5. Warteschlange für das senden von 433mhz Codes

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Warteschlange für das senden von 433mhz Codes

Geplant Angeheftet Gesperrt Verschoben JavaScript
3 Beiträge 3 Kommentatoren 294 Aufrufe 4 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.
  • D Offline
    D Offline
    DerT
    Forum Testing
    schrieb am zuletzt editiert von
    #1

    Hallo Zusammen,

    ich habe drei 433mhz Steckdosen im Einsatz.
    Das schalten dieser Steckdosen funktioniert übern einen RaspberryPi.
    Dort setzte ich einen Befehl via SSH ab der über einen Sender den jeweiligen Code verschickt.
    Nun kommt mein Problem.
    Für die Steckdosen habe ich jeweils einen State im angelegt.
    bei True wird der Code für "Einschalten" gesendet und bei False für "ausschalten".

    Wen ich alle drei Steckdosen gleichzeitig schalte, zum Beispiel weil eine Szene schaltet, funktioniert das ganze nicht da der Raspberry nicht alle drei Codes gleichzeitig senden kann.

    Hier müsste ich eine Art Warteschlange bauen damit die Codes nacheinander abgearbeitet werden.

    Ich habe bereits eine Lösung implementiert die zwar funktioniert aber extrem unsauber ist.

    Hier wird einfach alle 3 Sekunden abgefragt ob der Zustand einer Steckdose sich in den letzten 10 Sekunden geändert hat und wenn ja wird der Code versendet.
    Wenn sich mehrere geändert haben gibt es einen Timeout von einer Sekunde.

    Das Problem dabei ist natürlich, das der Code völlig unnötig alle 3 Sekunden getriggert wird.

    Es muss doch eine elegantere Lösung geben.
    Weiß jemand was?

    Danke und Gruß
    T

    //************************ Schedules *********************
    
    //Prüft alle 3 Sekunden ob sich der Zustand einer 433Mhz Steckdose in den letzten 10 Sekunden geändert hat.
    //Wenn ja wird der Befehl zum schalten der Steckdose gesendet
    //Wenn sich mehrere geändert haben wird ein Timeout gesetzt.
    schedule("*/3 * * * * *", function () {
        var Plugs = ['OwnDevices.0.433mhzPlugs.10011.PlugA', 'OwnDevices.0.433mhzPlugs.10011.PlugB', 'OwnDevices.0.433mhzPlugs.10011.PlugC'];
        var Timeout = 0;
    
        Plugs.forEach(function (plugId) {
            var PlugLastChange = getState(plugId).lc;
            var actualTime = new Date().getTime();
            var PossibleTime = toInt(PlugLastChange) + 20000; //10 Sekunden
            if (actualTime < PossibleTime) {
                var PlugState = getState(plugId).val;
                setTimeout(function () {
                    SendCommand(plugId, PlugState);
                }, Timeout);
                Timeout += 1000;
            };
        });
    });
    //************************ Schedules *********************
    
    //************************ Functions *********************
    //Sendet perr SSH den Befehl zum Schalten der 433mhz Steckdosen
    function SendCommand(plugId, state) {
        var ssh = 'ssh pi@***.***.***.*** -p **** "';
        var path = '/home/pi/programs/433Utils/RPi_utils/./codesend ';
        if (state) {
            var Code = getState(plugId + '.CodeOn').val;
        }
        else {
            var Code = getState(plugId + '.CodeOff').val;
        };
        var command = ssh + path + Code + '"';
        exec(command);
    };
    //************************ Functions *********************
    
    
    arteckA 1 Antwort Letzte Antwort
    0
    • D DerT

      Hallo Zusammen,

      ich habe drei 433mhz Steckdosen im Einsatz.
      Das schalten dieser Steckdosen funktioniert übern einen RaspberryPi.
      Dort setzte ich einen Befehl via SSH ab der über einen Sender den jeweiligen Code verschickt.
      Nun kommt mein Problem.
      Für die Steckdosen habe ich jeweils einen State im angelegt.
      bei True wird der Code für "Einschalten" gesendet und bei False für "ausschalten".

      Wen ich alle drei Steckdosen gleichzeitig schalte, zum Beispiel weil eine Szene schaltet, funktioniert das ganze nicht da der Raspberry nicht alle drei Codes gleichzeitig senden kann.

      Hier müsste ich eine Art Warteschlange bauen damit die Codes nacheinander abgearbeitet werden.

      Ich habe bereits eine Lösung implementiert die zwar funktioniert aber extrem unsauber ist.

      Hier wird einfach alle 3 Sekunden abgefragt ob der Zustand einer Steckdose sich in den letzten 10 Sekunden geändert hat und wenn ja wird der Code versendet.
      Wenn sich mehrere geändert haben gibt es einen Timeout von einer Sekunde.

      Das Problem dabei ist natürlich, das der Code völlig unnötig alle 3 Sekunden getriggert wird.

      Es muss doch eine elegantere Lösung geben.
      Weiß jemand was?

      Danke und Gruß
      T

      //************************ Schedules *********************
      
      //Prüft alle 3 Sekunden ob sich der Zustand einer 433Mhz Steckdose in den letzten 10 Sekunden geändert hat.
      //Wenn ja wird der Befehl zum schalten der Steckdose gesendet
      //Wenn sich mehrere geändert haben wird ein Timeout gesetzt.
      schedule("*/3 * * * * *", function () {
          var Plugs = ['OwnDevices.0.433mhzPlugs.10011.PlugA', 'OwnDevices.0.433mhzPlugs.10011.PlugB', 'OwnDevices.0.433mhzPlugs.10011.PlugC'];
          var Timeout = 0;
      
          Plugs.forEach(function (plugId) {
              var PlugLastChange = getState(plugId).lc;
              var actualTime = new Date().getTime();
              var PossibleTime = toInt(PlugLastChange) + 20000; //10 Sekunden
              if (actualTime < PossibleTime) {
                  var PlugState = getState(plugId).val;
                  setTimeout(function () {
                      SendCommand(plugId, PlugState);
                  }, Timeout);
                  Timeout += 1000;
              };
          });
      });
      //************************ Schedules *********************
      
      //************************ Functions *********************
      //Sendet perr SSH den Befehl zum Schalten der 433mhz Steckdosen
      function SendCommand(plugId, state) {
          var ssh = 'ssh pi@***.***.***.*** -p **** "';
          var path = '/home/pi/programs/433Utils/RPi_utils/./codesend ';
          if (state) {
              var Code = getState(plugId + '.CodeOn').val;
          }
          else {
              var Code = getState(plugId + '.CodeOff').val;
          };
          var command = ssh + path + Code + '"';
          exec(command);
      };
      //************************ Functions *********************
      
      
      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      schrieb am zuletzt editiert von arteck
      #2

      @DerT du könntest mit einer queue arbeiten .. oder du erzeugst dir ein wait
      https://www.heise.de/tipps-tricks/JavaScript-Sleep-und-setTimeout-4060840.html

      oder

      function sleep(milliseconds) {
        var start = new Date().getTime();
        for (var i = 0; i < 1e7; i++) {
          if ((new Date().getTime() - start) > milliseconds){
            break;
          }
        }
      }
      

      von hier https://stackoverflow.com/questions/16873323/javascript-sleep-wait-before-continuing/16873849

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

      1 Antwort Letzte Antwort
      0
      • BuZZyB Offline
        BuZZyB Offline
        BuZZy
        schrieb am zuletzt editiert von
        #3

        Ich würde eine Variable setzen wenn gesendet wird.

        Am Anfang der function dann überprüfen ob gesendet wird = true? Wenn ja -> in 3 Sekunden noch mal probieren && return.
        Wenn nein -> fortfahren..

        Gruß

        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

        748

        Online

        32.6k

        Benutzer

        82.2k

        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