NEWS
[Gelöst] Skript "Lichter zählen": Kombination von z-Wave + Homematic
-
Das hier veröffentlichte Skript zum Zählen und Auflisten vorhandener Lichter habe ich seit einiger Zeit im Einsatz und es funktioniert einwandfrei.
Nun möchte ich einen Fibaro Double Relay Switch, der 2 Lichter schaltet, mit einbinden, was mir bisher nicht gelungen ist.
Gewerke in Homematic problemlos; z-wave bietet das nicht (zumindest hab ich auf der ioBroker-Oberfläche keine Möglichkeit gefunden).
Daher habe ich im Tab "Objekte" den betroffenen Switches per Hand dem Gewerk "Licht" (unter Funktion) zugeordnet.
Trotz Neustart werden die Switches nicht mitgezählt.
Was habe ich übersehen oder falsch gemacht?
-
Hallo,
kannst du einen Screenshot der Zuordnung posten?
Hast du gesehen, dass in den functions nur Kanäle zugeordnete sind, nicht die Datenpunkte (zB State oder Level)?
Gruß
Pix
-
So wie ich das verstehe, liegt es in der unterschiedlichen Namensgebung, also "Garagenlicht.State" bei Homematic, aber bei z-wave lediglich "switch". Hab schon versucht, händisch im Node ein Objekt anzulegen und darin die Namensstruktur von Homematic zu erzeugen, aber iwie haut es trotzdem nicht hin.
So sieht das im Original ohne meine Veränderungen aus.
-
So wie ich das verstehe, liegt es in der unterschiedlichen Namensgebung, also "Garagenlicht.State" bei Homematic, aber bei z-wave lediglich "switch". Hab schon versucht, händisch im Node ein Objekt anzulegen und darin die Namensstruktur von Homematic zu erzeugen, aber iwie haut es trotzdem nicht hin.
So sieht das im Original ohne meine Veränderungen aus.
screenshot_lichtzaehlen.png `
Welche skript benutzt du ? Ich vermute ma er triggert nur auf die waerte STATE, das skript muesste man dan fuer diesen teil anpassen damit er auch mit deinen objecten uerbeinstimmt.
~Dutch
-
Dieses hier:
! /* System Zahl Lichter
! zaehlt die Lichter in allen Raeumen und meldet die Eingeschalteten namentlich
! Daten kommen vom Gewerk "Licht"
! */
! createState('zaehlen_Lichter.anzahlLichter', {
! def: 0,
! name: 'Anzahl der vorhandenen Lichter',
! desc: 'Anzahl aller Lichter im Gewerk',
! read: true,
! write: true,
! min: 0,
! type: 'number'
! });
! createState('zaehlen_Lichter.anzahlLichterAn', {
! def: 0,
! name: 'Anzahl eingeschaltete Lichter',
! desc: 'Anzahl aller eingeschalteten Lichter im Gewerk',
! read: true,
! write: true,
! min: 0,
! type: 'number'
! });
! createState('zaehlen_Lichter.textLichterAn', {
! def: "",
! name: 'Aufzaehlung eingeschaltete Lichter',
! desc: 'Namen aller eingeschalteten Lichter im Gewerk als Liste',
! read: true,
! write: true,
! type: 'string'
! });
! var cacheSelector = $('channelstate.id=*.STATE');
! var cacheSelectorState = $('channelstate.id=*.STATE');
! var cacheSelectorDimmer = $('channelstate.id=*.LEVEL');
! function countLamps(obj) {
! // Setzt die Zaehler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
! var anzahlLichterAn = 0;
! var anzahlLichter = 0;
! var textLichterAn = [];
! log('Ausloesender Aktor: ' + obj.id + ': ' + obj.newState.val); // Info im Log, welcher Zustand sich geaendert 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 hochgezaehlt
! textLichterAn.push(obj.common.name); // Zu Array hinzufügen
! }
! log("Licht Nr. " + i + ": " + getObject(id).common.name + ": " + status);
! ++anzahlLichter; // Zaehlt die Anzahl der vorhandenen Lichter unabhaengig 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; // Zaehlt die Anzahl der vorhandenen Lichter unabhaengig 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("zaehlen_Lichter.textLichterAn", textLichterAn.join(',
')); // Schreibt die aktuelle Namen der eingeschalteten Lichter
! setState("zaehlen_Lichter.anzahlLichterAn", textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter
! setState("zaehlen_Lichter.anzahlLichter", anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht
! }
! cacheSelectorState.on(function(obj) { // bei Zustandaenderung *. STATE im Gewerk Fenster
! countLamps(obj);
! });
! cacheSelectorDimmer.on(function(obj) { // bei Zustandaenderung *. LEVEL im Gewerk Licht
! countLamps(obj);
! });Die Definition der Variablen hab ich im Skript rot markiert, da müsste noch der Double Switch rein, weiß aber nicht wie. Im Vergleich sind die Datenpunkte so definiert (links Homematic, rechts z-wave):
-
Auf den ersten schnellen Blick macht das Script was mir state.id.
Bei den einen heißt die id so bei den anderen switch_xx, morgen Mal an pc Schaun…
~Dutch
Send from mobile device
-
Auf den ersten schnellen Blick macht das Script was mir state.id.
Bei den einen heißt die id so bei den anderen switch_xx, morgen Mal an pc Schaun…
~Dutch
Send from mobile device `
dachte ich mir auch, aber meine Kenntnisse reichen nicht aus, das umzusetzen. Das Erstellen eines neuen Datenpunktes für den Switch, wo ich die id angepasst hatte, war nicht erfolgreich.
-
Nachdem ich nun eine ganze Weile rumexperimentiert habe, bin ich noch nicht weiter. Hier ein Auszug aus meinem aktuellen Skript (eingeschränkt funktionsfähig).
! [… Definition Variablen]
! [… Anlegen Status]
! var cacheSelectorState = $('channelstate.id=*.STATE'); // Gewerk Licht
! var cacheSelectorLevel = $('channelstate.id=*.LEVEL');
! var cacheSelectorSwitch_1 = $('channelstate.id=*.Switch_1'); // Zwave Lampen (müssen im Gewerk Licht sein)
! 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
! });
! ` > cacheSelectorSwitch_1.each(function(id, i) { // Schleife für jedes gefundenen Element *.Switch_1 im Gewerk Lichtvar obj = getObject(id);
var name = getObject(id).common.name;
var status = getState(id).val; // Zustand *.ON abfragen (jedes Element)
var devicename = name.substring(0, name.indexOf(".Switch_1")); //.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
});
! [… Dimmer] ! [… Array sortieren] ! // 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(); ! });
> CacheSelectorSwitch_1.on(function(obj) { // bei Zustandänderung *.Switch_1 von ZwaveLampen im Gewerk Lichtif (logging) log('Auslösende SWITCH: ' + 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);
! });Auch ein manuell erstellter Datenpunkt im entsprechenden Node wird nicht erfasst. HM-Geräte werden hingegen einwandfrei erkannt und ausgewertet. Wo hab ich da noch einen Fehler drin?
-
Vielleicht hilft ja das Script für Lichter homematic + hue weiter.
Da wird irgendwie noch mit der role gearbeitet:
var cacheSelectorHue = $('state[id=*.on](functions=Licht)[role=switch]'); //var cacheSelectorHue = $('channel[state.id=*.ON](functions="Licht")'); // HUE Lampen (müssen im Gewerk Licht sein)
Komplettes Script:
! ````
/* 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: 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 ... 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
21.06.2017 HUE Lampen 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');
var cacheSelectorHue = $('stateid=*.on[role=switch]'); //var cacheSelectorHue = $('channelstate.id=*.ON'); // HUE Lampen (müssen im Gewerk Licht sein)
! 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
});cacheSelectorHue.each(function(id, i) { // Schleife für jedes gefundenen Element *.ON im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.ON abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".on")); //.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();
});
cacheSelectorHue.on(function(obj) { // bei Zustandänderung *.ON von HUE Lampen im Gewerk Licht
if (logging) log('Auslösende HUE: ' + 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);
}); -
Danke, genau dieses Skript habe ich versucht zu modifizieren.
-
Das Problem ist gelöst, das Skript modifiziert und lauffähig. Danke für die Unterstützung.