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

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Diverse Aktoren über einen Schalter steuern.

Geplant Angeheftet Gesperrt Verschoben Blockly
scenesjavascriptblockly
8 Beiträge 3 Kommentatoren 503 Aufrufe 3 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.
  • A Offline
    A Offline
    AustinVTI
    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • A Offline
        A Offline
        AustinVTI
        schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von
              #6

              @Asgothian Danke ich werde es mal probieren.

              1 Antwort Letzte Antwort
              0
              • A Offline
                A Offline
                AustinVTI
                schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
                0
                • A Offline
                  A Offline
                  AustinVTI
                  schrieb am zuletzt editiert von
                  #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 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

                  605

                  Online

                  32.7k

                  Benutzer

                  82.4k

                  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