NEWS
getState(obj.id).val vs obj.state.val
-
@paul53 sagte in getState(obj.id).val vs obj.state.val:
@hanss sagte:
Wird in jedem Fall das Objekt neu gelesen?
Nein, die Variable obj wurde bereits an die Callback-Funktion übergeben.
Ich habe auch nicht obj gemeint, sondern ob der val in der Callback neu gelesen wird.
Kannst Du etwas zu dem geschilderten Unterschied sagen? -
@hanss sagte:
ob der val in der Callback neu gelesen wird.
obj.state.val ist Bestandteil der Objekt-Variablen obj. Es muss also im Gegensatz zu getState(id).val nichts neu eingelesen werden.
-
@paul53 sagte in getState(obj.id).val vs obj.state.val:
@hanss sagte:
ob der val in der Callback neu gelesen wird.
obj.state.val ist Bestandteil der Objekt-Variablen obj. Es muss also im Gegensatz zu getState(id).val nichts neu eingelesen werden.
Hallo paul53,
das ist genau die Info, die ich gesucht habe.
Ich habe schon vermutet, dass es einen grundsätzlichen Unterschied gibt.
Kennst Du eine Quelle, wo man solche Infos nachlesen kann?
Vielen Dank für die Info. -
-
@paul53 sagte in getState(obj.id).val vs obj.state.val:
Es muss also im Gegensatz zu getState(id).val nichts neu eingelesen werden.
Ganz wichtig: getState kann innerhalb von Triggern teilweise alte Werte liefern. obj.state.val ist immer der Wert, der den Trigger ausgelöst hat.
-
Hallo paul53,
ich habe hier die Abfrage:
$('state(functions=fensterkontakt)').on(function(obj) { log("Immer, wenn ein fensterkontakt = true") }
Die on funktion wird immer aktiv, wenn ein fensterkontakt = true.
Ich benötige aber nur einen Aufruf, wenn fensterkotakt sich geändert hat, d.h. "ne":,
bringe aber das 'change: "ne"' nirgens unter.Hoffentlich kennst Du die Syntax, im Tutorial wurde ich nirgens fündig.
-
@hanss sagte:
Die on funktion wird immer aktiv, wenn ein fensterkontakt = true.
Nein, getriggert wird bei Wertänderung. Will man true auswerten, muss man eine Abfrage einbauen:
$('state(functions=fensterkontakt)').on(function(obj) { if(obj.state.val) log("Immer, wenn ein fensterkontakt = true"); else log("Immer, wenn ein fensterkontakt = false"); });
-
Dann muß ich leider den ganzen Block einfügen:
Ich erhalte laufend die E-mail, die in Zeile 45 erzeugt wird, obwohl sich der fensterkontakt
in Zeile 11 nicht geändert hat (habe in dem Objekt die letzte Änderung kontrolliert)Ist zwar eine Zumutung, die Bitte einen Fehler zu suchen, aber vielleicht hast Du einige Minuten
Zeit:const idsFenster = $('state(functions=fensterkontakt)'); // alle Objekte mit Funktion Tür Fenster Kontakt var AnzFensterOffen = 0; idsFenster.each(function(id, i) { // Bei Programmstart alle Kontakte einlesen if (getState(id).val){ AnzFensterOffen++; } }); setState("javascript.0.zigbee.0.Fensterkontakt", AnzFensterOffen) idsFenster.on(function(obj) { // alle Objekte mit Funktion Tür Fenster Kontakt var Kontakt = obj.state.val; // Fensterkontakt true/false // obj.state.val = Bestandteil der Objekt-Variablen obj var raum = getObject(obj.id, "rooms"); var raumname = String(raum.enumNames); // Raumname(Aufzählungen) der Änderung var obj_root_id = "javascript.0." + obj.id.substr(0, 25) // Root Objekt = die ersten 25 Zeichen von "zigbee.0.00158d0003eefd9f.opened" InsertObj(obj_root_id,raumname); // evtl. fehlende Alarm Obj. erzeugen var alarm_id = obj_root_id+".AlarmStatus"; // Objekt ID für Alarm man. Eintrag var alarmzeit_id = obj_root_id+".AlarmZeit"; // Individuelle Alarm Zeit man. Eintrag var alarmzeit = getState(alarmzeit_id).val; if (alarmzeit < 1) alarmzeit = DefaultAlarmZeit; var radiator_id = ""; // Welcher Heizkörper ist betroffen var timeout_1 var WZ_Temp_alt = TempHigh // Suche Heizungs-Objekt $('state[id=*](functions=solltemperatur)(rooms='+raumname+')').each(function(id) { // suche Radiator für diesen Raum radiator_id = id; }); // log ("Kontrolle: "+raumname+" - " + Kontakt+" - "+radiator_id) // log ("Alarm: "+alarm_id+" Alarmzeit: "+alarmzeit) if (Kontakt) { // Fenster/Türe offen setState(alarm_id,1); // 1 = Fenster offen AnzFensterOffen++; timeout_1 = setTimeout(function (obj,alarm_id,radiator_id,raumname) { if (getState(obj.id).val) { // Kontakt neu einlesen. Nach Alarmzeit immer noch offen? if (raumname=="Wohnzimmer"){ // Sonderfall Wohnzimmer setState("mqtt.0.haus.keller.Helios_KWL.Lueftung.KWL_EinAus","false"); // Lüftung aus WZ_Temp_alt = parseFloat(getState('javascript.0.haus.Heizung.Wohnzimmer.Soll').val); } else { // kein Alarm im Sommer wenn Heizung aus if (parseFloat(getState("javascript.0.haus.Summenwerte.7_Tage.keller.Heizung.Gasverbrauch.proTag").val) > 5){ const text = "Achtung !! Im "+raumname + " ist ein Fenster länger als "+ alarmzeit/60 + " Min. offen" loginfo(text); Email(text,'OG Fenster offen'); } } setState(alarm_id,2); // 2 = Fenster Offen Alarm if(radiator_id != "") setState(radiator_id,TempLow); // Wenn EvoHome TV: RT-Soll bei offenem Fenster } },alarmzeit * 1000,obj,alarm_id,radiator_id,raumname); // Alarm nach OffenAlarmZeit Sek. } else { clearTimeout(timeout_1) // Alarm Timer löschen, wenn Fenster/Türe = zu setState(alarm_id,0); // Fenster geschlossen AnzFensterOffen--; if (raumname=="Wohnzimmer"){ // Sonderfall Wohnzimmer setState("mqtt.0.haus.keller.Helios_KWL.Lueftung.KWL_EinAus","true"); // Lüftung ein var WZ_Temp_akt = parseFloat(getState('javascript.0.haus.Heizung.Wohnzimmer.Soll').val); var WZ_Zemp_man = parseFloat(getState(radiator_id).val); if (WZ_Temp_akt != TempLow) { if (WZ_Zemp_man == TempLow) setState(radiator_id,-WZ_Temp_akt); } else { setState(radiator_id,-TempHigh); } } } setState("javascript.0.zigbee.0.Fensterkontakt",AnzFensterOffen) }); // state(functions=
-
@hanss sagte:
Ich erhalte laufend die E-mail, die in Zeile 45 erzeugt wird, obwohl sich der fensterkontakt
in Zeile 11 nicht geändert hatSicher ? Die Callback-Funktion wird nur bei einem Trigger ausgeführt. Checke es per Log:
idsFenster.on(function(obj) { // alle Objekte mit Funktion Tür Fenster Kontakt var Kontakt = obj.state.val; // Fensterkontakt true/false log('Trigger ' + obj.id + ': ' + Kontakt);
-
@paul53
Da war mal wieder Geisterstunde.
Seit dem Vorfall kann ich die wiederkehrenden E-mails nicht mehr reproduzieren.
Vielen Dank! -
@hanss
Hallo paul53:Ich finde das einfach nicht:
Könntest Du mir bitte einen Link angeben, wo ich sehen kann, wie das
obj bei " idsBW1.on(function(obj) " aufgebaut ist?
Bis jetzt kenne ich nur obj.state.val und obj.id.Wie kann ich mit log("Objekt: "+obj.liste) alle möglichen werte einsehen?
Vielen Dank! -
Meinst du
log(JSON.stringify(obj));
?
und hier ist es aufgelistet. https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#on---subscribe-on-changes-or-updates-of-some-state
-
@ticaki sagte in getState(obj.id).val vs obj.state.val:
log(JSON.stringify(obj));
Ja genau. Super.
Vielen Dank -
@ticaki sagte:
log(JSON.stringify(obj));
In neueren Versionen des Javascript-Adapters ist JSON.stringify() nicht erforderlich.
on(id, function(dp) { log(dp); // zeigt id, state, oldState log(dp.common); // zeigt common-Attribute });