NEWS
"Licht-Skript" liefert falsche Gerätenamen
-
Hallo zusammen,
ich habe bei mir folgendes Skript im Einsatz.
/* System Zahl Lichter zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Licht indoor" */ createState('zählen_Lichter.anzahlLichter', { def: 0, name: 'Anzahl der vohandenen Lichter', desc: 'Anzahl aller Lichter / Dimmer im Gewerk', read: true, write: true, min: 0, type: 'number' }); createState('zählen_Lichter.anzahlLichterAn', { def: 0, name: 'Anzahl eingeschaltete Lichter', desc: 'Anzahl aller eingeschalteten Lichter / Dimmer im Gewerk', read: true, write: true, min: 0, type: 'number' }); createState('zählen_Lichter.textLichterAn', { def: "", name: 'Aufzählung eingeschaltete Lichter', desc: 'Namen aller eingeschalteten Lichter / Dimmer im Gewerk als Liste', read: true, write: true, type: 'string' }); var cacheSelector = $('channel[state.id=*.STATE](functions=Licht indoor)'); var cacheSelectorState = $('channel[state.id=*.STATE](functions=Licht indoor)'); var cacheSelectorDimmer = $('channel[state.id=*.LEVEL](functions=Licht indoor)'); function countLamps(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; 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 Licht var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var obj = getObject(id); if (status === true) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt textLichterAn.push(obj.common.name); // Zu Array hinzufügen } log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status); ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); cacheSelectorDimmer.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 textLichterAn.push(obj.common.name); // Zu Array hinzufügen } log("Licht Nr. " + i + ": " + id + ": " + status); // gibt alle Elemente *.LEVEL im Gewerk Licht mit dem aktuelle Status im Log aus ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben log("Text: " + textLichterAn); log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Lichter.textLichterAn", textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht } cacheSelectorState.on(function(obj) { // bei Zustandänderung *. STATE im Gewerk Fenster countLamps(obj); }); cacheSelectorDimmer.on(function(obj) { // bei Zustandänderung *. LEVEL im Gewerk Licht countLamps(obj); });
Als Widget benutze ich:
[{"tpl":"tplMetroTileStringDialogNumber","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":true,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","hover":"true","transform":"true","bg_class":"bg-black","icon_class":"","badge_bg_class":"bg-red","brand_bg_class":"bg-gray","dialog_fontSize":"12px","dialog_padding":"0px 0px 0px 0px","dialog_draggable":"true","dialog_icon_class":"","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"dialog_oid":"javascript.0.zählen_Lichter.textLichterAn","number_oid":"javascript.0.zählen_Lichter.anzahlLichterAn","label":"Lichter","hide_on_0":true,"dialog_width":"480","dialog_height":"240","dialog_title":"Lichter AN","icon_src":"/vis.0/main/glühbirne_ws_auf_sw.jpg","icon_width":"50","icon_height":"50","icon_top":"36","icon_left":"53"},"style":{"left":"243px","top":"144px","width":"100","height":"100","border-width":"2px","border-style":"solid","border-color":"rgb(255, 248, 220)","border-radius":"5px"},"widgetSet":"metro"}]
Als Dialog-ID habe ich javascript.0.zählen_Lichter.textLichterAn und als Nummer ID javascript.0.zählen_Lichter.anzahlLichterAn
<u>Folgendes Problem:</u>
Solange ich nur Lichter, die keinen Dimmer haben, anschalte, erscheinen die richtigen Gerätenamen im Widget (wenn angeklickt). Schalte ich dann ein Gerät mit einem Dimmer hinzu stimmt auch noch alles. Schaltet ich danach ein weiteres Gerät mit Dimmer hinzu, wird das zuletzt hinzugefügte Dimmer-Gerät doppelt angezeigt und das erste Dimmer-Gerät gelöscht. Folgt ein drittes wird dieses dann 3x angezeigt und die beiden anderen fehlen.
Der Wert der eingeschalteten Lampen stimmt immer, egal ob Geräte mit State oder Level angeschaltet sind. Es funktioniert nur nicht die Aufzählung der Gerätenamen.
Ich habe mir das Skript schon angesehen, stehe aber auf dem Schlauch. Über Hinweise würde ich mich freuen.
Schon mal vielen Dank vorab.
Gruß Balu
-
Hallo Balu,
das Skript ist nicht vollständig.
Du hast zwar die ABfrage nach Dimmern, aber startest damit die Funktion countLamps(). Dann zählt er alle eingeschalteten Lampen nochmal (und keine Dimmer).
Es fehlt die FUnktion countDimmer().
Ich habe das Skript so im Einsatz:
! ````
/* System Zahl Lichter
! zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
Daten kommen vom Gewerk "Licht"
! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt
Log Ausgabe auskommentiert
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
24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens)
06.05.2016 Datenpunkt für Ansagen zugefügt
02.07.2016 abgeschaltet, da Fehler
03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer
search statt indexOf und RegEx für Suche nach Virtuellen Kanälen
*/
! createState('zählen_Lichter.anzahlLichter', 0); // wenn benötigt: Anzahl der vorhandenen Lichter
createState('zählen_Lichter.anzahlLichterAn', 0); // Anzahl der Lichter, die an sind als Variable unter Javascript.0 anlegen
createState('zählen_Lichter.textLichterAn'); // Namen der Lichter, die an sind als Variable unter Javascript.0 anlegen
! var cacheSelectorState = $('channelstate.id=*.STATE');
var cacheSelectorDimmer = $('channelstate.id=*.LEVEL');
! function countLamps(obj) {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
var anzahlLichterAn = 0;
var anzahlLichter = 0;
var textLichterAn = [];
! //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 Licht
var obj = getObject(id);
var name = getObject(id).common.name;
var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen
// ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) {
var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)//log(devicename + ' Status: ' + status); if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen } // log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status); ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // ENDE VK-Abfrage }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben //log("Text: " + textLichterAn); //log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
setState("zählen_Lichter.textLichterAn", textLichterAn.join(',
')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
setState("zählen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
setState("zählen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
}
! function countDimmer(obj) {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
var anzahlLichterAn = 0;
var anzahlLichter = 0;
var textLichterAn = [];
! //log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hatcacheSelectorDimmer.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) //log(devicename + ' Status: ' + status); if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen } } // Ende Abfrage VK // log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status); // gibt alle Elemente *.LEVEL im Gewerk Licht mit dem aktuelle Status im Log aus ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben //log("Text: " + textLichterAn); //log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn);
! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
setState("zählen_Lichter.textLichterAn", textLichterAn.join(',
')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
setState("zählen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
setState("zählen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
}
! cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht
countLamps(obj);
});
cacheSelectorDimmer.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
countDimmer(obj);
});
! // Variable für Ansage aufbereiten
createState('zählen_Lichter.textLichterAnAnsage', " "); // Anzahl der Fenster, die auf sind, für Ansage aufbereitet
var idAnzahl = "javascript.0.zählen_Lichter.anzahlLichterAn"/zählen_Lichter.anzahlLichterAn/,
idQuelle = 'javascript.0.zählen_Lichter.textLichterAn',
idAnsage = 'javascript.0.zählen_Lichter.textLichterAnAnsage';
! function strip_tags(data) {
var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " ");
return(rueckgabe);
}
! on(idQuelle, function (obj) {
var text = obj.state.val;
text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
setState(idAnsage, text);
});Prüfe erstmal, ob du den bei dir fehlenden Teil selbst einarbeiten kannst. Sonnst nimm dieses Skript und passe die Pfade der States an. Nicht nur bei den PWM-Dimmern gibt es virtuelle Kanäle. Um nicht jeden einzelnen Kanal zu zählen, lasse ich mit dieser Abfrage```` if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { ````keine Kanäle zu, die im Namen "CUX", "K2", "K3", "VK" haben. So habe ich die Virtuellen Kanäle meiner HM-Dimmer in der HM-Webui genannt. "CUX" sind Geräte des CUxD. Das musst du natürlich auch an deine Bedingungen anpassen. Gruß Pix
-
Hallo Pix,
habe das Script 1:1 von dir übernommen. Das Gewerk "Licht" heisst bei mir "<u>l</u>icht"
Das habe ich bei den folgenden Zeilen auch angepasst:
var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); var cacheSelectorDimmer = $('channel[state.id=*.LEVEL](functions="Licht")');
Das Script scheint zu laufen, da unter scriptEnabled der Wert true. Auch die drei Datenpunkte werden angezeigt, leider alle Werte auf 0.
Im Log steht folgendes:
` > javascript.0 2016-11-25 13:56:33.409 info script.js.System_Zahl_Lichter: registered 21 subscriptions and 0 schedulesjavascript.0 2016-11-25 13:56:33.335 info Start javascript script.js.System_Zahl_Lichter `
Muss im Code noch mehr angepasst werden? Danke und Gruß -
Hallo,
deine Log Ausgabe zeigt ja keinen Fehler, sondern dass das Skript läuft.
Du kannst im Skript mal die zusätzlichlen Logs zum Debug einschalten. Leider nur manuell. Dazu bei diesen Zeilen
//log ````die beiden```` // ````entfernen. Dann Skript neu starten, Lampen an und aus, Log angucken. Gruß Pix
-
Hallo Pix,
danke für deine Hilfe.Du hast Recht, der Teil mit den Dimmern fehlte. Hab es angepasst, leider nicht richtig.
Habe versucht dein Skript zu benutzen. Leider zeigt er mir anstatt 6 Lampen immer 0 Lampen an (habe 3 Lampen mit Dimmer und 3 Lampen ohne Dimmer).
Solange ich nur die Lampen mit *state schalte, passen die Namen der Lampen –> Anzahl falsch
Solange ich nur die Lampen mit *level schalte, passen auch hier die Namen der Lampen --> Anzahl falsch
Schalte ich 1*state, zeigt er mir an: 0 Lampen, eine an
Schalte ich dann 1*level, zeigt er mir an: 0 Lampen, eine an
Schalte ich dann 1*state, zeigt er an: 0 Lampen, zwei an
Schalte ich dann 1*level, zeigt er an: 0 Lampen, zwei an
Virtuelle Kanäle habe ich nicht. CuXd kann man auch vernachlässigen.
Auch stimmt bei mir Lichter.textLichterAnAnsage nicht wirklich. z.B. habe ich eine Lampe an kommt die Meldung "Alle Lichter sind ausgeschaltet" (siehe Bild).
Sind alle Lampen aus kommt die Meldung "Lichter eingeschaltet:".
Kannst du noch mal drüber schauen?
/* System Zahl Lichter zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Licht" erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564 23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt Log Ausgabe auskommentiert 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 24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens) 06.05.2016 Datenpunkt für Ansagen zugefügt 02.07.2016 abgeschaltet, da Fehler 03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer search statt indexOf und RegEx für Suche nach Virtuellen Kanälen */ createState('zählen_Lichter.anzahlLichter', 0); // wenn benötigt: Anzahl der vorhandenen Lichter createState('zählen_Lichter.anzahlLichterAn', 0); // Anzahl der Lichter, die an sind als Variable unter Javascript.0 anlegen createState('zählen_Lichter.textLichterAn'); // Namen der Lichter, die an sind als Variable unter Javascript.0 anlegen var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht indoor")'); var cacheSelectorDimmer = $('channel[state.id=*.LEVEL](functions="Licht indoor")'); function countLamps(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; //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 Licht var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) //log(devicename + ' Status: ' + status); if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen } // log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status); ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // ENDE VK-Abfrage }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben //log("Text: " + textLichterAn); //log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Lichter.textLichterAn", textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht } function countDimmer(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; //log('Auslösender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geändert hat cacheSelectorDimmer.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) //log(devicename + ' Status: ' + status); if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen } } // Ende Abfrage VK // log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status); // gibt alle Elemente *.LEVEL im Gewerk Licht mit dem aktuelle Status im Log aus ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben //log("Text: " + textLichterAn); //log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState("zählen_Lichter.textLichterAn", textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState("zählen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht } cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht countLamps(obj); }); cacheSelectorDimmer.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht countDimmer(obj); }); // Variable für Ansage aufbereiten createState('zählen_Lichter.textLichterAnAnsage', " "); // Anzahl der Fenster, die auf sind, für Ansage aufbereitet var idAnzahl = "javascript.0.zählen_Lichter.anzahlLichterAn"/*zählen_Lichter.anzahlLichterAn*/, idQuelle = 'javascript.0.zählen_Lichter.textLichterAn', idAnsage = 'javascript.0.zählen_Lichter.textLichterAnAnsage'; function strip_tags(data) { var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " "); return(rueckgabe); } on(idQuelle, function (obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet'; setState(idAnsage, text); });
-
Habe ähnliches Verhalten wie baluderbär…
Hier mein Log:
! javascript.0 2016-11-26 13:58:36.762 info script.js.System_Zahl_Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-26 13:58:36.761 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:58:36.755 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.1.JEQ0713856.13.STATE: false
! javascript.0 2016-11-26 13:58:31.493 info script.js.System_Zahl_Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-26 13:58:31.493 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:58:31.486 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.1.JEQ0713856.15.STATE: false
! javascript.0 2016-11-26 13:58:11.688 info script.js.System_Zahl_Lichter: Anzahl Lichter: 3 # davon Lichter an: 0
! javascript.0 2016-11-26 13:58:11.687 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:58:11.687 info script.js.System_Zahl_Lichter: Licht Nr. 2: 1:wohnen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:58:11.686 info script.js.System_Zahl_Lichter: Licht Nr. 1: 1:essen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:58:11.685 info script.js.System_Zahl_Lichter: Licht Nr. 0: 2:bad_licht gross.LEVEL: undefined
! javascript.0 2016-11-26 13:58:11.684 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.0.LEQ0126380.1.LEVEL: 0
! javascript.0 2016-11-26 13:58:08.908 info script.js.System_Zahl_Lichter: Anzahl Lichter: 3 # davon Lichter an: 0
! javascript.0 2016-11-26 13:58:08.907 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:58:08.906 info script.js.System_Zahl_Lichter: Licht Nr. 2: 1:wohnen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:58:08.905 info script.js.System_Zahl_Lichter: Licht Nr. 1: 1:essen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:58:08.903 info script.js.System_Zahl_Lichter: Licht Nr. 0: 2:bad_licht gross.LEVEL: undefined
! javascript.0 2016-11-26 13:58:08.902 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.0.LEQ0126380.1.LEVEL: 68.5
! javascript.0 2016-11-26 13:57:34.566 info script.js.System_Zahl_Lichter: Anzahl Lichter: 3 # davon Lichter an: 0
! javascript.0 2016-11-26 13:57:34.564 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:57:34.561 info script.js.System_Zahl_Lichter: Licht Nr. 2: 1:wohnen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:34.560 info script.js.System_Zahl_Lichter: Licht Nr. 1: 1:essen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:34.559 info script.js.System_Zahl_Lichter: Licht Nr. 0: 2:bad_licht gross.LEVEL: undefined
! javascript.0 2016-11-26 13:57:34.557 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.0.LEQ0126380.1.LEVEL: 72
! javascript.0 2016-11-26 13:57:31.281 info script.js.System_Zahl_Lichter: Anzahl Lichter: 3 # davon Lichter an: 0
! javascript.0 2016-11-26 13:57:31.280 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:57:31.280 info script.js.System_Zahl_Lichter: Licht Nr. 2: 1:wohnen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:31.279 info script.js.System_Zahl_Lichter: Licht Nr. 1: 1:essen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:31.278 info script.js.System_Zahl_Lichter: Licht Nr. 0: 2:bad_licht gross.LEVEL: undefined
! javascript.0 2016-11-26 13:57:31.277 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.0.LEQ0126380.1.LEVEL: 67.5
! javascript.0 2016-11-26 13:57:30.940 info script.js.System_Zahl_Lichter: Anzahl Lichter: 3 # davon Lichter an: 0
! javascript.0 2016-11-26 13:57:30.940 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:57:30.939 info script.js.System_Zahl_Lichter: Licht Nr. 2: 1:wohnen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:30.937 info script.js.System_Zahl_Lichter: Licht Nr. 1: 1:essen_licht.LEVEL: undefined
! javascript.0 2016-11-26 13:57:30.935 info script.js.System_Zahl_Lichter: Licht Nr. 0: 2:bad_licht gross.LEVEL: undefined
! javascript.0 2016-11-26 13:57:30.932 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.0.LEQ0126380.1.LEVEL: 0.5
! javascript.0 2016-11-26 13:57:21.477 info script.js.System_Zahl_Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-26 13:57:21.477 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:57:21.471 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.1.JEQ0713856.13.STATE: true
! javascript.0 2016-11-26 13:56:46.723 info script.js.System_Zahl_Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-26 13:56:46.722 info script.js.System_Zahl_Lichter: Text:
! javascript.0 2016-11-26 13:56:46.713 info script.js.System_Zahl_Lichter: Auslösender Aktor: hm-rpc.1.JEQ0713856.15.STATE: true
! javascript.0 2016-11-26 13:55:31.735 info script.js.System_Zahl_Lichter: registered 21 subscriptions and 0 schedules
! javascript.0 2016-11-26 13:55:31.670 info Start javascript script.js.System_Zahl_Lichter -
Hallo zusammen,
ich habe mir das Skript nochmal vorgenommen, es war ein grundlegender Fehler drin (obwohl Bluefox das http://forum.iobroker.net/viewtopic.php?f=21&t=473&p=5511 schon korrekt erklärt/vorgekaut hatte) :oops: :
Die Anzahl und Liste der Geräte wurde bei jeder Auslösung ja genullt/geleert. Wenn also ein Dimmer eingeschaltet wurde, dann wurden alle Schalter (State) gelöscht und nicht wieder durchgezählt. Genauso, nur umgekehrt, wenn ein State auf true ging.
Das neue Skript hat das nun korrigiert. Es gibt eine besseres logging. Das sollte aber nach dem ausgeschaltet werden, da es viele Zeilen im Log produziert.
Ausserdem wird die Liste der eingeschalteten Geräte nun alphabetisch sortiert.
Die Struktur und der Pfad der Datenpunkte sind neu (bei mir) und ggf. anzupassen (auch in den Widgets).
Es gibt
-
Anzahl aller Licht
-
Anzahl eingeschalteter Lichter
-
Text mit allen eingeschalteten Lichtern
-
Ansage(text) mit Aufzählung der eingeschalteten Lichter oder mit sprechbarem Text, wenn kein Licht eingeschaltet
Das Skript startet, wenn einer der betreffenden Aktoren im Gewerk "Licht" seinen Wert ändert und jetzt auch nach dem Skriptstart (2s verzögert).
Wer die Abfrage nach den Virtuellen Kanälen oder den CUXD-Geräten nicht braucht, kann die beiden if-Abfragen (State und Level) einfach rausnehmen oder auskommentieren. Aber nur die Abfrage, nicht den Inhalt!
! ````
/* Status Zahl Lichter
! zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
Daten kommen vom Gewerk "Licht"
! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt
Log Ausgabe auskommentiert
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
24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens)
06.05.2016 Datenpunkt für Ansagen zugefügt
02.07.2016 abgeschaltet, da Fehler
03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer
search statt indexOf und RegEx für Suche nach Virtuellen Kanälen
27.11.2016 Verschoben in Status
Code optimiert
*/
var logging = false;
! var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein',
idAnzahl = 'javascript.0.Status.Lichter.Anzahl',
idText = 'javascript.0.Status.Lichter.Text',
idAnsage = 'javascript.0.Status.Lichter.Ansage';// Abhier nix mehr ändern
createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter
type: 'number',
name: 'Anzahl aller Lichter',
min: 0,
def: 0,
role: 'value'
});
createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen
type: 'number',
name: 'Anzahl der eingeschalteten Lichter',
min: 0,
def: 0,
role: 'value'
});
createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen
type: 'string',
name: 'Eingeschaltete Lichter',
desc: 'Namen der eingeschalteten Lichter',
def: ' ',
role: 'value'
});
createState(idAnsage, {
type: 'string',
name: 'Eingeschaltete Lichter (Ansage)',
desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)',
def: ' ',
role: 'value'
});! var cacheSelectorState = $('channelstate.id=*.STATE'); // Gewerk Licht
var cacheSelectorLevel = $('channelstate.id=*.LEVEL');
! function checkDevices(obj) {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
var anzahlLichterAn = 0;
var anzahlLichter = 0;
var textLichterAn = [];
if (logging) {
log('++++++ Lichter Anzahl ++++ ');
log('#### SCHALTER ##### ');
}
cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
var obj = getObject(id);
var name = getObject(id).common.name;
var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen
// ########## Abfrage ob Virtueller Kanal? VK oder : im Namen)
if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) {
if (logging) {
log('-------');
log('Kanal: ' + name);
log('Status: ' + status);
}
if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt
++anzahlLichterAn;
textLichterAn.push(devicename); // Zu Array hinzufügen
}
++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
} // ENDE VK-Abfrage
});if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textLichterAn.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(',
')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
}! // Trigger
cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht
if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
! function main() {
setTimeout(function(){
if (logging) log('Auslöser Skriptstart');
checkDevices();
}, 2000);
}
! main(); // Skriptstart-Auslöser
! // Aufbereitung für Ansage
function strip_tags(data) {
var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " ");
return(rueckgabe);
}
! on(idText, function (obj) {
var text = obj.state.val;
text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
setState(idAnsage, text);
});Bitte um Feedback! Hier noch ein Widget (bzw. zwei übereinanderliegende Widgets):
[{"tpl":"tplMetroTileDialogStatic","data":{"visibility-cond":"==","visibility-val":1,"hover":false,"transform":"true","bg_class":"bg-transparent","icon_class":"","icon_badge":"","badge_bg_class":"","brand_bg_class":"","dialog_draggable":"true","dialog_icon_class":"","name":"Lichter Dialog liegt oben","label":"","content_oid":"","html":"{javascript.0.Status.Lichter.Text}","dialog_width":"800px","dialog_height":"500px","dialog_title":"Diese Lichter sind eingeschaltet ({javascript.0.Status.Lichter.Anzahl_ein})","dialog_shadow":true,"gestures-offsetX":0,"gestures-offsetY":0,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"dialog_flat":true,"dialog_modal":true,"label_prepend":"von {javascript.0.Servicemeldungen.Homematic.UNREACH.moegliche} ","visibility-groups-action":"hide"},"style":{"left":"364px","top":"508px","z-index":"30","width":"137px","height":"137px"},"widgetSet":"metro"},{"tpl":"tplMetroTileString","data":{"visibility-cond":"==","visibility-val":1,"bg_class_true":"ribbed-yellow","bg_class_false":"bg-transparent","icon_class_true":"icon-custom","icon_class_false":"icon-custom","badge_bg_class_true":"","badge_bg_class_false":"","icon_badge_true":"","icon_badge_false":"","brand_bg_class_true":"","brand_bg_class_false":"","name":"Lichter an","visibility-oid":"","content_prepend":"Lichter an ","content_append":"","content_oid":"javascript.0.Status.Lichter.Anzahl_ein","label_prepend":"von {javascript.0.Status.Lichter.Anzahl} ","label_append":" Lichtern","label_id":"","state_oid":"javascript.0.Status.Lichter.Anzahl_ein","transform":false,"select_on_true":false,"icon":"/vis.0/main/img/schritte.png","icon_width":"60","icon_height":"60","icon_false":"/icons-mfd-png/light_light.png","icon_top":"38","icon_left":"40","hover":false,"html":"Homematic Hardware","icon_true":"/icons-mfd-png/light_light_dim_100.png","badge_top":"0","badge_left":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"dialog_title":"Diese Lichter sind eingeschaltet ({javascript.0.Status.Lichter.Anzahl_ein})","visibility-groups-action":"hide"},"style":{"left":"364px","top":"508px","width":"137px","height":"137px","z-index":"15","font-family":"","color":"","font-size":""},"widgetSet":"metro"}]
Hier noch für Interessierte das CSS für den Dialogstil für den Reiter CSS in VIS (2spaltige Darstellung) >! ```` .dialogstil { height: 96%; width: 99%; padding: 15px 0 0 15px; /* background: url(http://192.168.178.38:8082/vis/img/back/oblique-line-bk.png) repeat scroll 0% 0% / auto padding-box border-box, rgba(0, 0, 0, 0) radial-gradient(50% 105.41% at 50% 350px, rgb(66, 140, 189) 0px, rgb(39, 98, 134) 20%, rgb(34, 78, 114) 33%, rgb(0, 3, 41) 100%) repeat scroll 0% 0% / auto padding-box border-box; */ font-family: futura; font-size: 16px; color: rgba(250,250,250,1); overflow-y: hidden; column-count: 2; column-gap: 20px; column-rule: 1px solid rgba(250,250,250,0.6); }
Gruß
Pix
-
-
Danke Pix
für das Script
Funktioniert super !!
kann man auch Hue lampen mit einbinden ?
Gruß Stephan
-
HAllo,
ich habe leider keine HUE-Lampen, aber denkbar ist die Einbindung aller Geräte mit einem Datenpunkt LEVEL. Ausserdem sollten sie dem Gewerk/Enum "Licht" zugeordnet sein.
Gruß
Pix
-
Anscheinend mache ich grundlegend etwas Falsch! Es funktioniert einfach nicht…
Hier nochmal mein Log:
! javascript.0 2016-11-28 20:01:00.604 info javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:01:00.603 info javascript.0 script.js.Lichter: Text:
! javascript.0 2016-11-28 20:01:00.603 info javascript.0 script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:01:00.603 info javascript.0 script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:01:00.603 info javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:01:00.602 info javascript.0 script.js.Lichter: Auslösender Dimmer: hm-rpc.0.LEQ0126380.1.LEVEL: 50
! javascript.0 2016-11-28 20:00:58.094 info javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:00:58.094 info javascript.0 script.js.Lichter: Text:
! javascript.0 2016-11-28 20:00:58.094 info javascript.0 script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:00:58.094 info javascript.0 script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:00:58.093 info javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:00:58.092 info javascript.0 script.js.Lichter: Auslösender Dimmer: hm-rpc.0.LEQ0126380.1.LEVEL: 40.5
! javascript.0 2016-11-28 20:00:57.786 info javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:00:57.786 info javascript.0 script.js.Lichter: Text:
! javascript.0 2016-11-28 20:00:57.786 info javascript.0 script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:00:57.785 info javascript.0 script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:00:57.785 info javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:00:57.785 info javascript.0 script.js.Lichter: Auslösender Dimmer: hm-rpc.0.LEQ0126380.1.LEVEL: 50
! hm-rpc.0 2016-11-28 20:00:57.774 info hm-rpc.0 setValue ["LEQ0126380:1","LEVEL",{"explicitDouble":0.5}] FLOAT
! javascript.0 2016-11-28 20:00:39.341 info javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:00:39.340 info javascript.0 script.js.Lichter: Text:
! javascript.0 2016-11-28 20:00:39.340 info javascript.0 script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:00:39.340 info javascript.0 script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:00:39.339 info javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:00:39.339 info javascript.0 script.js.Lichter: Auslösender Schalter: hm-rpc.1.JEQ0713856.17.STATE: true
! hm-rpc.1 2016-11-28 20:00:39.328 info hm-rpc.1 setValue ["JEQ0713856:17","STATE",true] BOOL
! javascript.0 2016-11-28 20:00:37.932 info javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:00:37.932 info javascript.0 script.js.Lichter: Text:
! javascript.0 2016-11-28 20:00:37.932 info javascript.0 script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:00:37.931 info javascript.0 script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:00:37.931 info javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:00:37.930 info javascript.0 script.js.Lichter: Auslösender Schalter: hm-rpc.1.JEQ0713856.14.STATE: true
! hm-rpc.1 2016-11-28 20:00:37.921 info hm-rpc.1 setValue ["JEQ0713856:14","STATE",true] BOOL
! javascript.0 2016-11-28 20:00:22.942 info script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
! javascript.0 2016-11-28 20:00:22.942 info script.js.Lichter: Text:
! javascript.0 2016-11-28 20:00:22.941 info script.js.Lichter: #### DIMMER #####
! javascript.0 2016-11-28 20:00:22.937 info script.js.Lichter: #### SCHALTER #####
! javascript.0 2016-11-28 20:00:22.934 info script.js.Lichter: ++++++ Lichter Anzahl ++++
! javascript.0 2016-11-28 20:00:22.931 info script.js.Lichter: Auslösender Schalter: hm-rpc.1.JEQ0713856.13.STATE: true
! hm-rpc.1 2016-11-28 20:00:22.925 info setValue ["JEQ0713856:13","STATE",true] BOOL
! web.0 2016-11-28 20:00:15.902 info 2016-11-28T19:00:15.902Z Connected system.user.admin
Was muss bei der Adapterkonfiguration bei "zusätzliche NPM Module" eingetragen werden?Gruß
Bob
-
Hallo pix
mir geht es ebenfalls so
verwende Script 28.11.2016 02:46
! ````
20:27:02.340
[info]
javascript.0 Start javascript script.js.Lichter
20:27:02.341
[info]
javascript.0 script.js.Lichter: registered 15 subscriptions and 0 schedules
20:27:04.345
[info]
javascript.0 script.js.Lichter: Auslöser Skriptstart
20:27:04.345
[info]
javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
20:27:04.345
[info]
javascript.0 script.js.Lichter: #### SCHALTER #####
20:27:04.345
[info]
javascript.0 script.js.Lichter: #### DIMMER #####
20:27:04.345
[info]
javascript.0 script.js.Lichter: Text:
20:27:04.345
[info]
javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
20:27:12.051
[info]
javascript.0 script.js.Lichter: Auslösender Dimmer: hm-rpc.0.JEQ0475027.1.LEVEL: 0
20:27:12.052
[info]
javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
20:27:12.053
[info]
javascript.0 script.js.Lichter: #### SCHALTER #####
20:27:12.053
[info]
javascript.0 script.js.Lichter: #### DIMMER #####
20:27:12.053
[info]
javascript.0 script.js.Lichter: Text:
20:27:12.053
[info]
javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
20:27:15.913
[info]
javascript.0 script.js.Lichter: Auslösender Schalter: hm-rpc.0.HEQ0149562.1.STATE: true
20:27:15.913
[info]
javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
20:27:15.914
[info]
javascript.0 script.js.Lichter: #### SCHALTER #####
20:27:15.914
[info]
javascript.0 script.js.Lichter: #### DIMMER #####
20:27:15.914
[info]
javascript.0 script.js.Lichter: Text:
20:27:15.914
[info]
javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0
20:27:26.478
[info]
javascript.0 script.js.Lichter: Auslösender Schalter: hm-rpc.0.IEQ0405132.1.STATE: false
20:27:26.479
[info]
javascript.0 script.js.Lichter: ++++++ Lichter Anzahl ++++
20:27:26.480
[info]
javascript.0 script.js.Lichter: #### SCHALTER #####
20:27:26.480
[info]
javascript.0 script.js.Lichter: #### DIMMER #####
20:27:26.480
[info]
javascript.0 script.js.Lichter: Text:
20:27:26.480
[info]
javascript.0 script.js.Lichter: Anzahl Lichter: 0 # davon Lichter an: 0Mausi70
-
Hallo Bob,
@BobBruni:Was muss bei der Adapterkonfiguration bei "zusätzliche NPM Module" eingetragen werden? `
Keine!Dein Log sagt mir, dass das eingeschaltete Gerät schon erkannt wird. Das Durchzählen klappt aber nicht.
Du und mausi70 haben vermutlich auch kein Interesse an den Abfragen nach Virtuellen oder CUxD Kanälen.
Deshalb setzt bitt vor Zeile 73
if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) {
und vor Zeile 84} // ENDE VK-Abfrage
und vor Zeile 94if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten
und schließlich vor Zeile 105} // Ende Abfrage VK
bitt einmal zwei Schrägstriche zum Auskommentieren````
//Gruß Pix
-
Hallo pix
jetzt funktioniert
habe etwas ausprobiert, liegt an Zeile 73 bei mir. Cux Geräte sind aber bei mir ein Thema.
Danke erstmal für die Schnelle Hilfe
Mausi70
-
Hallo Pix,
besten Dank!! Funktioniert super!!!!
Gruß
Bob
-
Hallo Pix,
besten Dank!! Funktioniert super!!!!
Gruß
Bob `
Hallo Pix, ich bin bisher nicht dazu gekommen es zu testen. Aber da es bei den beiden anderen funktioniert, gehe ich davon aus, dass es auch bei mir läuft und bedanke mich schon einmal im Voraus. Daumen hoch.Viele Grüße
Balu
Gesendet von iPhone mit Tapatalk
-
Hallo pix
jetzt funktioniert
habe etwas ausprobiert, liegt an Zeile 73 bei mir. Cux Geräte sind aber bei mir ein Thema.
Danke erstmal für die Schnelle Hilfe
Mausi70 `
Bei mir sind sie ein Thema, da ich noch aus Zeiten, in denen ich ausschließlich über HM automatisiert habe, einige CUx-Geräte zB für die Türfensterkontakte in der CCU habe. Sie haben Statistik Werte u.ä. geliefert. Ich brauche die nicht mehr, sie sind aber noch da. Könnte sie eigentlich löschen.Wenn du über CUxD Lampen eingebunden hast, sollte das Ausklammern der Abfrage der richtige Weg sein.
Gruß
Pix
-
Guten Morgen,
Kann man das Script mit einer variablen erweitern wo die Räume angezeigt werden.
(Analog altem ccu.io Script)
Also:
Eine Variable wo die Räume angezeigt werden in denen Licht an ist.
Mit freundlichen Grüßen
Dieter
-
Ich bekomms nicht hin (mit den Räumen).
Keiner eine Idee?
mfg
Dieter
-
Dieter, habs probiert, bin aber nicht fertig geworden. Bin zur Zeit nicht in der Nähe von iobroker und kann nicht testen. Sorry.
Pix
-
Hallo,
hier die Variante, die auch den Raumnamen liefert.
! ````
/* Status Zahl Lichter
! zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
Daten kommen vom Gewerk "Licht"
! erstellt: 17.06.2015 nach diesem Vorbild: http://forum.iobroker.net/viewtopic.php?f=21&t=869&sid=f9ba5657489ff431a1990884f90779c1#p6564
23.06.2015 globale Variablendefinition zählen_Lichter.textLichterAn fehlte und wurde hinzugefügt
Log Ausgabe auskommentiert
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
24.03.2016 keine Anzeigen von virtuellen Kanälen mehr (in Abhängigkeit der Abfrage des Namens)
06.05.2016 Datenpunkt für Ansagen zugefügt
02.07.2016 abgeschaltet, da Fehler
03.07.2016 Zähl-Funktion getrennt nach Schalter und Dimmer
search statt indexOf und RegEx für Suche nach Virtuellen Kanälen
27.11.2016 Verschoben in Status
Code optimiert
23.12.2016 Räume eingebaut
*/
var logging = false;
! var idAnzahlEin = 'javascript.0.Status.Lichter.Anzahl_ein',
idAnzahl = 'javascript.0.Status.Lichter.Anzahl',
idText = 'javascript.0.Status.Lichter.Text',
idRaum = 'javascript.0.Status.Lichter.Raum', // <---- NEU
idAnsage = 'javascript.0.Status.Lichter.Ansage';// Ab hier nix mehr ändern
createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter
type: 'number',
name: 'Anzahl aller Lichter',
min: 0,
def: 0,
role: 'value'
});
createState(idAnzahlEin, { // Anzahl der Lichter, die auf sind als Variable unter Javascript.0 anlegen
type: 'number',
name: 'Anzahl der eingeschalteten Lichter',
min: 0,
def: 0,
role: 'value'
});
createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen
type: 'string',
name: 'Eingeschaltete Lichter',
desc: 'Namen der eingeschalteten Lichter',
def: ' ',
role: 'value'
});
createState(idAnsage, {
type: 'string',
name: 'Eingeschaltete Lichter (Ansage)',
desc: 'Namen der eingeschalteten Lichter (für Ansage aufbereitet)',
def: ' ',
role: 'value'
});
createState(idRaum, { // Räume, in denen Lichter brennen // <---- NEU
type: 'string',
name: 'Räume mit eingeschalteten Lichter',
desc: 'Namen der Räume, in denen Lichter eingeschaltet sind',
def: ' ',
role: 'value'
});! var cacheSelectorState = $('channelstate.id=*.STATE'); // Gewerk Licht
var cacheSelectorLevel = $('channelstate.id=*.LEVEL');
! function checkDevices(obj) {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
var anzahlLichterAn = 0;
var anzahlLichter = 0;
var textLichterAn = [];
var textRaum = [];
if (logging) {
log('++++++ Lichter Anzahl ++++ ');
log('#### SCHALTER ##### ');
}
cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
var obj = getObject(id);
var name = getObject(id).common.name;
var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen
var raumname = getObject(id, "rooms"); // <---- NEU// ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die ANzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // ENDE VK-Abfrage }); if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // <---- NEU // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // <---- NEU // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(',
')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
setState(idRaum, textRaum.join(',
')); // Räume, in denen Licht brennt // <---- NEU
}! // Trigger
cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht
if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat
checkDevices();
});
! function main() {
setTimeout(function(){
if (logging) log('Auslöser Skriptstart');
checkDevices();
}, 2000);
}
! main(); // Skriptstart-Auslöser
! // Aufbereitung für Ansage
function strip_tags(data) {
var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " ");
return(rueckgabe);
}
! on(idText, function (obj) {
var text = obj.state.val;
text = (getState(idAnzahl).val > 0 ) ? 'Lichter eingeschaltet: ' + strip_tags(text) : 'Alle Lichter sind ausgeschaltet';
setState(idAnsage, text);
});
! ````Mir fehlte noch die Ausgabe des passenden Raumes zum Licht. Dieser Thread hat mir geholfen: http://forum.iobroker.net/viewtopic.php?t=1085#p8731
Suche die Zeilen mit diesem Kommentar, dort sind die Neuerungen.````
// <---- NEUEs wird wieder ein Array erstellt, in das die Namen der betroffenen Räume geschrieben werden, sobald ein Licht dazukommt oder wegfällt (bei Änderung). Genau genommen werden bei jeder Änderung alle Lampen neu durchgeprüft und ihr Status/Level abgefragt. Wenn der Status __true__ oder das Level größer als __0__, dann wird der Raumname des Aktors ins Array geschrieben. Das Objekt ist idRaum, die Raumnamen werden alphabetisch sortiert jeweils in eine neue Zeile geschrieben (.sort() und " "). Gruß Pix