NEWS


  • 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

  • Developer Most Active

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


  • 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.


  • 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. 😉

  • Developer

    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.


  • Asgothian Danke ich werde es mal probieren.


  • 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. 😉


  • 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.

Suggested Topics

1.8k
Online

34.6k
Users

40.7k
Topics

557.9k
Posts