NEWS
[ gelöst ]Osram Plug in Script „Lichter zählen“ einfügen
-
https://forum.iobroker.net/viewtopic.php?f=21&t=16963&p=178783#p178783.
const osram = $('state[id=*.state](functions="Licht")');
-
Hallo Paul53, vielen Dank für deinen Vorschlag. Leider bin ich aber zu blöd, deinen Code in mein Script zu integrieren.
Auch den Link zu den Fensterscript verstehe ich nicht wirklich oder willst du mir damit sagen, das das was ich vorhabe, mit dem Script "Lichter zählen" nicht möglich ist. Ich würde mich freuen, wenn du mir das ganze kurz erklären könntest.
Gruß Baerny
-
Mit dem Selektor osram musst Du eine weitere Schleife
osram.each(function(id, i) { // Schleifen-Operationen });
innerhalb der Funktion checkDevices() erstellen und außerdem einen zusätzlichen Trigger
osram.on(function(obj) {});
Das Fensterskript zeigt, wie es prinzipiell funktioniert.
-
Vielen Dank, schau mal ob Ichs hinbekomme
Baerny
-
Habe jetzt einige Tage alles mögliche ausprobiert, leider werden meine Osram Plug + von dem Lichterscript nicht gefunden.
Ich habe zuletzt dieses Script benutzt da es für mich übersichtlicher ist die das bereits oben gepostete
// Tread: https://forum.iobroker.net/viewtopic.php?t=18239&p=190534#p190534 var logging = true; //Variablen deklarieren var idAnzahlEin = 'Beleuchtung.Anzahl_ein', idAnzahl = 'Beleuchtung.Anzahl', idText = 'Beleuchtung.Text', idRaum = 'Beleuchtung.Raum', idAnsage = 'Beleuchtung.Ansage'; // Status erstellen createState(idAnzahl, { type: 'number', name: 'Anzahl aller Lichter', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { type: 'number', name: 'Anzahl der eingeschalteten Lichter', min: 0, def: 0, role: 'value' }); createState(idText, { 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, { type: 'string', name: 'Räume mit eingeschalteten Lichter', desc: 'Namen der Räume, in denen Lichter eingeschaltet sind', def: ' ', role: 'value' }); //Variablen der Geräte deklarieren var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="Licht")'); var cacheSelectorHue = $('channel[state.id=*.ON](functions="Licht")'); var cacheSelectorOsram = $('channel[state.id=*.state](functions="Licht")'); // Osram var cacheSelectorPOWER = $('channel[state.id=*.POWER](functions="Licht")'); // Sonoff function checkDevices(obj) { var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; var textRaum = []; if (logging) { log('++++++ Lichter Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorState.each(function(id, i) { var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; var devicename = name.substring(0, name.indexOf(".STATE")); var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; }); cacheSelectorOsram.each(function(id, i) { // Osram Plug var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; var devicename = name; var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; }); cacheSelectorPOWER.each(function(id, i) { // Sonoff var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; var devicename = name; var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; }); // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Lichter: " + anzahlLichter + " # davon Lichter an: " + anzahlLichterAn); setState(idText, textLichterAn.join(', ')); setState(idAnzahlEin, textLichterAn.length); setState(idAnzahl, anzahlLichter); setState(idRaum, textRaum.join(', ')); } // Trigger cacheSelectorState.on(function(obj) { if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); checkDevices(); }); cacheSelectorOsram.on(function(obj) { // Osram Plug if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); checkDevices(); }); cacheSelectorPOWER.on(function(obj) { // Sonoff if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); checkDevices(); }); cacheSelectorHue.on(function(obj) { if (logging) log('Auslösende HUE: ' + obj.id + ': ' + obj.state.val); checkDevices(); }); cacheSelectorLevel.on(function(obj) { if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); 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); });
In diesem Script habe ich folgendes geändert:
var cacheSelectorOsram = $('channel[state.id=*.state](functions="Licht")'); ````und```` cacheSelectorOsram.each(function(id, i) { // Osram Plug var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; var devicename = name; var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; }); ````und```` cacheSelectorOsram.on(function(obj) { // Osram Plug if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); checkDevices(); }); ````woran könnte es denn liegen. Die Abfrage von HM und Sonoff Geräten funktioniert Über Hilfe würde ich mich freuen. Baerny
-
Die Osram-Geräte haben keinen Channel. Das Gewerk ist laut Deinem ersten Post dem Datenpunkt zugeordnet. Das ist beim Selector zu berücksichtigen. Versuche es mal so:
var cacheSelectorOsram = $('state[id=*.state](functions="Licht")'); // Osram
Außerdem verpasse den Datenpunkten .state sinnvolle Namen, da sie sonst nicht unterscheidbar sind.
-
Möchtest Du den Gerätenamen (z.B. "Plug 03") verwenden, muss die Schleifenfunktion geändert werden.
cacheSelectorOsram.each(function(id, i) { // Osram Plug var status = getState(id).val; var deviceid = id.substring(0, id.indexOf('.state')); //.state aus ID entfernen var devicename = getObject(deviceid).common.name; var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Gerät: ' + devicename); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; });
-
ja würde ich gerne, muss natürlich noch sinnvoll geändert werden
-
ganz herzlichen Dank für deine Hilfe
-
Hallo zusammen,
ich versuche gerade die Anpassung für die Osram Steckdosen zu übernehmen. Irgendwie mag es bei mir aber nicht funktionieren. Kann jemand mal über die Anpassung schauen?
var logging = true; var idAnzahlEin = 'javascript.0.Buero.Steckdose.Anzahl_ein', idAnzahl = 'javascript.0.Buero.Steckdose.Anzahl', idText = 'javascript.0.Buero.Steckdose.Text', idRaum = 'javascript.0.Buero.Steckdose.Raum', // <---- NEU idAnsage = 'javascript.0.Buero.Steckdose.Ansage'; 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' }); /* ------------------------- Selektor Start ------------------------------------------------------*/ var cacheSelectorSwitch = $('state[id=*.Switch](functions="onbuerosocket")'); // Shelly var cacheSelectorOsram = $('state[id=*.available](functions="onbuerosocket")'); // Osram /* ------------------------- Selektor Ende ------------------------------------------------------*/ 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 ##### '); } /* -----------------------Schleife Start -----------------------------------------------------*/ if (logging) { log('++++++ Lichter Anzahl ++++ '); log('#### SCHALTER ##### '); } //osram// cacheSelectorOsram.each(function(id, i) { // Osram Plug var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; var devicename = name; var raumname = getObject(id, "rooms"); if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { ++anzahlLichterAn; textLichterAn.push(devicename); textRaum.push(raumname.enumNames); } ++anzahlLichter; }); //shelly// cacheSelectorSwitch.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 *.STATE abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(" Switch ON/OFF")); //.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 }); /* -----------------------Schleife Ende -----------------------------------------------------*/ // 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(',<br>')); // Räume, in denen Licht brennt // <---- NEU setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU } /* ----------------- Trigger Start ------------------------------------------------------------*/ cacheSelectorSwitch.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(); }); /* ----------------- Trigger Ende ------------------------------------------------------------*/ 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 ausgeschaltet'; setState(idAnsage, text); });
Ich versuche das Script so anzupassen das nur die "Steckdosen" gezählt werden. Da ich mir für jeden Raum einzelnt eine Übersicht basteln möchte welche Steckdosen eingeschaltet sind. Darum gibt es mehrere Gewerke bei mir.
Die Shellys werden erkannt und gezählt, die Osram leider nicht