NEWS
Skript für Bewegungsmelder
-
Hallo zusammen,
Diese Woche sind die neuen HM-IP Präsenzmelder angekommen und ich komme leider in deren Einbindung nicht weiter.
Also…beim Gerät selbst kann man ja einstellen, wie oft der Status gesendet bzw. auch aktualisiert wird. Siehe Bild.
Das war mein Skript:
on({id: 'hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', val: true}, function () { log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', true); timer_baddecke (); function timer_baddecke() { clearTimeout(Timeout1); setTimeout(Timeout1, 30000); } function Timeout1() { setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', false); log('Deckenlampen im Bad leuchten für 30s'); } });
Das Licht ging zwar an, aber auch wenn man sich im Bad aufgehalten hat, ging es aus und nicht mehr an. Denkfehler war wohl, dass der Präsenzmelder den Bewegungsstatus auf "true" setzt und diesen natürlich beibehält. Mein Skript aber nur gestartet wird, wenn der Status auf true gesetzt wird.
Dann habe ich etwas daran gearbeitet und versucht, das Ganze mit "If" umzusetzen. Allerdings geht da gar nichts mehr. :?
if('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', true) { log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', true); timer_baddecke (); function timer_baddecke() { setTimeout(Timeout1, 10000); } function Timeout1() { setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', false); log('Deckenlampen im Bad leuchten für 10s'); } }
Kann mir jemand helfen? Logischerweise soll bei jeder Bewegung der Lampen-Timer wieder auf die ursprüngliche Dauer gesetzt werden. Optimal auch nicht erst, wenn auf "true" gesetzt wird….sondern ob die Variable auf "true" steht.
Dank euch und viele Grüße
Tobias
2771_pm.png -
Da der Bewegungsmelder so konfiguriert werden kann, dass er auch in einer Direkt-Vernüpfung richtig arbeitet (wenn der Aktor ein HMIP-Aktor wäre), sollte eine einfache Wertübertragung genügen:
on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) { if(dp.state.val) log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val); });
-
hab es so gelöst, vielleicht ein wenig hintenrum, aber es geht soweit.
Habe den Status durch der CCU für 1 min auf true.
Export Blockly
! ````
<xml xmlns="http://www.w3.org/1999/xhtml"><block type="on_ext" id="Tt_aFR+}(|M2`m-D~)pU" x="-562" y="-262"><mutation items="1"></mutation>
<field name="CONDITION">ne</field><value name="OID0"><shadow type="field_oid" id="}c1Lhyei/6mr.JOy^V}p"><field name="oid">hm-rpc.1.000C17099A02EF.1.PRESENCE_DETECTION_STATE</field></shadow></value> <statement name="STATEMENT"><block type="controls_if" id="n/cMf5v~E-G+*w-(q`ur"><mutation elseif="1"></mutation> <value name="IF0"><block type="logic_compare" id=";NKhS5OJtRd{%uF0E%U8"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="=Hr1]HjyF]V7E-b{o#PH"><field name="ATTR">val</field> <field name="OID">hm-rpc.1.000C17099A02EF.1.PRESENCE_DETECTION_STATE</field></block></value> <value name="B"><block type="logic_boolean" id="*6@2x0I(n)Z=J5]{TAf{"><field name="BOOL">TRUE</field></block></value></block></value> <statement name="DO0"><block type="timeouts_cleartimeout" id=")ZQ`6}2]Z4vqI6*YY)Si"><field name="NAME">timeout</field> <next><block type="controls_if" id="CiFNX[t_%75Wc7pbi^DB"><value name="IF0"><block type="logic_compare" id="gn6{X4h*fd|,k`?VLnUc"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="?I0x~E_9z~Mo3z_hyK.Y"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.MEQ1671045.1.STATE</field></block></value> <value name="B"><block type="logic_boolean" id="AfVb*KSt912SDI^#%+[*"><field name="BOOL">FALSE</field></block></value></block></value> <statement name="DO0"><block type="control" id="I@YxWw(Q#qq#)hyrxKeW"><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1671045.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="f`SK@kHNp[035Vi[+D{H"><field name="BOOL">TRUE</field></block></value></block></statement> <next><block type="controls_if" id="!qnW^{X;*Xaj*s7CwSTb"><value name="IF0"><block type="logic_compare" id="klakKKDmo(_O0hm)1K0B"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="C=7N[RPg,WUh0`QcvCYq"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.MEQ1673086.1.STATE</field></block></value> <value name="B"><block type="logic_boolean" id="2[T=dZyi+}V:dpo^j[t{"><field name="BOOL">FALSE</field></block></value></block></value> <statement name="DO0"><block type="control" id=".=:g@GttcX+n`%Cz(cbf"><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1673086.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="~jpU(e%?c7+1tLUe?_~3"><field name="BOOL">TRUE</field></block></value></block></statement> <next><block type="controls_if" id="cMRz-%xQhC!rQ)AkVX5C"><value name="IF0"><block type="logic_compare" id="EUIE4/eJa12=wB^d-p,6"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="^5wvE73D+MllSdR]o?[e"><field name="ATTR">val</field> <field name="OID">hm-rpc.0.MEQ1670131.1.STATE</field></block></value> <value name="B"><block type="logic_boolean" id="x;u6v(J6oX^DRBVg![0A"><field name="BOOL">FALSE</field></block></value></block></value> <statement name="DO0"><block type="control" id="wSI=d)]/jm-e*j{fx?DS"><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1670131.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="b7N{)@zBTB!x5~fT^,O("><field name="BOOL">TRUE</field></block></value></block></statement></block></next></block></next></block></next></block></statement> <value name="IF1"><block type="logic_compare" id="usY|s`1v!s4|x)NVJp]j"><field name="OP">EQ</field> <value name="A"><block type="get_value" id="Vv;y;SXY|%IbHnIL~]Ni"><field name="ATTR">val</field> <field name="OID">hm-rpc.1.000C17099A02EF.1.PRESENCE_DETECTION_STATE</field></block></value> <value name="B"><block type="logic_boolean" id="%B6-9.G+6SCc-nQd7_;t"><field name="BOOL">FALSE</field></block></value></block></value> <statement name="DO1"><block type="timeouts_settimeout" id="H{t.=N[?b[7OEf!1~3*g"><field name="NAME">timeout</field> <field name="DELAY">10</field> <field name="UNIT">sec</field> <statement name="STATEMENT"><block type="control" id="g9zx/)rCg39%pRCa|fOi"><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1670131.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="^:}?h0Nu^!!_]v6||_79"><field name="BOOL">FALSE</field></block></value> <next><block type="control" id="*;lQW@@*?AKz.4ZQ_o3."><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1673086.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="0Q.042:5#8Jq:Fp{5G)J"><field name="BOOL">FALSE</field></block></value> <next><block type="control" id="w_}GjyuK;NN9@y?#gG}Z"><mutation delay_input="false"></mutation> <field name="OID">hm-rpc.0.MEQ1671045.1.STATE</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"><block type="logic_boolean" id="{NgB:jcEa~!c.%{lP]i8"><field name="BOOL">FALSE</field></block></value></block></next></block></next></block></statement></block></statement></block></statement></block></xml>
[1241_bildschirmfoto_2017-08-10_um_21.19.53.png](/assets/uploads/files/1241_bildschirmfoto_2017-08-10_um_21.19.53.png)
-
Servus!
@ple -> hui…das sieht schon ziemlich aufwendig aus. :shock: Allerdings...
@paul53 -> vielen Dank, das funktioniert so einwandfrei. Super. Da ich mich ja gerade erst an JavaScript langsam ran traue, wie kann ich dein Script nachvollziehen? KAnnst du es mir vielleicht kurz erklären. Muss ich z. B. den Funktionsname dp bei jedem Programm ändern, damit es zu keinen Problemen kommt?
Kann man dieses Script auch verwenden, um eine Lampe/Gruppe gedimmt zu schalten? Hier könnte ich ja nicht einfach den Status weitergeben.
Viele Grüße
Tobi
-
Muss ich z. B. den Funktionsname dp bei jedem Programm ändern, damit es zu keinen Problemen kommt? `
Nein, dp ist der Name des an die Funktion übergebenen Objektes, der lokal (nur innerhalb dieser Funktion gültig) ist. Lokale Namen von Skriptvariablen können immer wieder lokal innerhalb des gleichen Skriptes verwendet werden.
@Seehofweg:KAnnst du es mir vielleicht kurz erklären. `
on('ID-String', function(dp) {
löst bei Wertänderung aus, das Datenpunkt-Objekt des Auslösers wird unter dem Namen dp an die Callback-Funktion übergeben.
if(dp.state.val) log('Bewegung im Bad EG erkannt');
Wenn der Wert des auslösenden Datenpunktes wahr ist, wird die Log-Ausgabe ausgeführt.
setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val);
Der Wert des auslösenden Datenpunktes wird in den Datenpunkt mit der ID 'hue.1.Bridge-EG_2.a.Badezimmer(Decke).on'_ geschrieben.
Eine ausfühliche Beschreibung der Funktion on(pattern, callback) findest Du auf https://github.com/ioBroker/ioBroker.javascript#on–-subscribe-on-changes-or-updates-of-some-state.
@Seehofweg:Kann man dieses Script auch verwenden, um eine Lampe/Gruppe gedimmt zu schalten? Hier könnte ich ja nicht einfach den Status weitergeben. `
Man muss es schon etwas abwandeln, z.B.var Dimmwert = 50; on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) { if(dp.state.val) { log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', Dimmwert); } else setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', 0); });
-
Hi,
ich nutze das Skript von Seehofweg in leicht abgewandelter Form um über einen Homematic IP Bewegungsmelder zwei HUEs zu schalten.
Allerdings würde ich noch gerne die Helligkeit mit Abfragen. Im Prinzip müsste ja nur eine einfache IF Abfrage drumherum gebaut werden, in etwa "wenn Helligeit < 20, dann Skript ausführen…".
Aber leider bekomme ich es im JS nicht hin ;(
Hat jemand einen Tipp?
on("hm-rpc.2.0009156xxxxxx.1.MOTION"/*BWM Flur:1.MOTION*/, function (dp) { if(dp.state.val) { log('Bewegung im Flur erkannt'); setState("hue.0.Philips_hue.Hue_white_lamp_2.level", 50); } else setState("hue.0.Philips_hue.Hue_white_lamp_2.level", 0); }); on("hm-rpc.2.0009156xxxxxx.1.MOTION"/*BWM Flur:1.MOTION*/, function (dp) { if(dp.state.val) { log('Bewegung im Flur erkannt'); setState("hue.0.Philips_hue.Hue_white_lamp_3.level", 50); } else setState("hue.0.Philips_hue.Hue_white_lamp_3.level", 0); });