Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Wie lasse ich eine if Bedingung regelmäßig prüfen?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Wie lasse ich eine if Bedingung regelmäßig prüfen?

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

      Hallo,

      ich arbeite mich gerade etwas in Javascript ja, klappt schon einiges ganz gut. Nun habe ich aber mal eine Frage.

      Über den on Befehl oder Zeiten setze ich Variablen. Diese möchte ich am Ende mit einem if Befehl auf den KNX Bus schreiben. Das Problem was ich habe, das Script läuft beim starten einmal durch. Die on Befehle werden ja weiterhin getriggert, ebenso die Zeiten. Jedoch wird der if Befehl nicht mehr ausgeführt. Wir ändere ich das, das der if Befehl ausgeführt wird wenn sich eine Bedingungsvariable ändert? Wäre klassen wenn mich da jemand auf den richtigen Weg bringen kann.

      var Aussenlicht_Freigabe = false;
      var Aussentaster = false;
      
      on({id: "knx.0.Beleuchtungssteuerung_EG.Außen.Schalter_Garten_Pfosten"/*Schalter Garten Pfosten*/}, function (obj) {
           Aussentaster = true;
           log("Taster Außenbeleuchtung gedrückt Timer gestartet");
      });
      
      on({id: "knx.0.Beleuchtungssteuerung_EG.Außen.Schalter_Garten_Pfosten"/*Schalter Garten Pfosten*/}, function (obj) {
           setTimeout(Aussentaster = false, 300000);
           setTimeout(log("Taster Außenbeleuchtung abgelaufen",300000));
          });
      
      schedule({astro: "sunset", shift: 0}, function () {
          log("Sonnenuntergang Aussenlicht_Freigabe AN");
          Aussenlicht_Freigabe = true;
      });
      
      schedule("00 23 * * 1-5", function () {
          log("Werktags 23 Uhr Aussenlicht_Freigabe AUS");
          Aussenlicht_Freigabe = false;
      });
      
      schedule("00 23 * * 6-7", function () {
          log("Wochenende 23 Uhr Aussenlicht_Freigabe AUS");
          Aussenlicht_Freigabe = false;
      });
      
      schedule("00 5 * * 1-5", function () {
          log("Werktags 5 Uhr Aussenlicht_Freigabe EIN");
          Aussenlicht_Freigabe = true;
      });   
      
      schedule("00 7 * * 6-7", function () {
          log("Wochenende 7 Uhr Aussenlicht_Freigabe EIN");
          Aussenlicht_Freigabe = true;
      });
      
      schedule("00 9 * * 1-5", function () {
          log("Werktags 9 Uhr Aussenlicht_Freigabe AUS");
          Aussenlicht_Freigabe = false;
      });
      
      schedule("00 10 * * 6-7", function () {
          log("Wochenende 10 Uhr Aussenlicht_Freigabe AUS");
          Aussenlicht_Freigabe = false;
      });
      
      if (isAstroDay () && Aussenlicht_Freigabe || Aussentaster) {
          setState("knx.0.Beleuchtungssteuerung_EG.Außen.Außenbeleuchtung_Tür_Schalten",true);
          log("Außenlicht wurde eingeschaltet");
      } else {
          setState("knx.0.Beleuchtungssteuerung_EG.Außen.Außenbeleuchtung_Tür_Schalten",false);
          log("Außenlicht wurde ausgeschaltet");
      } 
      
      1 Reply Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer last edited by

        Entweder du packst die if-Abfrage in eine eigene Funktion, die du jedesmal aufrufst, wenn du deine Skriptvariablen änderst, und 1x zu Beginn des Skripts.

        Oder du ersetzt deine Skriptvariablen durch States (Datenpunkte) in ioBroker, die du per setState(…) / getState(...) schreibst und ausliest. Dann kannst du die if-Abfrage in einen on(...)-Block wie oben packen, der immer aufgerufen wird, wenn sich die Zustände geändert haben.

        Übrigens:

        setTimeout(Aussentaster = false, 300000);
        

        setzt den Wert von Aussentaster sofort auf false

        setTimeout(function() {Aussentaster = false}, 300000);
        

        erst nach 300s.

        1 Reply Last reply Reply Quote 0
        • F
          fuchs1978 last edited by

          Vielen Dank für den Hinweis und die Ideen 🙂

          Dann werde ich die if Anweisung in eine Funktion legen und sie im oberen Bereich immer mit hineinschreiben.

          1 Reply Last reply Reply Quote 0
          • F
            fuchs1978 last edited by

            Vielen Dank, hat alles super geklappt. Für die Umstellung von EibPC auf ioBroker hätte ich noch eine Frage. Ich habe einige Timer die das Radio ausschalten wenn keine Bewegung mehr im Raum ist. Also: wenn bewegung=false starte timer 30s danach schalte radio aus. Wenn nun zwischenzeitlich wieder eine Bewegung registriert wird breche Timer ab bis Bewegung wieder false. Wie setzt ich soetwas um?

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

              Nur ein kleiner Tipp:

              Ich verwende für gleiche/ähnliche Beispiele meine 'StateMachine', ein Javascript Programm mit welchem mann einfach State-Machines und sonstige Befehle abarbeiten kann.

              Einen ersten Versuch einer Beschreibung gibt es da: http://forum.iobroker.net/viewtopic.php … atemachine

              Eine StateMachiene für das Radio könnte so ausschauen:

              const Machines = {
                  RadioLichtBad: {
                      _all: { timer: ["BewegungsmelderBad~+", "LichtschalterBad~+"], aus: "LichtschalterBad~-" },
                      aus: { _onEnter: ["radioBad-", "lichtBad-"], _onExit: ["radioBad+", "lichtBad+"], _default:true },
                      timer: { _timeout: "aus:30000" }
                  }
              }
              

              Sie reagiert auf Schalter oder Bewegung und schaltet Radio und Licht.

              Das könnte man erweitern um das Licht natürlich nur bei Dunkelheit zu schalten 🙂

              Die ~ bedeutet bei Änderung und +- ein(+)/aus(-).

              Die Maschine hat 2 States: aus und timer. bei allen states wird '_all:' abgefragt was bedeutet dass beim Einschalten oder bei Bewegung die Maschine auf timer geht und beim ausschalten auf aus.

              timer selbst geht nach 30 Sekunden auf aus.

              aus schaltet Lich und Radio ein oder aus je nachdem…

              Habe so etliche Steuerungen, auch mit Zeiten und lichtabhängig realisiert.

              p.s.: Irgendwann werd ich das in einen Adapter packen -- wenn BlueFox mir zeigt wie ich den Javascript-Adapter dafür ergänzen oder adaptieren kann....

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

              Support us

              ioBroker
              Community Adapters
              Donate

              499
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              3
              5
              926
              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