ioBroker.javascript icon indicating copy to clipboard operation
ioBroker.javascript copied to clipboard

Blockly "unBind" (aka unsubscribe)

Open thomke67 opened this issue 2 years ago • 6 comments

hallo,

wenn ich je nach ausgewähltem Gerät ein Binding zuordnen will, dann scheint das nicht zu funktionieren. Anscheinend werden immer beide Bindings beibehalten. Beim Debuggen erscheinen auf jeden Fall immer abwechselnde Werte von beiden Geräten, obwohl nur die unterschiedlichen Level genommen werden sollten. Beim Thor10 wird dem Binding der Battery-Level von Thor10 zugeordnet und eben beim Galaxy der entsprechende Level.

Hintergrund ist, dass ein Shelly nur zwischen 20 und 80 Prozent geschaltet werden soll. So ist das aber nicht möglich....

grafik

grafik

Gruß, Thomas

thomke67 avatar Mar 16 '22 20:03 thomke67

Ok, zwig bitte mal das generierte Javascript. Aus dem Blockly wird ja keiner schlau :-) In der Javascript UI auf den "Blockly | JS" grafik drücken dann schaltet er um.

Weiterhim wichtig: Im Trigger "Automatiken.gerät" nicht den Wert von "Automatiken Gerät" abfragen ... einfach den Wert aus demm Trigger nutzen wie beim zweiten Blockly oben mit Screenshot (und der annahme das das die gleichen IDs sind)

Apollon77 avatar Mar 16 '22 21:03 Apollon77

Hi Apollon,

zu dem Wert hast du natürlich Recht. Das ist durch das "Herumprobieren" entstanden. Normalerweise achte ich darauf.

Hier das Javascript:

on({id: "0_userdata.0.Automatiken.Gerät"/Automatiken.Gerät/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("0_userdata.0.Automatiken.Gerät").val == 'Thor10') { setState("0_userdata.0.Automatiken.GeräteLevel"/Automatiken.GeräteLevel/, getState("paw.0.THOR10.info.battery.level").val, true); on({id: 'paw.0.THOR10.info.battery.level', change: "ne"}, function (obj) { setState('0_userdata.0.Automatiken.GeräteLevel', obj.state.val); });} else if (getState("0_userdata.0.Automatiken.Gerät").val == 'Galaxy S7') { setState("0_userdata.0.Automatiken.GeräteLevel"/Automatiken.GeräteLevel/, getState("paw.0.SM-T875.info.battery.level").val, true); on({id: 'paw.0.SM-T875.info.battery.level', change: "ne"}, function (obj) { setState('0_userdata.0.Automatiken.GeräteLevel', obj.state.val); });} });

on({id: "0_userdata.0.Automatiken.GeräteLevel"/Automatiken.GeräteLevel/, change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") < 20) { setState("shelly.0.SHSW-1#E8DB84D74624#1.Relay0.Switch"/Switch/, true); } else if ((obj.state ? obj.state.val : "") > 80) { setState("shelly.0.SHSW-1#E8DB84D74624#1.Relay0.Switch"/Switch/, false); } });

Und das Ergebnis sieht man im Log des Blocklys. Ich habe einen Debug auf den Datenpunkt Automatiken.GeräteLevel gelegt. grafik

Der Wert springt zwischen den beiden Geräten immer hin und her!

Gruß, Thomas

thomke67 avatar Mar 17 '22 19:03 thomke67

Ok, now I get it ... you need an unsubscribe ... This is a blockly featre request. In JavaScript itself it is present and possible ... blockly do not have it right now.

This also requires to store the binding id in a variable name and such

Apollon77 avatar Mar 18 '22 17:03 Apollon77

Hi Apollon,

ist das nun bereits eine feature request oder muss ich noch etwas machen?

Gruß, Thomas

thomke67 avatar Mar 19 '22 15:03 thomke67

enhancement heisst "Feature Request". Alles gut.... müssen schauen wann jemand Zeit findet.

Wenn DU so ein skript aktuell haben willst schreib es als JavaScript und nicht Blockly

Apollon77 avatar Mar 19 '22 18:03 Apollon77

... wenn ich das mal könnte.....

thomke67 avatar Mar 19 '22 19:03 thomke67