Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] Generisches Fensteroffenskript + Vis

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Vorlage] Generisches Fensteroffenskript + Vis

    This topic has been deleted. Only users with topic management privileges can see it.
    • sigi234
      sigi234 Forum Testing Most Active @Pittini last edited by

      @Pittini

      Ist ok....Kein Problem. Danke.😏

      1 Reply Last reply Reply Quote 0
      • T
        Turbo last edited by Turbo

        Hallo,

        Habe das Script jetzt auch mal installiert. Läuft alles, vielen Dank.
        Aaaber: bei mir kommt nicht die letzte Auf/Zu Meldung, sondern die Vorletzte. Hab eben die Balkontür aufgemacht und habe die Info von gestern Abend (schließen) drin 🤔

        39B0FDD9-DCE9-442F-9791-285FFB28EAE0.jpeg

        Edit: Hat sich erledigt, nach 5 Minuten wurde es richtig angezeigt.

        Nochmal vielen Dank.

        1 Reply Last reply Reply Quote 0
        • crunchip
          crunchip Forum Testing Most Active @sigi234 last edited by crunchip

          @sigi234 hab google dazu und auf Tür geändert

          // V1.2 vom 28.3.2020
          //Script um offene Fenster 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 = "javascript.0.Benachrichtigung.TuerUeberwachung."; //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 = "Tür"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
          const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
          const UseAlexa = true; // Sollen Nachrichten via Alexa ausgegeben werden?
          const AlexaId = "xyz"; // Die Alexa Seriennummer
          const UseSayit = true; // Sollen Nachrichten via GOOGLE ausgegeben werden?
          const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
          const OpenDoorListSeparator = "<br>"; //Trennzeichen für die Textausgabe der offenen Fenster pro Raum
          const DoorIsOpenWhen = ["true", "offen", "gekippt", "open", "tilted", "1", "2"]; // Hier können eigene States für offen angegeben werden, immer !!! in Kleinschreibung
          const DoorIsClosedWhen = ["false", "closed", "0"]; // können eigene States für geschlossen angegeben werden, immer !!! in Kleinschreibung
          
          //Einstellungen zur Tabellenausgabe
          const DoorOpenImg = "/icons-mfd-svg/fts_door_open.svg"; //Icon für Fenster offen
          const DoorCloseImg = "/icons-mfd-svg/fts_door.svg"; // Icon für Fenster geschlossen
          const OpenDoorColor = "red"; // Farbe für Fenster offen
          const ClosedDoorColor = "green"; // Farbe für Fenster geschlossen
          const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
          
          
          //Ab hier nix mehr ändern!
          
          let OpenDoorCount = 0; // Gesamtzahl der geöffneten Fenster
          const RoomOpenDoorCount = []; // Array für offene Fenster pro Raum
          let RoomsWithOpenDoors = "";
          const OpenDoorMsgHandler = []; // 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 Verschluss
                     for (let y in members) { // Loop über alle Verschluss 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 + ".RoomOpenDoorCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der geöffneten Tueren im Raum", type: "number", def: 0 } };
                         DpCount++;
                         States[DpCount] = { id: praefix + room + ".IsOpen", initial: false, forceCreation: false, common: { read: true, write: true, name: "Tueren offen?", 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++;
                         };
                         RoomOpenDoorCount[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 + "AlleTuerenZu", initial: true, forceCreation: false, common: { read: true, write: true, name: "Tuer zu?", type: "boolean", role: "state", def: true } }; //
          DpCount++;
          States[DpCount] = { id: praefix + "DoorsOpen", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der geöffneten Tuer", type: "number", def: 0 } };
          DpCount++;
          States[DpCount] = { id: praefix + "RoomsWithOpenDoors", initial: "Tueren in allen Räumen geschlossen", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Tueren geöffnet?", type: "string", def: "Tueren in allen Räumen geschlossen" } };
          DpCount++;
          States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und geöffneten Tueren", 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
                 SimplyfyDoorStates(x);
                 // }, x * 100);
             };
             CreateTrigger();
             CheckAllDoors(); //Bei Scriptstart alle Fenster einlesen
             CreateOverviewTable()
          }
          
          function Meldung(msg) {
             if (UseSayit) {
                 setState("sayit.0.tts.text",msg);
             };
             if (UseTelegram) {
                 sendTo("telegram.0", "send", {
                     text: msg
                 });
             };
             if (UseAlexa) {
                 if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
             };
             if (logging) log(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: 40px; padding-top: 10px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Fensterstatus</div></caption>";
                 OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithOpenDoors + "</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 (RoomOpenDoorCount[x] > 0) { // Räume mit offenen Fenstern
                     RoomStateTimeStamp[x] = formatDate(getState(praefix + RoomList[x] + ".IsOpen").lc, "SS:mm:ss TT.MM.JJJJ")
                     OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + OpenDoorColor + ";'><img height=40px src='" + DoorOpenImg + "'></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:" + OpenDoorColor + ";'>" + RoomOpenDoorCount[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:" + OpenDoorColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>geöffnet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                 }
                 else { // Geschlossene Räume
                     RoomStateTimeStamp[x] = formatDate(getState(praefix + RoomList[x] + ".IsOpen").lc, "SS:mm:ss TT.MM.JJJJ")
                     OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + ClosedDoorColor + ";'><img height=40px src='" + DoorCloseImg + "'></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:" + ClosedDoorColor + ";'>" + RoomOpenDoorCount[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:" + ClosedDoorColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>geschlossen: " + RoomStateTimeStamp[x] + "</div></td></tr>"
          
                 };
             };
             OverviewTable = OverviewTable + "</tbody></table></div>";
             setState(praefix + "OverviewTable", OverviewTable);
             //log(OverviewTable);
          }
          
          function CreateRoomsWithOpenDoorList() { //Erzeugt Textliste mit Räumen welche geöffnete Fenster haben
             RoomsWithOpenDoors = ""; //Liste Initialisieren
             for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                 if (RoomOpenDoorCount[x] > 0) { // Nur Räume mit offenen Fenstern berücksichtigen
                     if (RoomOpenDoorCount[x] == 1) { //Wenn 1 Fenster offen, Singular Schreibweise
                         RoomsWithOpenDoors = RoomsWithOpenDoors + RoomList[x] + " " + RoomOpenDoorCount[x] + " offene Tuer" + OpenDoorListSeparator;
                     }
                     else { //ansonsten Plural Schreibweise
                         RoomsWithOpenDoors = RoomsWithOpenDoors + RoomList[x] + " " + RoomOpenDoorCount[x] + " offene Tueren" + OpenDoorListSeparator;
                     };
                 };
             };
             RoomsWithOpenDoors = RoomsWithOpenDoors.substr(0, RoomsWithOpenDoors.length - OpenDoorListSeparator.length); //letzten <br> Umbruch wieder entfernen
          
             if (RoomsWithOpenDoors == "") {
                 RoomsWithOpenDoors = "Alle Tueren sind geschlossen";
             };
             setState(praefix + "RoomsWithOpenDoors", RoomsWithOpenDoors);
             if (logging) log(RoomsWithOpenDoors);
          }
          
          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 CheckDoor(x) { //Für einzelnes Fenster. 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 CheckDoor, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
             if (SensorVal[x] == "open" && SensorOldVal[x] != "open") { //Fenster war geschlossen und wurde geöffnet
                 OpenDoorCount++;
                 RoomOpenDoorCount[TempRoomIndex]++;
                 if (logging) log("RoomOpenDoorCount für " + TempRoom + "=" + RoomOpenDoorCount[TempRoomIndex]);
                 setState(praefix + "AlleTuerenZu", false);
                 setState(praefix + TempRoom + ".IsOpen", true);
                 setState(praefix + "DoorsOpen", OpenDoorCount);
                 setState(praefix + TempRoom + ".RoomOpenDoorCount", RoomOpenDoorCount[TempRoomIndex]);
          
                 if (logging) log(TempRoom + " Tuer geöffnet");
                 if (UseEventLog == true) WriteEventLog(TempRoom + " Tuer geöffnet!");
                 if (RoomOpenDoorCount[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);
          
                             OpenDoorMsgHandler[TempRoomIndex] = setInterval(function () {
                                 Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                 Meldung(TempRoom + "tuer seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten geöffnet!");
                             }, ZeitBisNachricht);
                         }
                         else { // Wenn einmalige Meldung eingestellt
                             if (logging) log("Setting Timeout to Room:" + TempRoom);
          
                             OpenDoorMsgHandler[TempRoomIndex] = setTimeout(function () {
                                 Meldung(TempRoom + "tuer seit " + ZeitBisNachricht / 1000 / 60 + " Minuten geöffnet!");
                             }, ZeitBisNachricht);
                         };
                     };
                 };
             }
             else if (SensorVal[x] == "closed") {
                 if (OpenDoorCount > 0) OpenDoorCount--;
                 if (RoomOpenDoorCount[TempRoomIndex] > 0) RoomOpenDoorCount[TempRoomIndex]--;
          
                 setState(praefix + "DoorsOpen", OpenDoorCount);
                 setState(praefix + TempRoom + ".RoomOpenDoorCount", RoomOpenDoorCount[TempRoomIndex]);
          
                 log(TempRoom + " Tuer geschlossen.");
                 if (UseEventLog == true) WriteEventLog(TempRoom + " Tuer geschlossen!");
                 if (RoomOpenDoorCount[TempRoomIndex] == 0) {
                     setState(praefix + TempRoom + ".IsOpen", false);
          
                     if (RepeatInfoMsg == true) {
                         if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                         clearInterval(OpenDoorMsgHandler[TempRoomIndex]);
                     }
                     else {
                         if (logging) log("reaching clearTimeout");
                         clearTimeout(OpenDoorMsgHandler[TempRoomIndex]);
                     };
                 };
          
                 if (OpenDoorCount == 0) { //Wenn kein Fenster mehr offen
                     setState(praefix + "AlleTuerenZu", true);
                     setState(praefix + TempRoom + ".IsOpen", false);
                     log("Alle Tueren geschlossen.");
                 };
             };
             if (logging) log("Offene Tueren gesamt= " + OpenDoorCount);
             CreateRoomsWithOpenDoorList();
             CreateOverviewTable();
          }
          
          function CheckAllDoors() { //Prüft bei Programmstart alle Fenster
             for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                 let TempRoom = GetRoom(x);
                 let TempRoomIndex = RoomList.indexOf(TempRoom);
                 if (SensorVal[x] == "open") { //Fenster is offen
                     OpenDoorCount = OpenDoorCount + 1;
                     RoomOpenDoorCount[TempRoomIndex] = RoomOpenDoorCount[TempRoomIndex] + 1;
                     if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomOpenDoorcount= " + RoomOpenDoorCount[TempRoomIndex]);
          
                     setState(praefix + "AlleTuerenZu", false);
                     setState(praefix + "DoorsOpen", OpenDoorCount);
          
                     setState(praefix + TempRoom + ".IsOpen", true);
                     setState(praefix + TempRoom + ".RoomOpenDoorCount", RoomOpenDoorCount[TempRoomIndex]);
                     if (InfoMsgAktiv == true && RoomOpenDoorCount[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);
                             OpenDoorMsgHandler[TempRoomIndex] = setInterval(function () {
                                 Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                 Meldung(TempRoom + "tuer seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten geöffnet!");
                             }, ZeitBisNachricht);
                         }
                         else {
                             if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
          
                             OpenDoorMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                                 Meldung(TempRoom + "tuer seit " + ZeitBisNachricht / 1000 / 60 + " Minuten geöffnet!");
                             }, ZeitBisNachricht);
                         };
                     };
                     if (logging) log(TempRoom + " Tuer = geöffnet");
                 }
                 else if (SensorVal[x] == "closed") {
                     //RoomOpenDoorCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomOpenDoorCount").val - 1;
                     RoomOpenDoorCount[TempRoomIndex]--;
                     if (RoomOpenDoorCount[TempRoomIndex] < 0) RoomOpenDoorCount[TempRoomIndex] = 0;
                     setState(praefix + TempRoom + ".IsOpen", false);
                     setState(praefix + TempRoom + ".RoomOpenDoorCount", RoomOpenDoorCount[TempRoomIndex]);
                     //log(TempRoom + " Fenster = geschlossen.");
                 };
             };
             if (OpenDoorCount == 0) {
                 setState(praefix + "AlleTuerenZu", true);
                 setState(praefix + "DoorsOpen", OpenDoorCount);
          
                 log("Alle Tueren geschlossen.");
             };
             CreateRoomsWithOpenDoorList();
          }
          
          function SimplyfyDoorStates(x) { //Die verschiedenen Gerätestates zu open oder close vereinfachen
             //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
             if (DoorIsOpenWhen.indexOf(SensorVal[x]) != -1) { // Suche in Fensteroffenarray, wenn gefunden, Status auf open setzen
                 SensorVal[x] = "open";
             }
             else if (DoorIsClosedWhen.indexOf(SensorVal[x]) != -1) { // Suche in Fenstergeschlossenarray, wenn gefunden, Status auf closed setzen
                 SensorVal[x] = "closed";
             };
          
             if (SensorVal[x] != "open" && SensorVal[x] != "closed") { // Suche in Fensteroffenarray und Fenstergeschlossenarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
                 log("Unknown Doorstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
                 SensorVal[x] = "unknown";
             };
          
             if (DoorIsOpenWhen.indexOf(SensorOldVal[x]) != -1) {
                 SensorOldVal[x] = "open";
             }
             else if (DoorIsClosedWhen.indexOf(SensorOldVal[x]) != -1) {
                 SensorOldVal[x] = "closed";
             };
          }
          
          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
                         SimplyfyDoorStates(x);
                         CheckDoor(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 (RoomOpenDoorCount[x] == 0) {
                         if (RepeatInfoMsg == true) {
                             clearInterval(OpenDoorMsgHandler[x]);
                         }
                         else {
                             clearTimeout(OpenDoorMsgHandler[x]);
                         };
                     };
          
                 };
             }, 100);
          }
          

          1 Reply Last reply Reply Quote 0
          • P
            Pittini Developer last edited by

            Wens interessiert, ähhlich aufgebautes Baterieüberwachungsskript mit vielen Features is jetzt auch online:

            Forumthread:
            https://forum.iobroker.net/topic/31676/vorlage-generische-batteriestandsüberwachung-vis-ausgabe

            Git:
            https://github.com/Pittini/iobroker-Batterienauswertung

            1 Reply Last reply Reply Quote 1
            • M
              michihorn last edited by

              Hallöchen habe Deine letzte Version am laufen, ich bekomme aber keine Telegram Nachrichten gesendet.
              Zeile 15 ist auf True und 119 habe ich die Instanz auf 1 angepasst
              Gruß
              Michael

              P 1 Reply Last reply Reply Quote 0
              • P
                Pittini Developer @michihorn last edited by Pittini

                @michihorn sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                bekomme aber keine Telegram Nachrichten gesendet.

                Logging in den Optionen aktivieren. Fenster aufmachen, die eingestellte Wartezeit warten, ins log schauen. Is dort dann ne Meldung zu finden, liegts an Deinem Telegram (oder Du hast beim Ändern der Instanz z.B. versehentlich nen Punkt weggemacht). Wenn nicht, nochmal hier melden und das log posten, sowie nen Screenshot Deiner Einstellungen.

                1 Reply Last reply Reply Quote 0
                • T
                  Tirador last edited by Tirador

                  @Pittini Vielen Dank für das schöne Skript.

                  Was mir noch fehlt:

                  Kannst Du bitte in deinem Skript oben im Kommentar einen Link auf die Github Seite und das IOBroker Forum machen.
                  Ich schaue zyklisch alle Skripte aus dem Forum durch und versuche dann updzudaten.
                  Ein Link im Skript ist hilfreich, damit ich die Informationen nicht redundant vorhalten muss.

                  Toll wären auch Datenpunkte für diejenigen Fenster, die länger offen sind.

                  Eine Unterscheidung zwischen Fenstern und Türen in den States.
                  Hintergrund: Bei mir ist es kritischer, wenn eine Tür offen ist, statt ein Fenster auf Kipp.
                  Ich habe leider keine Sensoren, die gekippt und offen unterscheiden können.

                  P 1 Reply Last reply Reply Quote 0
                  • P
                    Pittini Developer @Tirador last edited by

                    @Tirador sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                    Was mir noch fehlt:
                    Kannst Du bitte in deinem Skript oben im Kommentar einen Link auf die Github Seite und das IOBroker Forum machen.

                    Kann ich mit dem nächsten update reinmachen kein Problem.

                    Toll wären auch Datenpunkte für diejenigen Fenster, die länger offen sind.

                    Das Skript basiert auf Räumen, nicht auf einzelne Fenster. Ich wüßte auch nicht was in diesen Datenpunkten rein solllte? Weißt Du denn nicht welche Fenster Du in Deinen Räumen hast?
                    Sollte es um reine Zeitangaben gehen, gugg Dir mal das heutige Update an, da wird jetzt die offen/geschlossen Zeit berechnet statt nur den Timestamp anzugeben, evtl. genügt Dir das ja schon.

                    Eine Unterscheidung zwischen Fenstern und Türen in den States.

                    Gleiches Thema wie oben, das Skript ist Raumbasiert. Es steht Dir aber natürlich frei auch Türen als "Verschluss" zu definieren, dann werden die mitberücksichtigt. Der Begriff Fenster taucht ohnehin nur noch im (abschaltbaren) Header auf.

                    1 Reply Last reply Reply Quote 0
                    • P
                      Pittini Developer last edited by

                      Update 1.3.0 auf Git

                      9.4.20 (V 1.3.0)

                      • Add: Unterstriche werden in Meldungen nun als Leerzeichen ausgegeben. Ae, ue, oe, wird in Meldungen nun als ä, ü, ö ausgegeben.
                      • Change: offen/geschlossen Zeiten werden nicht mehr als Zeitstempel angezeigt sondern die jeweilige Dauer berechnet und minütlich aktualisiert.
                      • Add: Pro Raum konfigurierbare Lüftungsempfehlung integriert. Bei Skriptneustarts wird bereits vorhandene geschlossen Zeit berücksichtigt.
                      • Change: Tabellenfarben jetzt heller / freundlicher.
                      • Fix: Ignorieren von geöffneten Fenstern bei Skriptstart behoben, wenn diese in einem Raum mit mehreren/zweiflügeligen Fenstern waren und das geöffnete Fenster in der Aufzählung vor dem geschlossenen gelistet war.

                      fensteroffentut2b.png

                      sigi234 Dominik F. O 3 Replies Last reply Reply Quote 1
                      • sigi234
                        sigi234 Forum Testing Most Active @Pittini last edited by

                        @Pittini

                        Nach update:

                        Screenshot (2277).png

                        P 1 Reply Last reply Reply Quote 0
                        • Dominik F.
                          Dominik F. @Pittini last edited by

                          @Pittini

                          Ich hab mal die Farben von dem CSS von Uhula rausgesucht, vielleicht wäre es ja interessant die mit deinen Farben zu ersetzen. Für die, die kein CSS von Uhula nutzen ist es egal, für die die es nutzen vielleicht interessant weil sich die Farben dann nicht mehr unterscheiden .

                          const OpenWindowColor = "#f44336"; // Farbe für Fenster offen
                          const ClosedWindowColor = "#4caf50"; // Farbe für Fenster geschlossen
                          const VentWarnColor = "#ffeb3b"; // Farbe für Fenster geschlossen
                          
                          1 Reply Last reply Reply Quote 1
                          • P
                            Pittini Developer @sigi234 last edited by

                            @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                            Nach update:

                            Hmm, seltsam, daran hab ich gar nix geändert seit der letzen Version. Schau mal Zeile 168+169 und spiel mit den height und padding top / bottom Angaben.
                            Hast Du irgendwelche speziellen CSS Sachen in Deinem Projekt?

                            @all Hat noch wer das Problem?

                            sigi234 Dominik F. 2 Replies Last reply Reply Quote 0
                            • sigi234
                              sigi234 Forum Testing Most Active @Pittini last edited by sigi234

                              @Pittini sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                              Hast Du irgendwelche speziellen CSS Sachen in Deinem Projekt?

                              Ja, Uhula CSS

                              Geht jetzt mit
                              height: 30px; text-align:center; padding-top: 1px

                              P 1 Reply Last reply Reply Quote 0
                              • Dominik F.
                                Dominik F. @Pittini last edited by

                                @Pittini

                                Ja, bei mir siehts genauso aus wie bei sigi234. Nutze auch Uhula CSS.

                                1 Reply Last reply Reply Quote 0
                                • P
                                  Pittini Developer @sigi234 last edited by Pittini

                                  @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                  Ja, Uhula CSS

                                  Bestätigt, liegt am MD von Uhula, muß mal guggen was da reinfunkt.

                                  Geht jetzt mit
                                  height: 30px; text-align:center; padding-top: 1px

                                  Super, werd trotzdem guggen dass das im nächsten fix auch mit dem MD2 direkt läuft.

                                  sigi234 1 Reply Last reply Reply Quote 0
                                  • sigi234
                                    sigi234 Forum Testing Most Active @Pittini last edited by sigi234

                                    @Pittini sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                    @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                    Ja, Uhula CSS

                                    Bestätigt, liegt am MD von Uhula, muß mal guggen was da reinfunkt.

                                    Geht jetzt mit
                                    height: 30px; text-align:center; padding-top: 1px

                                    Super, werd trotzdem guggen dass das im nächsten fix auch mit dem MD2 direkt läuft.

                                    Danke, cool wären noch Optionen für:

                                    Font-color + Font-Family + Font-size 😀

                                    P 2 Replies Last reply Reply Quote 0
                                    • P
                                      Pittini Developer @sigi234 last edited by

                                      @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                      Danke, cool wären noch Optionen für:
                                      Font-color + Font-Family + Font-size

                                      Font-color > ja; Font-Family > mal guggen; Font-size > schwierig, das blickt ja keiner mehr da 3 verschiedene Größen verwendet werden (0,7em, 0,8em und 1,1em), d.h. es müßte dann auch 3 verschiedene Angaben geben.
                                      Mal sehen, vieleicht regel ich das insgesamt via Styles in denen man das einstellen kann.

                                      1 Reply Last reply Reply Quote 0
                                      • P
                                        Pittini Developer @sigi234 last edited by

                                        @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                        Danke, cool wären noch Optionen für:
                                        Font-color + Font-Family + Font-size

                                        Hab ich gestern Nacht gar nicht dran gedacht, Font-Color und Font-Family hatte ich extra nicht gesetzt damit man das direkt im HTML Widget setzen kann.

                                        sigi234 1 Reply Last reply Reply Quote 0
                                        • sigi234
                                          sigi234 Forum Testing Most Active @Pittini last edited by

                                          @Pittini sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                          @sigi234 sagte in [Vorlage] Generisches Fensteroffenskript + Vis:

                                          Danke, cool wären noch Optionen für:
                                          Font-color + Font-Family + Font-size

                                          Hab ich gestern Nacht gar nicht dran gedacht, Font-Color und Font-Family hatte ich extra nicht gesetzt damit man das direkt im HTML Widget setzen kann.

                                          Ja, auch gerade getestet, habe im Skript gesucht.

                                          1 Reply Last reply Reply Quote 0
                                          • sigi234
                                            sigi234 Forum Testing Most Active @Pittini last edited by sigi234

                                            @Pittini

                                            Cool wären noch:

                                            Anzeige wie lange das Fenster geöffnet wurde.
                                            Eine Liste als Log in einen DP ? ( Als Table?)

                                            Kennst du das Raumklima Skript?

                                            Screenshot (2288).png

                                            https://forum.iobroker.net/topic/2313/skript-absolute-feuchte-berechnen/450

                                            P 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            844
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript monitoring template
                                            81
                                            768
                                            172519
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo