Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    1.1k

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.6k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    6.2k

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

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
9 Beiträge 4 Kommentatoren 2.5k 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: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

          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

                    Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                    Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                    Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                    Registrieren Anmelden
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    228

                    Online

                    33.0k

                    Benutzer

                    83.6k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2026
                    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