NEWS
javascript subscribe mit parameter
-
Hi,
ich bin dabei vom MaxCube auf den Maxcul zu wechseln dafür benötige ich jedoch ein paar Funktionen die ich jetzt selber schreiben muss.
Aktuell bin ich dabei die "Fenster offen Heizung aus" Funktion zu bauen.
Im Prinzip habe ich das auch am laufen :on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { if (getState('maxcul.0.NEQ1152113.isOpen').val == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
Da ich das für jedes Fenster /Raum machen müsste habe ich mir überlegt das ich lieber eine Funktion schreibe die dann als Parameter das Fenster und das/die Thermostat(e) bekommt.
function window_change(window, thermostat){ if (getState(window + '.isOpen').val == true){ setState(thermostat +'.mode',6); }else{ setState(thermostat +'.mode',0); } }
Jetzt müsste ich aber beim "on" die Parameter mit geben. Geht das Überhaupt?
on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },window_change,('maxcul.0.NEQ1152113',''maxcul.0.NEQ1255028.mode"));
oder muss ich das anderes schreiben das die window_change Funktion selber überprüfen muss um welches Fenster es sich handelt? Prinzipiell könnte ich über das Fenster Enum iterieren um herauszufinden welches offen ist und dann über die Räume das passende Thermostat zu finden.
Das wäre aber für mein Verständnis sehr umständlich da ja eigendlich bekannt ist welches Fenster bewegt wurde.Über einen Tipp würde ich mich sehr freuen.
Gruß Arne
-
@ignis-draco bau ein array mit window, thermostat..
dann schaust du nach ob sich was geändert hat
on({id: [ 'maxcul.0.NEQ1152113.isOpen', 'maxcul.0.NEQ1ewrwe13.isOpen', 'maxcul.0.NEQ1w4443.isOpen', ], change: 'ne'}, function (obj) { });
holst dir aus dem obj welches fenster ist den nu offen und arbeitest das laut dem array ab
p.s:
if (getState(window + '.isOpen').val){
das reicht als abfrage
-
Mal vorne angefangen:
an Stelle von
on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { if (getState('maxcul.0.NEQ1152113.isOpen').val == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
kannst Du auch direkt
on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { if (obj.state.val == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
nutzen. damit entfällt zumindest eine Variable. Das andere geht meiner Erfahrung nach nicht, weswegen ich das so lösen würde:
function my_trigger(sensor, trigger, aktor) { const _actor = aktor; on({ id:sensor, change:trigger }, function (obj) { if (obj.state.val == true){ setState(_actor,6); } else { setState(_actor,0); } }
Wenn ich die Gültigkeit von Variablen und Konstanten richtig verstanden habe ist so sicher gestellt das die Funktion im Trigger mit den korrekten Werten aufgerufen wird.
Die Funktion kannst du dann für Dein Beispiel so aufrufen:
my_trigger('maxcul.0.NEQ1152113.isOpen', 'any', 'maxcul.0.NEQ1255028.mode')
-
Den ersten Code kannst du vereinfachen:
on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { if (obj.state.val == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
Du musst also nicht das Objekt abfragen, du bekommst alles im Parameter übergeben.
Nun zu deiner eigentlichen Frage: fast richtig. Du musst einfach eine (anonyme) Funktion verwenden:
on( { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { window_change('maxcul.0.NEQ1255028.mode') });
Das erste Argument habe ich absichtlich weggelassen, da du ja den Wert bereits bekommst (siehe oben).
-
... und scheinbar beginnen alle Entwickler gleichzeitig zu arbeiten
-
@ignis-draco said in javascript subscribe mit parameter:
Hi,
ich bin dabei vom MaxCube auf den Maxcul zu wechseln dafür benötige ich jedoch ein paar Funktionen die ich jetzt selber schreiben muss.
Aktuell bin ich dabei die "Fenster offen Heizung aus" Funktion zu bauen.
Im Prinzip habe ich das auch am laufen :on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { if (getState('maxcul.0.NEQ1152113.isOpen').val == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
Da ich das für jedes Fenster /Raum machen müsste habe ich mir überlegt das ich lieber eine Funktion schreibe die dann als Parameter das Fenster und das/die Thermostat(e) bekommt.
function window_change(window, thermostat){ if (getState(window + '.isOpen').val == true){ setState(thermostat +'.mode',6); }else{ setState(thermostat +'.mode',0); } }
Jetzt müsste ich aber beim "on" die Parameter mit geben. Geht das Überhaupt?
on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' },window_change,('maxcul.0.NEQ1152113',''maxcul.0.NEQ1255028.mode"));
oder muss ich das anderes schreiben das die window_change Funktion selber überprüfen muss um welches Fenster es sich handelt? Prinzipiell könnte ich über das Fenster Enum iterieren um herauszufinden welches offen ist und dann über die Räume das passende Thermostat zu finden.
Das wäre aber für mein Verständnis sehr umständlich da ja eigendlich bekannt ist welches Fenster bewegt wurde.Über einen Tipp würde ich mich sehr freuen.
Gruß Arne
Hallo
also wenn du schon einen Trigger mit dem Object hast, dann brauchst du dir den state nicht nochmals mit getState holen, sondern es reicht soon({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { var isOpen = obj.state.val; if (isOpen == true){ setState('maxcul.0.NEQ1255028.mode',6); }else{ setState('maxcul.0.NEQ1255028.mode',0); } });
-
modules:composer.user_said_in, @unclesam, javascript subscribe mit parameter
Nun zu deiner eigentlichen Frage: fast richtig. Du musst einfach eine (anonyme) Funktion verwenden:
on( { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { window_change('maxcul.0.NEQ1255028.mode') });
Das erste Argument habe ich absichtlich weggelassen, da du ja den Wert bereits bekommst (siehe oben).
Hmm.. Muss da nicht noch ein parameter rein ob das Fenster auf Wert 0 oder Wert 6 gesetzt werden muss ? Also so:
on( { id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { window_change('maxcul.0.NEQ1255028.mode', (obj.state.val?6:0)) });
-
@asgothian Richtig, wollte eigentlich
obj
übergeben, aber hab ich dann vergessen. -
Hi @ll,
wo das nenne ich mal schnelle Reaktion und gleich so viele.
Auf die Idee in der anonymen Funktion einfach meine Funktion aufzurufen hätte ich auch selber kommen können .
Das ich über obj ja auch an den state dran kommen wir mir nicht so bewusst (muss in meinen anderen Skripten schauen ob ich das da auch verwenden kann).
Ich mache das jetzt erstmal so.function window_change(thermostat, value){ for (let i of thermostat){ setState(i +'.mode',value); } } on({ id: 'maxcul.0.NEQ1152113.isOpen', change: 'any' }, function (obj) { window_change(['maxcul.0.NEQ1255028'],(obj.state.val?6:0)) });
Vielleicht ändere ich das noch mal so dass es automatisch durch die enums erzeugt wird jedoch glaube ich das eine Änderung (neues Thermostat oder Fenstersensor) nicht so häufig passiert.
vielen dank noch mal für die vielen hilfreichen antworten.
Gruß
Arne