NEWS
Problem älteres Fenster-Zählen Skript
-
Hallo Codierer,
habe hier auf der Seite von ioBroker ein Skript gefunden das für mich goldrichtig ist. Nach einer kleinen Veränderung auf Verschluss funktioniert es auch. Aber leider nur mit Homematic Fensterkontakten. Die HomematicIP Fensterkontakte werden nicht erkannt.
In meiner CCU ist der IP-Kontakt im Gewerk Verschluss mit drin.
In Objekten stellt der Kontakt den Zustand gegenüber der Homematic Kontakten aber anders dar.
/* System Zahl Fenster zählt die Fenster in allen Räumen und meldet die offenen Fenster namentlich Daten kommen vom Gewerk 'Fenster' erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564 05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php?f=21&t=473&start=20#p9267 02.12.2015 Fehler beseitigt bei Anzahl Fenster, wenn offen (Unterscheidung RHS und TFK) Überprüfung des Zustandes (function fensterstatus) und Übergabe an Text 25.01.2016 Fenster Nummer in Log korrigiert (+1) 02.03.2016 Ansage für TTS aufbereitet 02.07.2016 Regulärer Ausdruck (gierig) bei Aufbereitung für Ansage */ 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' }); var cacheSelectorState = $('channel[state.id=*.STATE](functions="Fenster")'); function countFenster(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Fenster auf 0 var anzahlFenster = 0; var anzahlFensterauf = 0; var textFensterauf = []; log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat cacheSelectorState.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 }); // Schleife ist 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(',<br>')); // 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 } cacheSelectorState.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster countFenster(obj); }); // Variable für Ansage aufbereiten createState('zählen_Fenster.textFensteraufAnsage', { type: 'string', def: ' ', role: 'value' }); // Anzahl der Fenster, die auf sind, für Ansage aufbereitet var idQuelle = 'javascript.0.zählen_Fenster.textFensterauf', idAnsage = 'javascript.0.zählen_Fenster.textFensteraufAnsage'; on(idQuelle, function (obj) { var text = obj.state.val; text = text.replace(/RHS/g, 'Drehgriff'); text = text.replace(/TFK/g, 'Reedkontakt'); text = (text.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind verschlossen'; setState(idAnsage, text); });
Ich vermute mal, das das Problem in der Zeile 67 steckt und dort auf die IP-Kontakte erweitert werden müsste. Aber wie?
Gruß
Bernd -
@berlon
Pack doch alle entsprechenden Datenpunkte in eine Aufzählung
und geh' dann mit 'nem Blockly ran
-
@codierknecht
Mit Aufzählungen hatte ich noch nicht s zu tun. Muss ich mir erst mal anschauen wie das funktioniert.
Werden beim Blockly auch die Raumnamen angezeigt?
Wie bekäme ich die Ergebnisse in die Vis?
Das Skript schreibt alles in einen Datenpunkt das ich mit einem Basic-String Widget darstelle. -
@berlon sagte in Problem älteres Fenster-Zählen Skript:
Werden beim Blockly auch die Raumnamen angezeigt?
Nein - wie im Threadtitel angedeutet werden hier nur die offenen Fenster gezählt.
Um damit zusätzlich eine Liste zu füllen, müsste das entsprechend erweitert werden.
Kommt halt darauf an, was man haben möchte.
Tatsächlich nur eine (Text) Liste der geöffneten Fenster?
Oder doch eher den Status jedes einzelnen Fensters visualisieren.
-
@berlon hab kein Homematic aber vllt ist https://github.com/Pittini/iobroker-Fensterauswertung etwas für dich
https://forum.iobroker.net/topic/31674/vorlage-generisches-fensteroffenskript-vis -
@codierknecht
Das Skript erstellt nur eine Textliste der geöffneten Fenster. Das würde mir reichen.@crunchip
Schau ich mir mal an. Ist natürlich mächtig erweitert. -
anbei mal Scripte von mir bzgl. Fenster, Bewegung und Licht.
Diese Scripte gibt es schon seit Jahren (zumindest seit 7 Jahre) hier im Forum
P.S.
DP musst du natürlich selber anlegen.Vielleicht ist das ja das richtige.
-
@berlon
Ungetestet - kurz und schmerzlosvar count, windowList, state, parent; on({id: Array.prototype.slice.apply($("(functions=window)")), change: "ne"}, async function (obj) { count = 0; windowList = ''; var state_list = Array.prototype.slice.apply($("(functions=window)")); for (var state_index in state_list) { state = state_list[state_index]; if (getState(state).val) count++; parent = state.substring(0, state.lastIndexOf('.')); windowList += getObject(parent).common.name + '<br/>'; } setState("0_userdata.0.fenster_offen", count); setState("0_userdata.0.fenster_liste", windowList); });
-
wow,
Danke erst mal für die vielen Möglichkeiten. Bin nun gerade mal an der Sache von Pittini dran.
Habe da ein kleines Problem:
in dem Bild von Pittini ist da ein Scroll Balken vorhanden, bei mir nicht.
Habe das basic - html Widget genommen.
Wie hat er da den Scroll Balken hingezaubert?? -
@berlon sagte in Problem älteres Fenster-Zählen Skript:
Wie hat er da den Scroll Balken hingezaubert??
Wahrscheinlich im Widget konfiguriert.
Vertical overflow -> scroll (o.ä.)
EDIT:
Lieber mal für dich gesucht, bevor du es nicht findest
-
@homoran
Danke, gefunden.
Ist im Abschnitt CSS Allgemein -> overflow-y. Hier scroll auswählen. Falls es jemand interessiertWieder was gelernt.
-
@berlon sagte in Problem älteres Fenster-Zählen Skript:
Ist im Abschnitt CSS Allgemein -> overflow-y. Hier scroll auswählen
ach was!
-
@codierknecht Hab dein Blockly übernommen. Funktioniert klasse.
Ich lass mir die Anzahl geöffneter Sensoren per Telegramm zuschicken.
Hast du ne ahnung wie ich noch die Namen der geöffneten Geräte in meine Nachricht bekommen kann?
Bin leider auf Blockly beschränkt, ansonsten könnte ich nur C&P.
-
@rushmed
Geht nur per JS:function getObjectName(const objectId) { return getObject(objectId).common.name; }