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.2k

  • 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 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

                          570

                          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