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

                      566

                      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