NEWS
Fenster offen Script, Drehgriffkontakte einbinden
-
Bräuchte etwas Hilfe von den Script Profis
Ich nutze mometan folgendes Script (ist hier aus dem Forum), um die offenen Fenster zu zählen und unter anderem in Vis anzuzeigen.
Jetzt habe ich noch Drehgriffkontakte und würde die gerne mit einbinden. Wenn die Drehgriffe in Stellung offen sind funktioniert schon (im Script status ===2) aber wie muss ich das Script weiter ändern, damit mir auch die Fenster im Zustand "gekippt" (status===1) angegeben bzw. der gekippt Status mit in das Array geschrieben wird
createState('zählen_Fenster.anzahlFenster', 0); // wenn benötigt: Anzahl der vorhandenen Fenster createState('zählen_Fenster.anzahlFensterauf', 0); // Anzahl der Fenster, die an sind als Variable unter Javascript.0 anlegen createState('zählen_Fenster.textFensterauf', " "); // Anzahl der Fenster, die an sind als Variable unter Javascript.0 anlegen var cacheSelector = $('channel[state.id=*.STATE](functions=Fenster)'); 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); if (status === true || status === 2) { // wenn Zustand = true, dann wird die Anzahl der Fenster hochgezählt/Zustand 2 ist für Drehgriff offen textFensterauf.push(obj.common.name); // Zu Array hinzufügen } log("Fenster Nr. " + i + ": " + getObject(id).common.name + ": " + 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: " + anzahlFensterauf); log("Anzahl Fenster: " + anzahlFenster + " # davon Fenster offen: " + 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 }
-
Hallo,
ich nutze dieses Skript:
! ````
/* 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 = $('channelstate.id=*.STATE');
! 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 hatcacheSelectorState.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'); // RegEx Suche greedy
text = text.replace(/TFK/g, 'Reedkontakt'); // soll alle Vorkommen ersetzen
text = (text.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind verschlossen';
setState(idAnsage, text);
});
! ````Gruß
Pix
Editiert am 2.7.2016 (Replace mit regex-Suche)
-
Hi Pix,
erst mal danke, sieht schon gut aus soweit. Am Schluss des Scripts wird der Text aufbereitet für die Ansage, jedoch wird bei mir nur jeweils der erste TFK durch Reedkontakt und der erste RHS durch Drehgriff ersetzt. Bei den weiteren Aufzählungen steht noch TFK bzw. RHS drin
-
Hallo coyote,
du hast Recht. Habe das Skript oben geändert. Der replace-Befehl war falsch angewendet. Bei einfacher Suche nach einem String, wird nur dessen erstes Vorkommen ersetzt. Man muss Reguläre Ausdrücke (gierig) verwenden, dann gehts 8-)
text = text.replace(/RHS/g, 'Drehgriff'); // RegEx Suche greedy
Gruß
Pix
-
Hallo,
sorry, dass ich dieses alte Thema ausgrabe, aber ich bin aktuell an meinen Fensterabfragen dran und muss mich (leider) als völliger Laie jetzt mit Scripten auseinandersetzen.
Ich möchte dabei nur das ein Metro Dialog Widget nutzen, um beim Anklicken einen zusätzlichen Dialog zu bekommen mit den aktuell geöffneten Fenstern.
Alle Fenster sind in Homematic dem Gewerk "Fenster" zugeordnet.
Meine Frage (sorry für die Anfängerfragen):
Wo und wie muss ich das Script erstellen? Brauche ich z. B. Blockly dazu oder kann ich das irgendwie im Widget oder allgemein einbauen?
Blockly habe ich zwar installiert, aber da stehe ich völlig vor dem Berg und weiß nicht mal, wie ich es starten kann (über den Web-Adapter)?
Nochmals sorry für meine Fragen und bitte keine Links zur Doku von IOBroker - die hab ich versucht zu lesen - aber wenn man kein Programmierer ist und nur einige einfache Dinge umsetzen möchte, dann ist das nicht so einfach…
Grüße
Frank
-
Hallo Frank,
dieser Thread ist gelöst. Bitte öffne einen neuen Thread mit deinem Anliegen.
Allerdings mache ich mir wenig Hoffnung, dass dir ohne Dokumentation geholfen werden kann. Denn hier können wir nur ergänzende Hilfe zu den Dokus geben. Wenn dir die Doku, nicht ausreicht, mache einen Thread auf "Frage zur Doku: THEMA".
Trotzdem Doku-Links:
Einsteiger: http://www.iobroker.net/docu/?page_id=6317&lang=de
Einführung Programmieren mit Javascript http://www.iobroker.net/docu/?page_id=2786&lang=de
Adapter JavaScript Script http://www.iobroker.net/docu/?page_id=6818&lang=de
Gruß
Pix