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. zig gleiche Einträge in JS-Protokollanzeige

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

zig gleiche Einträge in JS-Protokollanzeige

Geplant Angeheftet Gesperrt Verschoben JavaScript
18 Beiträge 6 Kommentatoren 922 Aufrufe 4 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.
  • H hub01

    Vergleich der Protokollanzeigen
    -aus Javascript-Editor
    -von ioBroker
    -heruntergeladenem Logfile (aus ioB-Protokoll)

    heruntergeladenes Logfile:
    Da stehen alle Meldungen richtig drin.
    z.B. hier: alle 2 Sek. werden 3 Einträge erzeugt.
    3785bb1c-de03-451c-ad49-ffbe91b6da18-grafik.png

    2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:18.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:18.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:18.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:26.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:26.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:26.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
    2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
    2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
    

    ioBroker Protokoll:
    Hier werden nur die letzten x Meldungen angezeigt, und diese stimmen auch alle.

    Javascript Protokollanzeige:
    Alle Meldungen, die im ioB-Protokoll angezeigt werden, sind auch 1:1 richtig vorhanden.
    Aber davor werden hundertfach sich wiederholende Einträge, mit gleichen Zeitstempeln angezeigt.
    z.B.:
    bc5445f8-c174-4e4f-8df9-2e846891bd90-grafik.png

    4c67debe-54db-4091-8a06-0daf57b48de9-grafik.png

    HomoranH Offline
    HomoranH Offline
    Homoran
    Global Moderator Administrators
    schrieb am zuletzt editiert von
    #2

    @hub01 bitte keine Screenshots von logs, sondern als Text in code-tags posten!

    kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

    Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

    der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

    H 1 Antwort Letzte Antwort
    0
    • HomoranH Homoran

      @hub01 bitte keine Screenshots von logs, sondern als Text in code-tags posten!

      H Offline
      H Offline
      hub01
      schrieb am zuletzt editiert von
      #3

      @homoran
      sorry,
      -habe das log oben eingefügt
      -das JS-Protokoll von gestern ist leider weg

      HomoranH 1 Antwort Letzte Antwort
      0
      • H hub01

        @homoran
        sorry,
        -habe das log oben eingefügt
        -das JS-Protokoll von gestern ist leider weg

        HomoranH Offline
        HomoranH Offline
        Homoran
        Global Moderator Administrators
        schrieb am zuletzt editiert von
        #4

        @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

        das JS-Protokoll von gestern ist leider weg

        darum ging es.
        Da sind doch verschiedene Timestamps.

        hast du "live" gesehen, wie die sich aufbauten?
        Dabei mal den Browsercache gelöscht?

        Möglicherweise ist das nur ein Browser"problem"

        kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

        H 1 Antwort Letzte Antwort
        1
        • H hub01

          Vergleich der Protokollanzeigen
          -aus Javascript-Editor
          -von ioBroker
          -heruntergeladenem Logfile (aus ioB-Protokoll)

          heruntergeladenes Logfile:
          Da stehen alle Meldungen richtig drin.
          z.B. hier: alle 2 Sek. werden 3 Einträge erzeugt.
          3785bb1c-de03-451c-ad49-ffbe91b6da18-grafik.png

          2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:14.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:16.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:18.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:18.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:18.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:20.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:22.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:24.352 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:26.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:26.353 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:26.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: Ladestrom SW/IW= 8/16
          2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: auf 3-phasig umschalten
          2025-02-15 11:29:28.354 - info: javascript.0 (2018) script.js.HS_Skripte.PV_Überschussladen: -> Ladestrom SW/IW= 8/16
          

          ioBroker Protokoll:
          Hier werden nur die letzten x Meldungen angezeigt, und diese stimmen auch alle.

          Javascript Protokollanzeige:
          Alle Meldungen, die im ioB-Protokoll angezeigt werden, sind auch 1:1 richtig vorhanden.
          Aber davor werden hundertfach sich wiederholende Einträge, mit gleichen Zeitstempeln angezeigt.
          z.B.:
          bc5445f8-c174-4e4f-8df9-2e846891bd90-grafik.png

          4c67debe-54db-4091-8a06-0daf57b48de9-grafik.png

          AsgothianA Offline
          AsgothianA Offline
          Asgothian
          Developer
          schrieb am zuletzt editiert von
          #5

          @hub01 zeig mal das Skript. Da ist was faul

          ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
          "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

          H 1 Antwort Letzte Antwort
          0
          • HomoranH Homoran

            @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

            das JS-Protokoll von gestern ist leider weg

            darum ging es.
            Da sind doch verschiedene Timestamps.

            hast du "live" gesehen, wie die sich aufbauten?
            Dabei mal den Browsercache gelöscht?

            Möglicherweise ist das nur ein Browser"problem"

            H Offline
            H Offline
            hub01
            schrieb am zuletzt editiert von
            #6

            @homoran sagte in zig gleiche Einträge in JS-Protokollanzeige:

            @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

            das JS-Protokoll von gestern ist leider weg

            darum ging es.
            Da sind doch verschiedene Timestamps.

            hast du "live" gesehen, wie die sich aufbauten?
            Dabei mal den Browsercache gelöscht?

            Möglicherweise ist das nur ein Browser"problem"

            Ich weiß nicht, was du genau meinst.
            Im Logfile sind verschiedene Timestamps, was ja richtig ist.
            Aber in der JS-Protokollanzeige waren zig gleiche Timestamps.
            z.B.
            die Meldungen von 11:29:14 und 11:29:16 standen über 100 mal da, immer mit den gleichen Zeiten.
            Also jede 2. Meldung hatte die gleiche Uhrzeit.
            In der Hardcopy habe ich 3 Stück davon rauskopiert.

            Selbiges bei den Meldungen um 11:29:20, 11:29:22 und 11:29:24.
            Hier hatte jede 3. Meldung die gleiche Uhrzeit

            Live konnte ich das nicht sehen, erst als ich abends das Ganze kontrollierte.
            Da die letzten x Meldungen richtig angezeigt wurden, denke ich, dass man da live nichts sieht.
            Erst beim Zurückscrollen zu den älteren Meldungen wäre das vermutlich erkennbar.

            Browserproblem erscheint auch mir am plausibelsten.
            Werde das nächste Mal den Cache leeren und beobachten.
            Aber wenn ich den Cache leere, ist dann die Liste leer und füllt sich neu, oder bleiben die bisherigen Meldungen erhalten?

            1 Antwort Letzte Antwort
            0
            • AsgothianA Asgothian

              @hub01 zeig mal das Skript. Da ist was faul

              H Offline
              H Offline
              hub01
              schrieb am zuletzt editiert von
              #7

              @asgothian sagte in zig gleiche Einträge in JS-Protokollanzeige:

              @hub01 zeig mal das Skript. Da ist was faul

              Ist ziemlich lang.
              Ich könnte nur den Teil rauskopieren, der die Meldungen erzeugt.

              Aber im Logfile stehen ja alle Meldungen richtig drin.
              Wenn es am Script liegt, müsste dies doch auch im Logfile zu sehen sein?

              P T 2 Antworten Letzte Antwort
              0
              • H hub01

                @asgothian sagte in zig gleiche Einträge in JS-Protokollanzeige:

                @hub01 zeig mal das Skript. Da ist was faul

                Ist ziemlich lang.
                Ich könnte nur den Teil rauskopieren, der die Meldungen erzeugt.

                Aber im Logfile stehen ja alle Meldungen richtig drin.
                Wenn es am Script liegt, müsste dies doch auch im Logfile zu sehen sein?

                P Offline
                P Offline
                peterfido
                schrieb am zuletzt editiert von
                #8

                @hub01 Kann sein, dass ein Ausschnitt reicht. Muss es allerdings nicht. Evtl. gibt es noch mehr im Skript zu optimieren, was bei der Gelegenheit gleich passieren könnte.

                Umlaute vermeide ich. Zumindest im Namen des Skripts ist einer enthalten.

                Ansonsten reichen die Meldungen allein nicht.

                Gruß

                Peterfido


                Proxmox auf Intel NUC12WSHi5
                ioBroker: Debian (VM)
                CCU: Debmatic (VM)
                Influx: Debian (VM)
                Grafana: Debian (VM)
                eBus: Debian (VM)
                Zigbee: Debian (VM) mit zigbee2mqtt

                H 1 Antwort Letzte Antwort
                0
                • H hub01

                  @asgothian sagte in zig gleiche Einträge in JS-Protokollanzeige:

                  @hub01 zeig mal das Skript. Da ist was faul

                  Ist ziemlich lang.
                  Ich könnte nur den Teil rauskopieren, der die Meldungen erzeugt.

                  Aber im Logfile stehen ja alle Meldungen richtig drin.
                  Wenn es am Script liegt, müsste dies doch auch im Logfile zu sehen sein?

                  T Nicht stören
                  T Nicht stören
                  ticaki
                  schrieb am zuletzt editiert von ticaki
                  #9

                  @hub01

                  ist es länger als das:

                  export {};
                  const DEBUG = false;
                  
                  const cMinLux = 1800;
                  const luxminFront = 60;
                  const luxminBehind = 80;
                  const luxminComputer = 20;
                  let front = false;
                  let behind = false;
                  let behindComputer = false;
                  
                  const miredDiff = 180;
                  
                  const dimValueOptions: dimValueOptionsType = {
                      begin: '21:00',
                      end: '23:00',
                      reset: '6:00',
                      sunset: 340
                      // default values here
                  }
                  
                  // für hinteren Bereich
                  const cShutterPosForLight = 60;
                  
                  let hyperion_on = getState('sonoff.0.Gosund Steckdose 8.POWER').val;
                  const path = '0_userdata.0.scene'
                  const cCurrentLuxState = 'alias.0.zuhause.og.Abstellraum.Lux-Tasmota.lux';
                  
                  const mySwitch = 'zigbee2mqtt.0.0x001788010635d03f.';
                  const mySwitch2 = 'zigbee2mqtt.0.0x0017880104f33a08.';
                  var mySwitchTimeout:any = null;
                  const axios = require('axios');
                  //Objekte;
                  const dimmer:{[key: number]: {value: number, timeout: any}} = {};
                  let autoModeBright = existsState(`${path}.wohnzimmer.autoModeBright`) ? getState(`${path}.wohnzimmer.autoModeBright`).val : false;
                  
                  let autoModeOffTimeout = autoModeBright ? 15000 : 3000
                  // homematic 6 fach schalter
                  // Wandlampe Wohnzimmer
                  
                  const cShutterPos = 'homepilot20.0.Actuator.2-27601565.Position'
                  let shutterPos = getState(cShutterPos).val;
                  
                  on({id: cShutterPos, change: 'ne'}, (obj) => {
                      shutterPos = obj.state.val
                  })
                  on({ id: 'hm-rpc.1.000B5D89B01C44.1.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                     flipState(`${path}.wohnzimmer.autoModeBright`);
                  })
                  
                  on({ id: 'hm-rpc.1.000B5D89B01C44.3.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                     flipState('sonoff.0.NOUS 03.POWER')
                  })
                  
                  on({ id: 'hm-rpc.1.000B5D89B01C44.6.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                      if (!mySwitchTimeout) {
                          mySwitchTimeout = setTimeout(function () {
                              autoScene(0);
                              mySwitchTimeout = null;
                          }, 300);
                      }
                  })
                  on({ id: 'hm-rpc.1.000B5D89B01C44.2.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                      flipState('shelly.0.SHSW-1#E8DB84D7B242#1.Relay1.Switch')
                  })
                  on({ id: 'hm-rpc.1.000B5D89B01C44.4.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                      flipState('sonoff.0.NOUS 05.POWER')
                  })
                  on({ id: 'hm-rpc.1.000B5D89B01C44.5.PRESS_LONG_START', change: 'any', val: true }, function (obj) {
                      let lights = $('state(functions=beleuchtung)');
                      if (lights) {
                          lights.each(async (obj) => {
                              await sleep(100)
                              const obj2 = getObject(obj, 'rooms');
                              let rooms = obj2.enumIds
                              if (rooms === undefined) return;
                              rooms.forEach(async (room) => {
                                  await sleep(20)
                                  // workaround manche Geräte enthalten Räume die ich nicht entfernen kann.
                                  var enumObj = getObject(room);
                                  if (enumObj.common.members.findIndex((a) => { return obj.includes(a) }) == -1) return;
                                  const roomName = enumObj.common.name as iobJS.StringOrTranslated;
                                  let r = typeof roomName === 'string' ? roomName : roomName.de;
                                  if (r != 'Wohnzimmer') setState(obj, false);
                              });
                          });
                      }
                  })
                  on({ id: 'hm-rpc.1.000B5D89B01C44.5.PRESS_SHORT', change: 'any', val: true }, function (obj) {
                      setState('0_userdata.0.currentSceneWZ', -1);;
                  })
                  
                  let essbereichSchalter = getState('shelly.0.SHSW-25#E8DB8480264D#1.Relay0.Input').val
                  on({ id: 'shelly.0.SHSW-25#E8DB8480264D#1.Relay0.Input', change: 'ne' }, function (obj) {
                     essbereichSchalter = obj.state.val;
                     setLights();
                  })
                  let schreibtischbereichSchalter = getState('shelly.0.SHSW-25#E8DB8480264D#1.Relay1.Input').val
                  on({ id: 'shelly.0.SHSW-25#E8DB8480264D#1.Relay1.Input', change: 'ne' }, function (obj) {
                     schreibtischbereichSchalter = obj.state.val;
                     setLights();
                  })
                  
                  async function flipState(id) {
                      setStateAsync(id, !getState(id).val);
                  }
                  /* Lightsobjects at home
                  device, lightSubTyp (Typ) */
                  // 0= hue 1= shelly 2= alexa
                  //STARTGLOBAL
                  type zoneIntersect = 'couch' | 'schreibtisch' | 'essbereich' | 'durchgang' | 'durchgang_schreibtisch' | 'durchgang_essbereich' | 'durchgang_couch';
                  type lightNameType = 'Couch' | 'Stehlampe' | 'Esstisch' | 'Computer-Wandlampe' | 'Vitrine' | 'Ambiente 1' | 'Ambiente 2' | 'Deckenstrahler' 
                                          | 'Schreibtisch' | 'Fensterbank' | 'Deckenpanel';
                  type lightObjectsType = {
                      id: string;
                      name: lightNameType;
                      day: boolean;
                      night: boolean;
                      timeout?: any;
                  } & lightSubType;
                  
                  type LightZoneType = {}
                  
                  //type sceneSettings = Record<lightNameType,{}>
                  
                  
                  type subCommandTyp = {
                      stateName: string;
                      mqttName?: string;
                  }
                  
                  
                  type lightSubType = ( { 
                          mode: 0;
                          state?:   
                          {   
                              on: subCommandTyp;
                              bri: subCommandTyp;
                              color?: subCommandTyp;
                              colortemp?: subCommandTyp;
                          }
                      } | { 
                          mode: 1;
                          state?:   
                          {
                              on:subCommandTyp;
                          }
                      } | { 
                          mode: 2;
                          state?:   
                          {  
                              on: subCommandTyp;
                          }
                      } | { 
                          mode: 3;
                          state?:   
                      {
                              on: subCommandTyp
                          }
                      } | { 
                          mode: 4;
                          state?:   
                          {
                              on: subCommandTyp;
                              bri: subCommandTyp;
                              ps: subCommandTyp;
                          }
                      }
                  )
                  
                  const lightSubMode: lightSubType[] =  [{ 
                          mode: 0,
                          state:   
                          {   
                              on:{stateName:".state", mqttName: 'state'},
                              bri:{stateName: ".brightness", mqttName:'brightness'},
                              color:{stateName:".color", mqttName:'color'},
                              colortemp:{stateName:".colortemp", mqttName:'color_temp'},
                          }
                      } , { 
                          mode: 1,
                          state:   
                          {
                              on:{stateName:".Switch",},
                          }
                      } , { 
                          mode: 2,
                          state:   
                          {  
                              on:{stateName:".powerState", },
                          }
                      } , { 
                          mode: 3,
                          state:   
                      {
                          on:{stateName:".STATE",},
                          }
                      } , { 
                          mode: 4,
                          state:   
                          {
                              on:{stateName:".on", mqttName: 'on'},
                              bri:{stateName: ".bri", mqttName:'bri'},
                              ps:{stateName:".ps", mqttName:'ps'},
                          }
                      }]
                  
                  
                  type lightControlType = Record<lightNameType, lightSubType>
                  
                  
                  
                  const lightObj: lightObjectsType[] = [
                      { id: 'zigbee2mqtt.0.0x0017880102887f42', name: 'Couch', mode: 0, day: true, night: true }, // 0 Couch 
                      { id: 'zigbee2mqtt.0.0x00178801028fc5cd', name: 'Stehlampe', mode: 0, day: true, night: true }, // 1 Standlicht
                      // { id: 'zigbee2mqtt.0.0x0017880102922a60', mode: 0,  name: 'Wohnzimmer', day: false, night: true }, // 1 Kugel
                      // { id: 'zigbee2mqtt.0.0x0017880109bde7e3', mode: 0,  name: 'Wohnzimmer', day: true, night: true }, // 2 Computer
                      { id: 'zigbee2mqtt.0.group_4', name: 'Esstisch', mode: 0, day: true, night: true }, // 2 Esszimmer
                      { id: 'zigbee2mqtt.0.0xb43522fffe55d341', name: 'Computer-Wandlampe', mode: 0, day: true, night: true }, // 3 Computer Wandlampe
                      { id: 'alexa2.0.Smart-Home-Devices.54a20611-b863-4a2d-80c5-9b7f3caa2339', name: 'Vitrine', mode: 2, day: false, night: true }, // 4 Vitrine
                      { id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0', name: 'Deckenpanel', mode: 1, day: true, night: true }, // 10 Deckenlampe Wohnzimmer
                      { id: 'zigbee2mqtt.0.0x001788010bea2ef4', name: 'Ambiente 1', mode: 0, day: true, night: true }, // 11 Ambiente 1
                      { id: 'zigbee2mqtt.0.0x001788010bea2ec7', name: 'Ambiente 2', mode: 0, day: true, night: true }, // 12 Ambiente 2
                      { id: 'zigbee2mqtt.0.group_3', name: 'Deckenstrahler', mode: 0, day: true, night: true }, // 12 Deckenstrahler
                      { id: 'wled.0.0cb815b8af3c', name: 'Schreibtisch', mode: 4, day: true, night: true, timeout: null }, // 13 Schreibtisch
                      { id: 'wled.0.2cbcbb4f014c', name: 'Fensterbank', mode: 4, day: true, night: true, timeout: null } // 13 Fensterbank
                  ];
                  
                  
                  // Subobj [x][1]
                  var lightSubTyp = [['.state', '.brightness', '.sat', '.color', '.colortemp']];
                  lightSubTyp.push(['.Switch']);
                  lightSubTyp.push(['.powerState']);
                  lightSubTyp.push(['.STATE']);
                  lightSubTyp.push(['.on','.bri', '.ps'])
                  
                  const arrayLightSubTypToText = [
                      ['On', 'Helligkeit', 'Saturation', 'Farbe', 'Farbtemperatur'],
                      ['On'],
                      ['On'],
                      ['On'],
                      ['On', 'Helligkeit', 'Voreinstellung',]
                  ]
                  
                  
                  var Y = -1;
                  let lightScene:([boolean, number, number, string, number?] | [boolean] | [boolean, number,number])[][] = []; //0
                  
                  //0
                  lightScene.push([[false, 180, 140, '#151200', 450]]); //0
                  lightScene[++Y].push([false, 250, 140, '#151200', 450]); //1
                  //lightScene[Y].push([false,100,140,'#151200', 2200]]); //1
                  //lightScene[Y].push([false,200,140,'#151200', 2200]]); //2
                  lightScene[Y].push([false, 230, 0, '', 450]); //8
                  lightScene[Y].push([false, 20,0,'',450]); //3
                  lightScene[Y].push([false]); //4
                  lightScene[Y].push([false]); //5
                  lightScene[Y].push([false, 230, 140, '#001237', 450]); //6
                  lightScene[Y].push([false, 230, 140, '#001237', 450]); //7
                  lightScene[Y].push([true, 230, 0, '', 450]); //8
                  lightScene[Y].push([false,200, 1]); //Schreibtisch 9
                  lightScene[Y].push([true,10,1]); //Fensterbank
                  // +1
                  
                  
                  //Globale Variablen
                  var currentScene = getState('0_userdata.0.currentSceneWZ').val;
                  var dimmerRef = null;
                  //setState('0_userdata.0.currentSceneWZ', currentScene);
                  // Wir überprüfen Scene und Lights Array ob sie zusammenpassen und werfen hilfreiche Fehlermeldungen raus, wenn nicht
                  pruefeBeideArraysAufFehler();
                  // Überprüfung der Array erledigt
                  function pruefeBeideArraysAufFehler() {
                      var myBreak = false;
                      var isError = false;
                      for (var i = 0; i < lightScene.length; i++) {
                          if (lightScene[i].length != lightObj.length) {
                              var myErrorMsg = 'Anzahl der LightScene ' + i + ' Einträge: ' + lightScene[i].length + ' entspricht nicht der Anzahl and LightObjects: ' + lightObj.length;
                              log(myErrorMsg, 'error');
                              var maxLength;
                              isError = true;
                              if (lightScene[i].length > lightObj.length) maxLength = lightScene[i].length;
                              else maxLength = lightObj.length;
                              for (var y = 0; y < maxLength; y++) {
                                  myErrorMsg = '';
                                  if (y < lightScene[i].length) {
                                      myErrorMsg = 'LightScene: ' + i + ' existiert Werte: ' + lightScene[i][y];
                                      log(myErrorMsg, 'info');
                                  } else {
                                      myErrorMsg = 'In LightScene: ' + i + ' existiert Datensatz ' + y + ' nicht!';
                                      log(myErrorMsg, 'error');
                                      myBreak = true;
                                      break;
                                  }
                                  if (y < lightObj.length) {
                                      myErrorMsg = 'LightObjects: ' + y + ' existiert ObjID: ' + lightObj[y][0];
                                      log(myErrorMsg, 'info');
                                  } else {
                                      myErrorMsg = 'LightObjects: ' + y + ' existiert nicht!';
                                      log(myErrorMsg, 'error');
                                      myBreak = true;
                                      break;
                                  };
                              }
                              if (myBreak) break;
                          }
                      }
                      if (isError) {
                          myErrorMsg = 'Skript abgebrochen und pausiert. ';
                          //@ts-ignore
                          stopScript();
                      }
                  }
                  // Überprüfung der Array erledigt
                  
                  init();
                  async function init() {
                      if (!await existsObjectAsync(path)) {
                          await createFolderAsync(path, 'Szenen');
                      }
                      if (!await existsObjectAsync(`${path}.wohnzimmer`)) {
                          await createDeviceAsync(`${path}.wohnzimmer`, 'Szenen');
                      }
                      if (!await existsObjectAsync(`${path}.wohnzimmer.autoModeBright`)) {
                          await createStateAsync(`${path}.wohnzimmer.autoModeBright`, false, false, {name:'Hohe Helligkeit', role: 'state', type: 'boolean', read: true, write: true});
                      }
                      on({ id: `${path}.wohnzimmer.autoModeBright`, change: 'ne' }, function (obj) {
                          autoModeBright = obj.state.val;
                          autoModeOffTimeout = autoModeBright ? 15000 : 2000
                          resetAutoMode();
                          if (obj.id) setState(obj.id, obj.state.val, true);
                      })
                      
                      for (const a in lightScene) {
                          if (!await existsObjectAsync(`${path}.wohnzimmer.${a}`)) {
                              await createChannelAsync(`${path}.wohnzimmer.${a}`, 'Szene');
                              await createStateAsync(`${path}.wohnzimmer.${a}.dimmer`, 80, false, {name:'Helligkeitseinstellung', role: 'level.dimmer', type: 'number', unit:'%', min:1, max: 100, step:1, read: true, write: true});
                          }
                          if (!await existsObjectAsync(`${path}.wohnzimmer.${a}.useDimmer`)) {
                              await createStateAsync(`${path}.wohnzimmer.${a}.useDimmer`, a != '0', false, {name:'Nutze Dimmer', role: 'switch', type: 'boolean', read: true, write: true});
                          }
                          dimmer[a] = {value: (getState(`${path}.wohnzimmer.${a}.dimmer`)).val/100, timeout: null};
                          on({id: `${path}.wohnzimmer.${a}.dimmer`, change:'any', ack: false}, (dp) => {
                              if (!dp || !dp.id) return;
                              const arr = dp.id.split('.');
                              arr.pop()
                              const key = arr.pop();
                              if (key !== undefined) {
                                  dimmer[key].value = dp.state.val / 100;
                                  if (dimmer[key].value <= 0.01 || dimmer[key].value >= 1) {
                                      for (const light of lightObj) {
                                          if (light.mode === 0 && dimmer[key].timeout == null && getState(light.id + lightSubTyp[light.mode][0]).val) {
                                              setState(light.id + '.effect', 'blink');
                                              dimmer[key].timeout = setTimeout((light) => {
                                                  setState(light.id + '.effect', 'stop_effect');
                                                  dimmer[key].timeout = null;
                                              }, 1000, light);
                                          }
                                      }
                                  }
                              }
                              
                              if (dp.oldState.val !== dp.state.val) reSetScene(true);
                              setState(dp.id, dp.state.val, true);
                          })
                          for (const b in lightScene[a]) {
                              if (!await existsObjectAsync(`${path}.wohnzimmer.${a}.${b}`)) {
                                  await createChannelAsync(`${path}.wohnzimmer.${a}.${b}`, lightObj[b].name);
                              } else {
                                  await extendObjectAsync(`${path}.wohnzimmer.${a}.${b}`, {common:{ name: lightObj[b].name, } });
                              }
                              for (let cIndex = 0; cIndex < lightScene[a][b].length; cIndex++) {
                                  const c = arrayLightSubTypToText[lightObj[b].mode][cIndex]
                                  let value: any = undefined;
                                  if (await existsObjectAsync(`${path}.wohnzimmer.${a}.${b}.${cIndex}`)) {
                                      value = getState(`${path}.wohnzimmer.${a}.${b}.${cIndex}`).val;
                                      deleteState(`${path}.wohnzimmer.${a}.${b}.${cIndex}`);
                                  }
                                  if (!await existsStateAsync(`${path}.wohnzimmer.${a}.${b}.${c}`)) {     
                                      value = value === undefined ? lightScene[a][b][cIndex] : value
                                      await createStateAsync(`${path}.wohnzimmer.${a}.${b}.${c}`, value, {name: c, role: 'value', type: typeof lightScene[a][b][cIndex], read: true, write: true});
                                      setState(`${path}.wohnzimmer.${a}.${b}.${c}`, value, true)
                                  } else {
                                      if (typeof getState(`${path}.wohnzimmer.${a}.${b}.${c}`).val == 'object'){
                                          value =  lightScene[a][b][cIndex];
                                      }
                                      if (value !== undefined) setState(`${path}.wohnzimmer.${a}.${b}.${c}`, value, true)
                                      //if (c == 'Farbtemperatur') setState(`${path}.wohnzimmer.${a}.${b}.${c}`, 450, true)
                                      const typ = typeof lightScene[a][b][cIndex];
                                      switch (typ) {
                                          case 'string':
                                          case 'number':
                                          case 'boolean':
                                              await extendObjectAsync(`${path}.wohnzimmer.${a}.${b}.${c}`, {common:{ name: c, } });
                                      }
                                      
                                  }   
                                  await sleep(2) 
                                  lightScene[a][b][cIndex] = (getState(`${path}.wohnzimmer.${a}.${b}.${c}`)).val
                              }
                              on({id: new RegExp(`^${path}\\.wohnzimmer\\.${a}\\.${b}\..+`, 'g'), change:'any', ack: false}, (dp) => {
                                  if (!dp || !dp.id) return;
                                  const arr = dp.id.split('.');
                                  const c = arr.pop()
                                  if (c === undefined) return;
                                  const lampe = parseInt(arr.pop() ?? '');
                                  const scene = arr.pop();
                                  const option = arrayLightSubTypToText[lightObj[lampe].mode].findIndex((a) => a === c);
                                  if (scene === undefined || lampe === undefined || option === undefined) return;
                                  lightScene[scene][lampe][option] = dp.state.val;
                                  if (dp.oldState.val !== dp.state.val) {
                                      if (currentScene != 0) reSetScene(true);
                                      else resetAutoMode();
                                  }
                                  setState(dp.id, dp.state.val, true);
                              })
                          }
                      }
                  }
                  
                  function getCommandString(a,b) {
                      return lightSubTyp[lightObj[a].mode][b]
                  }
                  
                  schedule({ astro: "sunset" }, reSetScene);
                  schedule({ astro: "sunrise" }, reSetScene);
                  
                  function autoScene(x) {
                      // setze scene zurück wenn der ON Status der Lampen nicht der Scene entspricht.
                      if (currentScene > x - 1 && currentScene < lightScene.length) {
                          for (var i = 0; i < lightScene[currentScene].length; i++) {
                              let astro = lightObj[i].day && isAstroDay() || !isAstroDay() && lightObj[i].night;
                              if (lightObj[i].state && (lightScene[currentScene][i][0] && astro) != lightObj[i].state![getCommandString(i,0)]) {
                                  currentScene = x - 1;
                                  break;
                              }
                          }
                      }
                  
                      // Scenen counter 
                      currentScene++;
                      if (currentScene >= 0 || currentScene >= lightScene.length || currentScene < x) {
                          currentScene = x;
                      }
                      setState('0_userdata.0.currentSceneWZ', currentScene);
                  }
                  
                  on({ id: '0_userdata.0.szene_wohnzimmer', change: 'any', ack: false }, function (obj) {
                      switch (obj.state.val) {
                          case 'c':
                              setState('0_userdata.0.currentSceneWZ', 8);
                              break;
                          case 'f':
                              setState('0_userdata.0.currentSceneWZ', 10);
                              break;
                          case 'e':
                              setState('0_userdata.0.currentSceneWZ', 9);
                              break;
                          case 's':
                              setState('0_userdata.0.currentSceneWZ', 11);
                              break;
                          case 'o':
                              setState('0_userdata.0.currentSceneWZ', -1);
                              break;
                      }
                  })
                  
                  on({ id: '0_userdata.0.currentSceneWZ', change: 'any', ack: false }, setScene)
                  
                  function reSetScene(force = false) {
                      if (DEBUG) log('current scene: ' + currentScene);
                      if (currentScene == -1 || currentScene >= lightScene.length) return;
                      for (var i = 0; i < lightScene[currentScene].length; i++) {
                  
                          if (!force && lightObj[i].state && lightScene[currentScene][i][0] != (lightObj[i].state![getCommandString(i,0)] == (lightObj[i].day && isAstroDay() || !isAstroDay() && lightObj[i].night))) {
                              return;
                          }
                      }
                      setScene(undefined)
                  }
                  
                  async function setScene(obj) {
                      if (obj !== undefined) {
                          currentScene = obj.state.val;
                      }
                      if (currentScene == lightScene.length) return;
                      if (currentScene == -1) { stopScene(); return; };
                      if (currentScene === 0) {resetAutoMode(); return;}
                      // Aktive Lampen auf Endwert setzen
                      for (var i = 0; i < lightScene[currentScene].length; i++) {
                          await sleep (25);
                          switchLight(lightScene[currentScene][i], lightObj[i].name)
                      }
                  
                      if (DEBUG) log("setScene to: " + currentScene);
                      setState('0_userdata.0.currentSceneWZ', currentScene, true);
                      switch (currentScene) {
                          case 8:
                              setState('0_userdata.0.szene_wohnzimmer', 'c', true)
                              break;
                          case 10:
                              setState('0_userdata.0.szene_wohnzimmer', 'f', true);
                              break;
                          case 9:
                              setState('0_userdata.0.szene_wohnzimmer', 'e', true);
                              break;
                          case 11:
                              setState('0_userdata.0.szene_wohnzimmer', 's', true);
                              break;
                          case -1:
                              setState('0_userdata.0.szene_wohnzimmer', 'o', true);
                              break;
                          default:
                              setState('0_userdata.0.szene_wohnzimmer', '', true);
                      }
                  };
                  let lastCommandTimeout: any = null
                  let lastCommand:any ={}
                  async function switchLight(cArray, lightName: string, overwriteOn: boolean|null = null, overwriteDim: number|null = null) {
                      const light = lightObj.find(a => a.name == lightName);
                      if (!light) return;
                      
                      var cTyp = light.mode;
                      let astro = light.day && isAstroDay() || !isAstroDay() && light.night;
                      let lOn = (overwriteOn === null || overwriteOn === true ? astro && (cArray[0] || !!overwriteOn) : false);
                      let dimFix = currentScene != -1 ? (getState(`${path}.wohnzimmer.${currentScene}.useDimmer`).val ? dimmer[currentScene].value : 1) : 1;
                      let dim = (overwriteDim !== null ? overwriteDim/100 : 1) * dimFix
                      let carray4 = cArray[4]
                      
                      lastCommandTimeout && clearTimeout(lastCommandTimeout);
                      lastCommandTimeout = setTimeout(() => {lastCommand = {}}, 30000)
                  
                      if (lastCommand[lightName] && lastCommand[lightName].cArray === cArray && lastCommand[lightName].overwriteOn === overwriteOn 
                          && lastCommand[lightName].overwriteDim === overwriteDim && lastCommand[lightName].dim === dim && lastCommand[lightName].astro === astro ) {
                          return;
                      } else {
                  
                          lastCommand[lightName] = {cArray, overwriteOn, overwriteDim, dim, astro}
                      }
                  
                      // Verweizweigung der Lampen nach Funktion;
                      const isOn = getState(light.id + lightSubTyp[cTyp][0]).val;
                     
                      if (lOn === false && (isOn === false || light.timeout)) return;
                       //log (overwriteOn + ' ' + astro + ' ' + cArray[0] + ' ' + lOn + ' '+ (astro && (cArray[0] || !!overwriteOn)) + ' ' + isOn)
                      if (lOn) {
                          if (cTyp == 0) { 
                              let msg:{state:string, brightness: number, transition: number, color?:string, color_temp?: number} = {state: lOn ? 'ON' : 'OFF', brightness:(Math.round((cArray[1]-1) * dim)+1), transition: 1 }
                              if (!cArray[4]) {
                                  msg.color = cArray[3];
                              } else {
                                  carray4 = dimValue(cArray[4]-miredDiff, cArray[4]);
                                  msg.color_temp = carray4
                              }
                              if ((isOn && lOn)) {
                                  if (dim < dimFix) msg.transition = 3;
                                  else msg.transition = 3;
                              } else {
                                  msg.transition = 1
                              }
                              if (isOn !== lOn || getState(light.id + lightSubTyp[cTyp][1]).val !== (Math.round((cArray[1]-1) * dim)+1) 
                                  || carray4 && getState(light.id + lightSubTyp[cTyp][4]).val !== carray4 || !carray4 && getState(light.id + lightSubTyp[cTyp][3]).val !== cArray[3]) {
                                      sendTo('mqtt.0', 'sendMessage2Client', { topic: getTopic(light.id), message: JSON.stringify(msg) });
                                  }
                              //log(getTopic(light.id) + ': ' + JSON.stringify(msg))
                              //log(cArray[3])
                          
                          } else if (cTyp == 4) {    
                              if (light.timeout) clearTimeout(light.timeout);       
                              light.timeout = null;
                              let bri = Math.round((cArray[1]-1) * dim)+1
                              try {
                                  if (bri != getState(`${light.id}.bri`).val || lOn != getState(`${light.id}.on`).val || cArray[2] != getState(`${light.id}.ps`).val ) {
                                      setState(`${light.id}.action`, JSON.stringify({
                                          "bri": bri,
                                          "on": lOn,
                                          'ps': cArray[2],
                                          'transition': 1
                                      }))
                                  }
                              } catch(error) {
                                  console.warn(`wled ${light.id} nicht erreichbar! ` + error)
                  
                              }
                  
                          } else {
                              if (!isOn) setState(light.id + lightSubTyp[cTyp][0], lOn);        
                          }
                      } else {
                          if (cTyp == 0) {
                              let msg:{state:string, brightness: number, transition: number, color?:string, color_temp?: number} = {state: lOn ? 'ON' : 'OFF', brightness:(Math.round((cArray[1]-1) * dim)+1), transition: 2 }
                               msg.transition = 6;
                              
                              if (isOn !== lOn)  sendTo('mqtt.0', 'sendMessage2Client', { topic: getTopic(light.id), message: JSON.stringify(msg) });
                          } else if (cTyp === 4) {
                              const ip = getState(`${light.id}._info.ip`).val
                              try {
                                  if (!getState(`${light.id}.on`).val) {
                                      if (light.timeout) clearTimeout(light.timeout);
                                      return;
                                  }
                                  setState(`${light.id}.action`, JSON.stringify({
                                      "bri": 1,
                                      'ps': 5,           
                                      })
                                  )
                              } catch(error) {
                                  console.warn(`wled ${light.id} nicht erreichbar! ` + error)
                  
                              }
                              if (light.timeout) clearTimeout(light.timeout);
                              light.timeout = setTimeout((id) => {   
                                 setState(`${id}.on`, false)
                              }, 60000*1, light.id)
                          } else {
                              if (getState(light.id + lightSubTyp[cTyp][0]).val) setStateDelayed(light.id + lightSubTyp[cTyp][0], false, 100)
                          }
                      }
                      //log(lightObj[i].id+lightSubTyp[cTyp][0] + ' state: ' + lOn)
                  }
                  function getTopic(id) {
                      const r = getTopic2(id);  
                      return r.replace('group_3', 'Deckenstrahler').replace('group_4', 'Esstisch')
                  }
                  
                  function getTopic2(id) {
                      let a = id.split('.')
                      return 'zigbee2mqtt/' + a[a.length - 1] + '/set'
                  }
                  
                  async function stopScene() {
                      currentScene = -1;
                      for (var i = 0; i < lightObj.length; i++) {
                          await sleep(50)
                          await switchLight(lightScene[0][i], lightObj[i].name, false)
                          //var cTyp = lightObj[i].mode;
                          //if (getState(lightObj[i].id + lightSubTyp[cTyp][0]).val) setState(lightObj[i].id + lightSubTyp[cTyp][0], false);
                      }
                      setState('0_userdata.0.currentSceneWZ', currentScene, true)
                      setState('0_userdata.0.szene_wohnzimmer', 'o', true);
                  }
                  
                  function setBriOfLightsTo(value) {
                      for (var i = 0; i < lightScene[currentScene].length; i++) {
                          var cArray = lightScene[currentScene][i];
                          if (cArray[0]) {
                              var cTyp = lightObj[i].mode;
                              if (cTyp == 0) {
                                  setState(lightObj[i].id + lightSubTyp[cTyp][1], value);
                              } else {
                  
                              }
                          }
                      }
                  }
                  
                  on({ id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.longpush', change: 'ne' }, function (obj) {
                      if (obj.state.val) {
                          setState('0_userdata.0.currentSceneWZ', -1);
                      }
                  })
                  
                  on({ id: mySwitch + 'on_press', change: 'ne', val: true }, function (obj) {
                      if (!mySwitchTimeout) {
                          mySwitchTimeout = setTimeout(function () {
                              autoScene(0);
                              mySwitchTimeout = null;
                          }, 300);
                      }
                  });
                  on({ id: mySwitch + 'off_press', change: 'ne', val: true }, function (obj) {
                      setState('0_userdata.0.currentSceneWZ', -1)
                  });
                  on({ id: mySwitch + 'off_hold', change: 'ne', val: true }, function (obj) {
                      if (currentScene != -1)  setBriOfLightsTo(1);
                  });
                  on({ id: mySwitch + 'on_hold', change: 'ne', val: true }, function (obj) {
                      if (!mySwitchTimeout) {
                          mySwitchTimeout = setTimeout(function () {
                              autoScene(7);
                              mySwitchTimeout = null;
                          }, 300);
                      }
                  });
                  on({ id: mySwitch2 + 'on_press', change: 'ne', val: true }, function (obj) {
                      atv(true)
                  });
                  on({ id: mySwitch2 + 'off_press', change: 'ne', val: true }, function (obj) {
                      atv(false)
                  });
                  on({ id: mySwitch2 + 'down_press', change: 'ne', val: true }, function (obj) {
                      if (!getState("hyperion_ng.0.1.components.V4L").val) setState("hyperion_ng.0.1.components.V4L", true);
                  });
                  on({ id: mySwitch2 + 'up_press', change: 'ne', val: true }, function (obj) {
                      if (getState("hyperion_ng.0.1.components.V4L").val) setState("hyperion_ng.0.1.components.V4L", false);
                  });
                  
                  on({ id: '0_userdata.0.Dummys.AppleTV_Licht_einschalten', change: "any", ack: false }, function (obj) {
                      if (obj.state.val == true) {
                          atv(true)
                      }
                      else {
                          atv(false)
                      }
                      if (obj.id) setState(obj.id, obj.state.val, true);
                  
                  })
                  let hyperionStartupCheck;
                  let appleTvPlaying = getState('homekit-controller.0.IP-68:80:C5:D1:2D:02.1.sensor-motion-52.motion-detected').val;
                  let hyperionWledIdOn = getState('sonoff.0.Gosund Steckdose 8.POWER').val;
                  let subscriptWled: any = null;
                  on({ id: 'sonoff.0.Gosund Steckdose 8.POWER', change: "ne" }, function (obj) {
                      if (subscriptWled) clearTimeout(subscriptWled);
                      if (!obj.state.val) {
                          hyperionWledIdOn = obj.state.val;
                          setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.suspend', true);
                          SetLightsForAppleTV();   
                      } else {
                          subscriptWled = setTimeout(() => {
                                  hyperionWledIdOn = obj.state.val;
                                  SetLightsForAppleTV();     
                          },500)       
                      } 
                  })
                  let appleTvOffTimeout = null;
                  on({id:'homekit-controller.0.IP-68:80:C5:D1:2D:02.1.television-8.active', change:'ne'}, (obj) => {
                      if (!hyperionWledIdOn) {
                          appleTvOffTimeout = null;
                          return;
                      }
                      if (obj.state.val != 0) {
                          if (appleTvOffTimeout) {
                              clearTimeout(appleTvOffTimeout)
                              appleTvOffTimeout = null;
                          }
                          return;
                      }
                      if (appleTvOffTimeout) return;    
                      appleTvOffTimeout = setTimeout(()=>{ 
                          setState('sonoff.0.Gosund Steckdose 8.POWER', false); 
                          appleTvOffTimeout = null;
                          }, 120000)
                  })
                  
                  on({id: 'homekit-controller.0.IP-68:80:C5:D1:2D:02.1.sensor-motion-52.motion-detected', change: 'ne'}, function(obj) {
                      appleTvPlaying = obj.state.val;
                      SetLightsForAppleTV(obj.state.val)
                  })
                  function SetLightsForAppleTV(isPlaying: boolean | null = null) {
                      if (isPlaying === null) isPlaying = appleTvPlaying;
                  
                      if (isPlaying && hyperionWledIdOn) {
                          setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.resume', true);
                          if (!getState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.componentstate.LEDDEVICE').val) setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.componentstate.LEDDEVICE', true);
                          hyperion_on = true;
                          setLights();
                      } else {
                          setState('hyperion-connector.0.107a543b-ddfc-5ac9-8f44-051ae0e6db4d.controls.system.idle', true);
                          hyperion_on = false;
                          setLights();
                      }
                  }
                  
                  async function atv(on) {
                      if (on) {
                          if (!getState('sonoff.0.Gosund Steckdose 3.POWER').val) {
                              setState('sonoff.0.Gosund Steckdose 3.POWER', true)
                              await sleep(5000)
                          }
                          if (!getState('sonoff.0.Gosund Steckdose 8.POWER').val) {
                              setState('sonoff.0.Gosund Steckdose 8.POWER', true);
                          }
                          setState('0_userdata.0.Dummys.AppleTV_einschalten', true, false)
                  
                      } else {
                          if (getState('sonoff.0.Gosund Steckdose 8.POWER').val) setState('sonoff.0.Gosund Steckdose 8.POWER', false);
                          setStateDelayed('0_userdata.0.currentSceneWZ', currentScene, 800)
                          setState('0_userdata.0.Dummys.AppleTV_ausschalten', true)
                      }
                  }
                  
                  
                  on({ id: 'shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.Input', change:'ne', val:true }, () => {
                      DeckenpanelShouldOn = !DeckenpanelShouldOn;
                      setLights(true);
                  })
                  
                  let bigLampShouldOn = getState('shelly.0.SHSW-1#E8DB84D7B242#1.Relay0.Switch').val
                  let DeckenpanelShouldOn = getLightObjectState('Deckenpanel')
                  if (DeckenpanelShouldOn) {
                      setLightObjectState('Deckenpanel', false)
                      DeckenpanelShouldOn = false;
                  }
                  
                  let presence
                  const radarZone = {
                      lux: {
                          front:'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-light-2672.light-level-current',
                          behindComputer:'sonoff.0.lux1_tasmota_638B51.BH1750_Illuminance',
                      },
                      presence1: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2688.occupancy-detected',
                          count: 0
                      },
                      presence2: {
                          id: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2688.occupancy-detected',
                          count: 0
                      },
                      durch: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2700.occupancy-detected',
                          id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2696.occupancy-detected',
                          count:0,
                          count2: 0,
                          state: false
                      },
                      couch: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2704.occupancy-detected',
                          id2:'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2704.occupancy-detected',
                          count:0,
                          count2:0,
                          state: false
                      },
                      computer: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2692.occupancy-detected',
                          id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2692.occupancy-detected',
                          count: 0,
                          count2: 0,
                          state: false
                      },
                      ess: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2696.occupancy-detected',
                          id2: 'homekit-controller.0.IP-7D:4F:34:4A:51:D1.1.sensor-occupancy-2700.occupancy-detected',
                          count: 0,
                          count2: 0,
                          state: false
                      },
                      durch_ess: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2712.occupancy-detected',
                          count: 0,
                          state: false
                      },
                      durch_computer: {
                          id: 'homekit-controller.0.IP-C6:61:82:37:C4:1F.1.sensor-occupancy-2708.occupancy-detected',
                          count: 0,
                          state: false
                      }
                  }
                  
                  front = getState(radarZone.lux.front).val < luxminFront;
                  behindComputer = getState(radarZone.lux.behindComputer).val < luxminBehind;
                  behind = getState(radarZone.lux.front).val < luxminBehind;
                  let oldPresense: boolean | undefined = undefined
                  function checkPresence() {
                      presence = !!radarZone.presence1.count || !!radarZone.presence2.count
                      if (currentScene !== 0 && currentScene !== -1) {
                          oldPresense = undefined;
                          return;
                      }
                      if (oldPresense !== presence) {
                          if (presence) {
                              currentScene = 0;        
                              //schreibtischLampe(true);
                              //esstischLampe(true);
                              //durchgang(true);
                              setLights(undefined, true);
                          }
                      }
                      oldPresense = presence;
                      const dimmode =  getState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode').val;
                      if (presence ) {     
                              if (!dimmode) setState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode', true)
                              setState('0_userdata.0.currentSceneWZ', 0, true) ;                     
                          } else {
                              if (dimmode) setState('0_userdata.0.NSPanel.2.ScreensaverInfo.Trigger_Dimmode', false)
                              if (currentScene == 0) {
                                  setState('0_userdata.0.currentSceneWZ', -1)
                              }
                          }
                  }
                  radarZone.presence1.count = getState(radarZone.presence1.id).val;
                  radarZone.presence2.count = getState(radarZone.presence2.id).val;
                  
                  on({id: radarZone.presence1.id, change: 'ne'}, function(obj){
                      //log('0 Anwesenheit ' + obj.state.val)
                      radarZone.presence1.count = obj.state.val 
                      checkPresence();
                  });
                  on({id: radarZone.presence2.id, change: 'ne'}, function(obj){
                      //log('0 Anwesenheit ' + obj.state.val)
                      radarZone.presence2.count = obj.state.val 
                      checkPresence();
                  });
                  on({id: radarZone.lux.front, change: 'ne'}, function(obj){
                      front = obj.state.val < luxminFront;
                      behind = obj.state.val < luxminBehind;
                     
                     
                  });
                  on({id: radarZone.lux.behindComputer, change: 'ne'}, function(obj){
                      behindComputer = obj.state.val < luxminComputer;
                  });
                  
                  
                  on({id: radarZone.computer.id, change: 'ne'}, function(obj){
                      //log('1 Schreibtisch ' + obj.state.val)
                      radarZone.computer.count = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //schreibtischLampe()
                      
                  });
                  on({id: radarZone.computer.id2, change: 'ne'}, function(obj){
                      //log('1 Schreibtisch ' + obj.state.val)
                      radarZone.computer.count2 = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //schreibtischLampe()
                      
                  });
                  on({id: radarZone.ess.id, change: 'ne'}, function(obj){
                      //log('2 Essbereich' + obj.state.val)
                      radarZone.ess.count = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //esstischLampe()
                      //durchgang()
                  });
                  on({id: radarZone.ess.id2, change: 'ne'}, function(obj){
                      //log('2 Essbereich' + obj.state.val)
                      radarZone.ess.count2 = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //esstischLampe()
                      //durchgang()
                  });
                  on({id: radarZone.durch.id, change: 'ne'}, function(obj){
                      //log('3 Durchgangsbereich' + obj.state.val)
                      radarZone.durch.count = obj.state.val
                      if (currentScene != 0) return;    
                      setLights()
                      //schreibtischLampe()
                      //esstischLampe()
                      //couchLampe()
                      //durchgang()
                  });
                  on({id: radarZone.durch.id2, change: 'ne'}, function(obj){
                      //log('3 Durchgangsbereich' + obj.state.val)
                      radarZone.durch.count2 = obj.state.val
                      if (currentScene != 0) return;    
                      setLights()
                      //schreibtischLampe()
                      //esstischLampe()
                      //couchLampe()
                      //durchgang()
                  });
                  on({id:radarZone.couch.id, change: 'ne'}, function(obj){
                      //log('4 Couch ' + obj.state.val)
                      radarZone.couch.count = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //couchLampe()
                  });
                  on({id: radarZone.durch_computer.id, change: 'ne'}, function(obj){
                      //log('3 Durchgangsbereich' + obj.state.val)
                      radarZone.durch_computer.count = obj.state.val
                      if (currentScene != 0) return;   
                       setLights() 
                      //schreibtischLampe()
                      //durchgang()
                  });
                  on({id: radarZone.durch_ess.id, change: 'ne'}, function(obj){
                      //log('3 Durchgangsbereich' + obj.state.val)
                      radarZone.durch_ess.count = obj.state.val
                      if (currentScene != 0) return;    
                      setLights()
                      //esstischLampe()
                      //durchgang()
                  });
                  
                  
                  on({id:radarZone.couch.id2, change: 'ne'}, function(obj){
                      //log('4 Couch ' + obj.state.val)
                      radarZone.couch.count2 = obj.state.val
                      if (currentScene != 0) return;
                      setLights()
                      //couchLampe()
                  });
                  
                  resetAutoMode()
                  
                  function resetAutoMode() {
                      if (currentScene != 0) return;
                      
                      const obj: {state:{val:any}} = {state: {val:0}}
                     
                      obj.state.val = getState(radarZone.computer.id).val
                      radarZone.computer.count = obj.state.val
                      
                      obj.state.val = getState(radarZone.computer.id2).val
                      radarZone.computer.count2 = obj.state.val
                  
                      obj.state.val = getState(radarZone.ess.id).val
                      radarZone.ess.count = obj.state.val
                  
                      obj.state.val = getState(radarZone.ess.id2).val
                      radarZone.ess.count2 = obj.state.val
                  
                      obj.state.val = getState(radarZone.durch.id).val
                      radarZone.durch.count = obj.state.val
                  
                      obj.state.val = getState(radarZone.durch.id2).val
                      radarZone.durch.count2 = obj.state.val
                  
                      obj.state.val = getState(radarZone.couch.id).val
                      radarZone.couch.count = obj.state.val
                  
                      obj.state.val = getState(radarZone.durch_computer.id).val
                      radarZone.durch_computer.count = obj.state.val
                  
                      obj.state.val = getState(radarZone.durch_ess.id).val
                      radarZone.durch_ess.count = obj.state.val
                   
                      obj.state.val = getState(radarZone.couch.id2).val
                      radarZone.couch.count2 = obj.state.val
                  
                      obj.state.val = getState(radarZone.lux.front).val
                      front = obj.state.val < luxminFront;
                      behind = obj.state.val < luxminBehind;
                      obj.state.val = getState(radarZone.lux.behindComputer).val
                      behindComputer = obj.state.val < luxminComputer;
                  
                      setLights();
                  }
                  
                  const lightZoneSettings:Record<lightNameType, {on: boolean, dim: number, timeout: any, hyperion?:boolean}>  = {
                      Couch: {
                          on: false,
                          hyperion: true,
                          dim:0,
                          timeout: null,
                      },
                      Schreibtisch: {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      Esstisch: {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      Deckenstrahler: {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      "Computer-Wandlampe": {
                          on: false,
                          dim:0,
                          timeout: null,
                      },
                      "Deckenpanel": {
                          on: false,
                          hyperion: true,
                          dim:0,
                          timeout: null,
                      },
                      "Ambiente 1": {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      "Ambiente 2": {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      Fensterbank: {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      Stehlampe: {
                          on: false,
                          hyperion: true,
                          dim:0,
                          timeout: null,
                      },
                      "Vitrine": {
                          on: false,
                          
                          dim:0,
                          timeout: null,
                      },
                      
                  }
                  
                  
                  
                  /*
                  * getLightObject
                  * @param name: lightNameType  
                  * @returns lightObject
                  */
                  function getLightObject(name: lightNameType): lightObjectsType {
                      const result = lightObj.find(a => a.name === name);
                      if (!result) {
                          throw new Error(`lightObject ${name} not found`)
                      }
                      return result;
                  }   
                  
                  function getLightObjectState(name: lightNameType): boolean {
                      return getState(getLightObject(name).id + lightSubTyp[getLightObject(name).mode][0]).val
                  }
                  
                  function getLightObjectIndex(name: lightNameType) {
                      return lightObj.findIndex(a => a.name === name)
                  }
                  
                  function setLightObjectState(name: lightNameType, on: boolean): void {
                      setState(getLightObject(name).id + lightSubTyp[getLightObject(name).mode][0], on)
                  }
                  
                  let timeoutSetLights: any = null;
                  function setLights(force: boolean = false, go: boolean = false) {
                      try {
                          //debounce
                          if (timeoutSetLights) {
                              clearTimeout(timeoutSetLights)
                              timeoutSetLights = null;
                          }
                          if (!go) {
                              timeoutSetLights = setTimeout(() => {
                                  setLights(force, true)
                              }, 100)
                              return;
                          }
                  
                          // reset variables
                          for (const key in lightZoneSettings) {
                              lightZoneSettings[key].on = false;
                              lightZoneSettings[key].dim = 0;
                          }
                  
                          /*
                          * 1. Couch
                          * 2. Schreibtisch
                          * 3. Esstisch
                          * 4. Deckenstrahler
                          * 5. Computer-Wandlampe
                          * 6. Deckenpanel
                          * 7. Ambiente 1
                          * 8. Ambiente 2
                          * 9. Fensterbank
                          * 10. Stehlampe
                          * 11. Vitrine
                          * 
                          *  lux is the indoor light sensor value
                          *  toDark is true if the outdoor light sensor value is below the minimum lux value
                          */
                          const toDark = shutterPos > cShutterPosForLight || behind || !isAstroDay();
                          const toDarkComputer = shutterPos > cShutterPosForLight || behindComputer || !isAstroDay();
                          //Couch
                          let on = radarZone.couch.count > 0 || radarZone.couch.count2 > 0;
                          let dim = radarZone.couch.count > 0 || radarZone.couch.count2 > 0 ? 100 : 5;
                          on = on && front;
                          lightZoneSettings.Couch.on = lightZoneSettings.Couch.on || on;
                          lightZoneSettings.Couch.dim = Math.max(lightZoneSettings.Couch.dim ,dim);
                          lightZoneSettings.Stehlampe.on = lightZoneSettings.Stehlampe.on || on;
                          lightZoneSettings.Stehlampe.dim = Math.max(lightZoneSettings.Stehlampe.dim, dim);
                          lightZoneSettings.Deckenpanel.on = lightZoneSettings.Deckenpanel.on || on;
                          lightZoneSettings.Deckenpanel.dim = Math.max(lightZoneSettings.Deckenpanel.dim, dim);
                          
                          //Computer
                          on =  radarZone.computer.count > 0 || radarZone.computer.count2 > 0 || radarZone.durch_computer.count > 0 ;
                          on = on && toDarkComputer || schreibtischbereichSchalter
                          dim =  radarZone.computer.count > 0 || radarZone.computer.count2 > 0 || radarZone.durch_computer.count > 0  || schreibtischbereichSchalter? 100 : 15;
                          
                          let dim2 = schreibtischbereichSchalter ? 100 : on ? 50 : 10;
                          lightZoneSettings['Computer-Wandlampe'].on = lightZoneSettings['Computer-Wandlampe'].on || on
                          lightZoneSettings['Computer-Wandlampe'].dim = Math.max(lightZoneSettings['Computer-Wandlampe'].dim, dim2) 
                          lightZoneSettings['Ambiente 1'].on = lightZoneSettings['Ambiente 1'].on || on
                          lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, dim)
                          lightZoneSettings['Ambiente 2'].on = lightZoneSettings['Ambiente 2'].on || on
                          lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, dim)
                          lightZoneSettings.Schreibtisch.on = lightZoneSettings.Schreibtisch.on || on
                          lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, dim)
                          
                          //Esstisch
                          on =  lightZoneSettings.Esstisch.on || radarZone.ess.count > 0 || radarZone.ess.count2 > 0 || radarZone.durch_ess.count > 0;
                          on = on && toDark || essbereichSchalter
                          dim = Math.max(lightZoneSettings.Esstisch.dim, radarZone.ess.count > 0 || radarZone.ess.count2 > 0 || radarZone.durch_ess.count > 0 || essbereichSchalter ? 100 : 15);
                          lightZoneSettings.Esstisch.on = on;
                          lightZoneSettings.Esstisch.dim = dim;
                  
                          // Durchgang
                          on = radarZone.durch.count +radarZone.durch.count2 > 0 || radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0 || (schreibtischbereichSchalter && DeckenpanelShouldOn);
                          on = on && toDark
                          dim = Math.max(radarZone.durch.count+radarZone.durch.count2 > 0 ? 85 : 0);
                          dim = Math.max(dim, radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0 || (schreibtischbereichSchalter && DeckenpanelShouldOn) ? 70 : 0);
                          lightZoneSettings.Couch.on = lightZoneSettings.Couch.on || (on && front);
                          lightZoneSettings.Stehlampe.on = lightZoneSettings.Stehlampe.on || (on && front);
                          lightZoneSettings.Deckenstrahler.on = lightZoneSettings.Deckenstrahler.on || on;
                          lightZoneSettings.Deckenstrahler.dim = Math.max(lightZoneSettings.Deckenstrahler.dim, dim);
                          lightZoneSettings.Deckenpanel.on = lightZoneSettings.Deckenpanel.on || on;
                          lightZoneSettings.Deckenpanel.dim = Math.max(lightZoneSettings.Deckenpanel.dim, dim);
                          lightZoneSettings.Fensterbank.on = lightZoneSettings.Fensterbank.on || on;
                          lightZoneSettings.Fensterbank.dim = Math.max(lightZoneSettings.Fensterbank.dim, dim);
                          lightZoneSettings['Ambiente 1'].on = on  || lightZoneSettings['Ambiente 1'].on;
                          lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, 3);
                          lightZoneSettings['Ambiente 2'].on = on  || lightZoneSettings['Ambiente 2'].on;
                          lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, 3);
                          lightZoneSettings.Schreibtisch.on = on  || lightZoneSettings.Schreibtisch.on;
                          lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, 3);
                          lightZoneSettings.Esstisch.on =  on  || lightZoneSettings.Esstisch.on;
                          lightZoneSettings.Esstisch.dim = Math.max(lightZoneSettings.Esstisch.dim, 3);
                          
                          // if Durchgang is true dont deactivate lights in Schreibtisch and Esstisch
                          on = radarZone.durch.count+radarZone.durch.count2 > 0 || radarZone.durch_ess.count > 0 || radarZone.durch_computer.count > 0
                          on = on && toDark
                          lightZoneSettings.Couch.on = (getLightObjectState("Couch") && on && front) || lightZoneSettings.Couch.on
                          lightZoneSettings.Stehlampe.on = (getLightObjectState("Stehlampe") && on && front) || lightZoneSettings.Stehlampe.on
                          lightZoneSettings["Computer-Wandlampe"].on = (getLightObjectState("Computer-Wandlampe") && on) || lightZoneSettings["Computer-Wandlampe"].on;
                          lightZoneSettings["Computer-Wandlampe"].dim = Math.max(lightZoneSettings["Computer-Wandlampe"].dim, 10);
                          lightZoneSettings['Ambiente 1'].on = (getLightObjectState('Ambiente 1') && on)  || lightZoneSettings['Ambiente 1'].on;
                          lightZoneSettings['Ambiente 1'].dim = Math.max(lightZoneSettings['Ambiente 1'].dim, 3);
                          lightZoneSettings['Ambiente 2'].on = (getLightObjectState('Ambiente 2') && on)  || lightZoneSettings['Ambiente 2'].on;
                          lightZoneSettings['Ambiente 2'].dim = Math.max(lightZoneSettings['Ambiente 2'].dim, 3);
                          lightZoneSettings.Schreibtisch.on = (getLightObjectState('Schreibtisch') && on)  || lightZoneSettings.Schreibtisch.on;
                          lightZoneSettings.Schreibtisch.dim = Math.max(lightZoneSettings.Schreibtisch.dim, 3);
                          lightZoneSettings.Esstisch.on = (getLightObjectState('Esstisch') && on)  || lightZoneSettings.Esstisch.on;
                          lightZoneSettings.Esstisch.dim = Math.max(lightZoneSettings.Esstisch.dim, 3);
                          
                      
                          /*
                          * Dont activate the light if day is detected
                          */
                          if (isAstroDay()) {
                              lightZoneSettings.Fensterbank.on = getLightObjectState('Fensterbank') || schreibtischbereichSchalter && lightZoneSettings.Fensterbank.on;
                              lightZoneSettings.Schreibtisch.on = getLightObjectState('Schreibtisch') || schreibtischbereichSchalter && lightZoneSettings.Schreibtisch.on;
                          }
                          // Deactive the big light if the value is false
                          if (!bigLampShouldOn) {
                              lightZoneSettings.Deckenpanel.on = false;
                              lightZoneSettings.Deckenpanel.dim = 0;
                              //lightZoneSettings['Computer-Wandlampe'].on = false;
                              lightZoneSettings['Computer-Wandlampe'].dim = schreibtischbereichSchalter ? 100 : Math.max(lightZoneSettings['Computer-Wandlampe'].dim, 10);
                          } else {
                              lightZoneSettings.Deckenpanel.on = true;
                              lightZoneSettings.Deckenpanel.dim = 0;
                              lightZoneSettings['Computer-Wandlampe'].on = true;
                              lightZoneSettings['Computer-Wandlampe'].dim = 95;
                          }
                          // if hyperion is on deactivate the other lights
                          if (hyperion_on) {
                              lightZoneSettings.Couch.on = false;
                              lightZoneSettings.Couch.dim = 0;
                              lightZoneSettings.Stehlampe.on = false;
                              lightZoneSettings.Stehlampe.dim = 0;
                              lightZoneSettings.Deckenpanel.on = false;
                              lightZoneSettings.Deckenpanel.dim = 0;
                              lightZoneSettings.Deckenstrahler.dim = Math.min(lightZoneSettings.Deckenstrahler.dim, 25);
                              lightZoneSettings.Fensterbank.dim = Math.min(lightZoneSettings.Fensterbank.dim, 5);
                          }
                          // if button is pressed activate the deckenpanel
                          if (DeckenpanelShouldOn) {
                              lightZoneSettings.Deckenpanel.on = true;
                              lightZoneSettings.Deckenpanel.dim = 100;
                          }
                          // if any light is on activte the deckenspots
                          on = false;
                          for (const key in lightZoneSettings) {
                              on = on || lightZoneSettings[key].on;
                          }
                          lightZoneSettings.Deckenstrahler.on = toDark && (on || lightZoneSettings.Deckenstrahler.on);
                          lightZoneSettings.Deckenstrahler.dim = Math.max(lightZoneSettings.Deckenstrahler.dim, 5);
                          
                          // write the settings to the lights
                          for (const key in lightZoneSettings) {
                              if (lightZoneSettings[key].timeout) clearTimeout(lightZoneSettings[key].timeout);
                              if (lightZoneSettings[key].on) {
                                  switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim);
                              } else {
                                  if (force || (hyperion_on && lightZoneSettings[key].hyperion)) {
                                      switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim)
                                  } else {
                                      lightZoneSettings[key].timeout = setTimeout((key) => {
                                          switchLight(lightScene[0][getLightObjectIndex(key as any)], key, lightZoneSettings[key].on, lightZoneSettings[key].dim == 100 ? undefined : lightZoneSettings[key].dim)
                                      }, autoModeOffTimeout, key)
                                  }
                              }
                              
                          }
                      } catch(error) {
                          log(error as string)
                      }
                  }
                  
                  function dimValue(from: number, to: number): number {
                          return _dimValue({from, to});
                  }
                  
                  type dimValueOptionsType = {
                      begin?: string;
                      end?: string;
                      reset?: string;
                      from?: number;
                      to?: number;
                      sunset?: boolean | number
                  }
                  
                  function _dimValue(options: dimValueOptionsType = {}): number {
                      options = {...dimValueOptions, ...options}
                      if (!options.begin || !options.end || !options.reset || options.from === undefined || options.to === undefined ) {
                          log('missing value')
                          return options.from || 0;
                      }
                      const startArr = options.begin.split(':');
                      const endArr = options.end.split(':');
                      const resetArr = options.reset.split(':');
                      if (startArr.length <= 1 || endArr.length <= 1 || resetArr.length <= 1) {
                          log('dimValue: missing string in start, reset or end (xx:xx)')
                          return options.to
                      }
                      const currentTime = new Date().getTime();
                      let startTime = new Date().setHours(parseInt(startArr[0]), parseInt(startArr[1]), startArr[2] ? parseInt(startArr[2]) : 0 );
                      let endTime = new Date().setHours(parseInt(endArr[0]), parseInt(endArr[1]), endArr[2] ? parseInt(endArr[2]) : 0 );
                      let resetTime = new Date().setHours(parseInt(resetArr[0]), parseInt(resetArr[1]), resetArr[2] ? parseInt(resetArr[2]) : 0 );
                      
                      if (endTime < startTime) {
                          if (startTime > currentTime && endTime > currentTime) {
                              // end is this day
                              startTime -=24 * 60 * 60 * 1000;
                          } 
                          if (startTime <= currentTime && endTime <= currentTime) {
                              // end is next day
                              endTime += 24 * 60 * 60 * 1000
                  
                          }
                      }
                      let from = options.from;
                      const to = options.to;
                      const sunset = options.sunset
                      from = sunset && typeof sunset === 'number' ? calculateDimSunset(from, sunset) : from;
                      if (currentTime <= startTime || currentTime >= endTime) {
                          //  20:00 > 6:00 && 20:00 < 21:00 (true) || 6:00 > 2:00 && 1:00 < 2:00 (true)
                          if (currentTime >= resetTime && currentTime < startTime || resetTime > startTime && currentTime < startTime ) {
                              return from;
                          }
                          return to;
                      }
                      const diff = to - from;
                      const result = Math.round(diff * (currentTime-startTime) / (endTime-startTime)) + from;
                      return result; 
                  
                  }
                  
                  function calculateDimSunset(from: number, to: number | number): number {
                      const sunsetStartTime = getAstroDate('sunsetStart').getTime();
                      const sunsetEndTime = getAstroDate('dusk').getTime();
                      const currentTime = new Date().getTime();
                      if (currentTime > sunsetEndTime) return to;
                      else if (currentTime < sunsetStartTime) return from;
                      const diff = to - from;
                      const result = Math.round(diff * (currentTime-sunsetStartTime) / (sunsetEndTime-sunsetStartTime)) + from;
                      return result;
                  }
                  

                  Man kann hier auch richtig lange sachen posten, außer es ist ein blockly dann es am besten als JS rauskopieren.

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  1 Antwort Letzte Antwort
                  0
                  • P peterfido

                    @hub01 Kann sein, dass ein Ausschnitt reicht. Muss es allerdings nicht. Evtl. gibt es noch mehr im Skript zu optimieren, was bei der Gelegenheit gleich passieren könnte.

                    Umlaute vermeide ich. Zumindest im Namen des Skripts ist einer enthalten.

                    Ansonsten reichen die Meldungen allein nicht.

                    H Offline
                    H Offline
                    hub01
                    schrieb am zuletzt editiert von
                    #10

                    @peterfido
                    Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
                    Das wird immer eine endlose Diskussion bei mir.
                    Hatte ich z.B. beim Thema „zyklische Routinen“

                    Hier mal der Teil, in dem die Meldungen erzeugt werden:
                    Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

                    // ======================================
                    //   Wallbox-Ansteuerung
                    //   ( TEST 2, noch nicht fertig )
                    //
                    //   zukünftige Funktionen:
                    //    - erst Abfahren, dann Ausschalten
                    //    - beim Laden Auto abgesteckt?
                    // ======================================
                    const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
                    setInterval(async function() {
                    
                        // Status von WB holen
                        // -------------------
                        bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
                        var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
                        var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
                        var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
                        b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
                        iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
                    
                        //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
                    
                        // Wallbox ansteuern
                        // -----------------
                    
                        if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
                            if(!bAcsRM) {                                   // Authent. Ein?
                                setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
                    
                                if(iPhasen==1)                              // Phasen-Vorwahl
                                setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                                else 
                                setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
                    
                                console.info("Anlauf: Authent. Aus, Phasenvorwahl");
                            }
                    
                            else if(!bZusRM) {                              // Wallbox Aus?
                                setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                                console.info("WB einschalten");
                            }
                        }
                    
                        if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
                            if(bZusRM) {                                    //   Wallbox Ein?
                                setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                                console.info("WB ausschalten");
                            }
                            else if(bAcsRM) {                               // Authent. Aus?
                                setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                                console.info("Authent. Ein");
                            }
                        }
                    
                        if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
                            setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
                            console.info("Pause einschalten");
                        }
                        
                        if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
                            setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
                            console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                        }
                    
                        if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
                            setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
                            console.info("auf 1-phasig umschalten");
                            console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                        }
                    
                        if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
                            setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
                            console.info("auf 3-phasig umschalten");
                            console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                        }
                    
                    }, zykWB);
                    
                    HomoranH OliverIOO 2 Antworten Letzte Antwort
                    0
                    • H hub01

                      @peterfido
                      Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
                      Das wird immer eine endlose Diskussion bei mir.
                      Hatte ich z.B. beim Thema „zyklische Routinen“

                      Hier mal der Teil, in dem die Meldungen erzeugt werden:
                      Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

                      // ======================================
                      //   Wallbox-Ansteuerung
                      //   ( TEST 2, noch nicht fertig )
                      //
                      //   zukünftige Funktionen:
                      //    - erst Abfahren, dann Ausschalten
                      //    - beim Laden Auto abgesteckt?
                      // ======================================
                      const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
                      setInterval(async function() {
                      
                          // Status von WB holen
                          // -------------------
                          bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
                          var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
                          var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
                          var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
                          b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
                          iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
                      
                          //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
                      
                          // Wallbox ansteuern
                          // -----------------
                      
                          if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
                              if(!bAcsRM) {                                   // Authent. Ein?
                                  setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
                      
                                  if(iPhasen==1)                              // Phasen-Vorwahl
                                  setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                                  else 
                                  setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
                      
                                  console.info("Anlauf: Authent. Aus, Phasenvorwahl");
                              }
                      
                              else if(!bZusRM) {                              // Wallbox Aus?
                                  setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                                  console.info("WB einschalten");
                              }
                          }
                      
                          if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
                              if(bZusRM) {                                    //   Wallbox Ein?
                                  setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                                  console.info("WB ausschalten");
                              }
                              else if(bAcsRM) {                               // Authent. Aus?
                                  setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                                  console.info("Authent. Ein");
                              }
                          }
                      
                          if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
                              setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
                              console.info("Pause einschalten");
                          }
                          
                          if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
                              setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
                              console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                          }
                      
                          if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
                              setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
                              console.info("auf 1-phasig umschalten");
                              console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                          }
                      
                          if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
                              setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
                              console.info("auf 3-phasig umschalten");
                              console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                          }
                      
                      }, zykWB);
                      
                      HomoranH Offline
                      HomoranH Offline
                      Homoran
                      Global Moderator Administrators
                      schrieb am zuletzt editiert von Homoran
                      #11

                      @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

                      console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);

                      wie oft kommt das denn im Skript vor?

                      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                      Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                      H 1 Antwort Letzte Antwort
                      0
                      • HomoranH Homoran

                        @hub01 sagte in zig gleiche Einträge in JS-Protokollanzeige:

                        console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);

                        wie oft kommt das denn im Skript vor?

                        H Offline
                        H Offline
                        hub01
                        schrieb am zuletzt editiert von
                        #12

                        @homoran
                        f628bcd4-8513-4160-9e3c-a828b2851cfe-grafik.png

                        HomoranH 1 Antwort Letzte Antwort
                        0
                        • H hub01

                          @homoran
                          f628bcd4-8513-4160-9e3c-a828b2851cfe-grafik.png

                          HomoranH Offline
                          HomoranH Offline
                          Homoran
                          Global Moderator Administrators
                          schrieb am zuletzt editiert von Homoran
                          #13

                          @hub01 das stimmt nicht!
                          alleine in den Ausschnitt sind 3
                          Screenshot_20250216-185233_Firefox.jpg

                          und wie oft werden die aufgerufen?

                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          H 1 Antwort Letzte Antwort
                          0
                          • H hub01

                            @peterfido
                            Möchte eigentlich nicht, dass mein ganzes Script analysiert wird.
                            Das wird immer eine endlose Diskussion bei mir.
                            Hatte ich z.B. beim Thema „zyklische Routinen“

                            Hier mal der Teil, in dem die Meldungen erzeugt werden:
                            Aber wie gesagt, im Logfiles taucht ja alles richtig auf.

                            // ======================================
                            //   Wallbox-Ansteuerung
                            //   ( TEST 2, noch nicht fertig )
                            //
                            //   zukünftige Funktionen:
                            //    - erst Abfahren, dann Ausschalten
                            //    - beim Laden Auto abgesteckt?
                            // ======================================
                            const zykWB = 2*1000;    // Wallbox-Ansteuerung (> 1Sek)
                            setInterval(async function() {
                            
                                // Status von WB holen
                                // -------------------
                                bZusRM    = getState(preWB +".carConnected").val=="Charging";   // Auto lädt
                                var bAcsRM= getState(preWB +".AccessState").val=="Open";        // Zugriff frei
                                var bPh1  = getState(preWB +".amps1").val>0;                    // 1. Phase an
                                var bPh2  = getState(preWB +".amps2").val>0;                    // 2. Phase an
                                b3PhRM    = bPh1 && bPh2;                                       // 3-phasiges Laden
                                iLStromRM = getState(preWB +".amp").val;                        // Ladestrom
                            
                                //console.info("RM Zus Strom Phasen: " +bZusRM +"  " +iLStromRM +"  " +b3PhRM);
                            
                                // Wallbox ansteuern
                                // -----------------
                            
                                if(iLZus==cZusAnlauf) {                             // ====  Anlauf?  ====
                                    if(!bAcsRM) {                                   // Authent. Ein?
                                        setState(preWB +".set_state", "acs;0");     //   j: Authent. Ausschalten
                            
                                        if(iPhasen==1)                              // Phasen-Vorwahl
                                        setState(preWB +".set_state", "psm;1");     // - 1phasig vorwählen
                                        else 
                                        setState(preWB +".set_state", "psm;2");     // - 3phasig vorwählen
                            
                                        console.info("Anlauf: Authent. Aus, Phasenvorwahl");
                                    }
                            
                                    else if(!bZusRM) {                              // Wallbox Aus?
                                        setState(preWB +".set_state", "frc;0");     //   j: Wallbox Einschalten
                                        console.info("WB einschalten");
                                    }
                                }
                            
                                if(iLZus==cZusAus) {                                // ====  Ausschalten?  ====
                                    if(bZusRM) {                                    //   Wallbox Ein?
                                        setState(preWB +".set_state", "frc;1");     //   j: Wallbox Ausschalten
                                        console.info("WB ausschalten");
                                    }
                                    else if(bAcsRM) {                               // Authent. Aus?
                                        setState(preWB +".set_state", "acs;1");     //   j: Authent. Ein
                                        console.info("Authent. Ein");
                                    }
                                }
                            
                                if((iLZus==cZusPause) && bZusRM ) {                 // ====  Pause, WB Ein?  ====
                                    setState(preWB +".set_state", "frc;1");         //   j: Wallbox Ausschalten
                                    console.info("Pause einschalten");
                                }
                                
                                if((iLZus!=cZusAus) && (iLStrom!=iLStromRM)) {      // ====  Ladestrom ändern?  ====
                                    setState(preWB +".set_power", iLStrom);         //   j: Ladestrom zur WB
                                    console.info("Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                                }
                            
                                if((iPhasen==1) && b3PhRM) {                        // ====  3->1 Phasen?  ====
                                    setState(preWB +".set_state", "psm;1");         //   auf 1phasig umschalten
                                    console.info("auf 1-phasig umschalten");
                                    console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                                }
                            
                                if((iPhasen==3) && !b3PhRM) {                       // ====  1->3 Phasen?  ====
                                    setState(preWB +".set_state", "psm;2");         //   auf 3phasig umschalten
                                    console.info("auf 3-phasig umschalten");
                                    console.info("-> Ladestrom SW/IW= " +iLStrom +"/" +iLStromRM);
                                }
                            
                            }, zykWB);
                            
                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #14

                            @hub01

                            nimm nicht setIntervall, sonder setTimeout und am Ende des Skripts wieder ein erneutes setTimeout auslösen für den nächsten Zyklus.
                            Das sorgt dafür, das beim beenden des Skripts der Code maximal nur noch 1 mal ausgeführt wird.

                            mit setInterval registrierst du bei jedem Skriptstart das erneut, ohne das der vorherige Interval vergessen wird. der müsste eigentlich mit clearTimeout gelöscht werden. Das Interval handle wird beimn Aufruf von setInterval zurückgegeben.
                            Ohne das, kannst diese vergessenen Intervalle nur stoppen indem du den javascript adapter neu startest.

                            Wahrscheinlich hast du das Skript mehrfach aufgerufen und da laufen mehrere Abläufe parallel.

                            https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                            https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                            https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            T 1 Antwort Letzte Antwort
                            1
                            • OliverIOO OliverIO

                              @hub01

                              nimm nicht setIntervall, sonder setTimeout und am Ende des Skripts wieder ein erneutes setTimeout auslösen für den nächsten Zyklus.
                              Das sorgt dafür, das beim beenden des Skripts der Code maximal nur noch 1 mal ausgeführt wird.

                              mit setInterval registrierst du bei jedem Skriptstart das erneut, ohne das der vorherige Interval vergessen wird. der müsste eigentlich mit clearTimeout gelöscht werden. Das Interval handle wird beimn Aufruf von setInterval zurückgegeben.
                              Ohne das, kannst diese vergessenen Intervalle nur stoppen indem du den javascript adapter neu startest.

                              Wahrscheinlich hast du das Skript mehrfach aufgerufen und da laufen mehrere Abläufe parallel.

                              https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                              https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                              https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval

                              T Nicht stören
                              T Nicht stören
                              ticaki
                              schrieb am zuletzt editiert von
                              #15

                              @oliverio

                              AFAIK kümmert sich die Javascript Instanz um das beenden von setInterval() und schedule().

                              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                              Spenden

                              OliverIOO 1 Antwort Letzte Antwort
                              0
                              • HomoranH Homoran

                                @hub01 das stimmt nicht!
                                alleine in den Ausschnitt sind 3
                                Screenshot_20250216-185233_Firefox.jpg

                                und wie oft werden die aufgerufen?

                                H Offline
                                H Offline
                                hub01
                                schrieb am zuletzt editiert von
                                #16

                                @homoran sagte in zig gleiche Einträge in JS-Protokollanzeige:

                                @hub01 das stimmt nicht!
                                alleine in den Ausschnitt sind 3
                                Screenshot_20250216-185233_Firefox.jpg

                                und wie oft werden die aufgerufen?

                                530da197-47b9-45a7-b05a-e6a31152b628-grafik.png

                                a85251cb-77b1-4680-9eb1-787e1feb5fb9-grafik.png

                                alle 2 Sekunden

                                T 1 Antwort Letzte Antwort
                                0
                                • H hub01

                                  @homoran sagte in zig gleiche Einträge in JS-Protokollanzeige:

                                  @hub01 das stimmt nicht!
                                  alleine in den Ausschnitt sind 3
                                  Screenshot_20250216-185233_Firefox.jpg

                                  und wie oft werden die aufgerufen?

                                  530da197-47b9-45a7-b05a-e6a31152b628-grafik.png

                                  a85251cb-77b1-4680-9eb1-787e1feb5fb9-grafik.png

                                  alle 2 Sekunden

                                  T Nicht stören
                                  T Nicht stören
                                  ticaki
                                  schrieb am zuletzt editiert von
                                  #17

                                  @hub01
                                  Gut wegen dem ursprünglichen Problem. Issue aufmachen wenns stört. Kann es aber weder bestätigen noch verneinen, da ich dort keine logs gucke die älter sind. Das wird im Admin oder im Download geguckt. :)

                                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                  Spenden

                                  1 Antwort Letzte Antwort
                                  0
                                  • T ticaki

                                    @oliverio

                                    AFAIK kümmert sich die Javascript Instanz um das beenden von setInterval() und schedule().

                                    OliverIOO Offline
                                    OliverIOO Offline
                                    OliverIO
                                    schrieb am zuletzt editiert von
                                    #18

                                    @ticaki
                                    ja, hab gerade ausprobiert.
                                    dann ist das relativ neu.
                                    das war früher nicht so.
                                    da gab es immer wieder fälle, das sich das aufmultipliziert hat

                                    Meine Adapter und Widgets
                                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                    Links im Profil

                                    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

                                    471

                                    Online

                                    32.5k

                                    Benutzer

                                    81.6k

                                    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