Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Auf mehrere Ereignisse subscriben, aber Block nicht mehrmals zeitgleich ausführen

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    784

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

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

Auf mehrere Ereignisse subscriben, aber Block nicht mehrmals zeitgleich ausführen

Scheduled Pinned Locked Moved Skripten / Logik
3 Posts 2 Posters 577 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Offline
    C Offline
    cernst1980
    wrote on last edited by
    #1

    Ich stehe gerade auf dem Schlauch, brauche mal bitte nen Tipp.

    Ich habe eine Beleuchtung "Bar" und "Vitrine" über eine Funksteckdose.

    Diese sollen in Abhängigkeit der Hue Lampen "Esstisch" und "Wohnwand" geschalten werden, aber erst ab einer gewissen Helligkeit (40 bzw. 80 Prozent).

    ! var timeout; ! on({id: new RegExp('hue\\.0\\.Hue_Bridge\\.Esstisch\\.level' + "|" + 'hue\\.0\\.Hue_Bridge\\.Wohnwand\\.level'), change: "any"}, function (obj) { if (getState("hue.0.Hue_Bridge.Esstisch.level").val >= 40 || getState("hue.0.Hue_Bridge.Wohnwand.level").val >= 40) { setState("hue.1.HA-Bridge.Bar.on"/*HA-Bridge.Bar.on*/, true); } else { setState("hue.1.HA-Bridge.Bar.on"/*HA-Bridge.Bar.on*/, false); } timeout = setTimeout(function () { if (getState("hue.0.Hue_Bridge.Esstisch.level").val >= 40 || getState("hue.0.Hue_Bridge.Wohnwand.level").val >= 80) { setState("hue.1.HA-Bridge.Vitrine.on"/*HA-Bridge.Vitrine.on*/, true); } else { setState("hue.1.HA-Bridge.Vitrine.on"/*HA-Bridge.Vitrine.on*/, false); } }, 500); }); !

    Das Skript funktioniert und tut soweit, was ich will.

    Nun habe ich das Problem, wenn in einer Hue Szene (Hue Dimmschalter) sowohl "Esstisch" als auch "Wohnwand" gleichzeitig verändert werden, wird der Block auch 2 mal gleichzeitig ausgeführt.

    Dadurch wird jedes auszuführende setState 2-mal zeitgleich ausgeführt und gefunkt, was zur Folge hat, dass die Steckdosen teilweise gar nicht schalten.

    Wie kann ich zwar auf Esstisch und Wohnwand subscriben, aber wenn beides zeitgleich aktualisiert wird, den Block nur einmal ausführen?

    Mit einer Hilfsvariable hatte es nicht geklappt, diese wird wohl nicht schnell genug gesetzt, da wirklich zeitgleich.

    Damit wird es auch nichts bringen, einen Status von "Bar" oder "Vitrine" mit getState vorher abzufragen, das wäre noch langsamer…

    1 Reply Last reply
    0
    • apollon77A Offline
      apollon77A Offline
      apollon77
      wrote on last edited by
      #2

      In nodejs machst du das üblicherweise mit nem Timeouts. Man sagt in welchen Zeitraum man doppelte Trigger ignorieren will(1s oder länger) und kann dann:

      Option 1 die Ausführung von dem was getan werden soll verzögern. Jede neue Aktion startet die Verzögerung neu.

      Option 2: sofort ausführen (nur wen Variable nicht gesetzt ist) Und eine Variable setzen. Dann mit einer Verzögerung die Variable zurücksetzen …

      Hoffe war jetzt nicht zu kryptisch [emoji6]

      Ps: wirklich parallel wird nichts ausgeführt. Kommt alles nacheinander.

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Reply Last reply
      0
      • C Offline
        C Offline
        cernst1980
        wrote on last edited by
        #3

        Ich habe jetzt eine andere Ursache gefunden, es funktioniert doch mit der ursprünglichen Methode Hilfsvariable.

        ! ````
        var Threshold_Bar_Esstisch, is_running, Threshold_Bar_Wohnwand, Threshold_Vitrine_Esstisch, Threshold_Vitrine_Wohnwand, timeout1, Esstisch, Wohnwand, timeout2;
        ! Threshold_Bar_Esstisch = 40;
        Threshold_Bar_Wohnwand = 40;
        Threshold_Vitrine_Esstisch = 40;
        Threshold_Vitrine_Wohnwand = 80;
        ! is_running = false;
        on({id: new RegExp('hue\.0\.Hue_Bridge\.Esstisch\.level' + "|" + 'hue\.0\.Hue_Bridge\.Wohnwand\.level'), change: "any"}, function (obj) {
        if (is_running != true) {
        is_running = true;
        timeout1 = setTimeout(function () {
        Esstisch = getState("hue.0.Hue_Bridge.Esstisch.level").val;
        Wohnwand = getState("hue.0.Hue_Bridge.Wohnwand.level").val;
        if (Esstisch >= Threshold_Bar_Esstisch || Wohnwand >= Threshold_Bar_Wohnwand) {
        setState("hue.1.HA-Bridge.Bar.on"/HA-Bridge.Bar.on/, true);
        } else {
        setState("hue.1.HA-Bridge.Bar.on"/HA-Bridge.Bar.on/, false);
        }
        timeout2 = setTimeout(function () {
        if (Esstisch >= Threshold_Vitrine_Esstisch || Wohnwand >= Threshold_Vitrine_Wohnwand) {
        setState("hue.1.HA-Bridge.Vitrine.on"/HA-Bridge.Vitrine.on/, true);
        } else {
        setState("hue.1.HA-Bridge.Vitrine.on"/HA-Bridge.Vitrine.on/, false);
        }
        is_running = false;
        }, 500);
        }, 500);
        }
        });

        
        Das Problem war, dass bei gleichzeitigem Schalten von Esstisch und Wohnwand nicht sofort die Werte von "hue.0.Hue_Bridge.Esstisch.level" und "hue.0.Hue_Bridge.Wohnwand.level" gesetzt sind wenn die Subscription zuschlägt, da der Adapter diese seriell abfragt.
        
        Daher habe ich "timeout1" von 500 ms hinzugefügt.
        
        Im Zusammenspiel mit "is_running", welches sofort auf "true" gesetzt wird, wird der Block jetzt nur noch exklusiv aber mit korrekten Werten ausgeführt.
        1 Reply Last reply
        0

        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

        With your input, this post could be even better 💗

        Register Login
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        Support us

        ioBroker
        Community Adapters
        Donate

        542

        Online

        32.8k

        Users

        82.7k

        Topics

        1.3m

        Posts
        Community
        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
        ioBroker Community 2014-2025
        logo
        • Login

        • Don't have an account? Register

        • Login or register to search.
        • First post
          Last post
        0
        • Home
        • Recent
        • Tags
        • Unread 0
        • Categories
        • Unreplied
        • Popular
        • GitHub
        • Docu
        • Hilfe