Bewegungsmelder als Präsenzmelder mit Blockly

Einen Bewegungsmelder als Präsenzmelder mit Blockly in ioBroker zu emulieren ist einfacher als gedacht. Präsenzmelder für das Smarthome sind nicht nur teuer, sondern für bestimmte Einsatzzwecke nicht notwendig. Sie erkennen die Anwesenheit sensibler als Bewegungsmelder, dennoch reicht meistens ein Bewegungsmelder für eine Außenbeleuchtung aus.

In diesem Beispiel habe ich im Kellereingang eine Lampe über einen Bewegungsmelder geschaltet. Die passende Einschaltdauer des Lichts zu finden hat nicht wirklich geklappt. Oft war das Licht aus, wenn man zu lange im Keller zu tun hatte oder es war zu lange an, weil man nur kurz etwas holen wollte. Eine andere Lösung musste her. Die Recherche nach Präsenzmeldern für die Hausautomation zeigte schnell, dass ich nicht unbedingt bereit war, das Dreifache auszugeben.

Präsenzmelder mit Blockly emulieren

Manchmal sieht man einfach nicht, dass die Lösung so einfach sein kann. Blockly stellt in dem Block „steuere“ die Funktion „Verzögerung“ mit der Option „löschen falls läuft“ bereit. Der Block ist zu finden in der Blockly Navigation unter „System“.

Der steuere Block mit Verzögerung ermöglicht es mit der Option löschen falls läuft einen Präsenzmelder zu emulieren.

Hiermit lässt sich ein Bewegungsmelder als Präsenzmelder emulieren. Wie das genau funktioniert beschreibe ich euch jetzt.

Bewegungsmelder als Präsenzmelder im Skript

Als nächstes zeige ich euch das fertige Skript:

Der Trigger ist der Datenpunkt vom Bewegungsmelder. Erkennt dieser Bewegung, so geht es weiter mit der Bedingung. Die Bedingung fragt ab, ob die aktuelle Zeit in einem bestimmten Zeitraum liegt. Zusätzlich muss ein anderer Bewegungsmelder aus sein, damit das Skript weiter ausgeführt wird. Sind beide Bedingungen erfüllt, schaltet das Licht ein und umgehend wird das Licht mit einer Verzögerung von 3 Minuten wieder ausgeschaltet. Zusätzlich ist die Option „löschen falls läuft“ aktiviert. Diese bewirkt folgendes: Erkennt der Bewegungsmelder innerhalb der 3 Minuten Verzögerung eine erneute Bewegung, wird ab diesem Zeitpunkt die Verzögerung gelöscht und der Timer von 3 Minuten neu gestartet. Der Bewegungsmelder hat einen Timeout von 60 Sekunden nach einer Bewegungserkennung.

Mittlerweile habe ich die Testphase hinter mir und einige unserer Bewegungsmelder als Präsenzmelder emuliert. Angeboten hat sich der Flur, die Haustür und die Garage.

Blockly Quellcode – Bewegungsmelder als Präsenzmelder

<xml xmlns="https://developers.google.com/blockly/xml">
  <block type="on_ext" id="B}`P^?qpNW1tax:}0GBJ" x="138" y="563">
    <mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
    <field name="CONDITION">true</field>
    <field name="ACK_CONDITION"></field>
    <value name="OID0">
      <shadow type="field_oid" id="!8jQelFt?-}PG!n890lH">
        <field name="oid">deconz.0.Sensors.17.presence</field>
      </shadow>
    </value>
    <statement name="STATEMENT">
      <block type="controls_if" id="3zh%pyj*fM@g_,%T8}Dp">
        <mutation else="1"></mutation>
        <value name="IF0">
          <block type="logic_operation" id="}9e1Ec5)}!xWAC2!#kN~" inline="false">
            <field name="OP">AND</field>
            <value name="A">
              <block type="time_compare_ex" id="]Z/),tyxqPjzKd/~WrAr">
                <mutation xmlns="http://www.w3.org/1999/xhtml" end_time="true" actual_time="true"></mutation>
                <field name="USE_ACTUAL_TIME">TRUE</field>
                <field name="OPTION">between</field>
                <value name="START_TIME">
                  <shadow type="text" id="VMd0Lm^CeU,C]B}]X[Z6">
                    <field name="TEXT">12:00</field>
                  </shadow>
                  <block type="time_astro" id="asf8Iqd2?3|bO8tR-Q_]">
                    <field name="TYPE">sunset</field>
                    <field name="OFFSET">-60</field>
                  </block>
                </value>
                <value name="END_TIME">
                  <shadow type="text" id="Od2meZdZ^)gg?Dpf0K?4">
                    <field name="TEXT">18:00</field>
                  </shadow>
                  <block type="time_astro" id="^wX0M~iFyoc%OlF!I8-v">
                    <field name="TYPE">sunrise</field>
                    <field name="OFFSET">1440</field>
                  </block>
                </value>
              </block>
            </value>
            <value name="B">
              <block type="logic_compare" id="QZcQ`/:(9~eg_nQuP9eS">
                <field name="OP">EQ</field>
                <value name="A">
                  <block type="get_value" id="s$0r9vsPvSoC.G;}2vB_">
                    <field name="ATTR">val</field>
                    <field name="OID">mqtt.0.espHome.Bewegungsmelder.Keller.binary_sensor.bewegungsmelder_keller_digital.state</field>
                  </block>
                </value>
                <value name="B">
                  <block type="text" id="GQHp4c*s.-U@DaKn$_1U">
                    <field name="TEXT">OFF</field>
                  </block>
                </value>
              </block>
            </value>
          </block>
        </value>
        <statement name="DO0">
          <block type="telegram" id="h@1SyaUFr=6$J.~np)WB" collapsed="true">
            <field name="INSTANCE"></field>
            <field name="LOG"></field>
            <field name="SILENT">FALSE</field>
            <field name="PARSEMODE">default</field>
            <value name="MESSAGE">
              <shadow type="text" id="M?b1H@t?IM*[)cOp6v(K">
                <field name="TEXT">BWM-Kellertür: Licht nach Sonnenuntergang!</field>
              </shadow>
            </value>
            <next>
              <block type="control" id="A-z@sGkqb!@xX~{jr:Im">
                <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
                <field name="OID">deconz.0.Lights.21.on</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE">
                  <block type="logic_boolean" id="epWj/p?qM4Vhrt!-;V:}">
                    <field name="BOOL">TRUE</field>
                  </block>
                </value>
                <next>
                  <block type="comment" id="XGOV~-#L.Wv$5S;V-gPB">
                    <field name="COMMENT">Löschen falls läuft = Präsenz emulieren</field>
                    <next>
                      <block type="control" id="uwD.spH3i-z+7+3^uncS">
                        <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="true"></mutation>
                        <field name="OID">deconz.0.Lights.21.on</field>
                        <field name="WITH_DELAY">TRUE</field>
                        <field name="DELAY_MS">3</field>
                        <field name="UNIT">min</field>
                        <field name="CLEAR_RUNNING">TRUE</field>
                        <value name="VALUE">
                          <block type="logic_boolean" id="O$5DVdvzS1c-z%W9r|zd">
                            <field name="BOOL">FALSE</field>
                          </block>
                        </value>
                      </block>
                    </next>
                  </block>
                </next>
              </block>
            </next>
          </block>
        </statement>
        <statement name="ELSE">
          <block type="telegram" id="P1P)@.Vok-EkDDLHz:|z" collapsed="true">
            <field name="INSTANCE"></field>
            <field name="LOG"></field>
            <field name="SILENT">FALSE</field>
            <field name="PARSEMODE">default</field>
            <value name="MESSAGE">
              <shadow type="text" id="kZ+c_^WO%R/g0~N@{F2O">
                <field name="TEXT">BWM-Kellertür: Bewegung erkannt!</field>
              </shadow>
            </value>
          </block>
        </statement>
      </block>
    </statement>
  </block>
</xml>

Blockly Quellcode – Importieren



13 Gedanken zu „Bewegungsmelder als Präsenzmelder mit Blockly“

  1. Hallo Jan,

    welchen Bewegungsmelder benutzt Du ?
    Ich möchte diese Drahtgebunden an HMIPW anschliessen,
    Bei meinem momentan verbauten stehe ich irgendwann im dunkel im Bad, da dieser so lange auf Bewegung bleibt bis ich den Raum verlasse oder in Dusche bin.
    In allen anderen Räumen funktioniert Dein Script super

    Gruß
    Andi

    1. Hallo Andi,

      erst einmal vielen Dank für dein Feedback.

      Ich habe auch einige Bewegungsmelder ausprobiert. Bin sehr zufrieden mit den Xiaomi BWM, aber auch der Philips HUE Bewegungsmelder hat mich überzeugt. Laufen alle über das Zigbee-Protokoll und dort kann man die Duration der Bewegungserkennung in Sekunden einstellen – also wie lange die Bewegungserkennung auf true steht.

      Geht das bei deinem vielleicht auch?

      Welches Modell hast du genau und ist es ggf. ein Präsenzmelder?

      Grüße, Jan

      1. Hallo Jan,

        Danke für Deine schnelle Antwort,

        da ist ein PIR-8 Bewegungsmelder an einen HMIPW Eingangsmodul verbaut. Der hat nur eine Zeitverzögerung mit drin, die funktioniert auch, aber eben erst wenn ich den Raum verlassen habe.
        Wenn ich das ausschalten bei keine Bewegung mehr , mache klappt es auch, nur wenn ich in er Dusche bin geht das Licht dann nach der Verzögerung aus und nur nicht gleich wieder an. Das klappt dann erst nach einiger Zeit wieder

        Gruß ans andere Ende der Stadt

        1. Hi Andi,

          das ist der „Nachteil“ bei konventionellen Bewegungsmeldern, die durch ein Einstellrad die Dauer von x bis y Sekunden/Minuten vorgeben.
          Ist der minimale Zeitraum für die Erkennung zu lang hast du genau den von dir erwähnten Effekt.

          Was ggf. funktionieren könnte, ist das Setzen eines zusätzlichen boolschen Datenpunktes per Skript in Abhängigkeit vom realen Bewegungsmelder.

          Ich bin mir gerade nicht sicher, ob man per Skript da etwas tricksen könnte, aber das Problem wird sein, dass dein Bewegungsmelder immer erst nach x Sekunden/Minuten wieder eine neue Bewegung erfassen wird und damit ist es fast unmöglich.

          Das Skript könnte einen selbst erstellten boolschen Datenpunkt auf true setzen, wenn dein BWM Bewegung erkannt hat und setzt ihn einfach z.B. nach 30 Sekunden wieder auf false.
          Das Problem was ich sehe ist die neue Bewegung deines BWM, die auch erst wieder aktiv ist, wenn keine Bewegung vorhanden ist – also nichts gewonnen 🙂

          Ich habe einen konventionellen BWM an einen D1-Mini (analoger Eingang -> 3,3V = 1) angeschlossen mit einem Relais 230V -> 3,3V.
          Kleinste Zeit ist bei dem BWM 120 Sekunden. Nun leuchtet draussen aber das Licht 5 Minuten, so dass nach 2 Minuten eine neue Bewegung erkannt wird und entsprechend nachschaltet bzw. anlässt.

          Aber solange die Verzögerung größer ist als die Dauer der Bewegungserkennung sollte das doch klappen… (!?)

          Grüße wohin auch immer aber scheinst in der Nähe zu sein 🙂

          Jan

  2. Hallo Jan,

    ich habe mal eine Frage zu dem Script. Ich habe es bei mir eingesetzt und es funktioniert ganz gut. Allerdings habe ich nun festgestellt, dass das Licht ab 0:00 Uhr nicht mehr eingeschaltet wird. Hast du eine Idee, woran das liegen kann?

    1. Hallo Marco,

      in meiner Bedingung wird lediglich ein Zeitraum abgefragt, ob die aktuelle Uhrzeit zwischen Sonnenuntergang (selber Tag) und Sonnenaufgang (nächster Tag) ist und ob ein anderer Bewegungsmelder AN ist.

      Versuch doch mal die Bedingung(en) rauszunehmen und nur auf die Bewegung/Präsenz abzufragen.

      Falls du weitere Fragen hast, meld dich einfach nochmal.

      Gruß, Jan

  3. Hi Jan,
    vielen Dank für deine schnelle Rückmeldung. Danke auch für den Tipp mit dem Debugging, das hätte ich an anderer Stelle auch schon mal gebraucht 😉
    Also, ich benutze den BWM von Aqara (Xiaomi) über Zigbee (per Conbee 2 Stick als Gateway). Funktioniert soweit echt gut und finde die auch sehr praktisch. Habe heute festgestellt, dass die Duration von 90 Sekunden ich gar nicht verstellen kann, dachte gestern, wenn ich in den Objekten die Duration auf 30 heruntersetze, bleibt es so. Aber heute weiß ich, dass man das gar nicht ändern kann 🙂
    Auf Youtube gibt es eine Anleitung, wie man per Hardware Hack den Aqara Sensor auf 5 Sekunden verringern kann. Ich glaube das mache ich dann auch, denn 90 Sekunden für eine Aktualisierung finde ich extrem lange. Sprich, bei 90 Sekunden habe ich vorhin 100 Sekunden im Blockly als Verzögerung eingestellt, dann bleibt mein LED tatsächlich auch länger an, solange Bewegungen da sind. Aber das ist eben für mein Geschmack zu lange. Wenn du mir sonst einen anderen Bewegungsmelder empfehlen kannst was mit Zigbee funktioniert, sehr gerne 😉
    Ansonsten bin ich dir sehr dankbar für die coolen Ideen auf deiner Webseite und deiner schnellen Hilfe.
    Gruß
    Thomas

    1. Moin Thomas,

      ich glaube du kannst bis auf 60 Sekunden runtergehen. Den Hardware Hack hat ein Nachbar von mir erfolgreich im Einsatz.

      Wenn die Duration sich nicht über den DeConz Adapter/Datenpunkt setzen lässt, kannst du auch versuchen direkt über die API zu gehen um diesen zu ändern. Unter 60 Sekunden wird nicht empfohlen – habe ich gelesen.

      Nachteil bei den XIAOMI BWM ist, dass sie ab und zu die Verbindung verlieren können.
      Bin gerade unterwegs, suche dir aber gerne raus, wie du über die API den Wert änderst.

      Etwas teurer sind die von Trust – PIR 8000 – damit habe ich sehr gute Erfahrungen gesammelt. Auch die Philips HUE BWM sind auch gut.

      Danke für dein Feedback zum Blog und den Inhalten.

      Bei Fragen oder Anregungen einfach ein Kommentar schreiben.

      Greets, Jann

      1. Hi Jan,
        ja die Anleitung via API wäre echt nice, ansonsten werde ich heute abend versuchen über den Deconz den Wert auf 60 zu setzen, in der Hoffnung, dass es erhalten bleibt – auch nach einem Raspberry PI Neustart.
        Vielen Dank für die Tipps, kannte den BWM von Trust nicht. Unabhängig davon wollte ich mir eh einen Philips Hue BWM kaufen, zumal ich den Aqara Melder daheim verwenden möchte. Mit dem BWM von Philips löst sich hoffentlich eh mein Problem, man kann da wohl die Zeiten einstellen.
        Nochmals Danke für deine tolle Hilfe. Die API Anleitung bitte noch posten 😉

        Gruß
        Thomas

  4. Hallo Jan,
    erstmal vielen Dank für die coole Idee. Bei mir scheint es leider nicht zu funktionieren. Habe beim Bewegungsmelder 30 Sekunden eingerichtet. Das Licht als Verzögerung 40 und die Option „löschen falls läuft“ aktiviert. Leider geht das Licht trotzdem nach 30 Sekunden aus, trotz Bewegung.
    Hast du eine Idee woran das liegen kann oder einen Tipp für mich?
    Gruß
    Thomas A.

    1. Hallo Thomas,

      danke für dein Kommentar.
      Ich empfinde, dass 30 Sekunden vom Bewegungsmelder zu 40 Sekunden zum Ausschalten schon sehr knapp bemessen sind.
      Du hast also ein Zeitfenster von NUR 10 Sekunden, damit die Präsenz funktioniert…

      Hast du es mal mit 120 Sekunden (2 Minuten) probiert?
      Löst der Bewegungsmelder wirklich nach 30 Sekunden wieder aus?
      Was hast du für einen Bewegungsmelder und über welches Protokoll läuft dieser?

      Du kannst auch im Blockly mal einen Debug-Baustein einsetzen und den in die Abfrage mit reinstecken.
      Dann siehst du im JS-Adapter die Log-Ausgabe, wann genau dein Bewegungsmelder wieder auslöst…

      Wenn du weitere Fragen hast, meld dich einfach 🙂

      Bestes, Jan

      Hier ein Bild vom Baustein (DEBUG-OUTPUT):
      Blockly Debug-Baustein

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

* Bitte akzeptiere die Bestimmungen zum Datenschutz.