NEWS
Falls zwei Trigger Einfluss auf eine Veränderung haben
-
Hallo,
ich verzweifle an folgendem Vorhaben:Anwesenheitserkennung steuert Rufumleitung.
Es muss nur eine Person im Haus sein, dann steuere Rufumleitung mit false.
Wenn keine Person im Haus, Rufumleitung auf true.So wie ich das gemacht habe, ändert sich das willkürlich wenn nur eine Person das Haus verlässt. Wie macht man es denn richtig?
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="uwYo(qUyXt`C3CiGYgO^" x="288" y="-238"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id=",TM4eFuuXv[JBKzFkB7d"> <field name="oid">0_userdata.0.Personen.Daniel</field> </shadow> </value> <value name="OID1"> <shadow type="field_oid" id="z[j6TS*xS31?aTjNK_UO"> <field name="oid">0_userdata.0.Personen.Andreas</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="E+@%Vrm!LPTo)GF=7[z;"> <mutation elseif="1"></mutation> <value name="IF0"> <block type="logic_compare" id="{LhHF{{pLJuAAZa(j~.t"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="uITXc{[JLLjZqt4;D/{["> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="logic_boolean" id=",SQA0:/p$h8+}#K/.oRK"> <field name="BOOL">TRUE</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="+??q,}3nUDZRPn;8{*|1"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">tr-064.0.callForwarding.0</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="c3MzTm~dkz[DHJKKE:mk"> <field name="BOOL">FALSE</field> </block> </value> </block> </statement> <value name="IF1"> <block type="logic_compare" id="#7cff:Fb;@[g_@$RhyS*"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="ye8i^#68k=x!fccp!dLO"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="logic_boolean" id="`.8qMYqtt%=nYnc*b%BJ"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <statement name="DO1"> <block type="control" id="07.u}DXs#ie4UOjg_K~z"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">tr-064.0.callForwarding.0</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="logic_boolean" id="j:Gnw;NGLBqvczn`,(KQ"> <field name="BOOL">TRUE</field> </block> </value> </block> </statement> </block> </statement> </block> </xml>
-
Ist kein Blockly aber du musst ja nur die States anpassen:
die oberen 4 0_userdata.0.Sensoren.Anwesenheit States auf deine Bedürfnisse anpassen und den Anyone erstellen, dann hast du einen State auf den du triggern kannst.
const cAnyone = '0_userdata.0.Sensoren.Anwesenheit.Anyone' var someOne = [ {atHome: false, id: '0_userdata.0.Sensoren.Anwesenheit.Sarah'}, {atHome: false, id: '0_userdata.0.Sensoren.Anwesenheit.Tim'},// wenn du Gast löschst muß ach das komma hier weg {atHOme: false, id: '0_userdata.0.Sensoren.Anwesenheit.Gast'} ]; var homeCount = 0; for (let a=0;a<someOne.length;a++) { someOne[a].atHome=getState(someOne[a].id).val; } function checkAnyone(obj) { homeCount = 0; for (var y = 0; y<someOne.length;y++){ if (obj && obj.id == someOne[y].id) someOne[y].atHome=obj.state.val; if (someOne[y].atHome) homeCount++; } setState(cAnyone, homeCount > 0); } for (var x = 0; x<someOne.length;x++) { on({id:someOne[x].id, change:'ne'}, checkAnyone); } on({id:cAnyone, change:'any', ack:false}, function (obj){ //setState('mqtt.1.display.show.Anwesenheit.value',homeCount); setState(cAnyone, obj.state.val, true); }); checkAnyone(null);
So wie das von Paul geht auch.
-
@mika-0 sagte: Wenn keine Person im Haus, Rufumleitung auf true.
-
@paul53
fehlt da nicht der delay? Wegen Falls Objekt und state.val != getState() -
@ticaki sagte: fehlt da nicht der delay?
Was soll ein delay bewirken? Es ist lediglich eine Oderverknüpfung der beiden Anwesenheitswerte mit anschließender Negation.
-
@paul53
Das man, soweit mir bekannt, in einer on(x, y) Subscription nicht auf den Wert von x per getState() zugreifen soll, da getState().val != dp.state.val sein kann -
@ticaki sagte: da getState().val != dp.state.val sein kann
Das widerspricht meiner Erfahrung aus hunderten Beiträgen im Forum. Wenn auf Änderung getriggert wird, liefert auch getState(id).val den Wert, der zum Auslösen führte.
Anders ausgedrückt: Die Callback-Funktion, die den Puffer der Javascript-Instanz mit dem Zustand aktualisiert, wird vor der Callback-Funktion im Skript ausgeführt. -
@paul53 sagte in Falls zwei Trigger Einfluss auf eine Veränderung haben:
@ticaki sagte: da getState().val != dp.state.val sein kann
Das widerspricht meiner Erfahrung aus hunderten Beiträgen im Forum. Wenn auf Änderung getriggert wird, liefert auch getState(id).val den Wert, der zum Auslösen führte.
Anders ausgedrückt: Der Trigger, der den Puffer der Javascript-Instanz mit dem Zustand aktualisiert, erfolgt vor dem Trigger im Skript.Ok, meine Informationen sind jetzt ca. 3 Jahre alt und ich mache es seit dem einfach nicht. Gut möglich dass das heute so ist. Oder der der es geschrieben hatte (mit nem developer tag) hat unsinn geschrieben
Edit: Test durchgeführt mit 100 Wertänderungen eines Adapters, jedesmal war state.val == getState(). Gut das ich gefragt habe und noch besser das du mir geantwortet hast. Danke wiedermal.
-
@paul53 Hi Paul, danke nochmals. funktioniert einfandfrei!