NEWS
[gelöst]Zustand invertieren, Fenster offen Script
-
Hallo,
bräuchte eine Lösung für folgendes Problem:
Ich nutze das "Fenster offen" Script von Pix, um die offenen Fenster mit Drehgriff und TFK anzeigen zu lassen.
Jetzt habe ich jedoch seit gestern noch 3 Fenster an den Digital Eingängen eines 12/14er wired Modul hängen (hab sonst nix mehr frei :-)) Diese melden aber bei geschlossenem ReedKontakt den Zustand "true".
Für das Script ist das natürlich schlecht, da "true = offen" ist.
Wie könnte ich die 3 Fensterkontakte mit in das Script einbauen? Kann ich irgendwie den Zustand invertieren?
-
reagiere doch per Script auf den zustand des Datenpunktes und invertiere es
-
Naja, glaube so einfach ist es nicht.
Das Script holt ja alle Werte vom Gewerk Fenster
Hier mal das Script:
/* 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 */ 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(', ')); // 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) ? text : 'Alle Fenster sind verschlossen'; setState(idAnsage, text); });
-
Ist das mit homematic und einer ccu? Falls ja, dort kannst du -zumindest bei den Funk TFKs- einstellen, ob offen=true oder offen=false ist. Habe ich bei einem auch so gemacht.
Grüße Andreas
-
Das ist korrekt, mit den TFK's geht das, aber leider nicht mit den Digital Eingängen des 12/14 Wired Moduls.
-
Keiner eine Idee wie ich das lösen könnte?
Gesendet von meinem Pixel mit Tapatalk
-
Keiner eine Idee wie ich das lösen könnte? `
Du kannst die Tatsache auswerten, dass die wired Geräte in einer anderen Instanz (z.B. 1) von hm-rpc sind.... var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) if(id.split('.')[1] == '1') status = !status; // wired in Instanz hm-rpc.1 ? ...
-
Hallo paul,
Danke für deine Hilfe, die Idee ist an sich gar nicht schlecht, nur muss ich dann wohl doch noch etwas umverdraten, da ich einmal Kontakte an den TTL Eingängen und einmal an den anderen analog/digital Eingängen habe.
Muss mich wohl für eine Richtung entscheiden, was anderes bleibt mir wohl nicht oder fällt dir noch was ein wie ich es über Script lösen kann?
Gesendet von meinem Pixel mit Tapatalk
-
fällt dir noch was ein wie ich es über Script lösen kann? `
Du kannst auch noch die Kanäle auswerten:... var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var ch = parseInt(id.split('.')[3]); if(id.split('.')[1] == '1' && ch >= 15 && ch <= 20)) status = !status; // wired Instanz hm-rpc.1 und Kanäle 15 bis 20 ...
-
Aha, na das ist ja klasse. Das sollte gehen. Und wie baue ich das jetzt in das obige Script ein, damit ich zum Schluss nur einen Javascript Datenpunkt bzww ein Array hab mit allen Fenstern?
-
Und wie baue ich das jetzt in das obige Script ein, `
Hinter die ZeilencacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Fenster var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
-
Ok, werde ich gleich mal testen.
Hab aber noch ne Frage dazu. Ich habe auf 2 Modulen die Kontakte auf unterschiedlichen und auch mal auf gleichen Kanälen bzw. auf einem Modul ist auf Kanal 15 ein Reedkontakt vom Fenster auf dem zweiten Modul ist mein Klingelsignal.
Das sollte aber kein Problem sein oder? Da das Script ja nur im Gewerk Fenster sucht
-
Das sollte aber kein Problem sein oder? Da das Script ja nur im Gewerk Fenster sucht `
Sehe ich auch so. -
Funktioniert wie jetzt gewünscht. Danke Paul [THUMBS UP SIGN]
Gesendet von meinem Pixel mit Tapatalk