NEWS
[gelöst] RegEx im $ Selector möglich?
-
@paul53 Ich wollte gerade den Selector mit WIldcard benutzen ...
$(`state[id=${idStartAutomatikstati}.*]`).each((id)=>{ const elementname = id.substring(id.lastIndexOf(".") + 1,id.length); automatikstatus[elementname] = getState(id).val; });
Funktioniert.
Aber das hier:
$(`state[id=${idStartAutomatikstati}.*]`).on((obj)=>{ log(obj._id); const elementname = obj._id.substring(obj._id.lastIndexOf(".") + 1,obj._id.length); const value = getState(obj._id); log(elementname); automatikstatus[elementname] = value.val; if(!value.ack){ setState(obj._id,value.val,true); } });
Da kommt in der ersten Zeile "undefined" als log und das on reagiert nur auf Änderung.
Ist das mit der Änderung so korrekt. Damit könnte ich ja noch leben, aber warum ist obj._id undefined?Edit:
OK, ich muss "id" nicht "_id" verwenden.
-
@ben1983 sagte: Ist das mit der Änderung so korrekt.
Ja.
-
@paul53 So ist es jetzt eine allgemeine Lösung und ich kann über die States weitere Stati als element der internen Automatikstruktur hinzufügen.
// automatikstati // Wildcard definieren let idStartAutomatikstati = "0_userdata.0.Produktiv.Pool.Waermepumpe.automatikstati"; let automatikstatus = {}; $(`state[id=${idStartAutomatikstati}.*]`).each((id)=>{ const elementname = id.substring(id.lastIndexOf(".") + 1,id.length); automatikstatus[elementname] = getState(id).val; }); $(`state[id=${idStartAutomatikstati}.*]`).on((obj)=>{ log(obj.id); const elementname = obj.id.substring(obj.id.lastIndexOf(".") + 1,obj.id.length); const value = getState(obj.id); log(elementname); automatikstatus[elementname] = value.val; if(!value.ack){ setState(obj.id,value.val,true); } }); // Funktion zum setzen der Werte function setAutomatikstati(elementname){ setState(`${idStartAutomatikstati}.${elementname}`,automatikstatus[elementname],true); };
-
@ben1983
Zeile 13 würde ich optimieren:const value = obj.state;
wobei der Bezeichner
value
nicht optimal ist. Es handelt sich um den Zustand (state). -
@paul53 stimmt.
ach den state liefert er grad mit. cool.habe es dann so gemacht:
// automatikstati // Wildcard definieren let idStartAutomatikstati = "0_userdata.0.Produktiv.Pool.Waermepumpe.automatikstati"; let automatikstatus = {}; $(`state[id=${idStartAutomatikstati}.*]`).each((id)=>{ const elementname = id.substring(id.lastIndexOf(".") + 1,id.length); automatikstatus[elementname] = getState(id).val; }); $(`state[id=${idStartAutomatikstati}.*]`).on((obj)=>{ if(!obj.state.ack){ const elementname = obj.id.substring(obj.id.lastIndexOf(".") + 1,obj.id.length); automatikstatus[elementname] = obj.state.val; setState(obj.id,obj.state.val,true); } }); // Funktion zum setzen der Werte function setAutomatikstati(elementname){ setState(`${idStartAutomatikstati}.${elementname}`,automatikstatus[elementname],true); }; // Automatikstati zurücksetzen function setzeAutomatikstatiZurueck(){ for(const stati in automatikstatus){ automatikstatus[stati] = false; setAutomatikstati(stati); } }
-
@paul53 Wenn ich im selctor das Objekt logge, dann kommt:
o javascript.0 (3299) script.js.Garten.Pool.Wärmepumpe: {"id":"0_userdata.0.Produktiv.Pool.Waermepumpe.automatikstati.warteAufGeringeLeistung","newState":{"val":true,"ts":1686679813843,"ack":false,"lc":1686679813843,"from":"system.adapter.admin.0","q":0,"user":"system.user.admin"},"oldState":{"val":false,"ts":1686679759809,"ack":true,"lc":1686679759805,"from":"system.adapter.javascript.0","q":0,"c":"script.js.Garten.Pool.Wärmepumpe","user":"system.user.admin"},"state":{"val":true,"ts":1686679813843,"ack":false,"lc":1686679813843,"from":"system.adapter.admin.0","q":0,"user":"system.user.admin"}}
aber es gibt ja auch obj.name
Warum taucht das nicht mit log(JSON.stringify(obj) auf?
-
@ben1983 sagte: es gibt ja auch obj.name
obj.name gibt es nicht.
@ben1983 sagte in [gelöst] RegEx im $ Selector möglich?:
Warum taucht das nicht mit log(JSON.stringify(obj) auf?
Das habe ich mich auch schon gefragt. Logge mal obj.common.
-
@paul53 oh ja. Meinte ja obj.common.name
Warum logt er das common nicht mit. So meinte ich es.
Die Frage ist eigentlich, was alles verfügbar ist in
A: dem selector.on()
B: getObject()
Es ist unterschiedlich, oder?
Und obj._Id meldet „undefined“
obj.Id geht. -
@ben1983 sagte: was alles verfügbar ist in
A: dem selector.on()Siehe Doku zu den Funktionen des Javascript-Adapters.
@ben1983 sagte in [gelöst] RegEx im $ Selector möglich?:
B: getObject()
Liefert nur die statischen Eigenschaften eine Objektes.
-
@paul53 sagte in [gelöst] RegEx im $ Selector möglich?:
@ben1983 sagte: was alles verfügbar ist in
A: dem selector.on()OK.... aber z.B. geht auch
obj.name ..... und das steht nicht in der Doku und wird auch nicht geloggt.@ben1983 sagte in [gelöst] RegEx im $ Selector möglich?:
B: getObject()
Liefert nur die statischen Eigenschaften eine Objektes.
Was genau ist das denn alles?
-
@ben1983 sagte: Was genau ist das denn alles?
Siehe Doku Kernkonzept, Abschnitt "Objekte".
-
@paul53 ok, ich schau mal.
Nur beim on() passt es ja auch nicht. ist es mal erweitert worden?
-
@ben1983 sagte: aber z.B. geht auch obj.name
Stimmt. Habe bisher nur obj.common.name verwendet. Ist vielleicht mal um obj.name erweitert worden?
-
@paul53 Aber nur beim
on()beim getObject() gibts den nicht
-
@paul53 ist es möglich die $(selector).on() reaktion auch noch anderes einzustellen, als "NUR" auf Änderungen?
-
@ben1983 sagte: ist es möglich die $(selector).on() reaktion auch noch anderes einzustellen, als "NUR" auf Änderungen?
Ich wüsste nicht wie.
Hast Du es mal mit on({id: RegEx}, cb) versucht? -
@paul53 Nee, aber danke für den Tipp, damit sollte es ja klappe.
Aber genau überlagt reicht es mir ja auch so... und so mit dem Selector und der Wildcard ist auch ganz gut -
@paul53 sag mal kann ich auch irgendwie sowas wie die each Funktion vom selector mit ner RegEx machen? Bspw. Mit sowas wie getState()?
Ist ja cool, dass ich die RegEx beim on() verwenden kann, mich würde auch interessieren, welche States die RegEx erfüllen.
So könnte auch alles ohne selector funktionieren.
-
@ben1983 sagte: interessieren, welche States die RegEx erfüllen.
Da wird wohl nichts weiter übrig bleiben, als die RegEx möglichst genau für die $Selector.each-Schleife nachzubilden.
-
@paul53 ok. Schade.
Kann man die Wildcard „*“ auch mehrfach nutzen?Also nicht nur:
Adapter.0.folder.*
Sondern auch:
Adapter.0.folder.*.myfolder.*
Geht sowas?
Mit RegEx alle ids die passen raus finden, wäre halt optimal, denn dann bräuchte man keinen Selector, aber so wäre es auch cool.