Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Lichtauswertung zählt gedimmte Lichter nicht

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    949

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Lichtauswertung zählt gedimmte Lichter nicht

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
2 Beiträge 2 Kommentatoren 199 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    marsmännchen
    schrieb am zuletzt editiert von marsmännchen
    #1

    Hallo zusammen.

    Ich habe vor längerer Zeit ein Skript gefunden welches vom Skript: https://github.com/Pittini/iobroker-Fensterauswertung
    abgewandelt wurde.
    Ich habe es auf meine Bedürfnisse angepasst und bin auch recht zufrieden damit.
    Das Problem ist nur das es keine gedimmten Lampen erkennt.
    Es wird in Zeile 27 als String definiert was als Eingeschaltet gilt:

    const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
    

    Wie könnte ich erreichen das das licht schon bei >0 als ON erkannt wird?
    Würde das mit wenig Aufwand in dem Skript gelingen oder brauche ich ein zweites Skript welches mir wieder eigene Datenpunkte erstellt??
    Gruß
    Patrick
    Hier das ganze Skript:

    //der-eine 05.06.2020
    //Ursprüngliches Skript: https://github.com/Pittini/iobroker-Fensterauswertung
    //Das folgende Skript wurde zum zählen von eingeschaltenen Lichtern umgeschrieben.
    //
    // V1.2.3 vom 1.4.2020
    //Script um eingeschaltene Lichter pro Raum und insgesamt zu zählen. Legt pro Raum zwei Datenpunkte an, sowie zwei Datenpunkte fürs gesamte.
    //Möglichkeit eine Ansage nach x Minuten einmalig oder zyklisch bis Fensterschließung anzugeben
    //Dynamische erzeugung einer HTML Übersichtstabelle
    //WICHTIG!!!
    //Vorraussetzungen: Den Geräten müssen Räume zugewiesen sein, sowie die Funktion "Verschluss" für jeden entsprechenden Datenpunkt zugewiesen sein.
    
    //Grundeinstellungen
    const logging = false; //Erweiterte Logs ausgeben?
    const praefix = "0_userdata.0.Lichtueberwachung."; //Grundpfad für Script DPs
    const ZeitBisNachricht = 300000 // 300000 ms = 5 Minuten
    const RepeatInfoMsg = true; // Legt fest ob Ansage einmalig oder zyklisch
    const InfoMsgAktiv = true; // Legt fest ob eine Infonachricht nach x Minuten ausgegeben werden soll
    const WelcheFunktionVerwenden = "actualLevel"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
    const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
    const UseAlexa = false; // Sollen Nachrichten via Alexa ausgegeben werden?
    const AlexaId = ""; // Die Alexa Seriennummer
    const UseMail = false; //Nachricht via Mail versenden
    const UseSay = false; // Sollen Nachrichten via Say ausgegeben werden? Authorenfunktion, sollte deaktiviert werden.
    const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
    const AlsoMsgLightOnOff = false; //Soll auch das erstmalige einschalten, sowie das ausschalten gemeldet werden?
    const LightsOnListSeparator = "<br>"; //Trennzeichen für die Textausgabe der eingeschaltenen Lichter pro Raum
    const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
    const LightIsOffWhen = ["false", "off", "0"]; // können eigene States für aus angegeben werden, immer !!! in Kleinschreibung
    
    //Einstellungen zur Tabellenausgabe
    const LightsOnImg = "/icons-mfd-svg/light_light_dim_100.svg"; //Icon eingeschaltenes Licht
    const LightOffImg = "/icons-mfd-svg/light_light.svg"; // Icon für ausgeschaltenes Licht
    const LightsOnColor = "red"; // Farbe für eingeschaltenes Licht
    const LightsOffColor = "green"; // Farbe für ausgeschaltenes Licht
    const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
    const TableDateFormat = "SS:mm:ss TT.MM.JJJJ"; //Zeit- & Datums- formatierung für Tabelle. Übersicht der Kürzel hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
    
    //Ab hier nix mehr ändern!
    
    let LightOnCount = 0; // Gesamtzahl der eingeschaltenen Lichter
    const RoomLightsOnCount = []; // Array für eingeschaltene Lichter pro Raum
    let RoomsWithLightsOn = "";
    const LightsOnMsgHandler = []; // Objektarray für timeouts pro Raum
    const Sensor = []; //Sensoren als Array anlegen
    const SensorVal = [];//Sensorwerte als Array anlegen
    const SensorOldVal = []; //Alte Sensorwerte als Array ablegen
    const Laufzeit = []; //Timer Laufzeit pro Fenster
    const RoomList = []; // Raumlisten Array
    const RoomStateTimeStamp = [];
    let z = 0; //Zähler
    let DpCount = 0; //Zähler
    const States = []; // Array mit anzulegenden Datenpunkten
    let Funktionen = getEnums('functions');
    
    
    
    for (let x in Funktionen) {        // loop ueber alle Functions
        let Funktion = Funktionen[x].name;
        if (Funktion == undefined) {
            log("Keine Funktion gefunden");
        }
        else {
            if (typeof Funktion == 'object') Funktion = Funktion.de;
            let members = Funktionen[x].members;
            if (Funktion == WelcheFunktionVerwenden) { //Wenn Function ist Licht
                for (let y in members) { // Loop über alle Licht Members
                    Sensor[y] = members[y];
                    let room = getObject(Sensor[y], 'rooms').enumNames[0];
                    if (typeof room == 'object') room = room.de;
                    //Datenpunkte pro Raum vorbereiten
                    States[DpCount] = { id: praefix + room + ".RoomLightsOnCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter im Raum", type: "number", def: 0 } };
                    DpCount++;
                    States[DpCount] = { id: praefix + room + ".IsOn", initial: false, forceCreation: false, common: { read: true, write: true, name: "Licht eingeschaltet?", type: "boolean", role: "state", def: false } }; //
                    DpCount++;
                    //log(Funktion + ': ' + room);
                    if (RoomList.indexOf(room) == -1) { //Raumliste ohne Raumduplikate erzeugen
                        RoomList[z] = room;
                        if (logging) log("Raum " + z + " = " + RoomList[z]);
                        z++;
                    };
                    RoomLightsOnCount[y] = 0; // Array mit 0 initialisieren
                    Laufzeit[y] = 0; // Array mit 0 initialisieren
                };
            };
        };
    };
    
    //Struktur anlegen in js.0 um Sollwert und Summenergebniss zu speichern
    //Generische Datenpunkte vorbereiten 
    States[DpCount] = { id: praefix + "AllLightsOff", initial: true, forceCreation: false, common: { read: true, write: true, name: "Licht aus?", type: "boolean", role: "state", def: true } }; //
    DpCount++;
    States[DpCount] = { id: praefix + "LightsOn", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter", type: "number", def: 0 } };
    DpCount++;
    States[DpCount] = { id: praefix + "RoomsWithLightsOn", initial: "Lichter in allen Räumen ausgeschalten.", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Lichter eingeschalten?", type: "string", def: "Lichter in allen Räumen ausgeschalten" } };
    DpCount++;
    States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und eingeschaltener Lichter", type: "string", def: "" } };
    
    //Alle States anlegen, Main aufrufen wenn fertig
    let numStates = States.length;
    States.forEach(function (state) {
        createState(state.id, state.initial, state.forceCreation, state.common, function () {
            numStates--;
            if (numStates === 0) {
                if (logging) log("CreateStates fertig!");
                main();
            };
        });
    });
    
    function main() {
        for (let x = 0; x < Sensor.length; x++) {
            //setTimeout(function () { // Timeout setzt refresh status wieder zurück
            SensorVal[x] = String(getState(Sensor[x]).val).toLowerCase(); // Wert von Sensor in Schleife einlesen
            SimplyfyLightStates(x);
            // }, x * 100);
        };
        CreateTrigger();
        CheckAllLights(); //Bei Scriptstart alle Lichter einlesen
        CreateOverviewTable()
    }
    
    function Meldung(msg) {
        if (UseSay) Say(msg);
        if (UseTelegram) {
            sendTo("telegram.0", "send", {
                text: msg
            });
        };
        if (UseAlexa) {
            if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
        };
        if (UseMail) {
            sendTo("email", msg);
        };
        if (logging) log("Msg= " + msg);
    }
    
    function CreateOverviewTable() { //  Erzeugt tabellarische Übersicht als HTML Tabelle    
        //Tabellenüberschrift und Head
        let OverviewTable = "";
        if (!HeadlessTable) {
            OverviewTable = "<table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption>";
            OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithLightsOn + "</th></tr></thead><tbody></tbody></table>";
        };
        //Tabelle der Raumdetails
        OverviewTable = OverviewTable + "<div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'>";
        OverviewTable = OverviewTable + "<thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody>";
    
    
        for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
            if (RoomLightsOnCount[x] > 0) { // Räume mit eingeschaltenen Lichtern
                RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOnColor + ";'><img height=40px src='" + LightsOnImg + "'></td>"
                OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:" + LightsOnColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOnColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
            }
            else { // Ausgeschaltene Räume
                RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOffColor + ";'><img height=40px src='" + LightOffImg + "'></td>"
                OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:" + LightsOffColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOffColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
    
            };
        };
        OverviewTable = OverviewTable + "</tbody></table></div>";
        setState(praefix + "OverviewTable", OverviewTable);
        //log(OverviewTable);
    }
    
    function CreateRoomsWithLightsOnList() { //Erzeugt Textliste mit Räumen welche eingeschaltene Lichter haben
        RoomsWithLightsOn = ""; //Liste Initialisieren
        for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
            if (RoomLightsOnCount[x] > 0) { // Nur Räume mit eingeschaltenen Lichtern berücksichtigen
                if (RoomLightsOnCount[x] == 1) { //Wenn 1 Licht ein, Singular Schreibweise
                    RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                }
                else { //ansonsten Plural Schreibweise
                    RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                };
            };
        };
        RoomsWithLightsOn = RoomsWithLightsOn.substr(0, RoomsWithLightsOn.length - LightsOnListSeparator.length); //letzten <br> Umbruch wieder entfernen
    
        if (RoomsWithLightsOn == "") {
            RoomsWithLightsOn = "<img width=25px height=25px style= vertical-align:-5px src=img/bulb_off.png >"+ "Alle Lichter ausgeschalten";
        };
        setState(praefix + "RoomsWithLightsOn", RoomsWithLightsOn);
        if (logging) log(RoomsWithLightsOn);
    }
    
    function GetRoom(x) { // Liefert den Raum von Sensor x
        if (logging) log("Reaching GetRoom x=" + x)
        let room = getObject(Sensor[x], 'rooms').enumNames[0];
        if (room == undefined) {
            log("Kein Raum definiert bei Sensor " + Sensor[x], 'error');
            return "Kein Raum definiert";
        };
        if (typeof room == 'object') room = room.de;
        return room;
    }
    
    function CheckLight(x) { //Für einzelnes Licht. Via Trigger angesteuert.
        let TempRoom = GetRoom(x); //Raum des aktuellen Sensors bestimmen
        let TempRoomIndex = RoomList.indexOf(TempRoom); // Raumlistenindex für aktuellen Raum bestimmen
        if (logging) log("reaching CheckLight, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
        if (SensorVal[x] == "on" && SensorOldVal[x] != "on") { //Licht war ausgeschalten und wurde eingeschalten
            LightOnCount++;
            RoomLightsOnCount[TempRoomIndex]++;
            if (logging) log("RoomLightsOnCount für " + TempRoom + "=" + RoomLightsOnCount[TempRoomIndex]);
            setState(praefix + "AllLightsOff", false);
            setState(praefix + TempRoom + ".IsOn", true);
            setState(praefix + "LightsOn", LightOnCount);
            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
    
            if (logging) log(TempRoom + " Licht eingeschalten");
            if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht eingeschaltet!");
            if (UseEventLog == true) WriteEventLog(TempRoom + " Licht eingeschaltet!");
            if (RoomLightsOnCount[TempRoomIndex] == 1) {
                Laufzeit[TempRoomIndex] = 0;
                if (InfoMsgAktiv == true) {
                    if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                        if (logging) log("Setting Interval to Room:" + TempRoom);
    
                        LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                            Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                            Meldung(TempRoom + "licht seit " + (Laufzeit[TempRoomIndex] / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                        }, ZeitBisNachricht);
                    }
                    else { // Wenn einmalige Meldung eingestellt
                        if (logging) log("Setting Timeout to Room:" + TempRoom);
    
                        LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () {
                            Meldung(TempRoom + "licht seit " + (ZeitBisNachricht / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                        }, ZeitBisNachricht);
                    };
                };
            };
        }
        else if (SensorVal[x] == "off") {
            if (LightOnCount > 0) LightOnCount--;
            if (RoomLightsOnCount[TempRoomIndex] > 0) RoomLightsOnCount[TempRoomIndex]--;
    
            setState(praefix + "LightsOn", LightOnCount);
            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
    
            log(TempRoom + " Licht ausgeschalten.");
            if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht ausgeschaltet!");
            if (UseEventLog == true) WriteEventLog(TempRoom + " Licht ausgeschaltet!");
            if (RoomLightsOnCount[TempRoomIndex] == 0) {
                setState(praefix + TempRoom + ".IsOn", false);
    
                if (RepeatInfoMsg == true) {
                    if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                    clearInterval(LightsOnMsgHandler[TempRoomIndex]);
                }
                else {
                    if (logging) log("reaching clearTimeout");
                    clearTimeout(LightsOnMsgHandler[TempRoomIndex]);
                };
            };
    
            if (LightOnCount == 0) { //Wenn kein Licht mehr eingeschalten
                setState(praefix + "AllLightsOff", true);
                setState(praefix + TempRoom + ".IsOn", false);
                log("Alle Lichter ausgeschalten.");
            };
        };
        if (logging) log("Eingeschaltene Lichter gesamt= " + LightOnCount);
        CreateRoomsWithLightsOnList();
        CreateOverviewTable();
    }
    
    function CheckAllLights() { //Prüft bei Programmstart alle Lichter
        for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
            let TempRoom = GetRoom(x);
            let TempRoomIndex = RoomList.indexOf(TempRoom);
            if (SensorVal[x] == "on") { //Licht ist eingeschalten
                LightOnCount = LightOnCount + 1;
                RoomLightsOnCount[TempRoomIndex] = RoomLightsOnCount[TempRoomIndex] + 1;
                if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomLightsOnCount= " + RoomLightsOnCount[TempRoomIndex]);
    
                setState(praefix + "AllLightsOff", false);
                setState(praefix + "LightsOn", LightOnCount);
    
                setState(praefix + TempRoom + ".IsOn", true);
                setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                if (InfoMsgAktiv == true && RoomLightsOnCount[RoomList.indexOf(TempRoom)] == 1) {
                    if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                        if (logging) log("Setting Interval at initialization to Room: " + TempRoom);
                        LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                            Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                            Meldung(TempRoom + "licht seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten eingeschalten!");
                        }, ZeitBisNachricht);
                    }
                    else {
                        if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
    
                        LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                            Meldung(TempRoom + "licht seit " + ZeitBisNachricht / 1000 / 60 + " Minuten eingeschalten!");
                        }, ZeitBisNachricht);
                    };
                };
                if (logging) log(TempRoom + " Licht = eingeschalten");
            }
            else if (SensorVal[x] == "off") {
                //RoomLightsOnCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomLightsOnCount").val - 1;
                RoomLightsOnCount[TempRoomIndex]--;
                if (RoomLightsOnCount[TempRoomIndex] < 0) RoomLightsOnCount[TempRoomIndex] = 0;
                setState(praefix + TempRoom + ".IsOn", false);
                setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                //log(TempRoom + " Fenster = geschlossen.");
            };
        };
        if (LightOnCount == 0) {
            setState(praefix + "AllLightsOff", true);
            setState(praefix + "LightsOn", LightOnCount);
    
            log("Alle Lichter ausgeschalten.");
        };
        CreateRoomsWithLightsOnList();
    }
    
    function SimplyfyLightStates(x) { //Die verschiedenen Gerätestates zu on oder off vereinfachen
        //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
        if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
            SensorVal[x] = "on";
        }
        else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
            SensorVal[x] = "off";
        };
    
        if (SensorVal[x] != "on" && SensorVal[x] != "off") { // Suche in Lichtereinarray und Lichterausarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
            log("Unknown Lightstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
            SensorVal[x] = "unknown";
        };
    
        if (LightIsOnWhen.indexOf(SensorOldVal[x]) != -1) {
            SensorOldVal[x] = "on";
        }
        else if (LightIsOffWhen.indexOf(SensorOldVal[x]) != -1) {
            SensorOldVal[x] = "off";
        };
    }
    
    function CreateTrigger() {
        //Trigger für Sensoren erzeugen
        for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
            on(Sensor[x], function (dp) { //Trigger in Schleife erstellen
                if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val);
                if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
                    SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                    SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                    SimplyfyLightStates(x);
                    CheckLight(x);
                }
                else {
                    log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error");
                };
            });
        };
    
        onStop(function () { //Bei Scriptende alle Timer löschen
            for (let x = 1; x < Sensor.length; x++) {
                if (RoomLightsOnCount[x] == 0) {
                    if (RepeatInfoMsg == true) {
                        clearInterval(LightsOnMsgHandler[x]);
                    }
                    else {
                        clearTimeout(LightsOnMsgHandler[x]);
                    };
                };
    
            };
        }, 100);
    }
    
    

    Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
    Wago PFC200 mit Dali Lichtsteuerung.

    mickymM 1 Antwort Letzte Antwort
    0
    • M marsmännchen

      Hallo zusammen.

      Ich habe vor längerer Zeit ein Skript gefunden welches vom Skript: https://github.com/Pittini/iobroker-Fensterauswertung
      abgewandelt wurde.
      Ich habe es auf meine Bedürfnisse angepasst und bin auch recht zufrieden damit.
      Das Problem ist nur das es keine gedimmten Lampen erkennt.
      Es wird in Zeile 27 als String definiert was als Eingeschaltet gilt:

      const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
      

      Wie könnte ich erreichen das das licht schon bei >0 als ON erkannt wird?
      Würde das mit wenig Aufwand in dem Skript gelingen oder brauche ich ein zweites Skript welches mir wieder eigene Datenpunkte erstellt??
      Gruß
      Patrick
      Hier das ganze Skript:

      //der-eine 05.06.2020
      //Ursprüngliches Skript: https://github.com/Pittini/iobroker-Fensterauswertung
      //Das folgende Skript wurde zum zählen von eingeschaltenen Lichtern umgeschrieben.
      //
      // V1.2.3 vom 1.4.2020
      //Script um eingeschaltene Lichter pro Raum und insgesamt zu zählen. Legt pro Raum zwei Datenpunkte an, sowie zwei Datenpunkte fürs gesamte.
      //Möglichkeit eine Ansage nach x Minuten einmalig oder zyklisch bis Fensterschließung anzugeben
      //Dynamische erzeugung einer HTML Übersichtstabelle
      //WICHTIG!!!
      //Vorraussetzungen: Den Geräten müssen Räume zugewiesen sein, sowie die Funktion "Verschluss" für jeden entsprechenden Datenpunkt zugewiesen sein.
      
      //Grundeinstellungen
      const logging = false; //Erweiterte Logs ausgeben?
      const praefix = "0_userdata.0.Lichtueberwachung."; //Grundpfad für Script DPs
      const ZeitBisNachricht = 300000 // 300000 ms = 5 Minuten
      const RepeatInfoMsg = true; // Legt fest ob Ansage einmalig oder zyklisch
      const InfoMsgAktiv = true; // Legt fest ob eine Infonachricht nach x Minuten ausgegeben werden soll
      const WelcheFunktionVerwenden = "actualLevel"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
      const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
      const UseAlexa = false; // Sollen Nachrichten via Alexa ausgegeben werden?
      const AlexaId = ""; // Die Alexa Seriennummer
      const UseMail = false; //Nachricht via Mail versenden
      const UseSay = false; // Sollen Nachrichten via Say ausgegeben werden? Authorenfunktion, sollte deaktiviert werden.
      const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
      const AlsoMsgLightOnOff = false; //Soll auch das erstmalige einschalten, sowie das ausschalten gemeldet werden?
      const LightsOnListSeparator = "<br>"; //Trennzeichen für die Textausgabe der eingeschaltenen Lichter pro Raum
      const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
      const LightIsOffWhen = ["false", "off", "0"]; // können eigene States für aus angegeben werden, immer !!! in Kleinschreibung
      
      //Einstellungen zur Tabellenausgabe
      const LightsOnImg = "/icons-mfd-svg/light_light_dim_100.svg"; //Icon eingeschaltenes Licht
      const LightOffImg = "/icons-mfd-svg/light_light.svg"; // Icon für ausgeschaltenes Licht
      const LightsOnColor = "red"; // Farbe für eingeschaltenes Licht
      const LightsOffColor = "green"; // Farbe für ausgeschaltenes Licht
      const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
      const TableDateFormat = "SS:mm:ss TT.MM.JJJJ"; //Zeit- & Datums- formatierung für Tabelle. Übersicht der Kürzel hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
      
      //Ab hier nix mehr ändern!
      
      let LightOnCount = 0; // Gesamtzahl der eingeschaltenen Lichter
      const RoomLightsOnCount = []; // Array für eingeschaltene Lichter pro Raum
      let RoomsWithLightsOn = "";
      const LightsOnMsgHandler = []; // Objektarray für timeouts pro Raum
      const Sensor = []; //Sensoren als Array anlegen
      const SensorVal = [];//Sensorwerte als Array anlegen
      const SensorOldVal = []; //Alte Sensorwerte als Array ablegen
      const Laufzeit = []; //Timer Laufzeit pro Fenster
      const RoomList = []; // Raumlisten Array
      const RoomStateTimeStamp = [];
      let z = 0; //Zähler
      let DpCount = 0; //Zähler
      const States = []; // Array mit anzulegenden Datenpunkten
      let Funktionen = getEnums('functions');
      
      
      
      for (let x in Funktionen) {        // loop ueber alle Functions
          let Funktion = Funktionen[x].name;
          if (Funktion == undefined) {
              log("Keine Funktion gefunden");
          }
          else {
              if (typeof Funktion == 'object') Funktion = Funktion.de;
              let members = Funktionen[x].members;
              if (Funktion == WelcheFunktionVerwenden) { //Wenn Function ist Licht
                  for (let y in members) { // Loop über alle Licht Members
                      Sensor[y] = members[y];
                      let room = getObject(Sensor[y], 'rooms').enumNames[0];
                      if (typeof room == 'object') room = room.de;
                      //Datenpunkte pro Raum vorbereiten
                      States[DpCount] = { id: praefix + room + ".RoomLightsOnCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter im Raum", type: "number", def: 0 } };
                      DpCount++;
                      States[DpCount] = { id: praefix + room + ".IsOn", initial: false, forceCreation: false, common: { read: true, write: true, name: "Licht eingeschaltet?", type: "boolean", role: "state", def: false } }; //
                      DpCount++;
                      //log(Funktion + ': ' + room);
                      if (RoomList.indexOf(room) == -1) { //Raumliste ohne Raumduplikate erzeugen
                          RoomList[z] = room;
                          if (logging) log("Raum " + z + " = " + RoomList[z]);
                          z++;
                      };
                      RoomLightsOnCount[y] = 0; // Array mit 0 initialisieren
                      Laufzeit[y] = 0; // Array mit 0 initialisieren
                  };
              };
          };
      };
      
      //Struktur anlegen in js.0 um Sollwert und Summenergebniss zu speichern
      //Generische Datenpunkte vorbereiten 
      States[DpCount] = { id: praefix + "AllLightsOff", initial: true, forceCreation: false, common: { read: true, write: true, name: "Licht aus?", type: "boolean", role: "state", def: true } }; //
      DpCount++;
      States[DpCount] = { id: praefix + "LightsOn", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter", type: "number", def: 0 } };
      DpCount++;
      States[DpCount] = { id: praefix + "RoomsWithLightsOn", initial: "Lichter in allen Räumen ausgeschalten.", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Lichter eingeschalten?", type: "string", def: "Lichter in allen Räumen ausgeschalten" } };
      DpCount++;
      States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und eingeschaltener Lichter", type: "string", def: "" } };
      
      //Alle States anlegen, Main aufrufen wenn fertig
      let numStates = States.length;
      States.forEach(function (state) {
          createState(state.id, state.initial, state.forceCreation, state.common, function () {
              numStates--;
              if (numStates === 0) {
                  if (logging) log("CreateStates fertig!");
                  main();
              };
          });
      });
      
      function main() {
          for (let x = 0; x < Sensor.length; x++) {
              //setTimeout(function () { // Timeout setzt refresh status wieder zurück
              SensorVal[x] = String(getState(Sensor[x]).val).toLowerCase(); // Wert von Sensor in Schleife einlesen
              SimplyfyLightStates(x);
              // }, x * 100);
          };
          CreateTrigger();
          CheckAllLights(); //Bei Scriptstart alle Lichter einlesen
          CreateOverviewTable()
      }
      
      function Meldung(msg) {
          if (UseSay) Say(msg);
          if (UseTelegram) {
              sendTo("telegram.0", "send", {
                  text: msg
              });
          };
          if (UseAlexa) {
              if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
          };
          if (UseMail) {
              sendTo("email", msg);
          };
          if (logging) log("Msg= " + msg);
      }
      
      function CreateOverviewTable() { //  Erzeugt tabellarische Übersicht als HTML Tabelle    
          //Tabellenüberschrift und Head
          let OverviewTable = "";
          if (!HeadlessTable) {
              OverviewTable = "<table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption>";
              OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithLightsOn + "</th></tr></thead><tbody></tbody></table>";
          };
          //Tabelle der Raumdetails
          OverviewTable = OverviewTable + "<div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'>";
          OverviewTable = OverviewTable + "<thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody>";
      
      
          for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
              if (RoomLightsOnCount[x] > 0) { // Räume mit eingeschaltenen Lichtern
                  RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                  OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOnColor + ";'><img height=40px src='" + LightsOnImg + "'></td>"
                  OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:" + LightsOnColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                  OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOnColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
              }
              else { // Ausgeschaltene Räume
                  RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                  OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOffColor + ";'><img height=40px src='" + LightOffImg + "'></td>"
                  OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:" + LightsOffColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                  OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOffColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
      
              };
          };
          OverviewTable = OverviewTable + "</tbody></table></div>";
          setState(praefix + "OverviewTable", OverviewTable);
          //log(OverviewTable);
      }
      
      function CreateRoomsWithLightsOnList() { //Erzeugt Textliste mit Räumen welche eingeschaltene Lichter haben
          RoomsWithLightsOn = ""; //Liste Initialisieren
          for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
              if (RoomLightsOnCount[x] > 0) { // Nur Räume mit eingeschaltenen Lichtern berücksichtigen
                  if (RoomLightsOnCount[x] == 1) { //Wenn 1 Licht ein, Singular Schreibweise
                      RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                  }
                  else { //ansonsten Plural Schreibweise
                      RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                  };
              };
          };
          RoomsWithLightsOn = RoomsWithLightsOn.substr(0, RoomsWithLightsOn.length - LightsOnListSeparator.length); //letzten <br> Umbruch wieder entfernen
      
          if (RoomsWithLightsOn == "") {
              RoomsWithLightsOn = "<img width=25px height=25px style= vertical-align:-5px src=img/bulb_off.png >"+ "Alle Lichter ausgeschalten";
          };
          setState(praefix + "RoomsWithLightsOn", RoomsWithLightsOn);
          if (logging) log(RoomsWithLightsOn);
      }
      
      function GetRoom(x) { // Liefert den Raum von Sensor x
          if (logging) log("Reaching GetRoom x=" + x)
          let room = getObject(Sensor[x], 'rooms').enumNames[0];
          if (room == undefined) {
              log("Kein Raum definiert bei Sensor " + Sensor[x], 'error');
              return "Kein Raum definiert";
          };
          if (typeof room == 'object') room = room.de;
          return room;
      }
      
      function CheckLight(x) { //Für einzelnes Licht. Via Trigger angesteuert.
          let TempRoom = GetRoom(x); //Raum des aktuellen Sensors bestimmen
          let TempRoomIndex = RoomList.indexOf(TempRoom); // Raumlistenindex für aktuellen Raum bestimmen
          if (logging) log("reaching CheckLight, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
          if (SensorVal[x] == "on" && SensorOldVal[x] != "on") { //Licht war ausgeschalten und wurde eingeschalten
              LightOnCount++;
              RoomLightsOnCount[TempRoomIndex]++;
              if (logging) log("RoomLightsOnCount für " + TempRoom + "=" + RoomLightsOnCount[TempRoomIndex]);
              setState(praefix + "AllLightsOff", false);
              setState(praefix + TempRoom + ".IsOn", true);
              setState(praefix + "LightsOn", LightOnCount);
              setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
      
              if (logging) log(TempRoom + " Licht eingeschalten");
              if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht eingeschaltet!");
              if (UseEventLog == true) WriteEventLog(TempRoom + " Licht eingeschaltet!");
              if (RoomLightsOnCount[TempRoomIndex] == 1) {
                  Laufzeit[TempRoomIndex] = 0;
                  if (InfoMsgAktiv == true) {
                      if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                          if (logging) log("Setting Interval to Room:" + TempRoom);
      
                          LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                              Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                              Meldung(TempRoom + "licht seit " + (Laufzeit[TempRoomIndex] / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                          }, ZeitBisNachricht);
                      }
                      else { // Wenn einmalige Meldung eingestellt
                          if (logging) log("Setting Timeout to Room:" + TempRoom);
      
                          LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () {
                              Meldung(TempRoom + "licht seit " + (ZeitBisNachricht / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                          }, ZeitBisNachricht);
                      };
                  };
              };
          }
          else if (SensorVal[x] == "off") {
              if (LightOnCount > 0) LightOnCount--;
              if (RoomLightsOnCount[TempRoomIndex] > 0) RoomLightsOnCount[TempRoomIndex]--;
      
              setState(praefix + "LightsOn", LightOnCount);
              setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
      
              log(TempRoom + " Licht ausgeschalten.");
              if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht ausgeschaltet!");
              if (UseEventLog == true) WriteEventLog(TempRoom + " Licht ausgeschaltet!");
              if (RoomLightsOnCount[TempRoomIndex] == 0) {
                  setState(praefix + TempRoom + ".IsOn", false);
      
                  if (RepeatInfoMsg == true) {
                      if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                      clearInterval(LightsOnMsgHandler[TempRoomIndex]);
                  }
                  else {
                      if (logging) log("reaching clearTimeout");
                      clearTimeout(LightsOnMsgHandler[TempRoomIndex]);
                  };
              };
      
              if (LightOnCount == 0) { //Wenn kein Licht mehr eingeschalten
                  setState(praefix + "AllLightsOff", true);
                  setState(praefix + TempRoom + ".IsOn", false);
                  log("Alle Lichter ausgeschalten.");
              };
          };
          if (logging) log("Eingeschaltene Lichter gesamt= " + LightOnCount);
          CreateRoomsWithLightsOnList();
          CreateOverviewTable();
      }
      
      function CheckAllLights() { //Prüft bei Programmstart alle Lichter
          for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
              let TempRoom = GetRoom(x);
              let TempRoomIndex = RoomList.indexOf(TempRoom);
              if (SensorVal[x] == "on") { //Licht ist eingeschalten
                  LightOnCount = LightOnCount + 1;
                  RoomLightsOnCount[TempRoomIndex] = RoomLightsOnCount[TempRoomIndex] + 1;
                  if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomLightsOnCount= " + RoomLightsOnCount[TempRoomIndex]);
      
                  setState(praefix + "AllLightsOff", false);
                  setState(praefix + "LightsOn", LightOnCount);
      
                  setState(praefix + TempRoom + ".IsOn", true);
                  setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                  if (InfoMsgAktiv == true && RoomLightsOnCount[RoomList.indexOf(TempRoom)] == 1) {
                      if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                          if (logging) log("Setting Interval at initialization to Room: " + TempRoom);
                          LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                              Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                              Meldung(TempRoom + "licht seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten eingeschalten!");
                          }, ZeitBisNachricht);
                      }
                      else {
                          if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
      
                          LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                              Meldung(TempRoom + "licht seit " + ZeitBisNachricht / 1000 / 60 + " Minuten eingeschalten!");
                          }, ZeitBisNachricht);
                      };
                  };
                  if (logging) log(TempRoom + " Licht = eingeschalten");
              }
              else if (SensorVal[x] == "off") {
                  //RoomLightsOnCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomLightsOnCount").val - 1;
                  RoomLightsOnCount[TempRoomIndex]--;
                  if (RoomLightsOnCount[TempRoomIndex] < 0) RoomLightsOnCount[TempRoomIndex] = 0;
                  setState(praefix + TempRoom + ".IsOn", false);
                  setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                  //log(TempRoom + " Fenster = geschlossen.");
              };
          };
          if (LightOnCount == 0) {
              setState(praefix + "AllLightsOff", true);
              setState(praefix + "LightsOn", LightOnCount);
      
              log("Alle Lichter ausgeschalten.");
          };
          CreateRoomsWithLightsOnList();
      }
      
      function SimplyfyLightStates(x) { //Die verschiedenen Gerätestates zu on oder off vereinfachen
          //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
          if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
              SensorVal[x] = "on";
          }
          else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
              SensorVal[x] = "off";
          };
      
          if (SensorVal[x] != "on" && SensorVal[x] != "off") { // Suche in Lichtereinarray und Lichterausarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
              log("Unknown Lightstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
              SensorVal[x] = "unknown";
          };
      
          if (LightIsOnWhen.indexOf(SensorOldVal[x]) != -1) {
              SensorOldVal[x] = "on";
          }
          else if (LightIsOffWhen.indexOf(SensorOldVal[x]) != -1) {
              SensorOldVal[x] = "off";
          };
      }
      
      function CreateTrigger() {
          //Trigger für Sensoren erzeugen
          for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
              on(Sensor[x], function (dp) { //Trigger in Schleife erstellen
                  if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val);
                  if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
                      SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                      SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                      SimplyfyLightStates(x);
                      CheckLight(x);
                  }
                  else {
                      log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error");
                  };
              });
          };
      
          onStop(function () { //Bei Scriptende alle Timer löschen
              for (let x = 1; x < Sensor.length; x++) {
                  if (RoomLightsOnCount[x] == 0) {
                      if (RepeatInfoMsg == true) {
                          clearInterval(LightsOnMsgHandler[x]);
                      }
                      else {
                          clearTimeout(LightsOnMsgHandler[x]);
                      };
                  };
      
              };
          }, 100);
      }
      
      
      mickymM Offline
      mickymM Offline
      mickym
      Most Active
      schrieb am zuletzt editiert von mickym
      #2

      @marsmännchen Meines Erachtens musst Du die Bedingungen ab Zeile 325 aufbohren und in den Du eine weitere Bedingung eingibst. Ich bin aber kein JS Programmierer und habe das Script nur überflogen.

          if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
              SensorVal[x] = "on";
          }
          else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
              SensorVal[x] = "off";
          };
          else if (typeof SensorVal[x]  === "number") { // Überwachter Datenpunkt enthält nummerische Werte 
                SensorVal[x] = SensorVal[x] > 0 ? "on" : "off";
          };
      

      Wenn das aber verschiedene Zustände für an aus und den Dimmer sind, dann musst halt ein Alias nehmen, der Dir halt ein on oder off beim Lesen ausgibt:

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Antwort Letzte Antwort
      0
      Antworten
      • In einem neuen Thema antworten
      Anmelden zum Antworten
      • Älteste zuerst
      • Neuste zuerst
      • Meiste Stimmen


      Support us

      ioBroker
      Community Adapters
      Donate

      682

      Online

      32.6k

      Benutzer

      82.2k

      Themen

      1.3m

      Beiträge
      Community
      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
      ioBroker Community 2014-2025
      logo
      • Anmelden

      • Du hast noch kein Konto? Registrieren

      • Anmelden oder registrieren, um zu suchen
      • Erster Beitrag
        Letzter Beitrag
      0
      • Home
      • Aktuell
      • Tags
      • Ungelesen 0
      • Kategorien
      • Unreplied
      • Beliebt
      • GitHub
      • Docu
      • Hilfe