NEWS
"Licht-Skript" liefert falsche Gerätenamen
-
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
-
Super, Danke schön.
Funktioniert einwandfrei.
Ich hatte mir die Datenpunkte von den eq3-Scripten angeschaut.
Dort war auch dieses.
.rooms
und enum
aufgeführt.
Habs aber nicht hingekommen.
Nochmals danke.
mfg
Dieter
-
Hallo Pix,
habe dein Script mal abgeändert auf: Heizung.
Also: Wo ist überall die Heizung an !
Folglich: State von Licht entfernt.
valve_state von heizung eingefügt.
Ich habe aber irgendwo noch nen Knicks drin.
Kannst du mal drüberschauen. Dürfte für andere vielleicht auch interessant sein.
In dashui hatte ich diese Scripte für:
Licht, Heizung und Bewegung.
/* Status Zahl Heizung zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Heizung" 23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung */ var logging = true; var idAnzahlEin = 'javascript.0.Status.Heizung.Anzahl_ein', idAnzahl = 'javascript.0.Status.Heizung.Anzahl', idText = 'javascript.0.Status.Heizung.Text', idRaum = 'javascript.0.Status.Heizung.Raum', idAnsage = 'javascript.0.Status.Heizung.Ansage'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Heizung type: 'number', name: 'Anzahl aller Heizung', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Heizung, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der eingeschalteten Heizung', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Heizung und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Eingeschaltete Heizung', desc: 'Namen der eingeschalteten Heizung', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Eingeschaltete Heizung (Ansage)', desc: 'Namen der eingeschalteten Heizung (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { type: 'string', name: 'Räume mit eingeschalteten Heizung', desc: 'Namen der Räume, in denen Heizung eingeschaltet sind', def: ' ', role: 'value' }); var cacheSelectorLevel = $('channel[state.id=*.VALVE_STATE](functions="Heizung")'); // Gewerk Heizung function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0 var anzahlHeizungAn = 0; var anzahlHeizung = 0; var textHeizungAn = []; var textRaum = []; if (logging) log('++++++ Heizung Anzahl ++++ '); 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"); // ########## 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(VALVE_STATE) > 0) { // Wenn Dimmwert über 0 ++anzahlHeizungAn; textHeizungAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); } ++anzahlHeizung; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textHeizungAn.sort(); textRaum.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textHeizungAn); if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textHeizungAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Heizung setState(idAnzahlEin, textHeizungAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Heizung setState(idAnzahl, anzahlHeizung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht setState(idRaum, textRaum.join(', ')); // Räume, in denen Heizung an ist } // Trigger cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht if (logging) log('Auslösende Heizung: ' + 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 ) ? 'Heizung eingeschaltet: ' + strip_tags(text) : 'Alle Heizung sind ausgeschaltet'; setState(idAnsage, text); });
mfg
Dieter
-
Hallo,
und nur nun das Script für Bewegungsmelder.
Dieses läuft.
Gewerk: Bewegungsmelder
Die id mit der Ansage habe ich entfernt. Wenn gewünscht kann man es aber wieder einsetzen.
/* Status Zahl Bewegung zählt die Bewegung in allen Räumen und meldet die Eingeschalteten namentlich Daten kommen vom Gewerk "Bewegung" 23.12.2016 Script von pix; geändert von Bahnuhr auf Bewegung */ var logging = false; var idAnzahlEin = 'javascript.0.Status.Bewegung.Anzahl_ein', idAnzahl = 'javascript.0.Status.Bewegung.Anzahl', idRaum = 'javascript.0.Status.Bewegung.Raum'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Bewegung type: 'number', name: 'Anzahl aller Bewegung', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Bewegung, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der vorhandenen Bewegung', min: 0, def: 0, role: 'value' }); createState(idRaum, { type: 'string', name: 'Räume mit Bewegung', desc: 'Namen der Räume, in denen Bewegung ist', def: ' ', role: 'value' }); var cacheSelectorState = $('channel[state.id=*.MOTION](functions="Bewegungsmelder")'); // Gewerk Bewegungsmelder function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlBewegungAn = 0; var anzahlBewegung = 0; var textRaum = []; if (logging) { log('++++++ Bewegung Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht var obj = getObject(id); var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die Anzahl der Bewegung hochgezählt ++anzahlBewegungAn; textRaum.push(raumname.enumNames); } ++anzahlBewegung; // Zählt die Anzahl der vorhandenen Bewegung unabhängig vom Status }); // Array mit Lichternamen sortieren textRaum.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Anzahl Bewegung: " + anzahlBewegung + " # davon Bewegung an: " + anzahlBewegungAn); // die ermittelten Werte werden als javascript.0\. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idAnzahl, anzahlBewegung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Bewegung setState(idAnzahlEin, anzahlBewegungAn); setState(idRaum, textRaum.join(', ')); // Räume, in denen Bewegung ist } // Trigger cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Bewegung if (logging) log('Auslösende Bewegung: ' + 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
-
So, habs hinbekommen.
Anbei nun die 3 Scripte die bei mir laufen.
Licht:
! /* 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 … 79c1#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 ... t=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
! 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);
! });Heizung:
! /* Status Zahl Heizung
! zählt die Heizung in allen Räumen und meldet die Eingeschalteten namentlich
! Daten kommen vom Gewerk "Heizung"
! 23.12.2016 Vorlage von "pix" - geändert von bahnuhr auf Heizung
! */
! var logging = true;
! var idAnzahlEin = 'javascript.0.Status.Heizung.Anzahl_ein',
! idAnzahl = 'javascript.0.Status.Heizung.Anzahl',
! idRaum = 'javascript.0.Status.Heizung.Raum';
! // Ab hier nix mehr ändern
! createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Heizung
! type: 'number',
! name: 'Anzahl aller Heizung',
! min: 0,
! def: 0,
! role: 'value'
! });
! createState(idAnzahlEin, { // Anzahl der Heizung, die auf sind als Variable unter Javascript.0 anlegen
! type: 'number',
! name: 'Anzahl der eingeschalteten Heizung',
! min: 0,
! def: 0,
! role: 'value'
! });
! createState(idRaum, {
! type: 'string',
! name: 'Räume mit eingeschalteten Heizung',
! desc: 'Namen der Räume, in denen Heizung eingeschaltet sind',
! def: ' ',
! role: 'value'
! });
! var cacheSelectorLevel = $('channelstate.id=*.VALVE_STATE'); // Gewerk Heizung
! function checkDevices(obj) {
! // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Heizung auf 0
! var anzahlHeizungAn = 0;
! var anzahlHeizung = 0;
! var textRaum = [];
! if (logging) log('++++++ Heizung Anzahl ++++ ');
! cacheSelectorLevel.each(function (id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
! var obj = getObject(id);
! var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element)
! var raumname = getObject(id, "rooms");
! if (logging) {
! log('–-----');
! log('Kanal: ' + name);
! log('Status: ' + status + '%');
! }
! if (parseFloat(status) > 0) { // Wenn Dimmwert über 0
! ++anzahlHeizungAn;
! textRaum.push(raumname.enumNames);
! }
! ++anzahlHeizung; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
! });
! // Array mit Lichternamen sortieren
! textRaum.sort();
! // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
! if (logging) log("Anzahl Heizung: " + anzahlHeizung + " # davon Heizung an: " + anzahlHeizungAn);
! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
! setState(idAnzahlEin, anzahlHeizungAn);
! setState(idAnzahl, anzahlHeizung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
! setState(idRaum, textRaum.join(', ')); // Räume, in denen Heizung an ist
! }
! // Trigger
! cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht
! if (logging) log('Auslösende Heizung: ' + 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öserBewegung:
! /* Status Zahl Bewegung
! zählt die Bewegung in allen Räumen und meldet die Eingeschalteten namentlich
! Daten kommen vom Gewerk "Bewegung"
! 23.12.2016 Script von pix; geändert von Bahnuhr auf Bewegung
! */
! var logging = false;
! var idAnzahlEin = 'javascript.0.Status.Bewegung.Anzahl_ein',
! idAnzahl = 'javascript.0.Status.Bewegung.Anzahl',
! idRaum = 'javascript.0.Status.Bewegung.Raum';
! // Ab hier nix mehr ändern
! createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Bewegung
! type: 'number',
! name: 'Anzahl aller Bewegung',
! min: 0,
! def: 0,
! role: 'value'
! });
! createState(idAnzahlEin, { // Anzahl der Bewegung, die auf sind als Variable unter Javascript.0 anlegen
! type: 'number',
! name: 'Anzahl der vorhandenen Bewegung',
! min: 0,
! def: 0,
! role: 'value'
! });
! createState(idRaum, {
! type: 'string',
! name: 'Räume mit Bewegung',
! desc: 'Namen der Räume, in denen Bewegung ist',
! def: ' ',
! role: 'value'
! });
! var cacheSelectorState = $('channelstate.id=*.MOTION'); // Gewerk Bewegungsmelder
! function checkDevices(obj) {
! // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
! var anzahlBewegungAn = 0;
! var anzahlBewegung = 0;
! var textRaum = [];
! if (logging) {
! log('++++++ Bewegung Anzahl ++++ ');
! log('#### SCHALTER ##### ');
! }
! cacheSelectorState.each(function (id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
! var obj = getObject(id);
! var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element)
! var raumname = getObject(id, "rooms");
! if (logging) {
! log('–-----');
! log('Kanal: ' + name);
! log('Status: ' + status);
! }
! if (status) { // wenn Zustand = true, dann wird die Anzahl der Bewegung hochgezählt
! ++anzahlBewegungAn;
! textRaum.push(raumname.enumNames);
! }
! ++anzahlBewegung; // Zählt die Anzahl der vorhandenen Bewegung unabhängig vom Status
! });
! // Array mit Lichternamen sortieren
! textRaum.sort();
! // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben
! if (logging) log("Anzahl Bewegung: " + anzahlBewegung + " # davon Bewegung an: " + anzahlBewegungAn);
! // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS)
! setState(idAnzahl, anzahlBewegung); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Bewegung
! setState(idAnzahlEin, anzahlBewegungAn);
! setState(idRaum, textRaum.join(', ')); // Räume, in denen Bewegung ist
! }
! // Trigger
! cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Bewegung
! if (logging) log('Auslösende Bewegung: ' + 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öserDanke an alle, insbesondere an pix.
mfg
bahnuhr
-
Ich nochmal,
habe versucht in der Variablen "textRaum" doppelte Einträge zu eleminieren mit:
textRaum = array_unique(textRaum);
Klappt aber nicht. Im log kommt ne Fehlermeldung.
Jemand eine Idee ?
mfg
-
Hallo bahnuhr,
hab es so hinbekommen:
Diese Funktion oben einfügen (man kann sie auch als globales Skript abspeichern)````
// Funktion: Doppelte Einträge aus Array entfernen (für Räume) www.okco.de (c) codemaster
function deleteDuplicates(arr) {
var temp = {};
for (var i = 0; i < arr.length; i++) temp[arr[i]] = true;
var r = [];
for (var k in temp) r.push(k);
return r;
}Und dann untem im Skript diese Zeile```` textRaum = deleteDuplicates(textRaum); ````und zwar kurz vor dem Ende der Funktion checkDevices() >! ```` textRaum = deleteDuplicates(textRaum); >! // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.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 setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt
Code von dieser Seite: http://www.okco.de/code/java-script/dup … -entfernen
Gruß
Pix
-
Hallo pix,
läuft perfekt bei mir in allen 3 Scripten.
Ist schon gut wenn man weiß wo man nachschauen muss.
mfg
Dieter