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. Anfängerfrage: Eigener Alarmlogger

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.6k

Anfängerfrage: Eigener Alarmlogger

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
13 Beiträge 3 Kommentatoren 579 Aufrufe 1 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.
  • S Offline
    S Offline
    seyav
    schrieb am zuletzt editiert von seyav
    #1

    Hallo zusammen,
    Vorerst Mal bitte ich um Erbarmen. Bin wirklich ein Anfänger. Ich möchte gerne gewisse Ereignisse im vis HTML Widget anzeigen. Dazu wollte ich wie folgt vorgehen:

    function machwas(InZahl)
    {
        log(InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val));
        setState('0_userdata.0.Sicherheit.sAlarmLogHistory', InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val), false);
    }
    

    Nun der Test mit folgenden Werten:
    machwas("1");
    machwas("2");
    machwas("3");
    machwas("4");

    ergibt im Objekt sAlarmLogHistory nur den letzten Wert ("4</br>") und nicht wie erwartet die vorherigen Werte im String.
    Wie mache ich es, dass im Objekt sAlarmLogHistory "1</br>2</br>3</br>4</br>" steht?

    UncleSamU paul53P 2 Antworten Letzte Antwort
    0
    • S seyav

      Hallo zusammen,
      Vorerst Mal bitte ich um Erbarmen. Bin wirklich ein Anfänger. Ich möchte gerne gewisse Ereignisse im vis HTML Widget anzeigen. Dazu wollte ich wie folgt vorgehen:

      function machwas(InZahl)
      {
          log(InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val));
          setState('0_userdata.0.Sicherheit.sAlarmLogHistory', InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val), false);
      }
      

      Nun der Test mit folgenden Werten:
      machwas("1");
      machwas("2");
      machwas("3");
      machwas("4");

      ergibt im Objekt sAlarmLogHistory nur den letzten Wert ("4</br>") und nicht wie erwartet die vorherigen Werte im String.
      Wie mache ich es, dass im Objekt sAlarmLogHistory "1</br>2</br>3</br>4</br>" steht?

      UncleSamU Offline
      UncleSamU Offline
      UncleSam
      Developer
      schrieb am zuletzt editiert von UncleSam
      #2

      Was gibt denn das Log aus?

      Ein Zeilenumbruch in HTML ist <br/>. Du hast die falsche Reihenfolge erwischt.

      Und zudem: wenn schon wäre der Wert nach deiner Reihe: 4</br>3</br>... Da du ja Werte immer vorne dran hängst.

      Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
      ♡-lichen Dank an meine Sponsoren

      S 1 Antwort Letzte Antwort
      0
      • S seyav

        Hallo zusammen,
        Vorerst Mal bitte ich um Erbarmen. Bin wirklich ein Anfänger. Ich möchte gerne gewisse Ereignisse im vis HTML Widget anzeigen. Dazu wollte ich wie folgt vorgehen:

        function machwas(InZahl)
        {
            log(InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val));
            setState('0_userdata.0.Sicherheit.sAlarmLogHistory', InZahl + "</br> "+ String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val), false);
        }
        

        Nun der Test mit folgenden Werten:
        machwas("1");
        machwas("2");
        machwas("3");
        machwas("4");

        ergibt im Objekt sAlarmLogHistory nur den letzten Wert ("4</br>") und nicht wie erwartet die vorherigen Werte im String.
        Wie mache ich es, dass im Objekt sAlarmLogHistory "1</br>2</br>3</br>4</br>" steht?

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #3

        @seyav
        An die Funktion machwas(InZahl) wird nur eine Zahl übergeben und innerhalb der Funktion auch nur ausgewertet. Weshalb sollten 4 Zahlen im Datenpunkt stehen ?

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        S 1 Antwort Letzte Antwort
        0
        • UncleSamU UncleSam

          Was gibt denn das Log aus?

          Ein Zeilenumbruch in HTML ist <br/>. Du hast die falsche Reihenfolge erwischt.

          Und zudem: wenn schon wäre der Wert nach deiner Reihe: 4</br>3</br>... Da du ja Werte immer vorne dran hängst.

          S Offline
          S Offline
          seyav
          schrieb am zuletzt editiert von
          #4

          @UncleSam Reihenfolge: Hast Du recht. Der log ist:

          19:31:16.560	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 1</br>
          19:31:16.561	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 2</br>
          19:31:16.562	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 3</br>
          19:31:16.563	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 4</br>
          
          UncleSamU paul53P 2 Antworten Letzte Antwort
          0
          • S seyav

            @UncleSam Reihenfolge: Hast Du recht. Der log ist:

            19:31:16.560	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 1</br>
            19:31:16.561	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 2</br>
            19:31:16.562	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 3</br>
            19:31:16.563	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 4</br>
            
            UncleSamU Offline
            UncleSamU Offline
            UncleSam
            Developer
            schrieb am zuletzt editiert von
            #5

            @seyav OK, dann könnte es sein, dass die Werte noch nicht in den Datenpunkt geschrieben wurden (du machst das ja sehr schnell hinter einander). Was passiert, wenn du es eine Zeile nach der anderen ausführst (zB mit einem timeout)?

            Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
            ♡-lichen Dank an meine Sponsoren

            S 1 Antwort Letzte Antwort
            0
            • paul53P paul53

              @seyav
              An die Funktion machwas(InZahl) wird nur eine Zahl übergeben und innerhalb der Funktion auch nur ausgewertet. Weshalb sollten 4 Zahlen im Datenpunkt stehen ?

              S Offline
              S Offline
              seyav
              schrieb am zuletzt editiert von
              #6

              @paul53 Ich möchte einzelne Ereignisse in einem Datenpunkt chronologisch sammeln und im vis anzeigen (Tür geöffnet, Tür geschlossen usw. mit Zeitangabe)

              paul53P 1 Antwort Letzte Antwort
              0
              • S seyav

                @UncleSam Reihenfolge: Hast Du recht. Der log ist:

                19:31:16.560	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 1</br>
                19:31:16.561	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 2</br>
                19:31:16.562	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 3</br>
                19:31:16.563	info	javascript.0 (2716) script.js.____TESTS____.Skript_5: 4</br>
                
                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von paul53
                #7

                @seyav sagte in Anfängerfrage: Eigener Alarmlogger:

                Der log ist:

                Aufruf aus einer Schleife: Das funktioniert mit getState('0_userdata.0.Sicherheit.sAlarmLogHistory') nicht, da die Schleife durchlaufen ist bevor das erste setState() fertig ist (asynchrone Abarbeitung).

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Antwort Letzte Antwort
                0
                • S seyav

                  @paul53 Ich möchte einzelne Ereignisse in einem Datenpunkt chronologisch sammeln und im vis anzeigen (Tür geöffnet, Tür geschlossen usw. mit Zeitangabe)

                  paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von
                  #8

                  @seyav sagte:

                  Tür geöffnet, Tür geschlossen usw. mit Zeitangabe

                  Dann ist genügend Zeit zwischen den Ereignissen. Du kannst die Funktion nicht in einer Schleife testen.

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  1 Antwort Letzte Antwort
                  0
                  • UncleSamU UncleSam

                    @seyav OK, dann könnte es sein, dass die Werte noch nicht in den Datenpunkt geschrieben wurden (du machst das ja sehr schnell hinter einander). Was passiert, wenn du es eine Zeile nach der anderen ausführst (zB mit einem timeout)?

                    S Offline
                    S Offline
                    seyav
                    schrieb am zuletzt editiert von seyav
                    #9

                    @UncleSam Ja. habe ich vermutet. Doch, ich möchte von verschiedenen Programmen jeweils den log auslösen. Dazu habe ich die Routine "machwas" im "global" teil aufgeführt und rufe sie von meinen Programmen auf. Nun, wenn genügend Zeit ist, um die Werte in den Datenpunkt zu schreiben, funktioniert es ja auch. Das Problem ist, wenn die Aufrufe zu schnell hintereinander passieren. Ich wollte mit dem Use Case oben mein Problem erläutern. Irgendwie brauche ich eine Lösung, um Daten in den Datenpunkt synchron zu schreiben.
                    Wenn das nicht geht, muss ich mir irgendwie mit timeout behelfen, wo ich die Zeitspanne dazu irgendwie beherrschen muss.

                    UncleSamU 1 Antwort Letzte Antwort
                    0
                    • S seyav

                      @UncleSam Ja. habe ich vermutet. Doch, ich möchte von verschiedenen Programmen jeweils den log auslösen. Dazu habe ich die Routine "machwas" im "global" teil aufgeführt und rufe sie von meinen Programmen auf. Nun, wenn genügend Zeit ist, um die Werte in den Datenpunkt zu schreiben, funktioniert es ja auch. Das Problem ist, wenn die Aufrufe zu schnell hintereinander passieren. Ich wollte mit dem Use Case oben mein Problem erläutern. Irgendwie brauche ich eine Lösung, um Daten in den Datenpunkt synchron zu schreiben.
                      Wenn das nicht geht, muss ich mir irgendwie mit timeout behelfen, wo ich die Zeitspanne dazu irgendwie beherrschen muss.

                      UncleSamU Offline
                      UncleSamU Offline
                      UncleSam
                      Developer
                      schrieb am zuletzt editiert von
                      #10

                      @seyav Schreib eine Funktion, die den Inhalt selber speichert anstatt jedes mal den Wert des Datenpunktes auszulesen. Ansonsten musst du mit asynchronen Methoden oder Callbacks arbeiten und machst dir eine Hand ab.

                      Aber mal ganz ehrlich: wenn du so viele Daten schreiben willst, macht dann eine Ausgabe als HTML Sinn? Das kann ja niemand mehr lesen.

                      Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
                      ♡-lichen Dank an meine Sponsoren

                      S 1 Antwort Letzte Antwort
                      0
                      • UncleSamU UncleSam

                        @seyav Schreib eine Funktion, die den Inhalt selber speichert anstatt jedes mal den Wert des Datenpunktes auszulesen. Ansonsten musst du mit asynchronen Methoden oder Callbacks arbeiten und machst dir eine Hand ab.

                        Aber mal ganz ehrlich: wenn du so viele Daten schreiben willst, macht dann eine Ausgabe als HTML Sinn? Das kann ja niemand mehr lesen.

                        S Offline
                        S Offline
                        seyav
                        schrieb am zuletzt editiert von
                        #11

                        @UncleSam Also, das mit dem HTML geht es um Folgendes:
                        Capture.PNG
                        Wegen Callbacks &co hast Du Recht. Ich lasse Finger davon. Ich versuche es mal mit befüllen eines String Variablen.
                        Alle paar Sekunden schreibe ich dann den Stringwert in den Datenpunkt.

                        UncleSamU 1 Antwort Letzte Antwort
                        0
                        • S seyav

                          @UncleSam Also, das mit dem HTML geht es um Folgendes:
                          Capture.PNG
                          Wegen Callbacks &co hast Du Recht. Ich lasse Finger davon. Ich versuche es mal mit befüllen eines String Variablen.
                          Alle paar Sekunden schreibe ich dann den Stringwert in den Datenpunkt.

                          UncleSamU Offline
                          UncleSamU Offline
                          UncleSam
                          Developer
                          schrieb am zuletzt editiert von
                          #12

                          @seyav Eben, da passiert ja nicht innerhalb von zehn Millisekunden etwas. Dein ursprüngliches Skript würde also funktioneren.

                          Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
                          ♡-lichen Dank an meine Sponsoren

                          S 1 Antwort Letzte Antwort
                          0
                          • UncleSamU UncleSam

                            @seyav Eben, da passiert ja nicht innerhalb von zehn Millisekunden etwas. Dein ursprüngliches Skript würde also funktioneren.

                            S Offline
                            S Offline
                            seyav
                            schrieb am zuletzt editiert von
                            #13

                            @UncleSam Hab mal so gelöst:

                            /*************************************************/
                            // Globale Funktion, um Alarme auf dem vis auszugeben, im NAS zu loggen und auf dem Mobile (tts) auszugeben
                            // Max 5 schnellfolgende Meldungen
                            /*************************************************/
                            
                            var sLog = new Array(5); 
                            var sTxt = new Array(5); 
                            var sDauer = new Array(5); 
                            var sInSay = new Array(5); 
                            
                            var iMeldungSpanne=3000;                                                        // 3 Sek pro Meldung
                            var LogenInVerzeichnis = "/home/pi/nas/history.csv";                            // Text Datei auf NAS
                            var URLSoundAusgabe = "http://192.168.1.147:50000/tts=";                        // Mobile im Wohnzimmer
                            
                            for (var i = 0; i < sLog.length; i++) {sLog[i] = "";}                           // Array sLog Initialisieren
                            
                            var vIntervall=null;                                                            // k.A. ob es wirklich nötig ist
                            vIntervall=setInterval(function(){StringArrayAusgeben();}, iMeldungSpanne *5 + 200);    // Endless loop, alle 15 Sekunden
                                                                                                                            // Max 5 Meldungen vom Array sLog mit Zeitspanne 3Sek ausgeben
                                                                                                                            // falls innert 15 sek > 5 Meldungen eintreffen, gehen die verloren
                            
                            function HistoryAnlegen(InText, InDauerText, InSay){                                            // sLog[i] synchron befüllen
                                for (var i = 0; i < sLog.length; i++){
                                    if(sLog[i]==""){
                                        
                            /***** Datum loggen, wenn es sich geändert hat ******/    
                                        var sLastHistoryDate=getState('0_userdata.0.Sicherheit.dLastHistoryDate').val;
                                        var sCurrentDate=formatDate(new Date(), "<B>JJJJ.MM.TT</B>");
                                        if (sCurrentDate != sLastHistoryDate){
                                            setState('0_userdata.0.Sicherheit.dLastHistoryDate', sCurrentDate, true);
                                            strTmp = sCurrentDate + "<br>";
                                        }
                            
                            /***** den Text 'Offen Seit..." ermitteln ******/    
                                        var strTmp=""
                                        if (InDauerText + "" == ""){strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + "<br>";}
                                        else{
                                            if(InDauerText>59){
                                                InDauerText=(InDauerText/60).toFixed(1);
                                                strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + ", " + InDauerText + " Min. offen<br>";
                                            }
                                            else{
                                                strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + ", " + InDauerText + " Sek. offen<br>";
                                            }
                                        }
                                        sLog[i]=strTmp;sTxt[i]=InText;sDauer[i]=InDauerText;sInSay[i]=InSay;break;
                                    }
                                }
                            }
                            
                            async function StringArrayAusgeben(){                                                                                       // Wird alle 15 Sek einmal aufgerufen
                                for (var j = 0; j < 5; j++){        
                                    if(sLog[j]!="" ){
                                        const result = await StringArrayAusgebenSub(sLog[j], sTxt[j], sDauer[j], sInSay[j], j);sLog[j]="";               // Alle 3 Sek eine Meldung ausgeben
                                    }
                                }
                            }
                            
                            function StringArrayAusgebenSub(InStrTimeStamp, InStr, InDauerText, InSay, InCounter){return new Promise(resolve => {setTimeout(() =>{  // Durchlauf: 3 Sek
                            
                            /***** Alarme am Handy aussagen, false InSay=true ******/        
                                if (InSay && getState('0_userdata.0.Sicherheit.bAlarmIstScharf').val){request(URLSoundAusgabe + InStr.toLowerCase());}
                            
                            /***** Alarme in die LogDatei ergänzen ******/
                                    wl(InStr, InDauerText);
                            
                            /***** Alarme im Objekt sAlarmLogHistory ergänzen ******/
                                    InStrTimeStamp = InStrTimeStamp + String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val); 
                                    setState('0_userdata.0.Sicherheit.sAlarmLogHistory', InStrTimeStamp, false);
                                
                                resolve('resolved');}, iMeldungSpanne);});
                            }
                            
                            function wl(InText, InDauerText){
                                var fs = require('fs');
                                fs.appendFileSync(LogenInVerzeichnis, formatDate(new Date(), "DD.MM.YYYY") + ";" + formatDate(new Date(), "SS:mm:ss") + ";" + InText + ";" + InDauerText + "\n", 'utf8');      
                            }
                            

                            Die echten Programmer mögen meine Art der Codierung verzeihen. Doch, es tut, was es tun muss. Kann sicher optimiert werden. Vor allem, die anfängliche 15 Sek Warterei kriege ich nicht heraus.

                            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

                            525

                            Online

                            32.7k

                            Benutzer

                            82.4k

                            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