NEWS
[gelöst] Script "Zählen von Fenstern" zeigt keine offenen Fenster an
-
Hab mir mal das Script von der iobroker Seite geladen: http://www.iobroker.net/docu/?page_id=5158&lang=de als JS Script im ioBroker angelegt und gestartet. Die Datenpunkte werden angelegt und alles steht auf 0 bzw. Alle Fenster sind geschlossen. Stinmt aber nicht. Habt ihr nen Idee was ich noch anpassen müsste? Hab in der CCU alles TFK in das Gewerk "Fenster" gepackt und es wird im ioBroker unter Aufzählungen -> Functions auch korrekt angezeigt.
Hab mal ein Screenshot von den Datenpunkten und z.B dem Fenster vom Bad hochgeladen. Da steht der STATE Wert auf true
7763_2018-09-18_10_45_05-einstellungen.png
7763_2018-09-18_10_45_16-objects_-_iobroker.png
7763_2018-09-18_10_45_26-objects_-_iobroker.png -
Hast Du das Badfenster mal geschlossen und dann wieder geöffnet ?
Die Zählfunktion reagiert erst auf Änderung des Zustands eines Fensters.
-
Ach tatsächlich, heute zeigt er es korrekt an. Super dann danke für den Hinweis
-
Wie kann ich noch die TFK von Xiaomi anzeigen lassen? Habe die auch in die funtions Fenster geschoben aber sie werden nicht angezeigt. Auch nicht nach mehrmaligem öffnen und schließen. Kann es sein, das die Groß und Kleinschreibung vom Wort state ein Problem ist? Bei den HM Geräten wird es so geschrieben und auch so im Script gesucht: STATE und bei den Xiaomi : state. Wie kann ich das Scrip anpassen, damit ich diese Sensoren auch reinbekommen?
-
Wie kann ich noch die TFK von Xiaomi anzeigen lassen? Habe die auch in die funtions Fenster geschoben `
Was hast Du in die enum.functions.Fenster geschoben ? Den Kanal oder den Datenpunkt (*.state) ? -
Äh das ganze Gerät?!?! Bin auf Objekte gegangen und dann mit der Maus auf den Bereich wo Funktionen stehen, da kommt dann ein Bearbeitungs-Icon, klickt ma da drauf, dann kann man die Funktionen auswählen. Danach wandert alles vom Gerät in die Function Fenster oder ist dieser Weg falsch?
7763_2018-09-19_15_32_57-objects_-_iobroker.png -
ist dieser Weg falsch? `
Ist in Ordnung.
@smarti2015:Äh das ganze Gerät?!?! `
Das Gerät ist in ioBroker ein channel. -
Aber warum wird es dann nciht angezeigt? Kann es an dem state bzw STATE liegen? Ich glaube dslraser hatte mal sowas gesagt
-
Aber warum wird es dann nciht angezeigt? Kann es an dem state bzw STATE liegen? `
Ja, Javascript unterscheidet zwischen Groß- und Kleinschreibung. Es wird ein zweiter Selektor benötigt. -
Oh verdammt, macht es Sinn das Script einfach nochmal unter einem anderen Namen abzuspeichern und den Selektor zu ändern oder wie könnte ich in dem vorhandenen Script den zweiten Selektor einbinden?
-
wie könnte ich in dem vorhandenen Script den zweiten Selektor einbinden? `
Ohne die Ansage am Ende:function fensterstatus(zustand) { var meldung; switch (zustand) { case 1: meldung = 'RHS gekippt'; break; case 2: meldung = 'RHS offen'; break; case true: meldung = 'TFK offen'; break; default: meldung = 'geschlossen'; break; } return(meldung); } createState('zählen_Fenster.anzahlFenster', { // wenn benötigt: Anzahl der vorhandenen Fenster type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.anzahlFensterauf', { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.textFensterauf', { // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen type: 'string', def: ' ', role: 'value' }); const hmFenster = $('channel[state.id=*.STATE](functions="Fenster")'); const miFenster = $('channel[state.id=*.state](functions="Fenster")'); function countFenster() { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0 var anzahlFenster = 0; var anzahlFensterauf = 0; var textFensterauf = []; hmFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); miFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.state im Gewerk Fenster var status = getState(id).val; // Zustand *.state abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name; if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); // Schleifen sind durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben log("Text: " + textFensterauf); log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " + anzahlFensterauf); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Fenster.textFensterauf", textFensterauf.join(', ')); // Schreibt die aktuelle Namen der offenen Fenster setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length); // Schreibt die aktuelle Anzahl der offenen Fenster setState("zählen_Fenster.anzahlFenster", anzahlFenster); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster } countFenster(); // Skriptstart hmFenster.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); }); miFenster.on(function(obj) { // bei Zustandänderung *. state im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); });
-
wie könnte ich in dem vorhandenen Script den zweiten Selektor einbinden? `
Ohne die Ansage am Ende:function fensterstatus(zustand) { var meldung; switch (zustand) { case 1: meldung = 'RHS gekippt'; break; case 2: meldung = 'RHS offen'; break; case true: meldung = 'TFK offen'; break; default: meldung = 'geschlossen'; break; } return(meldung); } createState('zählen_Fenster.anzahlFenster', { // wenn benötigt: Anzahl der vorhandenen Fenster type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.anzahlFensterauf', { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen type: 'number', min: 0, def: 0, role: 'value' }); createState('zählen_Fenster.textFensterauf', { // Anzahl der offenen Fenster und deren Namen als Variable unter Javascript.0 anlegen type: 'string', def: ' ', role: 'value' }); const hmFenster = $('channel[state.id=*.STATE](functions="Fenster")'); const miFenster = $('channel[state.id=*.state](functions="Fenster")'); function countFenster() { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0 var anzahlFenster = 0; var anzahlFensterauf = 0; var textFensterauf = []; hmFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); miFenster.each(function (id, i) { // Schleife für jedes gefundenen Element *.state im Gewerk Fenster var status = getState(id).val; // Zustand *.state abfragen (jedes Element) var obj = getObject(id); var name = getObject(id).common.name; var devicename = name; if (status /*TFK*/ || status === 1 || status === 2 /*RHS*/) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt ++anzahlFensterauf; textFensterauf.push(devicename + ' (' + fensterstatus(status) + ')'); // Name und Zustand zum Array hinzufügen } log('Fenster #' + (i+1) + ': ' + devicename + ' ' + fensterstatus(status)/* + ' (' + status + ' / ' + typeof status + ')'*/); ++anzahlFenster; // Zählt die Anzahl der vorhandenen Fenster unabhängig vom Status }); // Schleifen sind durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben log("Text: " + textFensterauf); log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " + anzahlFensterauf); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Fenster.textFensterauf", textFensterauf.join(', ')); // Schreibt die aktuelle Namen der offenen Fenster setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length); // Schreibt die aktuelle Anzahl der offenen Fenster setState("zählen_Fenster.anzahlFenster", anzahlFenster); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Fenster } countFenster(); // Skriptstart hmFenster.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); }); miFenster.on(function(obj) { // bei Zustandänderung *. state im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); }); ```` `
Vielen Dank Paul53, klappt super
Was hat das noch mit der Ansage zu tun? Kann ich die unten drin lassen, ist die für Alexa? Wie kann man das optisch im VIS etwas schicker darstellen. Bei mir sieht es grad so aus. Weiss nicht so recht welches Widget man da nimmt.
Hab mal eine Übersicht manuell aller Fenster so angelegt, aber optisch nicht sehr schick und aufwendig weil man jeden Sensor auswählen muss. Vielleicht habt ihr nen Vorschlag, wie man das schöner verpacken kann. Möchte am liebsten eine Gesamtansicht aller Fenster haben.
-
Was hat das noch mit der Ansage zu tun? Kann ich die unten drin lassen, ist die für Alexa? `
Ja. -
habe auch das Problem das ich zu einem Hm Fenster Kontakte und Xaomi Fenster/Türkontakte benutze. Allerdings nutze ich die Xaoimi Kontakte über den
USB Zigbee Stick. Die von dir vorgestellte Möglichkeit mit
miFenster.on(function(obj) { // bei Zustandänderung *. state im Gewerk Fenster log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat countFenster(); });
Funktioniert hier nicht. Hast du eine Idee wie das aussehen könnte. Im Vorfeld schon Danke.
Baerny
3933_zigbee2.png -
Die Geräte haben keinen channel. Damit https://forum.iobroker.net/viewtopic.php?f=21&t=16564&p=174031#p174031.
Meine Empfehlung: Entferne die Geräte (device) aus enum.functions.Fenster wieder und ordne die Datenpunkte *.isopen dem Gewerk zu. Dann sollte der Selektor so funktionieren:
const miFenster = $('state[id=*.isopen](functions="Fenster")');
Außerdem verpasse den Datenpunkten *.isopen vernünftige Namen (z.B. Is open –> Fenster 1 offen).
-
Die Geräte haben keinen channel. Damit https://forum.iobroker.net/viewtopic.php?f=21&t=16564&p=174031#p174031.
Meine Empfehlung: Entferne die Geräte (device) aus enum.functions.Fenster wieder und ordne die Datenpunkte *.isopen dem Gewerk zu. Dann sollte der Selektor so funktionieren:
const miFenster = $('state[id=*.isopen](functions="Fenster")');
Außerdem verpasse den Datenpunkten *.isopen vernünftige Namen (z.B. Is open –> Fenster 1 offen). `
Vielen Dank Paul53, leider verstehe ich nicht ganz was du meinst, ich habe jetzt die Geräte aus enum.functions.Fenster herausgenommen. Habe ich das richtig verstanden, dass ich den Datenpunkt *.isopen dann wieder dem Gewerk Fenster zuordnen soll ?.
Außerdem weis ich nicht wo ich den Code im Script einsetzen muss. Wäre schön wenn du mir nochmals helfen könntest, bin in Sachen Script Anfänger.
Schon mal Danke im voraus.
-
Habe ich das richtig verstanden, dass ich den Datenpunkt *.isopen dann wieder dem Gewerk Fenster zuordnen soll ?. `
Ja.
@Baerny:Außerdem weis ich nicht wo ich den Code im Script einsetzen muss. `
Die Stelle, an der miFenster deklariert wirdconst miFenster = $('channel[state.id=*.state](functions="Fenster")');
ersetzen durch
const miFenster = $('state[id=*.isopen](functions="Fenster")');
-
Spitze, funktioniert einwandfrei
-
klappt super `
Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst]. -
Hab ich und nochmal vielen Dank