NEWS
HowTo Frage: Selector.on mit change any
-
Hallo,
ich brauche wieder einmal Eure Hilfe. Ich suche schon seit Stunden und kann nichts brauchbares finden, wobei mein Anliegen eigentlich ganz einfach sein sollte:
ich verwende einen Selector:
var Selector_Homematic_Bewegung = $('channel[state.id=*.MOTION|*.PRESENCE_DETECTION_STATE](functions=Bewegung)'); Selector_Homematic_Bewegung.on(function(obj) { var raum=room(obj); logs("Bewegugsmelder ausgelöst: "+ obj.name + " " + raum,"info","ffff00"); raum_status_ermitteln(); });
Soweit funktioniert das auch, aber nur wenn sich der Zustand ändert.
Nun meine Frage:
Wie muss ich das Ereignis beschreiben, wenn alle Meldungen auslösen sollen.
also so wie z.B.````
on({id:/hm-rpc.2.*.1.PRESENCE_DETECTION_STATE/,change:'any'}, function (obj) { // Arbeitszimmer PräsenzmelderVielen Dank für eure Hilfe
-
Ich verstehe nicht ganz was du meinst :-).
Der selector ist ein regex der also auf alles subscribet.
Du möchtest aber nicht nur Änderungen sondern auch Updates als Event ?
Wozu? Könntest du Mal den usw Case beschreiben?
Sent from my iPhone using Tapatalk
-
Der Hintergrund in meinem Fall ist folgender:
Erste Bewegung erkannt –> Licht für 5 Minuten an, gesteuert durch ein Script, dass den Lichtaktor mit einem Timer für 300 Sekunden aktiviert.
Es soll keine Direktverknüfung genutzt werden.
Zweite Bewegung wird innerhalb der 5 Minuten erkannt --> Licht wird wieder auf 5 Minuten gesetzt.
... solange wie Bewegung erkannt wird, bleibt das Licht von der letzten Bewegung für 5 Minuten an.
Wird in diesem Zeitraum keine Bewegung mehr erkannt, geht das Licht aus.
Jetzt kommt mein Problem. Mein Selector reagiert aber erst, wenn garantiert keine Bewegung mehr erkannt wird, d.h. die zweite Bewegung löst den Trigger nicht aus.
-
Du hast keinen ob in deinem Script?
$(selector).on(function(obj) {});
Sent from my iPhone using Tapatalk
-
Hallo,
das verstehe ich nicht. Das obj ist doch enthalten.
var Selector_Homematic_Bewegung = $('channel[state.id=*.MOTION|*.PRESENCE_DETECTION_STATE](functions=Bewegung)'); Selector_Homematic_Bewegung.on(function(obj) { var raum=room(obj); logs("Bewegugsmelder ausgelöst: "+ obj.name + " " + raum,"info","ffff00"); raum_status_ermitteln(); });
und vom Grundsatz her funktioniert das ja auch, bei der ersten Bewegungserkennung löst dieses Script aus.
Aber nicht wenn innerhalb der eingestellten Zeit die gleiche Meldung noch einmal kommt, nämlich Bewegung erkannt.
Wenn ich das klassisch mache mit:
on({id:/hm-rpc.0.MEQ0538238.1.MOTION/,change:'any'}, function (obj) { // Arbeitszimmer Präsenzmelder var raum=room(obj); logs("Direktangabe Bewegugsmelder ausgelöst: "+ obj.name + " " + raum,"info","ffff00"); raum_status_ermitteln(); });
funktioniert alles soweit, wie ich das wünsche. Der Grund hierfür liegt daran, dass ich hier change: ' any' angeben kann.
-
Probier doch Mal den selector mit on wie in der Dokumentation beschrieben anstatt Variable
Sent from my iPhone using Tapatalk
-
Probier es mal mit RegExp:
on({id: /.*(\.MOTION|\.PRESENCE_DETECTION_STATE)/}, function (obj) { // triggert auf Aktualisierung
-
Hallo,
da ich deinen Hinweis in der Doku nicht finden konnte, habe ich jetzt hierfür einen Workaround gefunden.
Es hat den Anschein, dass Selector_Homematic_Bewegung.on(function(obj) {}) nur auf Änderung reagiert.
Jetzt habe ich mir folgendes gebastelt.
`var bewegungname = [], bewegungid = [], bewegungstatus = []; // ------------------------------------------------------------------------------------------------------------------------------------------------------ // Bewegungsmelder zusammenstellen // ------------------------------------------------------------------------------------------------------------------------------------------------------ var Selector_Homematic_Bewegung = $('channel[state.id=*.MOTION|*.PRESENCE_DETECTION_STATE](functions=Bewegung)'); Selector_Homematic_Bewegung.each(function (id,i) { bewegungname[i] = getObject(id).common.name; bewegungid[i] = id; bewegungstatus[i] = getState(id).val; log ("Bewegungsmelder Name: " + bewegungname[i] + " Status: " + bewegungstatus[i]); // +JSON.stringify(getObject(id) }); on({id:bewegungid,change:'any'}, function (obj) { // Arbeitszimmer Präsenzmelder logs("03 Direktangabe Bewegugsmelder ausgelöst: "+ obj.name ,"info","ffff00"); });` Jetzt löst er auf jede Aktualisierung aus. Vielleicht hat ja noch jemand eine bessere Lösung, aber ich finde die scheinbar nicht. Trotzdem Danke für Eure Hilfe.[/i][/i][/i][/i][/i]
-
Da ich auch gerade nach diesem Thema gesucht habe und es ähnlich gemacht hab, hier noch eine Art, wie es noch einfacher geht. Einfach ein Array erstellen und darauf dann das ON lauschen lassen:
var IDs=[]; $(selector).each(function(id, i){ IDs.push(id) ; }); on({id: IDs, change: "any"}, function (obj){ // code });
LG, Andreas