NEWS
Abfrage ob Lichter an sind oder nicht
-
Hallo alle zusammen,
Ich benötige Eure Hilfe, und zwar würde ich gerne in Vis eine Tabelle einflechten die mir sagt ob alle Lampen aus sind im Wohnbereich und ob alle Lampen aus sind im Außenbereich oder halt nicht.
Das gleiche woltte ich in Habpanel erstellen.Danke für Eure Mühen
Gruß
Mico -
zeige doch mal was du bisher probiert hast.
-
@ralla66
HalloIch hatte dazu noch nicht wirklich einen Plan, ich hatte wohl die einzelnden Lichter per Bulb on/off intergriert, bzw bei Habpanel per Schaltfläche, aber sonst nicht wirklich eine Idee dazu.
Ich habe per Alexa die Lampen als gesammt zusammengestellt und wollte dieses als poweron switch wahr falsch einarbeiten aber das haute nicht wirklich hin. Hatte dieses in dem Widget Bool HTML bzw HTML State versucht zu intergrieren.Gruß
Mico -
@mico sagte in Abfrage ob Lichter an sind oder nicht:
einzelnden Lichter per Bulb on/off
Das ist doch ein guter Ansatz, jetzt kannst du ja z.B im Blockly die Zustände der Bulb bündeln.
Wenn Bulb 1 und Bulb 2 usw sind aus dann stelle in Visu alle Aus dar.
Dazu einfach einen Datenpunkt alle Aus anlegen. -
Ich glaube ich stehe etwas neben der Spur
Kannst du mir bitte mal auf die Sprünge helfen wie ich das in Blockly setzten mussDas wäre sehr schön
Danke
Gruß
Mico -
-
@mico
HiIch bei das bei mir wie folgt realisiert.
Voraussetzung: Alle Lichtschalter-Datenpunkte sind als Alias vorhanden (um nicht jeden Shelly oder was auch immer von Hand eintragen zu müssen).
Die Datenpunkte heißen z.B.alias.0.Raum.Wohnen.Licht.0.state
Das ist in diesem Fall ein Alias für
shelly.0.SHSW-25#C4A60C#1.Relay0.Switch
Jetzt in einem Javascript alle Lichtdatenpunte in ein Array packen (kann mir jemand einen Tipp geben wie man das noch eleganter lösen kann?)
const LichtState = $('alias.0.Raum.*.Licht.*.state'); var alias=[]; for (var i=0; i<LichtState.length; i++){alias.push(LichtState[i]);}
Dann einen Datenpunkt, in dem der Zustand für alle Lichter gespeichert ist:
const LichtStatusDP = 'javascript.0.Status.Licht'; // Zahl, bitweise mit der Licht ID geodert
hier wird bitweise für jedes Licht gespeichert, ob an oder aus. Also 1 für das erste Licht, 2 für das zweite, 4 für das dritte, 8 für das vierte etc.
jetzt auf Änderungen der Licht States triggern:
on({id: alias, change: "any"}, function (obj) // bei jeder Änderung reagieren { var Ausloeser=obj.id; var ObjektIndex = alias.indexOf(Ausloeser); var Value = obj.state.val; // Lichtzustand var ValNum = Value ? 1:0; // 1 wenn Licht an, sonst 0 setState(LichtStatusDP, SetBit(getState(LichtStatusDP).val, ObjektIndex, ValNum));
Wenn jetzt ein Licht geändert wird, dann wird in dem Lichtstatusdatenpunkt das Bit für das entsprechende Licht gesetzt oder gelöscht.
Um jetzt zu wissen, ob noch irgendwo ein Licht brennt muss man einfach nur schauen, ob der Lichtstatusdatenpunkt 0 oder ungleich 0 ist.
Um eine Liste aller Lichter die brennen zu erstellen bestimme ich den Raum aus dem Lichtdatenpunkt (Der Teil im Datenpunkt zwischen "Raum" und "Licht".
Also:var AusloeserSplit = Ausloeser.split("."); var Raum = AusloeserSplit[3];
Jetzt noch ein Status String, in dem alle Räume gelistet sind, in denen ein Licht brennt
if ((ValNum == 1) && (StatusS.search(Raum) == -1)){StatusS = StatusS + Raum + "<br>";} if (ValNum == 0){StatusS = StatusS.replace(Raum + "<br>", "");}
(Wenn es in einem Raum mehrere Lichter geben würde müsste man eben noch die Nummer dazunehmen.
Diesen Status String kann ich mir in Vis in einem html Widget anzeigen lassen.Um alle Lichter auszuschalten kann man einfach alle Lichtdatenpunkte per Schleife durchlaufen und den State auf "false" setzen.
for(var i=0; i < LichtState.length; i++){setState(LichtState[i], false);}
Um Innne und Außenlichter zu unterscheiden musst Du Dir eben sinnvolle Alias Namen überlegen um aus dem Namen zu erkennen, ob das Licht innen oder außen ist.