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. JavaScript
  5. on({id: ....mit timer kombiniert? Mehrfacher Aufruf??

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    9
    1
    94

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

on({id: ....mit timer kombiniert? Mehrfacher Aufruf??

Geplant Angeheftet Gesperrt Verschoben JavaScript
10 Beiträge 4 Kommentatoren 651 Aufrufe 3 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.
  • etvE Offline
    etvE Offline
    etv
    schrieb am zuletzt editiert von
    #1

    Liebe Leute,

    kurze Frage zur on-Funktion.

    Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.

    Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
    Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?

    Liebe Grüße
    Tom

    …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

    CodierknechtC arteckA paul53P 3 Antworten Letzte Antwort
    0
    • etvE etv

      Liebe Leute,

      kurze Frage zur on-Funktion.

      Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.

      Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
      Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?

      Liebe Grüße
      Tom

      CodierknechtC Online
      CodierknechtC Online
      Codierknecht
      Developer Most Active
      schrieb am zuletzt editiert von Codierknecht
      #2

      @etv
      Man stoppt bei Änderungen am DP zunächst den Timer, um ihn dann erneut zu starten.

      14c678b7-dc7f-4906-89ba-3b3d50d9f29e-image.png

      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
      HmIP|ZigBee|Tasmota|Unifi
      Zabbix Certified Specialist
      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

      1 Antwort Letzte Antwort
      1
      • etvE etv

        Liebe Leute,

        kurze Frage zur on-Funktion.

        Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.

        Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
        Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?

        Liebe Grüße
        Tom

        arteckA Offline
        arteckA Offline
        arteck
        Developer Most Active
        schrieb am zuletzt editiert von
        #3

        @etv das kannst du per se machen.. zuerst den laufenden stoppen dann neu starten

        zigbee hab ich, zwave auch, nuc's genauso und HA auch

        etvE 1 Antwort Letzte Antwort
        1
        • arteckA arteck

          @etv das kannst du per se machen.. zuerst den laufenden stoppen dann neu starten

          etvE Offline
          etvE Offline
          etv
          schrieb am zuletzt editiert von
          #4

          ...leider JEIN...

          Ich möchte eben den Timer NICHT stoppen, da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

          Wenn ich jedes mal den Timer lösche und neu starte wird das Gerät nie abgedreht, da es ja quasi fertig ist und "nie mehr" mehr Leistung ziehen wird....

          ABER, ich hab schon einen workaround gefunden

          on({id: id_Scooter_Power, valLt: 4}, function (obj) {
              watt = obj.state.val;
              if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: Leistungsänderung unter 4 Watt, nämlich: '+ watt +' W')}
              on_off_time = obj.state.lc;
              jetzt = parseFloat(Date.now().toFixed());
              if (on_off_time < jetzt - 30000) {
                  if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: UND - es ist länger als 30 Sekunden EIN, daher wird abgedreht')}
                  setState(id_Scooter_Switch, false)
              }
          });
          

          Ich löse es, indem ich die Zeit vom letzten State Change analysiere....

          Liebe Grüße
          Tom

          …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

          CodierknechtC 1 Antwort Letzte Antwort
          0
          • etvE etv

            ...leider JEIN...

            Ich möchte eben den Timer NICHT stoppen, da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

            Wenn ich jedes mal den Timer lösche und neu starte wird das Gerät nie abgedreht, da es ja quasi fertig ist und "nie mehr" mehr Leistung ziehen wird....

            ABER, ich hab schon einen workaround gefunden

            on({id: id_Scooter_Power, valLt: 4}, function (obj) {
                watt = obj.state.val;
                if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: Leistungsänderung unter 4 Watt, nämlich: '+ watt +' W')}
                on_off_time = obj.state.lc;
                jetzt = parseFloat(Date.now().toFixed());
                if (on_off_time < jetzt - 30000) {
                    if (debug_scooter) {log('- - - - - - - - - - Scooter Charger: UND - es ist länger als 30 Sekunden EIN, daher wird abgedreht')}
                    setState(id_Scooter_Switch, false)
                }
            });
            

            Ich löse es, indem ich die Zeit vom letzten State Change analysiere....

            Liebe Grüße
            Tom

            CodierknechtC Online
            CodierknechtC Online
            Codierknecht
            Developer Most Active
            schrieb am zuletzt editiert von Codierknecht
            #5

            @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

            da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

            Du triggerst doch auf "ist kleiner als 4". Dann feuert der Trigger nur bei absteigender Flanke und das Einschalten spielt keine Rolle.

            Trotzdem arbeitet man bei timeouts üblicherweise immer so, dass ein ggf. noch laufender Timer zunächst gestoppt wird.
            Ich bin mir nicht sicher, aber ich denke dass sonst mehrere Instanzen parallel laufen.
            Das gibt früher oder später Ärger.

            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

            Proxmox 9.1.1 LXC|8 GB|Core i7-6700
            HmIP|ZigBee|Tasmota|Unifi
            Zabbix Certified Specialist
            Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

            etvE 1 Antwort Letzte Antwort
            0
            • CodierknechtC Codierknecht

              @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

              da ich ja das Gerät abdrehen will, wenn nach 30 Sekunden noch immer wenig Leistung gezogen wird.

              Du triggerst doch auf "ist kleiner als 4". Dann feuert der Trigger nur bei absteigender Flanke und das Einschalten spielt keine Rolle.

              Trotzdem arbeitet man bei timeouts üblicherweise immer so, dass ein ggf. noch laufender Timer zunächst gestoppt wird.
              Ich bin mir nicht sicher, aber ich denke dass sonst mehrere Instanzen parallel laufen.
              Das gibt früher oder später Ärger.

              etvE Offline
              etvE Offline
              etv
              schrieb am zuletzt editiert von
              #6

              @codierknecht, danke für den Timer-Tipp!

              Problem in diesem Fall ist, dass der Lader am Anfang unten herum dümpelt, bis er endlich mit dem Laden beginnt. Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter) und das hat mir den Scooter oft wieder abgedreht, bevor er noch zu laden begonnen hat....daher dieser nötige Hack.

              Liebe Grüße
              Tom

              …ist schon sehr lange begeisterter ioBroker Nutzer! 1x zu Hause und 1x auf der Alm. ioBroker ist das 'Hirn' des Smarthome und steuert HomeMatic und Shellys, loggt was so passiert, zeigt es auf Tabletts schön an und ermöglicht mir via Cloud Adapter den Fernzugriff...

              CodierknechtC 1 Antwort Letzte Antwort
              0
              • etvE etv

                @codierknecht, danke für den Timer-Tipp!

                Problem in diesem Fall ist, dass der Lader am Anfang unten herum dümpelt, bis er endlich mit dem Laden beginnt. Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter) und das hat mir den Scooter oft wieder abgedreht, bevor er noch zu laden begonnen hat....daher dieser nötige Hack.

                Liebe Grüße
                Tom

                CodierknechtC Online
                CodierknechtC Online
                Codierknecht
                Developer Most Active
                schrieb am zuletzt editiert von
                #7

                @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

                Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter)

                OK, das klingt schwierig :-(

                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                HmIP|ZigBee|Tasmota|Unifi
                Zabbix Certified Specialist
                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                CodierknechtC 1 Antwort Letzte Antwort
                0
                • CodierknechtC Codierknecht

                  @etv sagte in on({id: ....mit timer kombiniert? Mehrfacher Aufruf??:

                  Da grundelt er etwa 10-15 Sekunden eben unter 4 Watt herum (mal rauf, mal runter)

                  OK, das klingt schwierig :-(

                  CodierknechtC Online
                  CodierknechtC Online
                  Codierknecht
                  Developer Most Active
                  schrieb am zuletzt editiert von
                  #8

                  Alternative:

                  on({id: id_Scooter_Power, change: "ne"}, async function (obj) {
                    var watt = obj.state.val;
                    (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})();
                    if (watt < 4) {
                    timeout = setTimeout(async function () {
                        setState(id_Scooter_Switch, false);
                      }, parseInt(30000));
                    }
                  });
                  

                  So reagiert der Trigger auf jede Änderung der Leistung.
                  Zuerst wird ein ggf. laufender Timer gelöscht.
                  Ist die Leistung < 4 W, starten die 30 Sekunden.
                  Ändert sich die Leistung innerhalb der 30 Sekunden, geht's von vorne los.
                  Ändert sich die Leistung beim Einschalten von z.B. 3 auf 100 W, wird ein ggf. laufender Timer gelöscht und nix passiert.

                  Einziges Problem hierbei: Wenn der Scooter nach dem Laden immer noch innerhalb von 30 Sekunden "rumdümpelt", wird er nie abgeschaltet ;-)

                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                  Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                  HmIP|ZigBee|Tasmota|Unifi
                  Zabbix Certified Specialist
                  Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                  1 Antwort Letzte Antwort
                  0
                  • etvE etv

                    Liebe Leute,

                    kurze Frage zur on-Funktion.

                    Ich möchte bei einer Leistungsmessung unter einem gewissen Wert einen Aktor ausschalten. Nachdem es aber beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist, kommt eine timer-Funktion dazu, die nach 30 Sekunden schaut, ob der Wert noch immer darunter liegt.

                    Was passiert nun, wenn diese on-Funktion aber innerhalb dieser 30 Sekunden erneut ausgelöst wird? Rennt dann das Programm mehrmals parallel?
                    Wenn ja, kann man das irgendwie abfangen, dass die on-Funktion für diese Dauer gesperrt wird?

                    Liebe Grüße
                    Tom

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

                    @etv sagte in: beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist

                    on({id: id_Scooter_Power, valLt: 4, oldValGe: 4}, function (obj) {
                    

                    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

                    CodierknechtC 1 Antwort Letzte Antwort
                    0
                    • paul53P paul53

                      @etv sagte in: beim Einschalten erst ein paar Sekunden braucht, bis die Leistung über diesem Wert ist

                      on({id: id_Scooter_Power, valLt: 4, oldValGe: 4}, function (obj) {
                      
                      CodierknechtC Online
                      CodierknechtC Online
                      Codierknecht
                      Developer Most Active
                      schrieb am zuletzt editiert von
                      #10

                      @paul53
                      Cool - das wandelnde Programmierhandbuch hat wieder zugeschlagen :grin:

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 9.1.1 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi
                      Zabbix Certified Specialist
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      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

                      812

                      Online

                      32.5k

                      Benutzer

                      81.7k

                      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