NEWS
Frage zu Fensterskript
-
Hi,
ich nutze das Fensterskript von smarthome-tricks.de. Dachte auch es verstanden zu haben, leider aktualisiert es die Werte nicht.
function countOpenWindowsDoors() { var openWindows = 0; var openDoors = 0; // Fenster var windows = getObject("enum.functions.fenster").common.members; for(let i = 0; i < windows.length; i++) { var Status = getState(windows[i]+ ".state").val; if ( Status ) { openWindows = openWindows + 1; } } // Türen var doors = getObject("enum.functions.tueren").common.members; for(let i = 0; i < doors.length; i++) { var Status = getState(doors[i]+ ".state").val; if ( Status ) { openDoors = openDoors + 1; } } var openWindowsText = "Kein Fenster geöffnet"; var openDoorText = "Keine Tür geöffnet"; if ( openWindows > 0 ) { openWindowsText = openWindows + " Fenster geöffnet"; } if ( openDoors > 0 ) { openDoorText = openDoors + " Türe(n) geöffnet"; } setState('javascript.0.Status.StatusWindowOpenText', openWindowsText ); setState('javascript.0.Status.StatusDoorOpenText', openDoorText ); setState('javascript.0.Status.StatusWindowOpen', openWindows, true ); setState('javascript.0.Status.StatusDoorOpen', openDoors, true ); } function registerSubscription() { $('state(functions=fenster)').on(function(obj) { countOpenWindowsDoors(); }); $('state(functions=tueren)').on(function(obj) { countOpenWindowsDoors(); }); } registerSubscription(); countOpenWindowsDoors();
Hab im Vergleich zum Originalskript die Namen der Functions angepasst. Dort hießen sie doorstatus und windowstatus, bei mir nur fenster und tueren.
Wenn ich das Skript ausführe oder neulade, läuft es auch durch. Aber die Subscription auf State changes scheint nicht zu funktionieren.
-
@martinschm
Zeige mal (mind.) einen Objektbaum, aus dem die Zuordnung des Gewerkes "fenster" ersichtlich ist.var Status = getState(windows[i]+ ".state").val;
+ ".state" ist sicherlich falsch !
-
@paul53 said in Frage zu Fensterskript:
@martinschm
Zeige mal (mind.) einen Objektbaum, aus dem die Zuordnung des Gewerkes "fenster" ersichtlich ist.var Status = getState(windows[i]+ ".state").val;
+ ".state" ist sicherlich falsch !
Hier der Objektbaum
Das +.state muß ich bei Xiaomi Sensoren machen. Ansonsten klappt es nicht. Das Skript läuft wie gesagt auch durch wenn man es manuell neulädt.
-
@martinschm sagte:
Hier der Objektbaum
Ich meinte nicht den Gewerkeobjektbaum, sondern den Objektbaum mit Fenster-Geräten und -Datenpunkten, bei dem man die Gewerkezuordnung sieht.
Das +.state muß ich bei Xiaomi Sensoren machen.
Hast Du das Gewerk Kanälen zugeordnet ? Dann muss der Trigger anders aussehen.
$('channel[state.id=*.state](functions=fenster)').on
oder Du ersetzt alles ab Zeile 38 durch:
on(/.+\.state$/, countOpenWindowsDoors); countOpenWindowsDoors();
-
@martinschm sagte:
Das Skript läuft wie gesagt auch durch wenn man es manuell neulädt.
Das Original-Skript setzt voraus, dass das Gewerk dem Datenpunkt (Name "Is opened") zugeordnet wird und nicht dem Kanal.
-
@paul53 said in Frage zu Fensterskript:
@martinschm sagte:
Hier der Objektbaum
Ich meinte nicht den Gewerkeobjektbaum, sondern den Objektbaum mit Fenster-Geräten und -Datenpunkten, bei dem man die Gewerkezuordnung sieht.
Das +.state muß ich bei Xiaomi Sensoren machen.
Hast Du das Gewerk Kanälen zugeordnet ? Dann muss der Trigger anders aussehen.
$('channel[state.id=*.state](functions=fenster)').on
oder Du ersetzt alles ab Zeile 38 durch:
on(/.+\.state$/, countOpenWindowsDoors); countOpenWindowsDoors();
Der Objektbaum sieht so aus:
Dachte es reicht wenn die Fenster einer Aufzählung zugeordnet sind und das Skript da durchläuft.
Ich sehe grade in dem Artikel (https://www.smarthome-tricks.de/software-iobroker/iobroker-aufzaehlungen-fuer-das-zaehlen-von-offenen-fenstern-oder-tueren-verwenden/), das dort nur die States und nicht die Geräte zugeordnet wurden.
Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?
-
@martinschm sagte:
Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?
Das habe ich in meiner vorletzten Antwort geschrieben. Alles ab Zeile 38 ersetzen durch
on(/.+\.state$/, countOpenWindowsDoors); // triggert alle .state bei Wertänderung countOpenWindowsDoors(); // Skriptstart
Hier wird kein Selector verwendet, sondern ein RegExp, mit dem auf alle Datenpunkte getriggert wird, die mit ".state" enden. Die Selektion nach Gewerk erfolgt in der Funktion countOpenWindowsDoors().
-
Bei meinen Xiaomi-Kontakten muss der Teil so heissen, damit es funktioniert (contact statt state):
on(/.+\.contact$/, countOpenWindowsDoors); // triggert alle .contact bei Wertänderung countOpenWindowsDoors();
Oder:
function registerSubscription() { $('state[state.id=*.contact](functions=fenster)').on(function(obj) { countOpenWindowsDoors(); }); $('state[state.id=*.contact](functions=tueren)').on(function(obj) { countOpenWindowsDoors(); }); }
Und ich hab natürlich überall Status durch !Status ersetzt, da der Wert "true" ist, wenn der Kontakt geschlossen und nicht offen ist:
if ( !Status ) { openWindows = openWindows + 1; }
Aber Achtung: Ich verwende den Zigbee-Adapter. Hier sind die Datenpunkte und Werte unterschiedlich zum MiHome-Adapter.
-
-
@paul53
Ich verwende die Version 0.10.2 des Zigbee-Adapters. -
@paul53 said in Frage zu Fensterskript:
@ReverZ sagte:
contact statt state
Verwendet ihr verschiedene Adapter ?
Ich verwende den Xiaomi Adapter
-
Ah OK, das erklärt natürlich einiges.
-
@paul53 said in Frage zu Fensterskript:
@martinschm sagte:
Wie muß ich das Skript denn ändern wenn ich lieber das Gerät als den State zuordnen will ?
Das habe ich in meiner vorletzten Antwort geschrieben. Alles ab Zeile 38 ersetzen durch
on(/.+\.state$/, countOpenWindowsDoors); // triggert alle .state bei Wertänderung countOpenWindowsDoors(); // Skriptstart
Hier wird kein Selector verwendet, sondern ein RegExp, mit dem auf alle Datenpunkte getriggert wird, die mit ".state" enden. Die Selektion nach Gewerk erfolgt in der Funktion countOpenWindowsDoors().
Aber wird dann nicht auf alle Sensoren mit state reagiert, also auch Bewegungsmelder oder Rauchmelder
-
@martinschm
Mit der Subscription ja aber in deiner Funktion wird ja widerum auf die gewünschten Aufzählungen "gefiltert". Hat paul53 weiter oben auch schon erklärt. -
@martinschm sagte:
wird dann nicht auf alle Sensoren mit state reagiert
Ja, aber da sie nicht in den "members" enthalten sind, passiert nichts.
-
@ReverZ said in Frage zu Fensterskript:
@martinschm
Mit der Subscription ja aber in deiner Funktion wird ja widerum auf die gewünschten Aufzählungen "gefiltert". Hat paul53 weiter oben auch schon erklärt.Hi, ok hab ich am Handy wahrscheinlich überlesen. Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.
Da muss ich mal nach einer anderen Lösung schauen.
Danke schonmal für eure Hilfe.
-
@martinschm sagte:
Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.
Ob die Filterung in der Javascript-Instanz oder im eigenen Skript vorgenommen wird, macht keinen großen Unterschied. Etwas Entlastung bringt das Einlesen der Arrays windows und doors außerhalb der Funktion.
const windows = getObject("enum.functions.fenster").common.members; const doors = getObject("enum.functions.tueren").common.members; function countOpenWindowsDoors() {
-
@paul53 said in Frage zu Fensterskript:
@martinschm sagte:
Finde die Handhabung nicht so vorteilhaft, da wird ja unter Umständen viel zu häufig das Skript aufgerufen nur um dann nichts zu machen.
Ob die Filterung in der Javascript-Instanz oder im eigenen Skript vorgenommen wird, macht keinen großen Unterschied. Etwas Entlastung bringt das Einlesen der Arrays windows und doors außerhalb der Funktion.
const windows = getObject("enum.functions.fenster").common.members; const doors = getObject("enum.functions.tueren").common.members; function countOpenWindowsDoors() {
Kann ich nicht eine Subscription auf die Objekte einer Aufzählung machen?
-
@martinschm sagte:
Kann ich nicht eine Subscription auf die Objekte einer Aufzählung machen?
Nein, außer mit einem Selector. Subscriben kann man nur Datenpunkte, Deine Aufzählungen enthalten aber Channels. Wie ich weiter oben schon mal geschrieben habe, kannst Du es mit einem veränderten Selector versuchen.
$('channel[state.id=*.state](functions=fenster)').on(countOpenWindowsDoors); $('channel[state.id=*.state](functions=tueren)').on(countOpenWindowsDoors);