Guten Tag,
ich benutze seit längerem das Licht Script zählen von diesem Topic
https://forum.iobroker.net/topic/5369/gelöst-lichter-zählen-script-läuft-nicht/113
Ich habe mir nun, auch der Preisfrage wegen, zusätzlich Shelly´s als Lichtschalter verbaut. Gerne würde ich diese Schalter auch mit dem Script abfragen. Nur habe ich von dieser Sprache keine Ahnung.
Wer könnte das Script um die Shelly´s erweitern? Der Datenpunkt müsste folgender sein:
Dieses Script ist bei mir im Einsatz - entnommen aus verlinktem Topic:
/* Status Zahl Lichter
zählt die Lichter in allen Räumen und meldet die Eingeschalteten namentlich
Daten kommen vom Gewerk "Licht"
*/
var logging = true;
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'
});
// HM Schalter, HM Dimmer und Hue Schalter im Gewerk Licht
const hmSTATE = $('channel[state.id=*.STATE](functions=Licht)');
const hmLEVEL = $('channel[state.id=*.LEVEL](functions=Licht)');
const hueon = $('state[id=*.on](functions=Licht)');
var anzahlLichterAn,
anzahlLichter,
textLichterAn,
textRaum;
function checkLicht(id, vorn, hinten) {
var name = getObject(id).common.name;
var devicename = name.substring(vorn, name.indexOf(hinten)); //Zeichen vorn, State hinten aus Text entfernen
var raum = getObject(id, "rooms").enumNames[0];
if (getState(id).val) { // wenn Zustand != false / 0, dann wird die Anzahl der Lichter hochgezählt
++anzahlLichterAn;
textLichterAn.push(devicename); // Zu Array hinzufügen
if(textRaum.indexOf(raum) == -1) textRaum.push(raum); // zu Array hinzu, wenn noch nicht vorhanden
}
++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status
}
function checkDevices() {
// Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0
anzahlLichterAn = 0;
anzahlLichter = 0;
textLichterAn = [];
textRaum = [];
hmSTATE.each(function(id, i) { // Schleife für jedes gefundenen Element *.STATE im Gewerk Licht
checkLicht(id, 0, '.STATE');
});
hueon.each(function(id, i) { // Schleife für jedes gefundenen Element *.on im Gewerk Licht
checkLicht(id, 12, '.on');
});
hmLEVEL.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht
checkLicht(id, 0, '.LEVEL');
});
// 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(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
hmSTATE.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();
});
hueon.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();
});
hmLEVEL.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();
});
// Skriptstart
setTimeout(function() {
if (logging) log('Auslöser Skriptstart');
checkDevices();
}, 500);
// 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);
});
Für die Mühe danke ich schonmal im Voraus
Gruß
Torsten
PS: Sollte ich mein Thema in der Forensuche übersehen haben reicht auch ein Hinweis auf den entsprechenden Eintrag