NEWS
Frage zu Script Fenster zählen
-
Es geht mir um dieses 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 … 79c1#p6564
! 05.08.2015 STATE aus der Ausgabe entfernt nach Idee von stephan61 http://forum.iobroker.org/viewtopic.php ... t=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 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'); // 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);
! });
Ich habe bisher ausschließlich optische IP Fensterkontakte (noch keine Drehgriffe, sollen aber dazu kommen)1. Wie muß ich das Script ändern das mir die Ergebnisse richtig angezeigt werden ? Im Moment werden mir Drehgriffe ausgegeben (bei offen steht gekippt) obwohl ich keine Drehgriffkontakte habe.
2. Die zweite Frage, wie bekomme ich das
in der Nachricht weg ? (wird wohl ein Zeilenumbruch sein ?) gesendet wird die Nachricht mit einem Blockly.3. Welcher Teil genau ist für TTS, den brauche ich eigentlich nicht, also was kann da gelöscht werden ? (ich hatte zwischenzeitlich TTS ((sayit-adapter)) installiert und wieder deinstalliert, dann wurde mir im Blockly aber nur noch ein sendto Baustein angezeigt, alle anderen waren weg. Ich habe woanders gelesen, das wenn ein Script mit Bezug auf TTS noch verwendet wird und der sayitt Adapter deinstalliert wird, bei anderen auch die Bausteine im Blockly fehlten. Jetzt habe ich sayit wieder installiert und Blockly läuft wieder. Ich bin noch Anfänger und würde mich über Hilfe freuen.
LG Heiko
3822_blockly.jpg
3822_screenshot_20171125-190228.jpg -
Hallo,
die IP Fensterkontake haben als Zustand "1/0" für "offen/zu".
Dieser Teil
status === 2 /*RHS*/
ist für die Drehgriffkontakte zuständig, die eben für gedreht noch die 2 ausgeben. Eigentlich sollte bei dir da gar nichts kommen, denn deine Kontakte können keine 2 ausgeben als Status
für Telegram musst du
durch \n ersetzen als Zeilenumbruch -
Danke erstmal für die Antwort. An dem Script habe ich ja nichts verändert ?
Warum dann die 2 (Drehgriff gekippt) ausgewertet wird verstehe ich auch nicht. Wor drann kann das liegen ?
PS: ich habe es erstmal so, es funktioniert auch, aber ob das richtig ist weiß ich nicht. Wäre trotzdem schön die richtige Funktion zu haben, da bei mir mal Drehgriffe dazu kommen sollen.
! 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 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 === 1 ) { // wenn Zustand offen, dann wird die Anzahl der Fenster hochgezählt
! ++anzahlFensterauf;
! textFensterauf.push(devicename ); // Name und Zustand zum Array hinzufügen
! }
! log('Fenster #' + (i+1) + ': ' + devicename + ' ' / + ' (' + 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.length > 1) ? 'Geöffnete Fenster: ' + text : 'Alle Fenster sind geschlossen';
! setState(idAnsage, text);
! });
Mit der geänderten Variante sieht es dann so aus wie im Anhang
3822_screenshot_20171126-225641.jpg -
Hallo,
die IP Fensterkontake haben als Zustand "1/0" für "offen/zu".
Dieser Teil
status === 2 /*RHS*/
ist für die Drehgriffkontakte zuständig, die eben für gedreht noch die 2 ausgeben. Eigentlich sollte bei dir da gar nichts kommen, denn deine Kontakte können keine 2 ausgeben als Status
für Telegram musst du
durch \n ersetzen als Zeilenumbruch `Ich habe mir das nochmal angesehen. Wenn ich das Script richtig verstehe ist das für Drehgriffe und für "alte Fensterkontakte oder nicht IP Kontakte" gedacht ? Kann das sein ?
Denn meine IP Fensterkontakte geben auch 0/1 bei geschlossen/offen aus. (in dem Script sollen aber die TFK bei true reagieren)
Kann es sein das die Drehgriffe 0/1/2 für geschlossen/gekippt/offen haben ? Dann würde es das Verhalten erklären und man
könnte das Script dann so nicht mit IP Fensterkontakten und IP Drehgriffen verwenden.
Dann würde mir nur noch einfallen ein zusätzliches Gewerk für Drehgriffe anzulegen und ein extra Script dafür ein zu richten ?
Oder geht das vielleicht einfacher ?
3822_ipfenster.jpg
3822_ipfenster2.jpg