Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Warteschlange für das senden von 433mhz Codes

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Warteschlange für das senden von 433mhz Codes

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      DerT Forum Testing last edited by

      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 *********************
      
      
      arteck 1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @DerT last edited by arteck

        @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

        1 Reply Last reply Reply Quote 0
        • BuZZy
          BuZZy last edited by

          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 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          546
          Online

          31.8k
          Users

          80.0k
          Topics

          1.3m
          Posts

          3
          3
          213
          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