NEWS
[gelöst]Fehler bei subscribe(channel:"…
-
nimm mal das (obj) raus bei dem "Bei Start" Teil
-
kein Fehler mehr, aber trotzdem zeigt er keine Werte
Sollte ja gleich funktionieren wie bei LOWBAT via functions?
4746_x4.jpg
4746_x5.jpg
4746_x6.jpg -
ok welche "cacheSelector" Varianten hast du denn jetzt probiert?
Du könntest als finalen Check nochmal das Original nehmen (naürlich mit "Fenster", nicht Verschluss) und das ausprobieren.
Wenn das auch nicht geht, weiß ich nichts mehr. Die Xiaomi funktionieren halt etwas anders.
Bzw. es gibt noch eine Variante, die aber (einmalig) mehr Arbeitsaufwand erfordert. Die könnten wir dann noch ausprobieren
-
Diesen:
createState('zählenFenster.anzahlFenster', 0); // wenn benötigt: Anzahl der vorhandenen Fenster createState('zählenFenster.anzahlFensterauf', 0); // Anzahl der Fenster, die an sind als Variable unter Javascript.0 anlegen createState('zählenFenster.textFensterauf', " "); // Text der Fenster, die an sind als Variable unter Javascript.0 anlegen var logging = true; var cacheSelectorState = $('channel[state.id=*.state](functions="Fenster")'); function countFenster(obj) { //Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht 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 >0) { // wenn Zustand = true, dann wird die Anzahl der offenen Fenster hochgezählt 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 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 eingeschalteten Fenster setState("zählen_Fenster.anzahlFensterauf", textFensterauf.length); // Schreibt die aktuelle Anzahl der eingeschalteten Fenster setState("zählen_Fenster.anzahlFenster", anzahlFenster); // Schreibt die aktuelle Anzahl der vorhandenen Elemente im Gewerk Fenster } cacheSelectorState.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster countFenster(obj); }); // Bei Start countFenster;
-
Bitte:
// Bei Start countFenster();
und dann nochmal probieren.
hattest du diese Variante
var cacheSelectorState = $('channel[state.id=*.state](functions="Fenster")');
denn auch getestet durch Öffnen eines Fensters bzw durch Anfügen dieses Teils:
// Bei Start countFenster();
?? Das ist mir nicht ganz klar.
-
ja habe alle Varianten getestet:
Theoretisch sollte zumindest die Anzahl Fenster angezeigt werden oder?
Mit den beiden Klammern erhalte ich nun diese Fehlermeldungen im Log:
4746_x7.jpg -
ah ja mit den Klammern ist klar. Ignorier das mal.
Nein, es sollten keine Fenster angezeigt werden, denn die "möglichen Fenster" werden auch erst im Rahmen des Skripthochlaufs gezählt
Dann gibt es jetzt die nachfolgende Möglichkeit. Macht etwas mehr Arbeit, sollte aber gehen
! ```
`// Skript zum prüfen, wieviele Fenster offen sind
// Lösung für Xiaomi Kontakte, die nicht via $-Selector ansprechbar zu sein scheinen
// Status: 4.1.2018
! // ############ ALLGEMEINE SKRIPTEINSTELLUNGEN ###############
! // debugging
! var debug = false;
! // states
! createState('Fenster.Total', 0);
createState('Fenster.Offen', 0);
! // ################## Fenster Kontakte #####################
! var idFenster1 = ["mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/] , // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = ["mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/
! // Variablen / IDs deklarieren
! var idFenster1 = "mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/, // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = "mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/; // du kannst die Variablen auch "FensterKueche" usw nennen, es muss nicht "idFenster1" sein
// idFenster3 = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] , // die IDs kannst du beliebig benennen. Müssen aber nachfolgend entsprechend eingetragen sein
// idFensterN = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] ; // die letzte ID muss mit einem Semikolon beendet werden, dazwischen Kommas
! var arrFenster = [idFenster1, idFenster2]; // hier musst du die gleichen Namen eintragen, wie du direkt hierüber eingestellt hast
! // Variablenvar countOffen = 0;
countTotal =arrFenster.length;! // ######## FUNKTIONEN ########
! on(arrFenster, function(obj){
! var status = obj.state.val;if(status){ ++countOffen; countOffen= Math.min(arrFenster.length, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); } else{ --countOffen; countOffen = Math.max(0, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); }
! setState("javascript.0.Fenster.Offen", countOffen);
setState("javascript.0.Fenster.Total", countTotal);
});// ############# BEI SKIRPTSTART DIE COUNTER RICHTIG SETZEN ###################
! for (var i = 0; i< arrFenster.length; i++) {
var objekt = arrFenster[i];
var value = getState(objekt).val;
if(debug) log(arrFenster[i] + " ist " +value);
if(value) ++countOffen;
setState("javascript.0.Fenster.Offen", countOffen);
}` [/i][/i] -
so alles angepasst und eingefügt via iobroker.pro da ich unterwegs bin.
Code:
! ```
`// Skript zum prüfen, wieviele Fenster offen sind
// Lösung für Xiaomi Kontakte, die nicht via $-Selector ansprechbar zu sein scheinen
// Status: 4.1.2018
! // ############ ALLGEMEINE SKRIPTEINSTELLUNGEN ###############
! // debugging
! var debug = false;
! // states
! createState('Fenster.Total', 0);
createState('Fenster.Offen', 0);
! // ################## Fenster Kontakte #####################
! // Variablen / IDs deklarieren
! var idFenster1 = ["mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/] , // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = ["mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/] ; // du kannst die Variablen auch "FensterKueche" usw nennen, es muss nicht "idFenster1" sein
//idFenster3 = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] , // die IDs kannst du beliebig benennen. Müssen aber nachfolgend entsprechend eingetragen sein
//idFensterN = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] ; // die letzte ID muss mit einem Semikolon beendet werden, dazwischen Kommas
! var arrFenster = [idFenster1, idFenster2]; // hier musst du die gleichen Namen eintragen, wie du direkt hierüber eingestellt hast
! // Variablenvar countOffen = 0;
countTotal =arrFenster.length;! // ######## FUNKTIONEN ########
! on(arrFenster, function(obj){
! var status = obj.state.val;if(status){ ++countOffen; countEG= Math.min(arrFenster.length, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); } else{ --countOffen; countOffen = Math.max(0, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); }
! setState("javascript.0.Fenster.Offen", countOffen);
setState("javascript.0.Fenster.Total", countTotal);
});// ############# BEI SKIRPTSTART DIE COUNTER RICHTIG SETZEN ###################
! for (var i = 0; i< arrFenster.length; i++) {
var objekt = arrFenster[i];
var value = getState(objekt).val;
if(debug) log(arrFenster[i] + " ist " +value);
if(value) ++countFenster;
setState("javascript.0.Fenster.Offen", countOffen);
}`
Hier der Status:
! Werde es sicher heute Abend zu Hause nochmals sauber testen und dir ein Feedback geben! Danke viel mal!!
4746_x8.jpg
4746_x9.jpg [/i][/i] -
Habe das Skript oben angepasst und deine beiden Kontakte eingetragen als Beispiel; da hattest du noch einen kleinen Verständnisfehler. Die [] gehörten zu meinem Kommentar und nicht zum Code. Waren noch zwei Übertragungsfehler drin. Ich habe letztlich nur schnell mein Hue-Lampenskript abgewandelt auf Fenster.
Bitte setze Skripte hier im Forum immer in die Code Tags, das macht das lesen viel leichter
Hi
-
hat sich noch ein kleiner Kopierfehler eingeschlichen:
! var idFenster1 = ["mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/] , // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
! idFenster2 = ["mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/[/spoiler]Code:
! ```
`// Skript zum prüfen, wieviele Fenster offen sind
// Lösung für Xiaomi Kontakte, die nicht via $-Selector ansprechbar zu sein scheinen
// Status: 4.1.2018
! // ############ ALLGEMEINE SKRIPTEINSTELLUNGEN ###############
! // debugging
! var debug = false;
! // states
! createState('Fenster.Total', 0);
createState('Fenster.Offen', 0);
! // ################## Fenster Kontakte #####################
! // Variablen / IDs deklarieren
! var idFenster1 = "mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/, // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = "mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/; // du kannst die Variablen auch "FensterKueche" usw nennen, es muss nicht "idFenster1" sein
// idFenster3 = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] , // die IDs kannst du beliebig benennen. Müssen aber nachfolgend entsprechend eingetragen sein
// idFensterN = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] ; // die letzte ID muss mit einem Semikolon beendet werden, dazwischen Kommas
! var arrFenster = [idFenster1, idFenster2]; // hier musst du die gleichen Namen eintragen, wie du direkt hierüber eingestellt hast
! // Variablenvar countOffen = 0;
countTotal =arrFenster.length;! // ######## FUNKTIONEN ########
! on(arrFenster, function(obj){
! var status = obj.state.val;if(status){ ++countOffen; countOffen= Math.min(arrFenster.length, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); } else{ --countOffen; countOffen = Math.max(0, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); }
! setState("javascript.0.Fenster.Offen", countOffen);
setState("javascript.0.Fenster.Total", countTotal);
});// ############# BEI SKIRPTSTART DIE COUNTER RICHTIG SETZEN ###################
! for (var i = 0; i< arrFenster.length; i++) {
var objekt = arrFenster[i];
var value = getState(objekt).val;
if(debug) log(arrFenster[i] + " ist " +value);
if(value) ++countOffen;
setState("javascript.0.Fenster.Offen", countOffen);
}`
! nun werden die offen Fenster gezählt!
! Wie gross wäre der Aufwand den Text mit zu senden? (Analog Lowbat)
4746_x10.jpg
4746_x11.jpg [/i][/i] -
tempestas, das Script funktioniert vor Ort richtig, erhalte alle Zahlen richtig.
Danke dir!!
Wie gross wäre der Aufwand im Script den Text zu ergänzen?
-
Ich habe auch noch mal eine Frage zu diesem Thema. Ich habe ne ganze Reihe Homematic ipFensterkontakte(also die optischen) und jetzt Homematic ip Drehgriffe dazu gekeauft.
die "normalen geben 0 = geschlossen und 1 = geöffnet aus.
die Drehgriffe geben 0 = geschlossen und 1 = gekippt und 2 = geöffnet aus.
Im Moment habe ich das Script für mich so laufen das mir nur 1 und 2 als offen gezeigt wird. Kann ich die Funktion gekippt trotzdem irgendwie nutzen, oder müßte ich mir zwei verschiediene Gewerke dafür anlegen und zwei Scripte laufen lassen ?
Hier mein derzeitiges Script
! ````
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 || status === 2) { // 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: " + textFensterauf.length);
! // 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);
});In dem originalem 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 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(', ')); // 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); }); ````werden mir ja sonst alle Fenster als gekippt angezeigt. Hat Jemand eine Idee dazu ?
-
DSL-Raser, versuchs mal so. Eventuell wieder Fehler drin, im Forum übersehe ich gerne mal was.
! ````
! 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'
});
! createState('zählen_Fenster.anzahlFensterKipp', { // Anzahl der gekippten Fenster als Variable unter Javascript.0 anlegen
type: 'number',
min: 0,
def: 0,
role: 'value'
});
createState('zählen_Fenster.textFensterKipp', { // Anzahl der gekippten 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 anzahlFensterKipp = 0;var textFensterauf = [];
var textFensterKipp = [];! 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 === 2 ) { // wenn Zustand offen (2), dann wird die Anzahl der Fenster hochgezählt
++anzahlFensterauf;
textFensterauf.push(devicename ); // Name und Zustand zum Array hinzufügen
}
else {
if( status === 1 ) { // wenn Zustand gekippt (1), dann wird die Anzahl der Fenster hochgezählt
++anzahlFensterKipp;
textFensterKipp.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 + "gekippt: "+ textFensterKipp) ;
log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " + textFensterauf.length +". Anzahl gekippter Fenster :" +textFensterKipp.length);
! // 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 FenstersetState("zählen_Fenster.textFenstrKipp, textFensterKipp.join(', ')); // Schreibt die aktuelle Namen der gekippten Fenster
setState("zählen_Fenster.anzahlFensterKipp", textFensterKipp.length); // Schreibt die aktuelle Anzahl der gekippten FenstersetState("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);
});
! ````Die Ansage habe ich mal ignoriert.
-
Dali3:
! ```
`// Skript zum prüfen, wieviele Fenster offen sind
// Lösung für Xiaomi Kontakte, die nicht via $-Selector ansprechbar zu sein scheinen
// Status: 4.1.2018
! // ############ ALLGEMEINE SKRIPTEINSTELLUNGEN ###############
! // debugging
! var debug = false;
! // states
! createState('Fenster.Total', 0);
createState('Fenster.Offen', 0);
createState('Fenster.Text',"");
! // ################## Fenster Kontakte #####################
! // Variablen / IDs deklarieren
! var idFenster1 = "mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/, // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = "mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/; // du kannst die Variablen auch "FensterKueche" usw nennen, es muss nicht "idFenster1" sein
// idFenster3 = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] , // die IDs kannst du beliebig benennen. Müssen aber nachfolgend entsprechend eingetragen sein
// idFensterN = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] ; // die letzte ID muss mit einem Semikolon beendet werden, dazwischen Kommas
! var arrFenster = [idFenster1, idFenster2]; // hier musst du die gleichen Namen eintragen, wie du direkt hierüber eingestellt hast
! // Variablenvar countOffen = 0;
countTotal =arrFenster.length;! // ######## FUNKTIONEN ########
! on(arrFenster, function(obj){
! var textFenster= [];
var status = obj.state.val;
! var name = getObject(id).common.name;
var devicename = name.replace("Is opened ",""); //
devicename = devicename.replace(" offen", ""); // Hier wird das "is opened " und am Ende das "offen" rausgenommen, damit nur die Raumbezeichnungen übrig bleibenif(status){ ++countOffen; countOffen= Math.min(arrFenster.length, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); textFenster.push(devicename); } else{ --countOffen; countOffen = Math.max(0, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); }
! setState("javascript.0.Fenster.Offen", countOffen);
setState("javascript.0.Fenster.Total", countTotal);
setState("javascript.0.Fenster.Text", textFenster.join(',
'));});
// ############# BEI SKIRPTSTART DIE COUNTER RICHTIG SETZEN ###################
! for (var i = 0; i< arrFenster.length; i++) {
var objekt = arrFenster[i];
var value = getState(objekt).val;
if(debug) log(arrFenster[i] + " ist " +value);
if(value) ++countOffen;
setState("javascript.0.Fenster.Offen", countOffen);
}` [/i][/i] -
Hallo tempestas
Habe es nun getestet.
Jedoch taucht kein Text auf, nur folgende Fehlermeldungen.
Sowie werden die Textwerte / Zahlen nicht sofort angepasst.
Siehe Bilder:
Dali3:
! ```
`// Skript zum prüfen, wieviele Fenster offen sind
// Lösung für Xiaomi Kontakte, die nicht via $-Selector ansprechbar zu sein scheinen
// Status: 4.1.2018
! // ############ ALLGEMEINE SKRIPTEINSTELLUNGEN ###############
! // debugging
! var debug = false;
! // states
! createState('Fenster.Total', 0);
createState('Fenster.Offen', 0);
createState('Fenster.Text',"");
! // ################## Fenster Kontakte #####################
! // Variablen / IDs deklarieren
! var idFenster1 = "mihome.0.devices.magnet_158d0001dacfc1.state"/Is opened Fenster Küche offen/, // ids eintragen, geht rechts oben im JS Editor, "id einfügen". Dort auf den "open" state verlinken.
idFenster2 = "mihome.0.devices.magnet_158d0001dacfc7.state"/Is opened Fenster Wohnzimmer offen/; // du kannst die Variablen auch "FensterKueche" usw nennen, es muss nicht "idFenster1" sein
// idFenster3 = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] , // die IDs kannst du beliebig benennen. Müssen aber nachfolgend entsprechend eingetragen sein
// idFensterN = [HIER DIE ID DEINER MAGNETEN EINFÜGEN] ; // die letzte ID muss mit einem Semikolon beendet werden, dazwischen Kommas
! var arrFenster = [idFenster1, idFenster2]; // hier musst du die gleichen Namen eintragen, wie du direkt hierüber eingestellt hast
! // Variablenvar countOffen = 0;
countTotal =arrFenster.length;! // ######## FUNKTIONEN ########
! on(arrFenster, function(obj){
! var textFenster= [];
var status = obj.state.val;
! var name = getObject(id).common.name;
var devicename = name.replace("Is opened ",""); //
devicename = devicename.replace(" offen", ""); // Hier wird das "is opened " und am Ende das "offen" rausgenommen, damit nur die Raumbezeichnungen übrig bleibenif(status){ ++countOffen; countOffen= Math.min(arrFenster.length, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); textFenster.push(devicename); } else{ --countOffen; countOffen = Math.max(0, countOffen); if(debug) log("Es sind "+countOffen +" Fenster offen"); }
! setState("javascript.0.Fenster.Offen", countOffen);
setState("javascript.0.Fenster.Total", countTotal);
setState("javascript.0.Fenster.Text", textFenster.join(',
'));});
// ############# BEI SKIRPTSTART DIE COUNTER RICHTIG SETZEN ###################
! for (var i = 0; i< arrFenster.length; i++) {
var objekt = arrFenster[i];
var value = getState(objekt).val;
if(debug) log(arrFenster[i] + " ist " +value);
if(value) ++countOffen;
setState("javascript.0.Fenster.Offen", countOffen);
}! [4746_x1.jpg](/assets/uploads/files/4746_x1.jpg) [4746_x2.jpg](/assets/uploads/files/4746_x2.jpg) [4746_x3.jpg](/assets/uploads/files/4746_x3.jpg) [4746_x4.jpg](/assets/uploads/files/4746_x4.jpg) [4746_x5.jpg](/assets/uploads/files/4746_x5.jpg) [/i][/i] ```
-
hmpf, hab ich nicht aufgepasst.
Bitte aus
var name = getObject(id).common.name;
das hier machen
var name = getObject(obj).common.name;
in Zeile 43
mir fällt aber auf, dass die "Total Fenster" immer 0 sind. Das soll natürlich nicht sein
-
DSL-Raser, versuchs mal so. Eventuell wieder Fehler drin, im Forum übersehe ich gerne mal was.
! ````
! 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'
});
! createState('zählen_Fenster.anzahlFensterKipp', { // Anzahl der gekippten Fenster als Variable unter Javascript.0 anlegen
type: 'number',
min: 0,
def: 0,
role: 'value'
});
createState('zählen_Fenster.textFensterKipp', { // Anzahl der gekippten 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 anzahlFensterKipp = 0;var textFensterauf = [];
var textFensterKipp = [];! 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 === 2 ) { // wenn Zustand offen (2), dann wird die Anzahl der Fenster hochgezählt
++anzahlFensterauf;
textFensterauf.push(devicename ); // Name und Zustand zum Array hinzufügen
}
else {
if( status === 1 ) { // wenn Zustand gekippt (1), dann wird die Anzahl der Fenster hochgezählt
++anzahlFensterKipp;
textFensterKipp.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 + "gekippt: "+ textFensterKipp) ;
log("Anzahl Fenster: " + anzahlFenster + " - davon Fenster auf: " + textFensterauf.length +". Anzahl gekippter Fenster :" +textFensterKipp.length);
! // 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 FenstersetState("zählen_Fenster.textFenstrKipp, textFensterKipp.join(', ')); // Schreibt die aktuelle Namen der gekippten Fenster
setState("zählen_Fenster.anzahlFensterKipp", textFensterKipp.length); // Schreibt die aktuelle Anzahl der gekippten FenstersetState("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);
});
! ````Die Ansage habe ich mal ignoriert. ` probiere ich die nächsten Tage mal aus, danke Dir.
-
Habe es angepasst, jedoch ändert sich nichts
hmpf, hab ich nicht aufgepasst.
Bitte aus
var name = getObject(id).common.name;
das hier machen
var name = getObject(obj).common.name;
in Zeile 43
mir fällt aber auf, dass die "Total Fenster" immer 0 sind. Das soll natürlich nicht sein `
4746_x13.jpg
4746_x14.jpg -
hmm da zeigt sich jetzt, dass ich nur interessierter Laie bin… die wirklich guten hier können das bestimmt sofort lösen. Ich muss mir das genauer ansehen
-
Habe es angepasst, jedoch ändert sich nichts
hmpf, hab ich nicht aufgepasst.
Bitte aus
var name = getObject(id).common.name;
das hier machen
var name = getObject(obj).common.name;
in Zeile 43
mir fällt aber auf, dass die "Total Fenster" immer 0 sind. Das soll natürlich nicht sein
Hi,
ohne es testen zu können, da ich keine Kontakte habe und darum nicht testen kann. Probier mal
var name = getObject(obj).common.name;
durch````
var name = obj.common.name;zu ersetzen