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. [gelöst] timerId von setTimeout in einem Datenpunkt speichern

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[gelöst] timerId von setTimeout in einem Datenpunkt speichern

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
9 Beiträge 4 Kommentatoren 2.3k Aufrufe
  • Ä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.
  • greyhoundG Offline
    greyhoundG Offline
    greyhound
    schrieb am zuletzt editiert von
    #1

    Moin, Moin,

    in einem Skript möchte ich die timerId eines gestarten Timers in einem Datenpunkt speichern, um diesen bei Bedarf wieder zu terminieren. Da die Anzahl der betroffenen Geräte (WebCams) quasi dynamisch ist, schien mir das Speichern in einem Datenpunkt einfacher als ein Datenarray vorzuhalten. Laut Doku ist die TimerId ein Object vom Typ "number". Ich wollte dieses Objekt nun per stringify serialisieren und in den Datenpunkt vom Typ "string" schreiben, aber ich scheitere schon beim serialisieren.

    var camID = "javascript.0.alarm.Devices.Cams.Cam1",
    	RecordTime_s = 3;
    
    timerID = setTimeout(stopCamAlarm, (RecordTime_s * 1000));
    logs(fctName + "setTimeout (timerID: " + JSON.stringify(timerID) + ") stopCamAlarm in " + RecordTime_s + "s for camID: "+ camID, "debug2");
    
    clearTimeout(timerID);
    
    function stopCamAlarm() {
        // was man da so tut
    }
    

    Beim stringify laufe ich auf folgenden Fehler: TypeError: Converting circular structure to JSON at Object.stringify (native) at script.js.

    Auch ein JSON.parse(timerID) hilft nicht –> SyntaxError: Unexpected token o at Object.parse (native) at script.js

    Ist das Objekt der timerId so komplex?

    Wie macht ihr das?

    Ich habe in der Diskussion zum http://forum.iobroker.net/viewtopic.php?f=22&t=1878&hilit=settimeout#p16032 gesehen, dass die timerId's in einem Array-Objekt gespeichert wurden.

    Ist das die einzige Möglichkeit?

    Danke und Gruß

    GH

    ioBroker auf ODROID-XU4 / Influx u. a. auf FUJITSU D3400-B, Celeron G3900, 16 GB RAM / CCU2 / Nuki

    1 Antwort Letzte Antwort
    0
    • apollon77A Offline
      apollon77A Offline
      apollon77
      schrieb am zuletzt editiert von
      #2

      Ich denke eher das es ein "Native" Typ ist und das nicht geht … versuch mal "new Number(timerId)" zu machen ... geht das?

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • greyhoundG Offline
        greyhoundG Offline
        greyhound
        schrieb am zuletzt editiert von
        #3

        Die Scriptengine sagt "Do not use Number as a constructor."

        var XX = new Number(timerID);
        
        

        XX == null

        Also leider nicht

        ioBroker auf ODROID-XU4 / Influx u. a. auf FUJITSU D3400-B, Celeron G3900, 16 GB RAM / CCU2 / Nuki

        1 Antwort Letzte Antwort
        0
        • paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #4

          @greyhound:

          in einem Skript möchte ich die timerId eines gestarten Timers in einem Datenpunkt speichern, um diesen bei Bedarf wieder zu terminieren. `
          Solange das Skript aktiv ist, ist die in dem Skript global deklarierte timerId gültig und kann zum Stoppen des Timers verwendet werden. Wozu also die Speicherung in einem Datenpunkt ?

          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
          • greyhoundG Offline
            greyhoundG Offline
            greyhound
            schrieb am zuletzt editiert von
            #5

            Im Prinzip hast du Recht.

            Allerdings sind je nach Umgebung (Skript läuft nicht nur beim mir zu Hause) mehr oder weniger Cams aktiv und für jede wird bei einem Alarm (durch Bewegungsmelder) ein Timer gestartet, der den Alarm nach einer festgelegten Zeit zurücksetzt und damit auch die Aufnahmefuntion der jeweiligen Cam. Und da ich in dem Skript an verschiedenen Stellen Daten schreibe und lese, hat sich das mit dem Datenpunkt angeboten.

            Ich hatte an dieser Stelle auch überhaupt nicht mit einem Problem gerechnet und da ich bei ioBroker und js Einsteiger bin, würde mich das technisch schon interessieren, warum ich die timerID als Objekt nicht serialisieren und speichern kann.

            Bin ich der Erste, der die timerID in einen Datenpunkt schreiben möchte?

            Als Ausweg sehe ich im Moment dann nur das Speichern in einem Array.

            ioBroker auf ODROID-XU4 / Influx u. a. auf FUJITSU D3400-B, Celeron G3900, 16 GB RAM / CCU2 / Nuki

            1 Antwort Letzte Antwort
            0
            • greyhoundG Offline
              greyhoundG Offline
              greyhound
              schrieb am zuletzt editiert von
              #6

              Habe jetzt die timerIDs in einem dynamischen Array gespeichert, ist eigentlich auich die bessere Lösung, dan die IDs nach dem Tot des Skriptes keine Relevanz haben.

              ioBroker auf ODROID-XU4 / Influx u. a. auf FUJITSU D3400-B, Celeron G3900, 16 GB RAM / CCU2 / Nuki

              1 Antwort Letzte Antwort
              0
              • G Offline
                G Offline
                GerdSo
                schrieb am zuletzt editiert von
                #7

                @greyhound:

                Habe jetzt die timerIDs in einem dynamischen Array gespeichert, ist eigentlich auich die bessere Lösung, dan die IDs nach dem Tot des Skriptes keine Relevanz haben. `
                Hallo,

                ich versuche gerade genau so einen Fall zu lösen. Kannst Du mir schreiben, wie Du es gelöst hast, also einen Auszug aus Deinem Skript. Ich stehe gerade auf dem Schlauch wie Deine Lösung aussieht.

                1 Antwort Letzte Antwort
                0
                • greyhoundG Offline
                  greyhoundG Offline
                  greyhound
                  schrieb am zuletzt editiert von
                  #8

                  am Anfang des Skriptes eine Variable für die Timer deklariert.

                  . . .
                  var aTimer[];
                  . . .
                  

                  Bei mir im Skript geht es um die Steuerung der Aufnahmezeiten bei Kameras im Alarmfall. D. h. bei einer Alarmierung soll die Kamera x Sekunden aufnehmen und wieder abschalten.

                  In einer Subscription auf dieses Alarmsignal wird das Objektarray dann entsprechend zugegriffen.

                  aTimer[cam_name] = null;
                  subscribe({id: camID + ".alarm", change:'ne'}, function (obj) {
                     . . .
                     if(obj.state.val === true) {
                        // set alarm
                        . . .
                        if(aTimer[cam_name]) {
                           // stop old timer
                            clearTimeout(aTimer[cam_name]);
                        }
                  
                        // RecordTimer für Cam starten
                        aTimer[cam_name] = setTimeout(function(){ stopCamAlarm(camID); }, (RecordTime_s * 1000));
                      } else {
                        var t1 = getState(camID + ".alarm_ack").ts;
                        var tdiff = new Date().getTime() - t1;
                        if(tdiff > RecordMinTime_s) {
                           stopCamAlarm(camID);
                  
                           // stop timer
                           if(aTimer[cam_name]) {
                              // stop timer
                              clearTimeout(aTimer[cam_name]);
                              aTimer[cam_name] = null;
                           }
                        } else {
                           // mindest Aufzeichnungszeit nicht erreicht, nicht abschalten
                        }
                     }
                  
                  

                  Hoffe, das hilft dir so weiter.

                  Gruß

                  GH

                  ioBroker auf ODROID-XU4 / Influx u. a. auf FUJITSU D3400-B, Celeron G3900, 16 GB RAM / CCU2 / Nuki

                  1 Antwort Letzte Antwort
                  0
                  • G Offline
                    G Offline
                    GerdSo
                    schrieb am zuletzt editiert von
                    #9

                    Hallo,

                    ja, hat geholfen.

                    Allerdings musste ich das Array anders definieren, Deine Version zeigt schon ein Ausrufezeichen und beim Speichern kam dann eine Fehlermeldung.

                    Mit```
                    var aTimer = [];[/code] geht es.

                    Danke für die Hilfe.

                    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

                    727

                    Online

                    32.6k

                    Benutzer

                    82.2k

                    Themen

                    1.3m

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

                    • Du hast noch kein Konto? Registrieren

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