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. Blockly
  5. Diverse Aktoren über einen Schalter steuern.

NEWS

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    5
    1
    115

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    8
    1
    159

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

Diverse Aktoren über einen Schalter steuern.

Scheduled Pinned Locked Moved Blockly
scenesjavascriptblockly
8 Posts 3 Posters 520 Views 3 Watching
  • 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.
  • A Offline
    A Offline
    AustinVTI
    wrote on last edited by AustinVTI
    #1

    Servus liebes IO Forum

    ich habe mich in meinen vier Wänden für Shelly 1 und Shelly 2.5 für die Steuerung von Licht und Steckdosen entschieden.
    Nun möchte ich ein Skript erstellen (vorzugsweise in Blockly) mit dessen Hilfe folgendes umgesetzt werden soll:

    Schalter 1 (Shelly 1 in UP installiert) ändert seinen Status durch Benutzer innerhalb 2 Sekunden 3mal (On-Off-On)
    Nun sollen diverse Shellys auf True gesetzt werden (entspricht gewünschter Vollbeleuchtung)

    Ich scheitere hier an der Zeitabhängigkeit. Ist das so in Blockly überhaiupt möglich? Alternative Codeschnipsel in Java (null Erfahrung) sind gerne gesehen.

    Beste Grüße

    Roger

    arteckA 1 Reply Last reply
    0
    • A AustinVTI

      Servus liebes IO Forum

      ich habe mich in meinen vier Wänden für Shelly 1 und Shelly 2.5 für die Steuerung von Licht und Steckdosen entschieden.
      Nun möchte ich ein Skript erstellen (vorzugsweise in Blockly) mit dessen Hilfe folgendes umgesetzt werden soll:

      Schalter 1 (Shelly 1 in UP installiert) ändert seinen Status durch Benutzer innerhalb 2 Sekunden 3mal (On-Off-On)
      Nun sollen diverse Shellys auf True gesetzt werden (entspricht gewünschter Vollbeleuchtung)

      Ich scheitere hier an der Zeitabhängigkeit. Ist das so in Blockly überhaiupt möglich? Alternative Codeschnipsel in Java (null Erfahrung) sind gerne gesehen.

      Beste Grüße

      Roger

      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      wrote on last edited by
      #2

      @AustinVTI es ist auch gerne gesehen wenn sich der Thread Ersteller mit seinem code presentiert..
      es ist einfacher dann dem zu helfen

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

      1 Reply Last reply
      0
      • A Offline
        A Offline
        AustinVTI
        wrote on last edited by AustinVTI
        #3

        Hallo Arteck,

        <xml xmlns="http://www.w3.org/1999/xhtml">
          <block type="on_ext" id="4wR|U?pRLl^@7h^.A[g^" x="-412" y="-63">
            <mutation items="1"></mutation>
            <field name="CONDITION">true</field>
            <field name="ACK_CONDITION"></field>
            <value name="OID0">
              <shadow type="field_oid" id="cGA7;Rc*9//](5Y9#0;]">
                <field name="oid">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
              </shadow>
            </value>
            <statement name="STATEMENT">
              <block type="controls_if" id="q-d7y=(2(dY|/6!ZAUf3">
                <mutation elseif="1"></mutation>
                <value name="IF0">
                  <block type="logic_compare" id="|.HENnv9QPlGr*JP/fu%">
                    <field name="OP">NEQ</field>
                    <value name="A">
                      <block type="get_value" id="qyX(R?rnuhVObY3L%sPl">
                        <field name="ATTR">val</field>
                        <field name="OID">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
                      </block>
                    </value>
                    <value name="B">
                      <block type="get_value" id="yfv!G,4*FI1K|St~02g/">
                        <field name="ATTR">val</field>
                        <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                      </block>
                    </value>
                  </block>
                </value>
                <statement name="DO0">
                  <block type="control" id="TPK*w_Y8yY-.,u@EFCno">
                    <mutation delay_input="true"></mutation>
                    <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                    <field name="WITH_DELAY">TRUE</field>
                    <field name="DELAY_MS">2000</field>
                    <field name="UNIT">ms</field>
                    <field name="CLEAR_RUNNING">FALSE</field>
                    <value name="VALUE">
                      <block type="logic_boolean" id="%c)*}aebUQrZ|.Ivn.Bm">
                        <field name="BOOL">TRUE</field>
                      </block>
                    </value>
                  </block>
                </statement>
                <value name="IF1">
                  <block type="logic_compare" id="uAX2HZ2O[ty:~8*JVkBO">
                    <field name="OP">EQ</field>
                    <value name="A">
                      <block type="get_value" id="#jl;lYOdr/tJ+ENY)@s*">
                        <field name="ATTR">val</field>
                        <field name="OID">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
                      </block>
                    </value>
                    <value name="B">
                      <block type="get_value" id="`i~4~}DA#Lj41qQZUYl0">
                        <field name="ATTR">val</field>
                        <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                      </block>
                    </value>
                  </block>
                </value>
              </block>
            </statement>
          </block>
        </xml>
        

        Dies ist zumindest ein Teil des Codes, wie ich ihn mir vorstelle.
        Gut und schön ist, dass nach dem Statuswechsel eines Shellys ein weiterer nach 2 sekunden ebenso einschaltet. Nun soll das ganze aber nur dann passieren, wenn "shelly1" seine Status von On nach Off und wieder zu On innerhalb eines gewissen Zeitfensters wechselt.

        Der gepostete Code ist dann natürlich nicht funktional, da hier die Timerfunktion fehlt. ;)

        Hauptziel des Ganzen soll es nämlich sein, die Szene "Vollbeleuchtung" an jedem Shelly, der sich hinter einem Schalter befindet durch diese Schaltfolge auswählen zu lassen.

        Deaktivierung natürlich umgekehrt. So kann ich ohne "Prothese" (Handy) an jedem Ort im Haus mittels definierter Schaltfolgen diverse Szenen auswählen. Notwendigerweise benötigt man hier eine Timerfunktion, die diese Status auch zählen kann.

        A 1 Reply Last reply
        0
        • A AustinVTI

          Hallo Arteck,

          <xml xmlns="http://www.w3.org/1999/xhtml">
            <block type="on_ext" id="4wR|U?pRLl^@7h^.A[g^" x="-412" y="-63">
              <mutation items="1"></mutation>
              <field name="CONDITION">true</field>
              <field name="ACK_CONDITION"></field>
              <value name="OID0">
                <shadow type="field_oid" id="cGA7;Rc*9//](5Y9#0;]">
                  <field name="oid">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
                </shadow>
              </value>
              <statement name="STATEMENT">
                <block type="controls_if" id="q-d7y=(2(dY|/6!ZAUf3">
                  <mutation elseif="1"></mutation>
                  <value name="IF0">
                    <block type="logic_compare" id="|.HENnv9QPlGr*JP/fu%">
                      <field name="OP">NEQ</field>
                      <value name="A">
                        <block type="get_value" id="qyX(R?rnuhVObY3L%sPl">
                          <field name="ATTR">val</field>
                          <field name="OID">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
                        </block>
                      </value>
                      <value name="B">
                        <block type="get_value" id="yfv!G,4*FI1K|St~02g/">
                          <field name="ATTR">val</field>
                          <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                        </block>
                      </value>
                    </block>
                  </value>
                  <statement name="DO0">
                    <block type="control" id="TPK*w_Y8yY-.,u@EFCno">
                      <mutation delay_input="true"></mutation>
                      <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                      <field name="WITH_DELAY">TRUE</field>
                      <field name="DELAY_MS">2000</field>
                      <field name="UNIT">ms</field>
                      <field name="CLEAR_RUNNING">FALSE</field>
                      <value name="VALUE">
                        <block type="logic_boolean" id="%c)*}aebUQrZ|.Ivn.Bm">
                          <field name="BOOL">TRUE</field>
                        </block>
                      </value>
                    </block>
                  </statement>
                  <value name="IF1">
                    <block type="logic_compare" id="uAX2HZ2O[ty:~8*JVkBO">
                      <field name="OP">EQ</field>
                      <value name="A">
                        <block type="get_value" id="#jl;lYOdr/tJ+ENY)@s*">
                          <field name="ATTR">val</field>
                          <field name="OID">shelly.0.SHSW-1#BA6C4B#1.Relay0.Switch</field>
                        </block>
                      </value>
                      <value name="B">
                        <block type="get_value" id="`i~4~}DA#Lj41qQZUYl0">
                          <field name="ATTR">val</field>
                          <field name="OID">shelly.0.SHSW-1#22F4E8#1.Relay0.Switch</field>
                        </block>
                      </value>
                    </block>
                  </value>
                </block>
              </statement>
            </block>
          </xml>
          

          Dies ist zumindest ein Teil des Codes, wie ich ihn mir vorstelle.
          Gut und schön ist, dass nach dem Statuswechsel eines Shellys ein weiterer nach 2 sekunden ebenso einschaltet. Nun soll das ganze aber nur dann passieren, wenn "shelly1" seine Status von On nach Off und wieder zu On innerhalb eines gewissen Zeitfensters wechselt.

          Der gepostete Code ist dann natürlich nicht funktional, da hier die Timerfunktion fehlt. ;)

          Hauptziel des Ganzen soll es nämlich sein, die Szene "Vollbeleuchtung" an jedem Shelly, der sich hinter einem Schalter befindet durch diese Schaltfolge auswählen zu lassen.

          Deaktivierung natürlich umgekehrt. So kann ich ohne "Prothese" (Handy) an jedem Ort im Haus mittels definierter Schaltfolgen diverse Szenen auswählen. Notwendigerweise benötigt man hier eine Timerfunktion, die diese Status auch zählen kann.

          A Offline
          A Offline
          AustinVTI
          wrote on last edited by
          #4

          Ach und noch eines,

          Ich habe mit Krampf das SmartHome-Lite umsetzen dürfen. Eine Alternative mit Alexa oder anderen sprachgesteuerten Assistenten, denen ich sage "Lichter Volllast", hat die Regierung verboten. ;)

          AsgothianA 1 Reply Last reply
          0
          • A AustinVTI

            Ach und noch eines,

            Ich habe mit Krampf das SmartHome-Lite umsetzen dürfen. Eine Alternative mit Alexa oder anderen sprachgesteuerten Assistenten, denen ich sage "Lichter Volllast", hat die Regierung verboten. ;)

            AsgothianA Offline
            AsgothianA Offline
            Asgothian
            Developer
            wrote on last edited by Asgothian
            #5

            @AustinVTI
            Das ganze ist aus meiner Sicht ganz einfach:

            let MultiShellyTimeout = null;
            let onCount = 0;
            let offCount = 0;
            
            on({id:'id des shelly', change: "ne"}, function(obj) {
              if (MultiShellyTimeout) {
                // multi-aktion startet immer mit "einschalten"
                if (obj.state.val) onCount++;
                else offCount++;
                return;
              }
              if (obj.state.val) {
                onCount = 1;
                offCount = 0;
                MultiShellyTimeout = setTimeout(function(obj) {
                  MultiShellyTimeout = null;
                        // Abfrage von onCount und offCount für Aktion. z.Bsp.
                  if (onCount == 2 && offCount == 1) {
                    // mehrere setState um die Aktoren zu schalten
                  }
                }, 2000);
              }
              else
              {
                // falls die 1. Aktion "ausschalten" ist, kann hier bei bedarf etwas getan werden.
              } 
            });
            

            Das sollte sich auch als Blockly umsetzen lassen, auch wenn ich das aktuell nicht zusammen bekomme - kein Zugriff auf Blockly

            In dem Zusammenhang kannst du dann mit der gleichen Funktion auch unterschiedliche Aktionen auslösen, abhängig davon wie der Shelly geschaltet wurde.

            Die Voraussetzung, das multi-Aktionen immer mit einem "on" anfangen kann durch leichte Anpassungen des Scripts durchaus geändert werden.

            Ich hoffe das hilft etwas.

            A.

            ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
            "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

            A 1 Reply Last reply
            0
            • AsgothianA Asgothian

              @AustinVTI
              Das ganze ist aus meiner Sicht ganz einfach:

              let MultiShellyTimeout = null;
              let onCount = 0;
              let offCount = 0;
              
              on({id:'id des shelly', change: "ne"}, function(obj) {
                if (MultiShellyTimeout) {
                  // multi-aktion startet immer mit "einschalten"
                  if (obj.state.val) onCount++;
                  else offCount++;
                  return;
                }
                if (obj.state.val) {
                  onCount = 1;
                  offCount = 0;
                  MultiShellyTimeout = setTimeout(function(obj) {
                    MultiShellyTimeout = null;
                          // Abfrage von onCount und offCount für Aktion. z.Bsp.
                    if (onCount == 2 && offCount == 1) {
                      // mehrere setState um die Aktoren zu schalten
                    }
                  }, 2000);
                }
                else
                {
                  // falls die 1. Aktion "ausschalten" ist, kann hier bei bedarf etwas getan werden.
                } 
              });
              

              Das sollte sich auch als Blockly umsetzen lassen, auch wenn ich das aktuell nicht zusammen bekomme - kein Zugriff auf Blockly

              In dem Zusammenhang kannst du dann mit der gleichen Funktion auch unterschiedliche Aktionen auslösen, abhängig davon wie der Shelly geschaltet wurde.

              Die Voraussetzung, das multi-Aktionen immer mit einem "on" anfangen kann durch leichte Anpassungen des Scripts durchaus geändert werden.

              Ich hoffe das hilft etwas.

              A.

              A Offline
              A Offline
              AustinVTI
              wrote on last edited by
              #6

              @Asgothian Danke ich werde es mal probieren.

              1 Reply Last reply
              0
              • A Offline
                A Offline
                AustinVTI
                wrote on last edited by AustinVTI
                #7

                Nachdem ich in der Zählersache etwas mehr durchgestiegen bin, habe ich einfach folgendes zurechtgehämmert.

                Das hat den Vorteil, dass ich den Schalter wie gewohnt benutzen kann ohne "Irgendwann" wenn die ON- und Off-Zähler ihre Füllstände erreicht haben eine Szene ausgeführt wird ohne, dass man es wollte.

                Mein Script zählt die Schaltzustände innerhalb eines gewissen Timeouts.
                Ist der Timeout abgelaufen, werden die Zähler zurückgesetzt und der Spaß geht von vorne los.

                var Rueckstellung, Zaehler_On, Zaehler_OFF;
                
                
                on({id: "Lichtschalter XY", change: "ne"}, function (obj) {
                  var value = obj.state.val;
                  var oldValue = obj.oldState.val;
                  Rueckstellung = setTimeout(function () {
                    Zaehler_On = 0;
                    Zaehler_OFF = 0;
                  }, 5000);
                  if (getState("Lichtschalter XY").val == true) {
                    Zaehler_On = (typeof Zaehler_On == 'number' ? Zaehler_On : 0) + 1;
                  }
                  if (getState("Lichtschalter XY").val == false) {
                    Zaehler_OFF = (typeof Zaehler_OFF == 'number' ? Zaehler_OFF : 0) + 1;
                  }
                  if (Zaehler_On == 2 && Zaehler_OFF == 2) {
                    if (getState("Aktor_in_der_Wunschszene").val == false) {
                      setState("Aktor_in_der_Wunschszene", true);
                      sendTo("telegram", "send", {
                          text: 'Wunschaktor aktiviert'
                      });
                    }
                    if (getState("Aktor_in_der_Wunschszene").val == true) {
                      setState("Aktor_in_der_Wunschszene", false);
                      sendTo("telegram", "send", {
                          text: 'Wunschaktor deaktiviert'
                      });
                    }
                    Zaehler_OFF = 0;
                    Zaehler_On = 0;
                  }
                });
                
                
                

                Was mir jetzt noch fehlt, ist die Auswahl von mehreren Szenen, was ich dann in einen weiteren timeout packen sollte, der erst nach einer gewissen Zeit die Codefolgen des Schalters prüft.

                Als Tipp: Der gewählte Schalter steuert eine eher unauffällige Lampe, die nicht im Raum für Blitzlichtgewitter sorgt. ;)

                1 Reply Last reply
                0
                • A Offline
                  A Offline
                  AustinVTI
                  wrote on last edited by
                  #8

                  Und das Ganze etwas erweitert:

                  var Rueckstellung, Zaehler_On, Zaehler_OFF, Auswertung;
                  
                  
                  on({id: 'Aktor_Küche#1.Relay0.Switch', change: "ne"}, function (obj) {
                    var value = obj.state.val;
                    var oldValue = obj.oldState.val;
                    Rueckstellung = setTimeout(function () {
                      Zaehler_On = 0;
                      Zaehler_OFF = 0;
                      console.warn((['Variablen zurückgesetzt, Mit Zähler ON= ',Zaehler_On,' und Zähler OFF=',Zaehler_OFF].join('')));
                    }, 10000);
                    if (getState("Aktor_Küche#1.Relay0.Switch").val == true) {
                      Zaehler_On = (typeof Zaehler_On == 'number' ? Zaehler_On : 0) + 1;
                    }
                    if (getState("Aktor_Küche#1.Relay0.Switch").val == false) {
                      Zaehler_OFF = (typeof Zaehler_OFF == 'number' ? Zaehler_OFF : 0) + 1;
                    }
                    Auswertung = setTimeout(function () {
                      if (Zaehler_On == 2 && Zaehler_OFF == 2) {
                        if (getState("Lampe 1#1.Relay0.Switch").val == false) {
                          setState("Lampe 1#1.Relay0.Switch"/*Switch*/, true);
                          console.log('Aktor1_in_der_Wunschszene aktiviert');
                        }
                        if (getState("Lampe 1#1.Relay0.Switch").val == true) {
                          setState("Lampe 1#1.Relay0.Switch"/*Switch*/, false);
                          console.log('Aktor1_in_der_Wunschszene deaktiviert');
                        }
                        Zaehler_OFF = 0;
                        Zaehler_On = 0;
                      }
                      if (Zaehler_On == 3 && Zaehler_OFF == 3) {
                        if (getState("Lampe 2#1.Relay0.Switch").val == false) {
                          setState("Lampe 2#1.Relay0.Switch"/*SHSW-1#BA6C4B#1.Relay0.Switch*/, true);
                          console.log('Aktor2_in_der_Wunschszene EIN');
                        }
                        if (getState("Lampe 2#1.Relay0.Switch").val == true) {
                          setState("Lampe 2#1.Relay0.Switch"/*SHSW-1#BA6C4B#1.Relay0.Switch*/, true);
                          console.log('Aktor2_in_der_Wunschszene AUS');
                        }
                        Zaehler_OFF = 0;
                        Zaehler_On = 0;
                      }
                    }, 6000);
                  });
                  
                  

                  Die Variablen werden erst nach 10 Sekunden genullt und die Auswertung der Wunschszene erfolgt - in diesem Beispiel - nach 6 Sekunden.

                  Hinterlegt wird ein jeweils angepasstes Script für jeden in Frage kommenden Teilnehmer, der die Szenen auswählen darf.

                  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

                  520

                  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