Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip"

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip"

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

      Hallo Zusammen

      In einem Fred hier im Forum wurde nach dem Badewannen-Prinzip gefragt.
      http://forum.iobroker.net/viewtopic.php … ead#p44827

      Ich setzte dieses Prinzip seit längerem an Stellen ein, wo andere Arten von Anwesenheitserkennung nur schwer oder gar nicht umsetzbar sind.
      Die ursprüngliche Idee hatte Roland M. aus dem Homatic-Forum.
      http://homematic-forum.de/forum/viewtop … 31&t=24962

      Die Einstellungen in meinem Beispiel, muss sich natürlich jeder nach seinen Bedürfnissen anpassen.
      Der betreffende BW ist folgendermaßen eingestellt:
      Auslösen bei jedem Sensor-Impuls
      Sendeabstand dynamisch
      Mindestsendeabstand 60 Sekunden
      Bei diesen Einstellungen kommt theoretisch jede Minute ein Impuls wenn sich jemand im Raum befindet.
      Das sind also max. 60 Impulse pro Stunde.
      Bei jeder erkannten Bewegung wird eine Variable (Motion_B1) um 1 erhöht.
      Und alle 30 Minuten werden von Motion_B1 wieder 10 abgezogen.
      Über die Angaben wie schnell, wieviel abgezogen wird, kann man seine Bedürfnisse anpassen

      Ich habe noch einen "Badewannen-Überlauf" eingebaut.
      Ohne "Überlauf" würde, wenn bei Motion_B1=60 keiner mehr im Raum ist, 3 Std. dauern bis Motion_B1 auf Null wäre (Alle 30 Min - 10) Das ist mir zu lang.

      Motion_B1 kann, in dem Beispiel, nicht größer als 30 werden.
      Dadurch wird nach max. 1,5 Std., ohne Bewegung, Motion_B1 auf 0 gesetzt.
      Dies wird an anderen Stellen getriggert und es erfolgen, je nach Wochentag und Tageszeit, weitere Aktionen.

      Hier ein paar Bildchen.
      Forum_Badewannenprinzip_B1.png
      Forum_Badewannenprinzip_B2.png

      Hiermit kann man sich das Blockly-Script importieren.

      <xml xmlns="http://www.w3.org/1999/xhtml">
        <block type="comment" id="dCjITNr+E3C4n~bCzT6A" x="-87" y="212">
          <field name="COMMENT">Anwesenheitserkennung nach</field>
          <next>
            <block type="comment" id="Z%{=SAN}R3~M%ru]Qk3N">
              <field name="COMMENT">"Badewannenprinzip"</field>
              <next>
                <block type="create" id="?}+9rxryWIjLf|V5PhK_">
                  <field name="NAME">Motion_Raum</field>
                  <next>
                    <block type="comment" id="@HdB0rR#*X1(DwRnE:.0">
                      <field name="COMMENT">"CountUp"</field>
                      <next>
                        <block type="on_ext" id="w3744~(4aM]Lmr1x%e?#">
                          <mutation items="1"></mutation>
                          <field name="CONDITION">true</field>
                          <field name="ACK_CONDITION"></field>
                          <value name="OID0">
                            <shadow type="field_oid" id="rbgU::(YPcRn+0+RqqDL">
                              <field name="oid">hm-rpc.0.KEQ0972714.1.MOTION</field>
                            </shadow>
                          </value>
                          <statement name="STATEMENT">
                            <block type="comment" id="_=|iyOkm(/DPWb+|3R%^">
                              <field name="COMMENT">Wenn Bewegung erkannt</field>
                              <next>
                                <block type="comment" id="n):F#kIqAp#:22q9z0RG">
                                  <field name="COMMENT">erfolgt der CountUp</field>
                                  <next>
                                    <block type="controls_if" id="9?(p#xHTJ@97wE=.3Gu~">
                                      <mutation else="1"></mutation>
                                      <value name="IF0">
                                        <block type="logic_compare" id="PIv`T`NUcv6}@B=]vM|z">
                                          <field name="OP">EQ</field>
                                          <value name="A">
                                            <block type="get_value" id="58FB1t=MwH2,s+*wio5{">
                                              <field name="ATTR">val</field>
                                              <field name="OID">javascript.0.Motion_Raum</field>
                                            </block>
                                          </value>
                                          <value name="B">
                                            <block type="math_number" id="@}5EodeJimakIHg1,NGe">
                                              <field name="NUM">0</field>
                                            </block>
                                          </value>
                                        </block>
                                      </value>
                                      <statement name="DO0">
                                        <block type="comment" id="`)QLP5HNi7/04=5UwDT}">
                                          <field name="COMMENT">Wenn der Wert 0 ist einen kleinen "Vorlauf" setzen</field>
                                          <next>
                                            <block type="comment" id="4wk%DJu0I:uTXujAcmWj">
                                              <field name="COMMENT">sonst könnte dieser beim nächsten "CountDown"</field>
                                              <next>
                                                <block type="comment" id="y%@L(;8TG[*!jJVIsT_e">
                                                  <field name="COMMENT">SOFORT wieder auf Null gesetzt werden</field>
                                                  <next>
                                                    <block type="control" id="|E=^o]go?T#xHZa~3sB6">
                                                      <mutation delay_input="false"></mutation>
                                                      <field name="OID">hm-rega.0.11551</field>
                                                      <field name="WITH_DELAY">FALSE</field>
                                                      <value name="VALUE">
                                                        <block type="math_arithmetic" id="aPV,*?0Vi~X[afH|to5i">
                                                          <field name="OP">ADD</field>
                                                          <value name="A">
                                                            <shadow type="math_number" id="wc,;^#NSu{I1!Hp6;(3O">
                                                              <field name="NUM">1</field>
                                                            </shadow>
                                                            <block type="get_value" id="4p#Vfti?!,xPiQkVz(zJ">
                                                              <field name="ATTR">val</field>
                                                              <field name="OID">javascript.0.Motion_Raum</field>
                                                            </block>
                                                          </value>
                                                          <value name="B">
                                                            <shadow type="math_number" id=".Av%rm/b;nUSM;heLI]B">
                                                              <field name="NUM">12</field>
                                                            </shadow>
                                                          </value>
                                                        </block>
                                                      </value>
                                                    </block>
                                                  </next>
                                                </block>
                                              </next>
                                            </block>
                                          </next>
                                        </block>
                                      </statement>
                                      <statement name="ELSE">
                                        <block type="comment" id="zfi@QDP]po]IoF4[:tXi">
                                          <field name="COMMENT">Motion Wert begrenzen (hier 30)</field>
                                          <next>
                                            <block type="controls_if" id="Td7?Stv51,wH/,!(lk%m">
                                              <value name="IF0">
                                                <block type="logic_compare" id=":=jgcl95Opr]cFCsFWMG">
                                                  <field name="OP">LT</field>
                                                  <value name="A">
                                                    <block type="get_value" id="9(0)^Hsvw.0NzGOjDfDr">
                                                      <field name="ATTR">val</field>
                                                      <field name="OID">javascript.0.Motion_Raum</field>
                                                    </block>
                                                  </value>
                                                  <value name="B">
                                                    <block type="math_number" id="wgwJa}fZa}?vHaQ8v{3#">
                                                      <field name="NUM">30</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </value>
                                              <statement name="DO0">
                                                <block type="comment" id="E[MqxsQP@+ilOFighRhc">
                                                  <field name="COMMENT">Motion erhöhen</field>
                                                  <next>
                                                    <block type="control" id="#k~BtfHBwLimY?r98v5#">
                                                      <mutation delay_input="false"></mutation>
                                                      <field name="OID">javascript.0.Motion_Raum</field>
                                                      <field name="WITH_DELAY">FALSE</field>
                                                      <value name="VALUE">
                                                        <block type="math_arithmetic" id="(bW;IT1c#|8OZrB+4kxb">
                                                          <field name="OP">ADD</field>
                                                          <value name="A">
                                                            <shadow type="math_number" id="wc,;^#NSu{I1!Hp6;(3O">
                                                              <field name="NUM">1</field>
                                                            </shadow>
                                                            <block type="get_value" id="|H{+Z.9,{Lupf=TC@(ej">
                                                              <field name="ATTR">val</field>
                                                              <field name="OID">javascript.0.Motion_Raum</field>
                                                            </block>
                                                          </value>
                                                          <value name="B">
                                                            <shadow type="math_number" id="TSCih;^5vNn+k[G;_d~)">
                                                              <field name="NUM">1</field>
                                                            </shadow>
                                                          </value>
                                                        </block>
                                                      </value>
                                                    </block>
                                                  </next>
                                                </block>
                                              </statement>
                                            </block>
                                          </next>
                                        </block>
                                      </statement>
                                    </block>
                                  </next>
                                </block>
                              </next>
                            </block>
                          </statement>
                        </block>
                      </next>
                    </block>
                  </next>
                </block>
              </next>
            </block>
          </next>
        </block>
        <block type="comment" id="rl9+_.4LKN]01[IKTrz|" x="-87" y="888">
          <field name="COMMENT">Alle 30 Minuten "CountDown"</field>
          <next>
            <block type="schedule" id="RxlCGpL@mvhUlw^I{@/C">
              <field name="SCHEDULE">*/30 * * * *</field>
              <statement name="STATEMENT">
                <block type="comment" id="CdLQ1%RGU;;p#@?3}EDY">
                  <field name="COMMENT">Dieser Wert soll abgezogen werden</field>
                  <next>
                    <block type="variables_set" id="919P*ZDse6JI;Tx?OrPR">
                      <field name="VAR">AbzugWert</field>
                      <value name="VALUE">
                        <block type="math_number" id="Cp*2Dn_*xMmR}*W-A(}B">
                          <field name="NUM">10</field>
                        </block>
                      </value>
                      <next>
                        <block type="comment" id="Qyt[7%^2[loDz^#E5Z9`">
                          <field name="COMMENT">Nicht ins Minus laufen lassen</field>
                          <next>
                            <block type="controls_if" id="S_1xt9-+tbwtdS/*.]|~">
                              <mutation else="1"></mutation>
                              <value name="IF0">
                                <block type="logic_compare" id="P!O,QbN/!t#A9@kvusRr">
                                  <field name="OP">GTE</field>
                                  <value name="A">
                                    <block type="get_value" id="(rPW/JXt8BC13v^W_@v=">
                                      <field name="ATTR">val</field>
                                      <field name="OID">javascript.0.Motion_Raum</field>
                                    </block>
                                  </value>
                                  <value name="B">
                                    <block type="variables_get" id="!YXQe:`It).%^=!{.wto">
                                      <field name="VAR">AbzugWert</field>
                                    </block>
                                  </value>
                                </block>
                              </value>
                              <statement name="DO0">
                                <block type="comment" id="XE^UpiZ??O^`Ltcf{.C:">
                                  <field name="COMMENT">AbzugsWert von Motion abziehen</field>
                                  <next>
                                    <block type="control" id="*7#498bFA!D3YisX|,Xi">
                                      <mutation delay_input="false"></mutation>
                                      <field name="OID">javascript.0.Motion_Raum</field>
                                      <field name="WITH_DELAY">FALSE</field>
                                      <value name="VALUE">
                                        <block type="math_arithmetic" id="rm35]JDVR!vn2-M?y!O{">
                                          <field name="OP">MINUS</field>
                                          <value name="A">
                                            <shadow type="math_number" id="wc,;^#NSu{I1!Hp6;(3O">
                                              <field name="NUM">1</field>
                                            </shadow>
                                            <block type="get_value" id="@1JoE5?c;%;K6as!]}4R">
                                              <field name="ATTR">val</field>
                                              <field name="OID">javascript.0.Motion_Raum</field>
                                            </block>
                                          </value>
                                          <value name="B">
                                            <shadow type="math_number" id="MN^b`GXU.4sT?sj;]DqH">
                                              <field name="NUM">1</field>
                                            </shadow>
                                            <block type="variables_get" id="JNcP^m!1MOASXd`}dE]q">
                                              <field name="VAR">AbzugWert</field>
                                            </block>
                                          </value>
                                        </block>
                                      </value>
                                    </block>
                                  </next>
                                </block>
                              </statement>
                              <statement name="ELSE">
                                <block type="comment" id=")S23z;Un`c|`kyrW`Fy1">
                                  <field name="COMMENT">Definitiv keiner mehr anwesend</field>
                                  <next>
                                    <block type="comment" id="3-Alqg!2(8zASq%D%lu_">
                                      <field name="COMMENT">Wert wird auf Null gesetzt</field>
                                      <next>
                                        <block type="comment" id="bg}hgHp%Bh.r:7@6@^a+">
                                          <field name="COMMENT">Dieser Wert auf Null wird in anderen Programmen</field>
                                          <next>
                                            <block type="comment" id="|lfOV4D`Q+@CCcCGg]:T">
                                              <field name="COMMENT">getriggert und Aktionen ausgelöst</field>
                                              <next>
                                                <block type="control" id="[Y6tCHG`[OkIxvEoPd8C">
                                                  <mutation delay_input="false"></mutation>
                                                  <field name="OID">javascript.0.Motion_Raum</field>
                                                  <field name="WITH_DELAY">FALSE</field>
                                                  <value name="VALUE">
                                                    <block type="math_number" id="D:tX2*C|Vr3`f8Y(xtJC">
                                                      <field name="NUM">0</field>
                                                    </block>
                                                  </value>
                                                </block>
                                              </next>
                                            </block>
                                          </next>
                                        </block>
                                      </next>
                                    </block>
                                  </next>
                                </block>
                              </statement>
                            </block>
                          </next>
                        </block>
                      </next>
                    </block>
                  </next>
                </block>
              </statement>
            </block>
          </next>
        </block>
      </xml>
      

      Und für, die nichts mit Blockly am Hut haben, das generierte JavaScript.

      var AbzugWert;
      
      
      // Anwesenheitserkennung nach
      // "Badewannenprinzip"
      createState("Motion_Raum", function () {
      });
      // "CountUp"
      on({id: 'hm-rpc.0.KEQ0972714.1.MOTION', val: true}, function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        // Wenn Bewegung erkannt
        // erfolgt der CountUp
        if (getState("javascript.0.Motion_Raum").val == 0) {
          // Wenn der Wert 0 ist einen kleinen "Vorlauf" setzen
          // sonst könnte dieser beim nächsten "CountDown"
          // SOFORT wieder auf Null gesetzt werden
          setState("hm-rega.0.11551", (getState("javascript.0.Motion_Raum").val + 12));
        } else {
          // Motion Wert begrenzen (hier 30)
          if (getState("javascript.0.Motion_Raum").val < 30) {
            // Motion erhöhen
            setState("javascript.0.Motion_Raum"/*Motion_Raum*/, (getState("javascript.0.Motion_Raum").val + 1));
          }
        }
      });
      
      // Alle 30 Minuten "CountDown"
      schedule("*/30 * * * *", function () {
        // Dieser Wert soll abgezogen werden
        AbzugWert = 10;
        // Nicht ins Minus laufen lassen
        if (getState("javascript.0.Motion_Raum").val >= AbzugWert) {
          // AbzugsWert von Motion abziehen
          setState("javascript.0.Motion_Raum"/*Motion_Raum*/, (getState("javascript.0.Motion_Raum").val - AbzugWert));
        } else {
          // Definitiv keiner mehr anwesend
          // Wert wird auf Null gesetzt
          // Dieser Wert auf Null wird in anderen Programmen
          // getriggert und Aktionen ausgelöst
          setState("javascript.0.Motion_Raum"/*Motion_Raum*/, 0);
        }
      });
      

      Vielleicht kann es jemand gebrauchen.

      Grüße

      1 Reply Last reply Reply Quote 2
      • B
        brufi last edited by

        Das ist grandios! Werde ich testen! Danke!

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

          @brufi:

          Das ist grandios! Werde ich testen! Danke! `
          Freut mich!

          Grüße

          M 1 Reply Last reply Reply Quote 0
          • M
            MartyBr @rantanplan last edited by

            @rantanplan
            Hallo rantanplan, ich habe gerade deinen Beitrag gefunden. Er passt gut zu meiner Überlegung, die Bewegungsmelder intelligenter für die Lichtsteuerung einzusetzen.

            Ich habe dein Blocky importiert und den DP angelegt. Eine Frage habe ich aber:
            Was ist der DP "hm-rega.0.11551"? Das ist ja eine Homematic Systemvariable. Kannst du bitte diesen Punkt kurz erläutern?
            Gruß und danke für das tolle Script

            rantanplan 1 Reply Last reply Reply Quote 0
            • rantanplan
              rantanplan @MartyBr last edited by

              @martybr sagte in [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip":

              @rantanplan
              Hallo rantanplan, ich habe gerade deinen Beitrag gefunden. Er passt gut zu meiner Überlegung, die Bewegungsmelder intelligenter für die Lichtsteuerung einzusetzen.

              Ich habe dein Blocky importiert und den DP angelegt. Eine Frage habe ich aber:
              Was ist der DP "hm-rega.0.11551"? Das ist ja eine Homematic Systemvariable. Kannst du bitte diesen Punkt kurz erläutern?
              Gruß und danke für das tolle Script

              Oh ja, ich hatte damals noch einige Programme parallel laufen.
              "hm-rega.0.11551" war eine Variable auf der CCU. Da habe ich beim Export nicht aufgepasst.
              Da muss der Datenpunkt "Motion_Raum" rein.

              Grüße

              M 1 Reply Last reply Reply Quote 1
              • M
                MartyBr @rantanplan last edited by

                @rantanplan Super, danke für die Info.

                M 1 Reply Last reply Reply Quote 0
                • M
                  maxpd @MartyBr last edited by maxpd

                  @rantanplan Das Script habe ich verstanden. Aber wie steuere ich jetzt die Dauer meines Lichts? Die Variable bildet ja die Brenndauer ab. Aber weder einer Verzögerung, noch einem Timeout kann ich die Variable als Wert mitgeben.
                  Wenn der Counter minütlich auch nochmal 1 Abziehen würde, würde ich es auch verstehen. Da ich dann mittels gesondertem Trigger auf 0 oder > 1 prüfen kann.

                  rantanplan 1 Reply Last reply Reply Quote 0
                  • rantanplan
                    rantanplan @maxpd last edited by

                    @maxpd Das Script ist nicht dafür da um Lampen nach einer bestimmten Brenndauer auszuschalten.
                    Licht über einen Bewegungsmelder, für eine bestimmte Zeit, einzuschalten macht eigentlich nur in Durchgangsräumen Sinn. Und auch da muss es nicht optimal sein.
                    Wer kennt das nicht: Licht geht an, man hält ein Schwätzchen, Licht geht aus und alle fuchteln mit den Armen damit das Licht wieder an geht.
                    Bewegungsmelder erkennen nun mal nicht JEDE Bewegung.
                    Das "Badewannen-Prinzip" "sammelt" Bewegungen über einen gewissen Zeitraum.
                    Das Licht geht z.B. nicht aus, wenn man mal vorm PC sitzt und 15 Min. einen Bericht liest und dabei keine Bewegung macht die der BW erkennt.
                    Einfach mal den 1. Beitrag lesen und auch die Links.

                    Grüße

                    M 1 Reply Last reply Reply Quote 0
                    • M
                      maxpd @rantanplan last edited by

                      @rantanplan said in [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip":

                      Das Licht geht z.B. nicht aus, wenn man mal vorm PC sitzt und 15 Min. einen Bericht liest und dabei keine Bewegung macht die der BW erkennt.
                      Einfach mal den 1. Beitrag lesen und auch die Links.

                      Aber exakt das ist mein Anwendungsfall. Und ich verstehe den dazugehörigen Trigger nicht eine Lampe zu schalten. Bzw. wie weiß die Lampe wann sie wieder ausgehen soll?
                      Vllt hast du für die schlussendliche Verwendung deiner Motion auch noch ein Screenshot.

                      rantanplan 1 Reply Last reply Reply Quote 0
                      • rantanplan
                        rantanplan @maxpd last edited by

                        @maxpd sagte in [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip":

                        @rantanplan said in [Vorlage] Blockly Anwesenheitserkennung nach "Badewannen-Prinzip":
                        Aber exakt das ist mein Anwendungsfall. Und ich verstehe den dazugehörigen Trigger nicht eine Lampe zu schalten. Bzw. wie weiß die Lampe wann sie wieder ausgehen soll?

                        Schau mal in dem "Sonst" bei dem Trigger "alle 30 Min. count down"
                        Da wird der Datenpunkt "Motion_Raum" auf 0 gesetzt.
                        Wie in dem Kommentar beschrieben, wird bei mir dieser Datenpunkt überwacht/getriggert.
                        Bei mir werden mehrere Zustände (in einem anderen Script) überprüft, wenn der Wert "Motion_Raum" auf 0 gesetzt wird. Deshalb der Weg über einen Datenpunkt.

                        Wenn Du "nur" das Licht ausschalten möchtest, einfach NACH dem "steuere Raum_Motion", Dein Licht ausschalten.

                        M 1 Reply Last reply Reply Quote 1
                        • M
                          maxpd @rantanplan last edited by

                          @rantanplan danke. Hab es für meinen Zweck ganz gut hinbekommen und werde es noch an 3 anderen Stellen einsetzen. 🙂

                          af3dd5e4-462e-46be-8c88-59aa9072d0ea-image.png

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          483
                          Online

                          31.7k
                          Users

                          79.9k
                          Topics

                          1.3m
                          Posts

                          blockly template
                          4
                          11
                          4196
                          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