NEWS
Aufzählung - ein Teil funktioniert iwie nicht
-
@ticaki
Danke für deine Antwort!
Ich werde das mal testen. -
Ich habe jetzt noch viel rum probiert, finde aber den Fehler nicht
Das Script läuft soweit. Die eigenen Datenpunkte werden korrekt gefüllt.
ABER: den Teil mit der Ansage bekomme ich nicht hin..
Ich habe den Tip von ticaki versucht und musste feststellen das die Werte (Zahlen) für
idAnzahlNordOn
idAnzahlOstOn
schlicht nie stimmen und das obwohl sie in die Datenpunkte korrekt geschrieben werden.Nach meinem kleinen Verständnis bislang liest doch die Funktion
on(idNamenNord, function (obj) { bzw.
on(idNamenOst, function (obj) {
per getState die Datenpunkte aus... Warum klappt das bei mir nicht?{1} zählt die Steckdosen in allen Räumen im Nordflügel und meldet die Eingeschalteten namentlich Daten kommen von Aufzählung "nordflügel-licht" {1} */ var logging = true; // ++++++++ Pfad und Name der zu erstellenden Datenpunkte var idAnzahlNordOn = '0_userdata.0.MrsBiesly.Status.Steckdosen.Anzahl_Nord_On'; var idAnzahlOstOn = '0_userdata.0.MrsBiesly.Status.Steckdosen.Anzahl_Ost_On'; var idAnzahlNord = '0_userdata.0.MrsBiesly.Status.Steckdosen.Anzahl_Nord'; var idAnzahlOst = '0_userdata.0.MrsBiesly.Status.Steckdosen.Anzahl_Ost'; var idNamenNord = '0_userdata.0.MrsBiesly.Status.Steckdosen.Namen_Nord'; var idNamenOst = '0_userdata.0.MrsBiesly.Status.Steckdosen.Namen_Ost'; var idRaumNord = '0_userdata.0.MrsBiesly.Status.Steckdosen.Raum_Nord'; var idRaumOst = '0_userdata.0.MrsBiesly.Status.Steckdosen.Raum_Ost'; var idAnsageNord = '0_userdata.0.MrsBiesly.Status.Steckdosen.Ansage_Nord'; var idAnsageOst = '0_userdata.0.MrsBiesly.Status.Steckdosen.Ansage_Ost'; // ++++++++ Wonach soll gesucht werden? // ++++++++ Hier nach allen Datenpunkten die in der Aufzählung "Nordflügel-Strom" / "Ostflügel-Strom" sind und die ID ".1" haben (da in diesem Datenpunkt false/true für ON bzw OFF) var cacheSelectorSwitchNord = $('state[id=*.1](functions=nordflügel-strom)'); var cacheSelectorSwitchOst = $('state[id=*.1](functions=ostflügel-strom)'); // ++++++++ Setzt die Zähler vor dem Durchlauf aller Elemente *.1 in der Aufzählung (Gewerk) Nordflügel-Strom auf 0 function checkDevicesNord(obj) { var anzahlSteckdockdosenNordOn = 0; var anzahlSteckdosenNord = 0; var NameSteckdoseNordOn = []; var textRaumNord = []; if (logging) { log('++++++ Steckdosen Nordflügel Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorSwitchNord.each(function (id, i) { // Schleife für jedes gefundenen Element *.1 in der Aufzählung (Gewerk) Nordflügel-Strom var obj = getObject(id); var idDev = id.substring(0, id.lastIndexOf('.')); // Zugriff auf übergeordneten Datenpunkt da der Name des Datenpunkts sonst "switch_1" heißen würde var name = getObject(idDev).common.name; // liest den Namen des übergeordneten Datenpunkts aus var status = getState(id).val; // Abfrage Zustand (true/false) für alle *.1 abfragen (für jedes Element) var raumname = getObject(id, "rooms"); // Abfrage Raum-Name if (status) { // wenn Zustand = true, dann wird die Anzahl der Steckdosen im Nordflügel hochgezählt ++anzahlSteckdockdosenNordOn; NameSteckdoseNordOn.push(name); // Zu Array hinzufügen textRaumNord.push(raumname.enumNames); // <---- NEU } ++anzahlSteckdosenNord; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); log('test: ' + anzahlSteckdosenNord); // Array mit Lichternamen sortieren NameSteckdoseNordOn.sort(); textRaumNord.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + NameSteckdoseNordOn); if (logging) log("Anzahl Steckdosen Nordflügel: " + anzahlSteckdosenNord + " # davon Steckdosen ON: " + anzahlSteckdockdosenNordOn); // die ermittelten Werte werden in die erstellten Datenpunkte geschrieben (z.B. für die Verarbeitung in VIS) setState(idNamenNord, NameSteckdoseNordOn.join(',')); // Schreibt die aktuellen Namen der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlNordOn, NameSteckdoseNordOn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlNord, anzahlSteckdosenNord); // Schreibt die aktuelle Anzahl der vorhandenen Steckdosen im Nordflügel setState(idRaumNord, textRaumNord.join(', ')); // Schreibt die Räume im Nordflügel, in denen Steckdosen ON sind } function checkDevicesOst(obj) { var anzahlSteckdockdosenOstOn = 0; var anzahlSteckdosenOst = 0; var NameSteckdoseOstOn = []; var textRaumOst = []; if (logging) { log('++++++ Steckdosen Ostflügel Anzahl ++++ '); log('#### SCHALTER ##### '); } cacheSelectorSwitchOst.each(function (id, i) { // Schleife für jedes gefundenen Element *.1 in der Aufzählung (Gewerk) Nordflügel-Strom var obj = getObject(id); var idDev = id.substring(0, id.lastIndexOf('.')); // Zugriff auf übergeordneten Datenpunkt da der Name des Datenpunkts sonst "switch_1" heißen würde var name = getObject(idDev).common.name; // liest den Namen des übergeordneten Datenpunkts aus var status = getState(id).val; // Abfrage Zustand (true/false) für alle *.1 abfragen (für jedes Element) var raumname = getObject(id, "rooms"); // Abfrage Raum-Name if (status) { // wenn Zustand = true, dann wird die Anzahl der Steckdosen im Nordflügel hochgezählt ++anzahlSteckdockdosenOstOn; NameSteckdoseOstOn.push(name); // Zu Array hinzufügen textRaumOst.push(raumname.enumNames); // <---- NEU } ++anzahlSteckdosenOst; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); log('test: ' + anzahlSteckdosenOst); log('test2: ' + anzahlSteckdockdosenOstOn); // Array mit Lichternamen sortieren NameSteckdoseOstOn.sort(); textRaumOst.sort(); // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + NameSteckdoseOstOn); if (logging) log("Anzahl Steckdosen Ostflügel: " + anzahlSteckdosenOst + " # davon Steckdosen ON: " + anzahlSteckdockdosenOstOn); // die ermittelten Werte werden in die erstellten Datenpunkte geschrieben (z.B. für die Verarbeitung in VIS) setState(idNamenOst, NameSteckdoseOstOn.join(',')); // Schreibt die aktuellen Namen der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlOstOn, NameSteckdoseOstOn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlOst, anzahlSteckdosenOst); // Schreibt die aktuelle Anzahl der vorhandenen Steckdosen im Nordflügel setState(idRaumOst, textRaumOst.join(', ')); // Schreibt die Räume im Nordflügel, in denen Steckdosen ON sind } {1} // Trigger cacheSelectorSwitchNord.on(function(obj) { // bei Zustandsänderung *.1 in der Aufzählung (Gewerk) "Nordflügel-Strom" if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevicesNord(); }); cacheSelectorSwitchOst.on(function(obj) { // bei Zustandsänderung *.1 in der Aufzählung (Gewerk) "Nordflügel-Strom" if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevicesOst(); }); function main() { setTimeout(function(){ if (logging) log('Auslöser Skriptstart'); checkDevicesNord(), ////?????????????????????????????????????????????? checkDevicesOst(); }, 2000); } {1} main(); // Skriptstart-Auslöser {1} // Aufbereitung für Ansage function strip_tags(data) { var rueckgabe = data.replace(/( |<([^>]+)>)/ig, " "); return(rueckgabe); } {1} on(idNamenNord, function (obj) { log('Check Nord:' + getState(idAnzahlNordOn).val + ' Namen:' + obj.state.val); //var text = obj.state.val; var textNord = obj.state.val; //text = (getState(idAnzahlNord).val > 0 ) ? 'Steckdosen Nordflügel eingeschaltet: ' + strip_tags(text) : 'Alle Steckdosen im Nordflügel sind ausgeschaltet'; textNord = (getState(idAnzahlNordOn).val > 0 ) ? 'Steckdosen Nordflügel eingeschaltet: ' + strip_tags(textNord) : 'Alle Steckdosen im Nordflügel sind ausgeschaltet'; //setState(idAnsageNord, text); setState(idAnsageNord, textNord); }) on(idNamenOst, function (obj) { log('Check Ost:' + getState(idAnzahlOstOn).val + ' Namen:' + obj.state.val); //var text = obj.state.val; var textOst = obj.state.val; //text = (getState(idAnzahlNord).val > 0 ) ? 'Steckdosen Nordflügel eingeschaltet: ' + strip_tags(text) : 'Alle Steckdosen im Nordflügel sind ausgeschaltet'; textOst = (getState(idAnzahlOstOn).val > 0 ) ? 'Steckdosen Ostflügel eingeschaltet: ' + strip_tags(textOst) : 'Alle Steckdosen im Ostflügel sind ausgeschaltet'; //setState(idAnsageNord, text); setState(idAnsageOst, textOst); }); {1} code_text
Hier mal das gesamte Script...
Und hier ein Screenshot von den Datenpunkten mit Werten
Ich würde mich sehr freuen wenn jemand die Zeit finden würde um sich das mal anzuschauen...
-
Dein Verständnis ist richtig du übersiehst dabei aber die Reihenfolge, dein Script reagiert auf die erste Änderung und nicht die letzte.
vorher:
setState(idNamenOst, NameSteckdoseOstOn.join(',')); // Schreibt die aktuellen Namen der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlOstOn, NameSteckdoseOstOn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlOst, anzahlSteckdosenOst); // Schreibt die aktuelle Anzahl der vorhandenen Steckdosen im Nordflügel setState(idRaumOst, textRaumOst.join(', ')); // Schreibt die Räume im Nordflügel, in denen Steckdosen ON sind
nachher:
setState(idAnzahlOstOn, NameSteckdoseOstOn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Steckdosen im Nordflügel setState(idAnzahlOst, anzahlSteckdosenOst); // Schreibt die aktuelle Anzahl der vorhandenen Steckdosen im Nordflügel setState(idRaumOst, textRaumOst.join(', ')); // Schreibt die Räume im Nordflügel, in denen Steckdosen ON sind setState(idNamenOst, NameSteckdoseOstOn.join(',')); // Schreibt die aktuellen Namen der eingeschalteten Steckdosen im Nordflügel
Und wenn das nicht reicht, was es aber sollte:
on(idNamenNord, function (obj) { var textNord = obj.state.val; //var text = obj.state.val; setTimeout(() => { //text = (getState(idAnzahlNord).val > 0 ) ? 'Steckdosen Nordflügel eingeschaltet: ' + strip_tags(text) : 'Alle Steckdosen im Nordflügel sind ausgeschaltet'; textNord = (getState(idAnzahlNord).val > 0 ) ? 'Steckdosen Nordflügel eingeschaltet: ' + strip_tags(textNord) : 'Alle Steckdosen im Nordflügel sind ausgeschaltet'; //setState(idAnsageNord, text); setState(idAnsageNord, textNord); },20; }
-
@ticaki
Sorry das ich mich erst jetzt wieder melde.. Bin vorher nicht dazu gekommen..Aber VIELEN DANK! für deine Hilfe!
Das schlichte Umstellen der Reihenfolge so wie du es aufgezeigt hast, führt nun zu korrekten Antworten
Konnte es zwar gerade nur für den "Nord-Teil" testen (wenn ich im Ost-Teil jetzt den Strom weg nehme hab ich keinen Rechner mehr lach), aber denke das es auch hier nun läuft...Den "Timeout" Teil werde ich bestimmt an anderer Stelle noch versuchen zu verwenden
Wenn es deine Zeit erlaubt.. Magst mir evtl. ein paar Zeilen schreiben zur Begründung?
Ich versuche nicht nur Dinge abzuschreiben sondern versuche auch den Hintergrund zu verstehen....
Hier ist mir jetzt nicht so ganz klar warum die Umstellung der Reihenfolge den Erfolg des Scripts ausmacht.... ?LG
-
Und dann doch noch ein "Problem"..
// Trigger cacheSelectorSwitchNord.on(function(obj) { // bei Zustandsänderung *.1 in der Aufzählung (Gewerk) "Nordflügel-Strom" //if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat if (logging) log('Auslösender Schalter: ' + obj.name + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevicesNord(); });
Dieser Teil zeigt mir ja im Log wer der Auslöser war.. Leider bekomme ich hier als (korrekte) Antwort "swicht_1" angezeigt.
Leider wenig hilfreich da alle meine Steckdosen dann quasi so heißen....
Hier würde ich gern den Namen des übergeordneten DP angezeigt bekommen (hier dann also "Fire-Strom").Wie bekomme ich das hin?
Hier die Struktur:
-
@Mrs-B
Wenn du 4 Punkte beschreibst, werden die nicht gleichzeitig geschrieben sondern das sind 4 einzelne Kommandos. Wenn du also auf den ersten Schreibvorgang einen Trigger setzt ist es sehr unwahrscheinlich, das die restlichen 3 schon geschrieben sind.Also bassiert der 1. Lösungsansatz darauf, dass die Schreibkommandos in aufgetragener Reihenfolge vollständig abgearbeitet sind.
Der 2. Lösungsansatz gibt dem System ein paar Millisekunden um die anstehenden Schreibaufträge abzuschließen, bevor mit dem auslesen der Daten begonnen wird.
Die beste Lösung wäre jedoch nicht mehrere Datenpunkte zu verwenden, sondern einen Objektdatenpunkt zu erstellen:
var fluegel = getState(datenpunkt_der_Objekt_enthalten_kann).val; if (fluegel === undefined) fluegel = {}; fluegel.nord = {}; fluegel.nord.anzahl = 3; fluegel.nord.text = 'text'; setState(datenpunkt_der_Objekt_enthalten_kann, fluegel);
EDIT: ups ich weiß garnicht ob es Objekt Datenpunkte gibt.
Das hier ist für einen Zeichenketten Datenpunkt:var str = getState(datenpunkt_der_Zeichenkette_enthält).val; var fluegel = {}; if (str) fluegel = JSON.parse(str); fluegel.nord = {}; fluegel.nord.anzahl = 3; fluegel.nord.text = 'text'; setState(datenpunkt_der_Zeichenkette_enthält, JSON.stringify(fluegel));
-
@ticaki
DANKE für die Antwort.. Das muss ich jetzt für mich erstmal studieren lach -
Zu deiner nächsten Frage: (Ich schreibe das Freihand, kann/wird Syntaxfehler enthalten )
var id = obj.id.substring(obj.id.lastIndexOf('.')); log(id); var oName = getObject(id).common.name; log(oName);
-
@ticaki said in Aufzählung - ein Teil funktioniert iwie nicht:
var id = obj.id.substring(obj.id.lastIndexOf('.'));
log(id);
var oName = getObject(id).common.name;
log(oName);Danke auch hier
So hat es bei mir iwie nicht funktionieren wollen.
Nach Analyse hab ich dann gesehen das ich immer "DeviceID" mit ".1" am Ende (so heißt die ID des abzufragenen Datenpunkts bei mir..) raus bekomme.
Habe mir dann soweit geholfen das ich einfach das ".1" am Ende abschneide und damit dann den Namen abfrage.Ist garantiert keine "schöne" Lösung ... Aber funktioniert in meiner Umgebung soweit gut...
JScript und ich wir stehen noch in der KennenlernphaseWünsche ein schönes Wochenende
-
@Mrs-B sagte in Aufzählung - ein Teil funktioniert iwie nicht:
var id = obj.id.substring(obj.id.lastIndexOf('.'));
Das tut nichts anders als alles hinter dem letzten "." zu verwerfen.
-
Huhu...
Ich hab endlich wieder etwas Zeit gefunden um an meinem Script (siehe oben) weiter zu basteln...
Hab da noch folgende Frage:
Mit folgenden Zeilen lege ich ja fest wonach gesucht werden soll:var cacheSelectorSwitchNord = $('stateid=*.1');
var cacheSelectorSwitchOst = $('stateid=*.1');Also hier für mein Beispiel nach Datenpunkten mit der ID "1" mit der jeweils zugewiesenen function...
Nun hab ich aber noch ne Steckdosenleiste die mitgezählt werden soll ... Hier heißen die ID`s leider nicht "1" ...
Kann man auch einfach nur nach den Datenpunkten suchen die die function zugewiesen haben? Also ohne Angabe der ID? Würde dann natürlich die entsprechende function auch nur den passenden Datenpunkten zuordnen...
Geht das? Und wie müsste ich das anstellen?