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. Tester
  4. jarvis v3.1.x - just another remarkable vis

NEWS

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

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

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

jarvis v3.1.x - just another remarkable vis

Geplant Angeheftet Gesperrt Verschoben Tester
jarvismaterialmaterial uimaterialdesignvisvisualisierungvisualization
1.8k Beiträge 92 Kommentatoren 727.1k Aufrufe 77 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.
  • F Flowski

    Hallo, habe das Problem dass ich bei nachfolgenden Buttons 2x drücken muss bevor ein Befehl vom Robbi ausgeführt wird:

    fa65b13b-e86e-4a81-863f-3bd3c9c425e1-image.png

    1x drücken, es erscheint ein Kreis statt dem Logo, drücke ich erneut, wird der Befehl ausgeführt

    e25953fb-746c-41a8-aa66-63c61c0b351c-image.png

    jemand eine Idee? Trigger Element ist Button Action

    M Offline
    M Offline
    MCU
    schrieb am zuletzt editiert von
    #411

    @flowski Als Taster einstellen. Komponenten Optionen zum IconButtonAction.

    NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
    Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

    1 Antwort Letzte Antwort
    1
    • D Offline
      D Offline
      dering
      schrieb am zuletzt editiert von
      #412

      Hallo zusammen,

      ich hab Schwierigkeiten mit dem Layout.
      Ich habe ein Tablet welches im Hochformat die Dinge anzeigen soll.
      Die Widgets werden zu gleichen Teilen angezeigt. Ich möchte das aber anders haben:
      0f83344c-8e16-4fdf-8cfe-a3e118806211-image.png

      Zum Beispiel Datum und Uhrzeit soll 3/4 ausfüllen. Die Temperatur 1/4.
      Die Termine (zweiter roter Kasten) soll über die ganze breite angezeigt werden.

      Wenn ich den Browser größer ziehe, dann werden die Verhältnisse richtig gesetzt:
      02590613-5352-4c8f-b605-7a623f07f60b-image.png

      Ich hab mit den Breakpoints rumgespielt, führt alles nicht zum Ziel.

      Hat jemand Ideen was ich noch wie einstellen könnte?

      1 Antwort Letzte Antwort
      0
      • M Offline
        M Offline
        MCU
        schrieb am zuletzt editiert von
        #413

        @dering Wie sind denn de Breakpoints eingestellt?
        Ergebnis von dem HTML?
        https://mcuiobroker.gitbook.io/jarvis-infos/jarvis-v3/system-effektprog./bildschirmgroesse-handy-jarvis

        NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
        Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

        1 Antwort Letzte Antwort
        0
        • M Offline
          M Offline
          marsmännchen
          schrieb am zuletzt editiert von
          #414

          Kann mir jemand einen Tipp geben was ich mit HTMLTable falsch mache?
          Ich habe von einem Script für Lichtüberwachung:

          <table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption><thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Badezimmer 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Küche 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Korridor 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >ZoeBuero 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >ZoeSchlaf 1</th></tr></thead><tbody></tbody></table><div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'><thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Ankleide<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:03:09 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Badezimmer<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:52:49 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Office<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 16:55:55 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Eingang<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 22:53:19 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Essbereich<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:32:06 12.01.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Küche<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:31:21 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Korridor<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:46:37 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Schlafzimmer<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 23:42:36 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Speis<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 14:32:39 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Vorraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 23:39:12 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Waschraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 15:41:38 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>WC<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 14:50:16 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Wohnzimmer<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:45:52 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Yogaraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:03:12 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>ZoeBuero<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:40:30 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>ZoeSchlaf<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:36:11 05.02.2023</div></td></tr></tbody></table></div>
          

          Dann erstelle ich ein Gerät - > Sonstiges mit dem Datenpunkt "html" worin der Datenpunkt von IoBroker eingetragen ist:

          licht1.PNG

          Dann ein Widget "HTMLTable":
          licht2.PNG

          Dieses Widget füge ich im Layout ein,
          ich sehe aber nur:
          licht3.PNG

          Kann es vielleicht daran liegen das die HTML Tabelle mit "</div> endet?

          Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
          Wago PFC200 mit Dali Lichtsteuerung.

          M 1 Antwort Letzte Antwort
          0
          • M marsmännchen

            Kann mir jemand einen Tipp geben was ich mit HTMLTable falsch mache?
            Ich habe von einem Script für Lichtüberwachung:

            <table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption><thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Badezimmer 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Küche 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >Korridor 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >ZoeBuero 1<br><img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >ZoeSchlaf 1</th></tr></thead><tbody></tbody></table><div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'><thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Ankleide<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:03:09 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Badezimmer<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:52:49 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Office<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 16:55:55 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Eingang<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 22:53:19 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Essbereich<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:32:06 12.01.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Küche<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:31:21 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>Korridor<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:46:37 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Schlafzimmer<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 23:42:36 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Speis<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 14:32:39 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Vorraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 23:39:12 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Waschraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 15:41:38 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>WC<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 14:50:16 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Wohnzimmer<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:45:52 04.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:green;'><img height=40px src='/icons-mfd-svg/light_light.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:green;'>0</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:green;'>Yogaraum<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: 17:03:12 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>ZoeBuero<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:40:30 05.02.2023</div></td></tr><tr><td style='border: 1px solid black; background-color:red;'><img height=40px src='/icons-mfd-svg/light_light_dim_100.svg'></td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:red;'>1</td><td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:red;'>ZoeSchlaf<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: 16:36:11 05.02.2023</div></td></tr></tbody></table></div>
            

            Dann erstelle ich ein Gerät - > Sonstiges mit dem Datenpunkt "html" worin der Datenpunkt von IoBroker eingetragen ist:

            licht1.PNG

            Dann ein Widget "HTMLTable":
            licht2.PNG

            Dieses Widget füge ich im Layout ein,
            ich sehe aber nur:
            licht3.PNG

            Kann es vielleicht daran liegen das die HTML Tabelle mit "</div> endet?

            M Offline
            M Offline
            MCU
            schrieb am zuletzt editiert von
            #415

            @marsmännchen Zeig malndas Script. Und ja vermutlich liegt es am </div>.

            NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
            Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

            M 1 Antwort Letzte Antwort
            0
            • M MCU

              @marsmännchen Zeig malndas Script. Und ja vermutlich liegt es am </div>.

              M Offline
              M Offline
              marsmännchen
              schrieb am zuletzt editiert von marsmännchen
              #416

              @mcu
              Ok, aber zum Script kann ich dir nur sagen, das ist von einem anderen User, ich hab es nur minimal angepasst:

              //der-eine 05.06.2020
              //Ursprüngliches Skript: https://github.com/Pittini/iobroker-Fensterauswertung
              //Das folgende Skript wurde zum zählen von eingeschaltenen Lichtern umgeschrieben.
              //
              // V1.2.3 vom 1.4.2020
              //Script um eingeschaltene Lichter pro Raum und insgesamt zu zählen. Legt pro Raum zwei Datenpunkte an, sowie zwei Datenpunkte fürs gesamte.
              //Möglichkeit eine Ansage nach x Minuten einmalig oder zyklisch bis Fensterschließung anzugeben
              //Dynamische erzeugung einer HTML Übersichtstabelle
              //WICHTIG!!!
              //Vorraussetzungen: Den Geräten müssen Räume zugewiesen sein, sowie die Funktion "Verschluss" für jeden entsprechenden Datenpunkt zugewiesen sein.
              
              //Grundeinstellungen
              const logging = false; //Erweiterte Logs ausgeben?
              const praefix = "0_userdata.0.Lichtueberwachung."; //Grundpfad für Script DPs
              const ZeitBisNachricht = 300000 // 300000 ms = 5 Minuten
              const RepeatInfoMsg = true; // Legt fest ob Ansage einmalig oder zyklisch
              const InfoMsgAktiv = true; // Legt fest ob eine Infonachricht nach x Minuten ausgegeben werden soll
              const WelcheFunktionVerwenden = "actualLevel"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
              const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
              const UseAlexa = false; // Sollen Nachrichten via Alexa ausgegeben werden?
              const AlexaId = ""; // Die Alexa Seriennummer
              const UseMail = false; //Nachricht via Mail versenden
              const UseSay = false; // Sollen Nachrichten via Say ausgegeben werden? Authorenfunktion, sollte deaktiviert werden.
              const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
              const AlsoMsgLightOnOff = false; //Soll auch das erstmalige einschalten, sowie das ausschalten gemeldet werden?
              const LightsOnListSeparator = "<br>"; //Trennzeichen für die Textausgabe der eingeschaltenen Lichter pro Raum
              const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
              const LightIsOffWhen = ["false", "off", "0"]; // können eigene States für aus angegeben werden, immer !!! in Kleinschreibung
              
              //Einstellungen zur Tabellenausgabe
              const LightsOnImg = "/icons-mfd-svg/light_light_dim_100.svg"; //Icon eingeschaltenes Licht
              const LightOffImg = "/icons-mfd-svg/light_light.svg"; // Icon für ausgeschaltenes Licht
              const LightsOnColor = "red"; // Farbe für eingeschaltenes Licht
              const LightsOffColor = "green"; // Farbe für ausgeschaltenes Licht
              const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
              const TableDateFormat = "SS:mm:ss TT.MM.JJJJ"; //Zeit- & Datums- formatierung für Tabelle. Übersicht der Kürzel hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
              
              //Ab hier nix mehr ändern!
              
              let LightOnCount = 0; // Gesamtzahl der eingeschaltenen Lichter
              const RoomLightsOnCount = []; // Array für eingeschaltene Lichter pro Raum
              let RoomsWithLightsOn = "";
              const LightsOnMsgHandler = []; // Objektarray für timeouts pro Raum
              const Sensor = []; //Sensoren als Array anlegen
              const SensorVal = [];//Sensorwerte als Array anlegen
              const SensorOldVal = []; //Alte Sensorwerte als Array ablegen
              const Laufzeit = []; //Timer Laufzeit pro Fenster
              const RoomList = []; // Raumlisten Array
              const RoomStateTimeStamp = [];
              let z = 0; //Zähler
              let DpCount = 0; //Zähler
              const States = []; // Array mit anzulegenden Datenpunkten
              let Funktionen = getEnums('functions');
              
              
              
              for (let x in Funktionen) {        // loop ueber alle Functions
                  let Funktion = Funktionen[x].name;
                  if (Funktion == undefined) {
                      log("Keine Funktion gefunden");
                  }
                  else {
                      if (typeof Funktion == 'object') Funktion = Funktion.de;
                      let members = Funktionen[x].members;
                      if (Funktion == WelcheFunktionVerwenden) { //Wenn Function ist Licht
                          for (let y in members) { // Loop über alle Licht Members
                              Sensor[y] = members[y];
                              let room = getObject(Sensor[y], 'rooms').enumNames[0];
                              if (typeof room == 'object') room = room.de;
                              //Datenpunkte pro Raum vorbereiten
                              States[DpCount] = { id: praefix + room + ".RoomLightsOnCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter im Raum", type: "number", def: 0 } };
                              DpCount++;
                              States[DpCount] = { id: praefix + room + ".IsOn", initial: false, forceCreation: false, common: { read: true, write: true, name: "Licht eingeschaltet?", type: "boolean", role: "state", def: false } }; //
                              DpCount++;
                              //log(Funktion + ': ' + room);
                              if (RoomList.indexOf(room) == -1) { //Raumliste ohne Raumduplikate erzeugen
                                  RoomList[z] = room;
                                  if (logging) log("Raum " + z + " = " + RoomList[z]);
                                  z++;
                              };
                              RoomLightsOnCount[y] = 0; // Array mit 0 initialisieren
                              Laufzeit[y] = 0; // Array mit 0 initialisieren
                          };
                      };
                  };
              };
              
              //Struktur anlegen in js.0 um Sollwert und Summenergebniss zu speichern
              //Generische Datenpunkte vorbereiten 
              States[DpCount] = { id: praefix + "AllLightsOff", initial: true, forceCreation: false, common: { read: true, write: true, name: "Licht aus?", type: "boolean", role: "state", def: true } }; //
              DpCount++;
              States[DpCount] = { id: praefix + "LightsOn", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter", type: "number", def: 0 } };
              DpCount++;
              States[DpCount] = { id: praefix + "RoomsWithLightsOn", initial: "Lichter in allen Räumen ausgeschalten.", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Lichter eingeschalten?", type: "string", def: "Lichter in allen Räumen ausgeschalten" } };
              DpCount++;
              States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und eingeschaltener Lichter", type: "string", def: "" } };
              
              //Alle States anlegen, Main aufrufen wenn fertig
              let numStates = States.length;
              States.forEach(function (state) {
                  createState(state.id, state.initial, state.forceCreation, state.common, function () {
                      numStates--;
                      if (numStates === 0) {
                          if (logging) log("CreateStates fertig!");
                          main();
                      };
                  });
              });
              
              function main() {
                  for (let x = 0; x < Sensor.length; x++) {
                      //setTimeout(function () { // Timeout setzt refresh status wieder zurück
                      SensorVal[x] = String(getState(Sensor[x]).val).toLowerCase(); // Wert von Sensor in Schleife einlesen
                      SimplyfyLightStates(x);
                      // }, x * 100);
                  };
                  CreateTrigger();
                  CheckAllLights(); //Bei Scriptstart alle Lichter einlesen
                  CreateOverviewTable()
              }
              
              function Meldung(msg) {
                  if (UseSay) Say(msg);
                  if (UseTelegram) {
                      sendTo("telegram.0", "send", {
                          text: msg
                      });
                  };
                  if (UseAlexa) {
                      if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
                  };
                  if (UseMail) {
                      sendTo("email", msg);
                  };
                  if (logging) log("Msg= " + msg);
              }
              
              function CreateOverviewTable() { //  Erzeugt tabellarische Übersicht als HTML Tabelle    
                  //Tabellenüberschrift und Head
                  let OverviewTable = "";
                  if (!HeadlessTable) {
                      OverviewTable = "<table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption>";
                      OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithLightsOn + "</th></tr></thead><tbody></tbody></table>";
                  };
                  //Tabelle der Raumdetails
                  OverviewTable = OverviewTable + "<div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'>";
                  OverviewTable = OverviewTable + "<thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody>";
              
              
                  for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                      if (RoomLightsOnCount[x] > 0) { // Räume mit eingeschaltenen Lichtern
                          RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                          OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOnColor + ";'><img height=40px src='" + LightsOnImg + "'></td>"
                          OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:" + LightsOnColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                          OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOnColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                      }
                      else { // Ausgeschaltene Räume
                          RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                          OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOffColor + ";'><img height=40px src='" + LightOffImg + "'></td>"
                          OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:" + LightsOffColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                          OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOffColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
              
                      };
                  };
                  OverviewTable = OverviewTable + "</tbody></table></div>";
                  setState(praefix + "OverviewTable", OverviewTable);
                  //log(OverviewTable);
              }
              
              function CreateRoomsWithLightsOnList() { //Erzeugt Textliste mit Räumen welche eingeschaltene Lichter haben
                  RoomsWithLightsOn = ""; //Liste Initialisieren
                  for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                      if (RoomLightsOnCount[x] > 0) { // Nur Räume mit eingeschaltenen Lichtern berücksichtigen
                          if (RoomLightsOnCount[x] == 1) { //Wenn 1 Licht ein, Singular Schreibweise
                              RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                          }
                          else { //ansonsten Plural Schreibweise
                              RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                          };
                      };
                  };
                  RoomsWithLightsOn = RoomsWithLightsOn.substr(0, RoomsWithLightsOn.length - LightsOnListSeparator.length); //letzten <br> Umbruch wieder entfernen
              
                  if (RoomsWithLightsOn == "") {
                      RoomsWithLightsOn = "<img width=25px height=25px style= vertical-align:-5px src=img/bulb_off.png >"+ "Alle Lichter ausgeschalten";
                  };
                  setState(praefix + "RoomsWithLightsOn", RoomsWithLightsOn);
                  if (logging) log(RoomsWithLightsOn);
              }
              
              function GetRoom(x) { // Liefert den Raum von Sensor x
                  if (logging) log("Reaching GetRoom x=" + x)
                  let room = getObject(Sensor[x], 'rooms').enumNames[0];
                  if (room == undefined) {
                      log("Kein Raum definiert bei Sensor " + Sensor[x], 'error');
                      return "Kein Raum definiert";
                  };
                  if (typeof room == 'object') room = room.de;
                  return room;
              }
              
              function CheckLight(x) { //Für einzelnes Licht. Via Trigger angesteuert.
                  let TempRoom = GetRoom(x); //Raum des aktuellen Sensors bestimmen
                  let TempRoomIndex = RoomList.indexOf(TempRoom); // Raumlistenindex für aktuellen Raum bestimmen
                  if (logging) log("reaching CheckLight, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
                  if (SensorVal[x] == "on" && SensorOldVal[x] != "on") { //Licht war ausgeschalten und wurde eingeschalten
                      LightOnCount++;
                      RoomLightsOnCount[TempRoomIndex]++;
                      if (logging) log("RoomLightsOnCount für " + TempRoom + "=" + RoomLightsOnCount[TempRoomIndex]);
                      setState(praefix + "AllLightsOff", false);
                      setState(praefix + TempRoom + ".IsOn", true);
                      setState(praefix + "LightsOn", LightOnCount);
                      setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
              
                      if (logging) log(TempRoom + " Licht eingeschalten");
                      if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht eingeschaltet!");
                      if (UseEventLog == true) WriteEventLog(TempRoom + " Licht eingeschaltet!");
                      if (RoomLightsOnCount[TempRoomIndex] == 1) {
                          Laufzeit[TempRoomIndex] = 0;
                          if (InfoMsgAktiv == true) {
                              if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                  if (logging) log("Setting Interval to Room:" + TempRoom);
              
                                  LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                      Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                      Meldung(TempRoom + "licht seit " + (Laufzeit[TempRoomIndex] / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                  }, ZeitBisNachricht);
                              }
                              else { // Wenn einmalige Meldung eingestellt
                                  if (logging) log("Setting Timeout to Room:" + TempRoom);
              
                                  LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () {
                                      Meldung(TempRoom + "licht seit " + (ZeitBisNachricht / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                  }, ZeitBisNachricht);
                              };
                          };
                      };
                  }
                  else if (SensorVal[x] == "off") {
                      if (LightOnCount > 0) LightOnCount--;
                      if (RoomLightsOnCount[TempRoomIndex] > 0) RoomLightsOnCount[TempRoomIndex]--;
              
                      setState(praefix + "LightsOn", LightOnCount);
                      setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
              
                      log(TempRoom + " Licht ausgeschalten.");
                      if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht ausgeschaltet!");
                      if (UseEventLog == true) WriteEventLog(TempRoom + " Licht ausgeschaltet!");
                      if (RoomLightsOnCount[TempRoomIndex] == 0) {
                          setState(praefix + TempRoom + ".IsOn", false);
              
                          if (RepeatInfoMsg == true) {
                              if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                              clearInterval(LightsOnMsgHandler[TempRoomIndex]);
                          }
                          else {
                              if (logging) log("reaching clearTimeout");
                              clearTimeout(LightsOnMsgHandler[TempRoomIndex]);
                          };
                      };
              
                      if (LightOnCount == 0) { //Wenn kein Licht mehr eingeschalten
                          setState(praefix + "AllLightsOff", true);
                          setState(praefix + TempRoom + ".IsOn", false);
                          log("Alle Lichter ausgeschalten.");
                      };
                  };
                  if (logging) log("Eingeschaltene Lichter gesamt= " + LightOnCount);
                  CreateRoomsWithLightsOnList();
                  CreateOverviewTable();
              }
              
              function CheckAllLights() { //Prüft bei Programmstart alle Lichter
                  for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                      let TempRoom = GetRoom(x);
                      let TempRoomIndex = RoomList.indexOf(TempRoom);
                      if (SensorVal[x] == "on") { //Licht ist eingeschalten
                          LightOnCount = LightOnCount + 1;
                          RoomLightsOnCount[TempRoomIndex] = RoomLightsOnCount[TempRoomIndex] + 1;
                          if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomLightsOnCount= " + RoomLightsOnCount[TempRoomIndex]);
              
                          setState(praefix + "AllLightsOff", false);
                          setState(praefix + "LightsOn", LightOnCount);
              
                          setState(praefix + TempRoom + ".IsOn", true);
                          setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                          if (InfoMsgAktiv == true && RoomLightsOnCount[RoomList.indexOf(TempRoom)] == 1) {
                              if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                  if (logging) log("Setting Interval at initialization to Room: " + TempRoom);
                                  LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                      Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                      Meldung(TempRoom + "licht seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten eingeschalten!");
                                  }, ZeitBisNachricht);
                              }
                              else {
                                  if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
              
                                  LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                                      Meldung(TempRoom + "licht seit " + ZeitBisNachricht / 1000 / 60 + " Minuten eingeschalten!");
                                  }, ZeitBisNachricht);
                              };
                          };
                          if (logging) log(TempRoom + " Licht = eingeschalten");
                      }
                      else if (SensorVal[x] == "off") {
                          //RoomLightsOnCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomLightsOnCount").val - 1;
                          RoomLightsOnCount[TempRoomIndex]--;
                          if (RoomLightsOnCount[TempRoomIndex] < 0) RoomLightsOnCount[TempRoomIndex] = 0;
                          setState(praefix + TempRoom + ".IsOn", false);
                          setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                          //log(TempRoom + " Fenster = geschlossen.");
                      };
                  };
                  if (LightOnCount == 0) {
                      setState(praefix + "AllLightsOff", true);
                      setState(praefix + "LightsOn", LightOnCount);
              
                      log("Alle Lichter ausgeschalten.");
                  };
                  CreateRoomsWithLightsOnList();
              }
              
              function SimplyfyLightStates(x) { //Die verschiedenen Gerätestates zu on oder off vereinfachen
                  //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
                  if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
                      SensorVal[x] = "on";
                  }
                  else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
                      SensorVal[x] = "off";
                  };
              
                  if (SensorVal[x] != "on" && SensorVal[x] != "off") { // Suche in Lichtereinarray und Lichterausarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
                      log("Unknown Lightstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
                      SensorVal[x] = "unknown";
                  };
              
                  if (LightIsOnWhen.indexOf(SensorOldVal[x]) != -1) {
                      SensorOldVal[x] = "on";
                  }
                  else if (LightIsOffWhen.indexOf(SensorOldVal[x]) != -1) {
                      SensorOldVal[x] = "off";
                  };
              }
              
              function CreateTrigger() {
                  //Trigger für Sensoren erzeugen
                  for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                      on(Sensor[x], function (dp) { //Trigger in Schleife erstellen
                          if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val);
                          if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
                              SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                              SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                              SimplyfyLightStates(x);
                              CheckLight(x);
                          }
                          else {
                              log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error");
                          };
                      });
                  };
              
                  onStop(function () { //Bei Scriptende alle Timer löschen
                      for (let x = 1; x < Sensor.length; x++) {
                          if (RoomLightsOnCount[x] == 0) {
                              if (RepeatInfoMsg == true) {
                                  clearInterval(LightsOnMsgHandler[x]);
                              }
                              else {
                                  clearTimeout(LightsOnMsgHandler[x]);
                              };
                          };
              
                      };
                  }, 100);
              }
              
              

              edit:
              Ich denke mir gerade ich sollte es für Jarvis irgendwie anders angehen.
              Dafür ist das Script vermutlich ein bisschen zu viel des guten. Bei Vis habe ich mir daraus folgendes gebastelt.

              licht4.PNG

              licht5.PNG

              Da brauche ich keinen HTMLTable.

              Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
              Wago PFC200 mit Dali Lichtsteuerung.

              Dominik F.D M 2 Antworten Letzte Antwort
              0
              • M marsmännchen

                @mcu
                Ok, aber zum Script kann ich dir nur sagen, das ist von einem anderen User, ich hab es nur minimal angepasst:

                //der-eine 05.06.2020
                //Ursprüngliches Skript: https://github.com/Pittini/iobroker-Fensterauswertung
                //Das folgende Skript wurde zum zählen von eingeschaltenen Lichtern umgeschrieben.
                //
                // V1.2.3 vom 1.4.2020
                //Script um eingeschaltene Lichter pro Raum und insgesamt zu zählen. Legt pro Raum zwei Datenpunkte an, sowie zwei Datenpunkte fürs gesamte.
                //Möglichkeit eine Ansage nach x Minuten einmalig oder zyklisch bis Fensterschließung anzugeben
                //Dynamische erzeugung einer HTML Übersichtstabelle
                //WICHTIG!!!
                //Vorraussetzungen: Den Geräten müssen Räume zugewiesen sein, sowie die Funktion "Verschluss" für jeden entsprechenden Datenpunkt zugewiesen sein.
                
                //Grundeinstellungen
                const logging = false; //Erweiterte Logs ausgeben?
                const praefix = "0_userdata.0.Lichtueberwachung."; //Grundpfad für Script DPs
                const ZeitBisNachricht = 300000 // 300000 ms = 5 Minuten
                const RepeatInfoMsg = true; // Legt fest ob Ansage einmalig oder zyklisch
                const InfoMsgAktiv = true; // Legt fest ob eine Infonachricht nach x Minuten ausgegeben werden soll
                const WelcheFunktionVerwenden = "actualLevel"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
                const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
                const UseAlexa = false; // Sollen Nachrichten via Alexa ausgegeben werden?
                const AlexaId = ""; // Die Alexa Seriennummer
                const UseMail = false; //Nachricht via Mail versenden
                const UseSay = false; // Sollen Nachrichten via Say ausgegeben werden? Authorenfunktion, sollte deaktiviert werden.
                const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
                const AlsoMsgLightOnOff = false; //Soll auch das erstmalige einschalten, sowie das ausschalten gemeldet werden?
                const LightsOnListSeparator = "<br>"; //Trennzeichen für die Textausgabe der eingeschaltenen Lichter pro Raum
                const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
                const LightIsOffWhen = ["false", "off", "0"]; // können eigene States für aus angegeben werden, immer !!! in Kleinschreibung
                
                //Einstellungen zur Tabellenausgabe
                const LightsOnImg = "/icons-mfd-svg/light_light_dim_100.svg"; //Icon eingeschaltenes Licht
                const LightOffImg = "/icons-mfd-svg/light_light.svg"; // Icon für ausgeschaltenes Licht
                const LightsOnColor = "red"; // Farbe für eingeschaltenes Licht
                const LightsOffColor = "green"; // Farbe für ausgeschaltenes Licht
                const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
                const TableDateFormat = "SS:mm:ss TT.MM.JJJJ"; //Zeit- & Datums- formatierung für Tabelle. Übersicht der Kürzel hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                
                //Ab hier nix mehr ändern!
                
                let LightOnCount = 0; // Gesamtzahl der eingeschaltenen Lichter
                const RoomLightsOnCount = []; // Array für eingeschaltene Lichter pro Raum
                let RoomsWithLightsOn = "";
                const LightsOnMsgHandler = []; // Objektarray für timeouts pro Raum
                const Sensor = []; //Sensoren als Array anlegen
                const SensorVal = [];//Sensorwerte als Array anlegen
                const SensorOldVal = []; //Alte Sensorwerte als Array ablegen
                const Laufzeit = []; //Timer Laufzeit pro Fenster
                const RoomList = []; // Raumlisten Array
                const RoomStateTimeStamp = [];
                let z = 0; //Zähler
                let DpCount = 0; //Zähler
                const States = []; // Array mit anzulegenden Datenpunkten
                let Funktionen = getEnums('functions');
                
                
                
                for (let x in Funktionen) {        // loop ueber alle Functions
                    let Funktion = Funktionen[x].name;
                    if (Funktion == undefined) {
                        log("Keine Funktion gefunden");
                    }
                    else {
                        if (typeof Funktion == 'object') Funktion = Funktion.de;
                        let members = Funktionen[x].members;
                        if (Funktion == WelcheFunktionVerwenden) { //Wenn Function ist Licht
                            for (let y in members) { // Loop über alle Licht Members
                                Sensor[y] = members[y];
                                let room = getObject(Sensor[y], 'rooms').enumNames[0];
                                if (typeof room == 'object') room = room.de;
                                //Datenpunkte pro Raum vorbereiten
                                States[DpCount] = { id: praefix + room + ".RoomLightsOnCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter im Raum", type: "number", def: 0 } };
                                DpCount++;
                                States[DpCount] = { id: praefix + room + ".IsOn", initial: false, forceCreation: false, common: { read: true, write: true, name: "Licht eingeschaltet?", type: "boolean", role: "state", def: false } }; //
                                DpCount++;
                                //log(Funktion + ': ' + room);
                                if (RoomList.indexOf(room) == -1) { //Raumliste ohne Raumduplikate erzeugen
                                    RoomList[z] = room;
                                    if (logging) log("Raum " + z + " = " + RoomList[z]);
                                    z++;
                                };
                                RoomLightsOnCount[y] = 0; // Array mit 0 initialisieren
                                Laufzeit[y] = 0; // Array mit 0 initialisieren
                            };
                        };
                    };
                };
                
                //Struktur anlegen in js.0 um Sollwert und Summenergebniss zu speichern
                //Generische Datenpunkte vorbereiten 
                States[DpCount] = { id: praefix + "AllLightsOff", initial: true, forceCreation: false, common: { read: true, write: true, name: "Licht aus?", type: "boolean", role: "state", def: true } }; //
                DpCount++;
                States[DpCount] = { id: praefix + "LightsOn", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter", type: "number", def: 0 } };
                DpCount++;
                States[DpCount] = { id: praefix + "RoomsWithLightsOn", initial: "Lichter in allen Räumen ausgeschalten.", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Lichter eingeschalten?", type: "string", def: "Lichter in allen Räumen ausgeschalten" } };
                DpCount++;
                States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und eingeschaltener Lichter", type: "string", def: "" } };
                
                //Alle States anlegen, Main aufrufen wenn fertig
                let numStates = States.length;
                States.forEach(function (state) {
                    createState(state.id, state.initial, state.forceCreation, state.common, function () {
                        numStates--;
                        if (numStates === 0) {
                            if (logging) log("CreateStates fertig!");
                            main();
                        };
                    });
                });
                
                function main() {
                    for (let x = 0; x < Sensor.length; x++) {
                        //setTimeout(function () { // Timeout setzt refresh status wieder zurück
                        SensorVal[x] = String(getState(Sensor[x]).val).toLowerCase(); // Wert von Sensor in Schleife einlesen
                        SimplyfyLightStates(x);
                        // }, x * 100);
                    };
                    CreateTrigger();
                    CheckAllLights(); //Bei Scriptstart alle Lichter einlesen
                    CreateOverviewTable()
                }
                
                function Meldung(msg) {
                    if (UseSay) Say(msg);
                    if (UseTelegram) {
                        sendTo("telegram.0", "send", {
                            text: msg
                        });
                    };
                    if (UseAlexa) {
                        if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
                    };
                    if (UseMail) {
                        sendTo("email", msg);
                    };
                    if (logging) log("Msg= " + msg);
                }
                
                function CreateOverviewTable() { //  Erzeugt tabellarische Übersicht als HTML Tabelle    
                    //Tabellenüberschrift und Head
                    let OverviewTable = "";
                    if (!HeadlessTable) {
                        OverviewTable = "<table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption>";
                        OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithLightsOn + "</th></tr></thead><tbody></tbody></table>";
                    };
                    //Tabelle der Raumdetails
                    OverviewTable = OverviewTable + "<div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'>";
                    OverviewTable = OverviewTable + "<thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody>";
                
                
                    for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                        if (RoomLightsOnCount[x] > 0) { // Räume mit eingeschaltenen Lichtern
                            RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                            OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOnColor + ";'><img height=40px src='" + LightsOnImg + "'></td>"
                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:" + LightsOnColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOnColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                        }
                        else { // Ausgeschaltene Räume
                            RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                            OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOffColor + ";'><img height=40px src='" + LightOffImg + "'></td>"
                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:" + LightsOffColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOffColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                
                        };
                    };
                    OverviewTable = OverviewTable + "</tbody></table></div>";
                    setState(praefix + "OverviewTable", OverviewTable);
                    //log(OverviewTable);
                }
                
                function CreateRoomsWithLightsOnList() { //Erzeugt Textliste mit Räumen welche eingeschaltene Lichter haben
                    RoomsWithLightsOn = ""; //Liste Initialisieren
                    for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                        if (RoomLightsOnCount[x] > 0) { // Nur Räume mit eingeschaltenen Lichtern berücksichtigen
                            if (RoomLightsOnCount[x] == 1) { //Wenn 1 Licht ein, Singular Schreibweise
                                RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                            }
                            else { //ansonsten Plural Schreibweise
                                RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                            };
                        };
                    };
                    RoomsWithLightsOn = RoomsWithLightsOn.substr(0, RoomsWithLightsOn.length - LightsOnListSeparator.length); //letzten <br> Umbruch wieder entfernen
                
                    if (RoomsWithLightsOn == "") {
                        RoomsWithLightsOn = "<img width=25px height=25px style= vertical-align:-5px src=img/bulb_off.png >"+ "Alle Lichter ausgeschalten";
                    };
                    setState(praefix + "RoomsWithLightsOn", RoomsWithLightsOn);
                    if (logging) log(RoomsWithLightsOn);
                }
                
                function GetRoom(x) { // Liefert den Raum von Sensor x
                    if (logging) log("Reaching GetRoom x=" + x)
                    let room = getObject(Sensor[x], 'rooms').enumNames[0];
                    if (room == undefined) {
                        log("Kein Raum definiert bei Sensor " + Sensor[x], 'error');
                        return "Kein Raum definiert";
                    };
                    if (typeof room == 'object') room = room.de;
                    return room;
                }
                
                function CheckLight(x) { //Für einzelnes Licht. Via Trigger angesteuert.
                    let TempRoom = GetRoom(x); //Raum des aktuellen Sensors bestimmen
                    let TempRoomIndex = RoomList.indexOf(TempRoom); // Raumlistenindex für aktuellen Raum bestimmen
                    if (logging) log("reaching CheckLight, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
                    if (SensorVal[x] == "on" && SensorOldVal[x] != "on") { //Licht war ausgeschalten und wurde eingeschalten
                        LightOnCount++;
                        RoomLightsOnCount[TempRoomIndex]++;
                        if (logging) log("RoomLightsOnCount für " + TempRoom + "=" + RoomLightsOnCount[TempRoomIndex]);
                        setState(praefix + "AllLightsOff", false);
                        setState(praefix + TempRoom + ".IsOn", true);
                        setState(praefix + "LightsOn", LightOnCount);
                        setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                
                        if (logging) log(TempRoom + " Licht eingeschalten");
                        if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht eingeschaltet!");
                        if (UseEventLog == true) WriteEventLog(TempRoom + " Licht eingeschaltet!");
                        if (RoomLightsOnCount[TempRoomIndex] == 1) {
                            Laufzeit[TempRoomIndex] = 0;
                            if (InfoMsgAktiv == true) {
                                if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                    if (logging) log("Setting Interval to Room:" + TempRoom);
                
                                    LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                        Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                        Meldung(TempRoom + "licht seit " + (Laufzeit[TempRoomIndex] / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                    }, ZeitBisNachricht);
                                }
                                else { // Wenn einmalige Meldung eingestellt
                                    if (logging) log("Setting Timeout to Room:" + TempRoom);
                
                                    LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () {
                                        Meldung(TempRoom + "licht seit " + (ZeitBisNachricht / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                    }, ZeitBisNachricht);
                                };
                            };
                        };
                    }
                    else if (SensorVal[x] == "off") {
                        if (LightOnCount > 0) LightOnCount--;
                        if (RoomLightsOnCount[TempRoomIndex] > 0) RoomLightsOnCount[TempRoomIndex]--;
                
                        setState(praefix + "LightsOn", LightOnCount);
                        setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                
                        log(TempRoom + " Licht ausgeschalten.");
                        if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht ausgeschaltet!");
                        if (UseEventLog == true) WriteEventLog(TempRoom + " Licht ausgeschaltet!");
                        if (RoomLightsOnCount[TempRoomIndex] == 0) {
                            setState(praefix + TempRoom + ".IsOn", false);
                
                            if (RepeatInfoMsg == true) {
                                if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                                clearInterval(LightsOnMsgHandler[TempRoomIndex]);
                            }
                            else {
                                if (logging) log("reaching clearTimeout");
                                clearTimeout(LightsOnMsgHandler[TempRoomIndex]);
                            };
                        };
                
                        if (LightOnCount == 0) { //Wenn kein Licht mehr eingeschalten
                            setState(praefix + "AllLightsOff", true);
                            setState(praefix + TempRoom + ".IsOn", false);
                            log("Alle Lichter ausgeschalten.");
                        };
                    };
                    if (logging) log("Eingeschaltene Lichter gesamt= " + LightOnCount);
                    CreateRoomsWithLightsOnList();
                    CreateOverviewTable();
                }
                
                function CheckAllLights() { //Prüft bei Programmstart alle Lichter
                    for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                        let TempRoom = GetRoom(x);
                        let TempRoomIndex = RoomList.indexOf(TempRoom);
                        if (SensorVal[x] == "on") { //Licht ist eingeschalten
                            LightOnCount = LightOnCount + 1;
                            RoomLightsOnCount[TempRoomIndex] = RoomLightsOnCount[TempRoomIndex] + 1;
                            if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomLightsOnCount= " + RoomLightsOnCount[TempRoomIndex]);
                
                            setState(praefix + "AllLightsOff", false);
                            setState(praefix + "LightsOn", LightOnCount);
                
                            setState(praefix + TempRoom + ".IsOn", true);
                            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                            if (InfoMsgAktiv == true && RoomLightsOnCount[RoomList.indexOf(TempRoom)] == 1) {
                                if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                    if (logging) log("Setting Interval at initialization to Room: " + TempRoom);
                                    LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                        Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                        Meldung(TempRoom + "licht seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten eingeschalten!");
                                    }, ZeitBisNachricht);
                                }
                                else {
                                    if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
                
                                    LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                                        Meldung(TempRoom + "licht seit " + ZeitBisNachricht / 1000 / 60 + " Minuten eingeschalten!");
                                    }, ZeitBisNachricht);
                                };
                            };
                            if (logging) log(TempRoom + " Licht = eingeschalten");
                        }
                        else if (SensorVal[x] == "off") {
                            //RoomLightsOnCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomLightsOnCount").val - 1;
                            RoomLightsOnCount[TempRoomIndex]--;
                            if (RoomLightsOnCount[TempRoomIndex] < 0) RoomLightsOnCount[TempRoomIndex] = 0;
                            setState(praefix + TempRoom + ".IsOn", false);
                            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                            //log(TempRoom + " Fenster = geschlossen.");
                        };
                    };
                    if (LightOnCount == 0) {
                        setState(praefix + "AllLightsOff", true);
                        setState(praefix + "LightsOn", LightOnCount);
                
                        log("Alle Lichter ausgeschalten.");
                    };
                    CreateRoomsWithLightsOnList();
                }
                
                function SimplyfyLightStates(x) { //Die verschiedenen Gerätestates zu on oder off vereinfachen
                    //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
                    if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
                        SensorVal[x] = "on";
                    }
                    else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
                        SensorVal[x] = "off";
                    };
                
                    if (SensorVal[x] != "on" && SensorVal[x] != "off") { // Suche in Lichtereinarray und Lichterausarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
                        log("Unknown Lightstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
                        SensorVal[x] = "unknown";
                    };
                
                    if (LightIsOnWhen.indexOf(SensorOldVal[x]) != -1) {
                        SensorOldVal[x] = "on";
                    }
                    else if (LightIsOffWhen.indexOf(SensorOldVal[x]) != -1) {
                        SensorOldVal[x] = "off";
                    };
                }
                
                function CreateTrigger() {
                    //Trigger für Sensoren erzeugen
                    for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                        on(Sensor[x], function (dp) { //Trigger in Schleife erstellen
                            if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val);
                            if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
                                SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                                SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                                SimplyfyLightStates(x);
                                CheckLight(x);
                            }
                            else {
                                log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error");
                            };
                        });
                    };
                
                    onStop(function () { //Bei Scriptende alle Timer löschen
                        for (let x = 1; x < Sensor.length; x++) {
                            if (RoomLightsOnCount[x] == 0) {
                                if (RepeatInfoMsg == true) {
                                    clearInterval(LightsOnMsgHandler[x]);
                                }
                                else {
                                    clearTimeout(LightsOnMsgHandler[x]);
                                };
                            };
                
                        };
                    }, 100);
                }
                
                

                edit:
                Ich denke mir gerade ich sollte es für Jarvis irgendwie anders angehen.
                Dafür ist das Script vermutlich ein bisschen zu viel des guten. Bei Vis habe ich mir daraus folgendes gebastelt.

                licht4.PNG

                licht5.PNG

                Da brauche ich keinen HTMLTable.

                Dominik F.D Offline
                Dominik F.D Offline
                Dominik F.
                schrieb am zuletzt editiert von
                #417

                @marsmännchen

                Du könntest ein anderes Skript dafür nutzen, sieht dann so in Jarvis aus:

                Unbenannt1.JPG

                Unbenannt.JPG

                M 1 Antwort Letzte Antwort
                0
                • Dominik F.D Dominik F.

                  @marsmännchen

                  Du könntest ein anderes Skript dafür nutzen, sieht dann so in Jarvis aus:

                  Unbenannt1.JPG

                  Unbenannt.JPG

                  M Offline
                  M Offline
                  marsmännchen
                  schrieb am zuletzt editiert von
                  #418

                  @dominik-f
                  würde ich gerne versuchen.
                  Ich durchforste gerade das Forum.
                  Weißt du noch woher du das hast?

                  Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
                  Wago PFC200 mit Dali Lichtsteuerung.

                  Dominik F.D 1 Antwort Letzte Antwort
                  0
                  • M marsmännchen

                    @dominik-f
                    würde ich gerne versuchen.
                    Ich durchforste gerade das Forum.
                    Weißt du noch woher du das hast?

                    Dominik F.D Offline
                    Dominik F.D Offline
                    Dominik F.
                    schrieb am zuletzt editiert von
                    #419

                    @marsmännchen

                    https://forum.iobroker.net/topic/40424/alexa-ansagen-i-telegram-i-email-i-alias-i-visu-i-html

                    Bei der Tabelle musst du allerdings eines beachten:
                    die Schriftgrößen sind bei der HTML in "em" . Das führt dazu, dass es in JArvis sehr klein dargestellt wird. Ich hab mir das Skript vorher in den Texteditor kopiert und das durch "px" ersetzt. Die Schriftgröße kannst du dir dann nachher in den Objekten anpassen wie du es für gut empfindest.

                    M 1 Antwort Letzte Antwort
                    1
                    • Dominik F.D Dominik F.

                      @marsmännchen

                      https://forum.iobroker.net/topic/40424/alexa-ansagen-i-telegram-i-email-i-alias-i-visu-i-html

                      Bei der Tabelle musst du allerdings eines beachten:
                      die Schriftgrößen sind bei der HTML in "em" . Das führt dazu, dass es in JArvis sehr klein dargestellt wird. Ich hab mir das Skript vorher in den Texteditor kopiert und das durch "px" ersetzt. Die Schriftgröße kannst du dir dann nachher in den Objekten anpassen wie du es für gut empfindest.

                      M Offline
                      M Offline
                      marsmännchen
                      schrieb am zuletzt editiert von
                      #420

                      @dominik-f
                      Danke, genau dort bin ich gerade angekommen.
                      Muss nur diese ganzen Benachrichtigungen und Alexa Sachen "überlesen"
                      Danke

                      Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
                      Wago PFC200 mit Dali Lichtsteuerung.

                      M 1 Antwort Letzte Antwort
                      0
                      • M marsmännchen

                        @dominik-f
                        Danke, genau dort bin ich gerade angekommen.
                        Muss nur diese ganzen Benachrichtigungen und Alexa Sachen "überlesen"
                        Danke

                        M Offline
                        M Offline
                        marsmännchen
                        schrieb am zuletzt editiert von
                        #421

                        Nein auch zu kompliziert wenn man kein Programmierer ist. Noch dazu bekomme ich meine Lichter per Modbus mit dem Wert 0 für aus und 100 für ein.

                        Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
                        Wago PFC200 mit Dali Lichtsteuerung.

                        Dominik F.D 1 Antwort Letzte Antwort
                        0
                        • M marsmännchen

                          Nein auch zu kompliziert wenn man kein Programmierer ist. Noch dazu bekomme ich meine Lichter per Modbus mit dem Wert 0 für aus und 100 für ein.

                          Dominik F.D Offline
                          Dominik F.D Offline
                          Dominik F.
                          schrieb am zuletzt editiert von Dominik F.
                          #422

                          @marsmännchen

                          Da du ja eh Aliase nutzen kannst/sollst kannst du dir die so einstellen, dass du bei 0 ein false hast und bei 100 ein true.

                          Da ich selbst kein Programmierer bin kann ich dir sagen, dass es durchaus machbar ist auch ohne große Programmierkenntnisse.

                          Aber gut. Ich kenne das Skript was du für Lichter nutzt. Das sollte sich in Jarvis darstellen lassen, zumindest in einem Pop Up. Hast du das schon mal versucht?

                          Pack den Datenpunkt mal in eine ganz normale Statelist rein. Wenn du dann drauf klickst, sollte die Tabelle sichtbar sein

                          1 Antwort Letzte Antwort
                          0
                          • M Offline
                            M Offline
                            marsmännchen
                            schrieb am zuletzt editiert von
                            #423

                            @dominik-f
                            Nein, ich sitze schon seit ca. 14:20 dabei meine eingeschalteten Lichter zu visualisieren.
                            Ja ich benutze den Alias Manager, aber eine möglichkeit 100 in true und 0 in false umzuwandeln finde ich in keiner Anleitung. Nur zum umrechnen mit val/100 und dergleichen.
                            licht6.PNG
                            Und von selber kommt ein User da nicht drauf.
                            Jetzt bin ich gerade am JavaScript lesen wie ich eine IF/ELSE Bedienung schreiben könnte um mir das um zu wandeln weil es scheinbar in Blockly wieder einen Studienabschluss in BLOCKLYNISMUS benötigt.
                            Aber ichbin schon echt sauer und hab schon langsam keine Lust mehr auf den ganzen....

                            Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
                            Wago PFC200 mit Dali Lichtsteuerung.

                            1 Antwort Letzte Antwort
                            0
                            • Marc_el_KM Offline
                              Marc_el_KM Offline
                              Marc_el_K
                              schrieb am zuletzt editiert von
                              #424

                              Hallo,

                              ich habe ein IFrame eingebunden mit einer Kamera und das Bild aktualisiert sich regelmäßig ist aber leider zu groß für das Widget. Kann mir jemand verraten, wie man das Image auf 100% Widgetbreite bekommt, damit es auf jedem Endgerät automatisch angepasst wird?

                              Dankeschön :-)

                              M 1 Antwort Letzte Antwort
                              0
                              • M marsmännchen

                                @mcu
                                Ok, aber zum Script kann ich dir nur sagen, das ist von einem anderen User, ich hab es nur minimal angepasst:

                                //der-eine 05.06.2020
                                //Ursprüngliches Skript: https://github.com/Pittini/iobroker-Fensterauswertung
                                //Das folgende Skript wurde zum zählen von eingeschaltenen Lichtern umgeschrieben.
                                //
                                // V1.2.3 vom 1.4.2020
                                //Script um eingeschaltene Lichter pro Raum und insgesamt zu zählen. Legt pro Raum zwei Datenpunkte an, sowie zwei Datenpunkte fürs gesamte.
                                //Möglichkeit eine Ansage nach x Minuten einmalig oder zyklisch bis Fensterschließung anzugeben
                                //Dynamische erzeugung einer HTML Übersichtstabelle
                                //WICHTIG!!!
                                //Vorraussetzungen: Den Geräten müssen Räume zugewiesen sein, sowie die Funktion "Verschluss" für jeden entsprechenden Datenpunkt zugewiesen sein.
                                
                                //Grundeinstellungen
                                const logging = false; //Erweiterte Logs ausgeben?
                                const praefix = "0_userdata.0.Lichtueberwachung."; //Grundpfad für Script DPs
                                const ZeitBisNachricht = 300000 // 300000 ms = 5 Minuten
                                const RepeatInfoMsg = true; // Legt fest ob Ansage einmalig oder zyklisch
                                const InfoMsgAktiv = true; // Legt fest ob eine Infonachricht nach x Minuten ausgegeben werden soll
                                const WelcheFunktionVerwenden = "actualLevel"; // Legt fest nach welchem Begriff in Funktionen gesucht wird.
                                const UseTelegram = false; // Sollen Nachrichten via Telegram gesendet werden?
                                const UseAlexa = false; // Sollen Nachrichten via Alexa ausgegeben werden?
                                const AlexaId = ""; // Die Alexa Seriennummer
                                const UseMail = false; //Nachricht via Mail versenden
                                const UseSay = false; // Sollen Nachrichten via Say ausgegeben werden? Authorenfunktion, sollte deaktiviert werden.
                                const UseEventLog = false; // Sollen Nachrichten ins Eventlog geschreiben werden? Authorenfunktion, sollte deaktiviert werden.
                                const AlsoMsgLightOnOff = false; //Soll auch das erstmalige einschalten, sowie das ausschalten gemeldet werden?
                                const LightsOnListSeparator = "<br>"; //Trennzeichen für die Textausgabe der eingeschaltenen Lichter pro Raum
                                const LightIsOnWhen = ["true", "ein", "on","100"]; // Hier können eigene States für ein angegeben werden, immer !!! in Kleinschreibung
                                const LightIsOffWhen = ["false", "off", "0"]; // können eigene States für aus angegeben werden, immer !!! in Kleinschreibung
                                
                                //Einstellungen zur Tabellenausgabe
                                const LightsOnImg = "/icons-mfd-svg/light_light_dim_100.svg"; //Icon eingeschaltenes Licht
                                const LightOffImg = "/icons-mfd-svg/light_light.svg"; // Icon für ausgeschaltenes Licht
                                const LightsOnColor = "red"; // Farbe für eingeschaltenes Licht
                                const LightsOffColor = "green"; // Farbe für ausgeschaltenes Licht
                                const HeadlessTable = false; // Tabelle mit oder ohne Kopf darstellen
                                const TableDateFormat = "SS:mm:ss TT.MM.JJJJ"; //Zeit- & Datums- formatierung für Tabelle. Übersicht der Kürzel hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#formatdate
                                
                                //Ab hier nix mehr ändern!
                                
                                let LightOnCount = 0; // Gesamtzahl der eingeschaltenen Lichter
                                const RoomLightsOnCount = []; // Array für eingeschaltene Lichter pro Raum
                                let RoomsWithLightsOn = "";
                                const LightsOnMsgHandler = []; // Objektarray für timeouts pro Raum
                                const Sensor = []; //Sensoren als Array anlegen
                                const SensorVal = [];//Sensorwerte als Array anlegen
                                const SensorOldVal = []; //Alte Sensorwerte als Array ablegen
                                const Laufzeit = []; //Timer Laufzeit pro Fenster
                                const RoomList = []; // Raumlisten Array
                                const RoomStateTimeStamp = [];
                                let z = 0; //Zähler
                                let DpCount = 0; //Zähler
                                const States = []; // Array mit anzulegenden Datenpunkten
                                let Funktionen = getEnums('functions');
                                
                                
                                
                                for (let x in Funktionen) {        // loop ueber alle Functions
                                    let Funktion = Funktionen[x].name;
                                    if (Funktion == undefined) {
                                        log("Keine Funktion gefunden");
                                    }
                                    else {
                                        if (typeof Funktion == 'object') Funktion = Funktion.de;
                                        let members = Funktionen[x].members;
                                        if (Funktion == WelcheFunktionVerwenden) { //Wenn Function ist Licht
                                            for (let y in members) { // Loop über alle Licht Members
                                                Sensor[y] = members[y];
                                                let room = getObject(Sensor[y], 'rooms').enumNames[0];
                                                if (typeof room == 'object') room = room.de;
                                                //Datenpunkte pro Raum vorbereiten
                                                States[DpCount] = { id: praefix + room + ".RoomLightsOnCount", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter im Raum", type: "number", def: 0 } };
                                                DpCount++;
                                                States[DpCount] = { id: praefix + room + ".IsOn", initial: false, forceCreation: false, common: { read: true, write: true, name: "Licht eingeschaltet?", type: "boolean", role: "state", def: false } }; //
                                                DpCount++;
                                                //log(Funktion + ': ' + room);
                                                if (RoomList.indexOf(room) == -1) { //Raumliste ohne Raumduplikate erzeugen
                                                    RoomList[z] = room;
                                                    if (logging) log("Raum " + z + " = " + RoomList[z]);
                                                    z++;
                                                };
                                                RoomLightsOnCount[y] = 0; // Array mit 0 initialisieren
                                                Laufzeit[y] = 0; // Array mit 0 initialisieren
                                            };
                                        };
                                    };
                                };
                                
                                //Struktur anlegen in js.0 um Sollwert und Summenergebniss zu speichern
                                //Generische Datenpunkte vorbereiten 
                                States[DpCount] = { id: praefix + "AllLightsOff", initial: true, forceCreation: false, common: { read: true, write: true, name: "Licht aus?", type: "boolean", role: "state", def: true } }; //
                                DpCount++;
                                States[DpCount] = { id: praefix + "LightsOn", initial: 0, forceCreation: false, common: { read: true, write: true, name: "Anzahl der eingeschaltenen Lichter", type: "number", def: 0 } };
                                DpCount++;
                                States[DpCount] = { id: praefix + "RoomsWithLightsOn", initial: "Lichter in allen Räumen ausgeschalten.", forceCreation: false, common: { read: true, write: true, name: "In welchen Räumen sind Lichter eingeschalten?", type: "string", def: "Lichter in allen Räumen ausgeschalten" } };
                                DpCount++;
                                States[DpCount] = { id: praefix + "OverviewTable", initial: "", forceCreation: false, common: { read: true, write: true, name: "Übersicht aller Räume und eingeschaltener Lichter", type: "string", def: "" } };
                                
                                //Alle States anlegen, Main aufrufen wenn fertig
                                let numStates = States.length;
                                States.forEach(function (state) {
                                    createState(state.id, state.initial, state.forceCreation, state.common, function () {
                                        numStates--;
                                        if (numStates === 0) {
                                            if (logging) log("CreateStates fertig!");
                                            main();
                                        };
                                    });
                                });
                                
                                function main() {
                                    for (let x = 0; x < Sensor.length; x++) {
                                        //setTimeout(function () { // Timeout setzt refresh status wieder zurück
                                        SensorVal[x] = String(getState(Sensor[x]).val).toLowerCase(); // Wert von Sensor in Schleife einlesen
                                        SimplyfyLightStates(x);
                                        // }, x * 100);
                                    };
                                    CreateTrigger();
                                    CheckAllLights(); //Bei Scriptstart alle Lichter einlesen
                                    CreateOverviewTable()
                                }
                                
                                function Meldung(msg) {
                                    if (UseSay) Say(msg);
                                    if (UseTelegram) {
                                        sendTo("telegram.0", "send", {
                                            text: msg
                                        });
                                    };
                                    if (UseAlexa) {
                                        if (AlexaId != "") setState("alexa2.0.Echo-Devices." + AlexaId + ".Commands.announcement"/*announcement*/, msg);
                                    };
                                    if (UseMail) {
                                        sendTo("email", msg);
                                    };
                                    if (logging) log("Msg= " + msg);
                                }
                                
                                function CreateOverviewTable() { //  Erzeugt tabellarische Übersicht als HTML Tabelle    
                                    //Tabellenüberschrift und Head
                                    let OverviewTable = "";
                                    if (!HeadlessTable) {
                                        OverviewTable = "<table style='width:100%; border-collapse: collapse; border: 0px solid black;'><caption><div style='height: 20px; padding-top: 0px; padding-bottom: 5px; font-size:1.4em; font-weight: bold;'>Lichterstatus</div></caption>";
                                        OverviewTable = OverviewTable + "<thead><tr><th width='100%' style='text-align:center; height: 20px; padding-bottom: 5px;'>" + RoomsWithLightsOn + "</th></tr></thead><tbody></tbody></table>";
                                    };
                                    //Tabelle der Raumdetails
                                    OverviewTable = OverviewTable + "<div style='height: 100%; overflow-y:auto; overflow-x:hidden;'><table style='width:100%; border-collapse: collapse;'>";
                                    OverviewTable = OverviewTable + "<thead><tr><th width='40px' style='text-align:left;'</th><th width='20px' style='text-align:center;'></th><th style='text-align:left;'></th></tr></thead><tbody>";
                                
                                
                                    for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                                        if (RoomLightsOnCount[x] > 0) { // Räume mit eingeschaltenen Lichtern
                                            RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                                            OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOnColor + ";'><img height=40px src='" + LightsOnImg + "'></td>"
                                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center;background-color:" + LightsOnColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOnColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.8em; font-weight:bold;'>eingeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                                        }
                                        else { // Ausgeschaltene Räume
                                            RoomStateTimeStamp[x] = formatDate(getDateObject(getState(praefix + RoomList[x] + ".IsOn").lc), TableDateFormat);
                                            OverviewTable = OverviewTable + "<tr><td style='border: 1px solid black; background-color:" + LightsOffColor + ";'><img height=40px src='" + LightOffImg + "'></td>"
                                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; text-align:center; background-color:" + LightsOffColor + ";'>" + RoomLightsOnCount[x] + "</td>"
                                            OverviewTable = OverviewTable + "<td style='border: 1px solid black; padding-left: 10px; padding-right: 10px; font-size:1.1em; font-weight: bold; background-color:" + LightsOffColor + ";'>" + RoomList[x] + "<br><div style='font-size:0.7em; font-weight:normal;'>ausgeschaltet: " + RoomStateTimeStamp[x] + "</div></td></tr>"
                                
                                        };
                                    };
                                    OverviewTable = OverviewTable + "</tbody></table></div>";
                                    setState(praefix + "OverviewTable", OverviewTable);
                                    //log(OverviewTable);
                                }
                                
                                function CreateRoomsWithLightsOnList() { //Erzeugt Textliste mit Räumen welche eingeschaltene Lichter haben
                                    RoomsWithLightsOn = ""; //Liste Initialisieren
                                    for (let x = 0; x < RoomList.length; x++) { //Alle Räume durchgehen
                                        if (RoomLightsOnCount[x] > 0) { // Nur Räume mit eingeschaltenen Lichtern berücksichtigen
                                            if (RoomLightsOnCount[x] == 1) { //Wenn 1 Licht ein, Singular Schreibweise
                                                RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                                            }
                                            else { //ansonsten Plural Schreibweise
                                                RoomsWithLightsOn = RoomsWithLightsOn +"<img width=25px height=25px style= vertical-align:-5px src=img/bulb_on.png >"+ RoomList[x] + " "  + RoomLightsOnCount[x] + LightsOnListSeparator;
                                            };
                                        };
                                    };
                                    RoomsWithLightsOn = RoomsWithLightsOn.substr(0, RoomsWithLightsOn.length - LightsOnListSeparator.length); //letzten <br> Umbruch wieder entfernen
                                
                                    if (RoomsWithLightsOn == "") {
                                        RoomsWithLightsOn = "<img width=25px height=25px style= vertical-align:-5px src=img/bulb_off.png >"+ "Alle Lichter ausgeschalten";
                                    };
                                    setState(praefix + "RoomsWithLightsOn", RoomsWithLightsOn);
                                    if (logging) log(RoomsWithLightsOn);
                                }
                                
                                function GetRoom(x) { // Liefert den Raum von Sensor x
                                    if (logging) log("Reaching GetRoom x=" + x)
                                    let room = getObject(Sensor[x], 'rooms').enumNames[0];
                                    if (room == undefined) {
                                        log("Kein Raum definiert bei Sensor " + Sensor[x], 'error');
                                        return "Kein Raum definiert";
                                    };
                                    if (typeof room == 'object') room = room.de;
                                    return room;
                                }
                                
                                function CheckLight(x) { //Für einzelnes Licht. Via Trigger angesteuert.
                                    let TempRoom = GetRoom(x); //Raum des aktuellen Sensors bestimmen
                                    let TempRoomIndex = RoomList.indexOf(TempRoom); // Raumlistenindex für aktuellen Raum bestimmen
                                    if (logging) log("reaching CheckLight, SensorVal[" + x + "]=" + SensorVal[x] + " SensorOldVal=" + SensorOldVal[x] + " TempRoom=" + TempRoom)
                                    if (SensorVal[x] == "on" && SensorOldVal[x] != "on") { //Licht war ausgeschalten und wurde eingeschalten
                                        LightOnCount++;
                                        RoomLightsOnCount[TempRoomIndex]++;
                                        if (logging) log("RoomLightsOnCount für " + TempRoom + "=" + RoomLightsOnCount[TempRoomIndex]);
                                        setState(praefix + "AllLightsOff", false);
                                        setState(praefix + TempRoom + ".IsOn", true);
                                        setState(praefix + "LightsOn", LightOnCount);
                                        setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                                
                                        if (logging) log(TempRoom + " Licht eingeschalten");
                                        if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht eingeschaltet!");
                                        if (UseEventLog == true) WriteEventLog(TempRoom + " Licht eingeschaltet!");
                                        if (RoomLightsOnCount[TempRoomIndex] == 1) {
                                            Laufzeit[TempRoomIndex] = 0;
                                            if (InfoMsgAktiv == true) {
                                                if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                                    if (logging) log("Setting Interval to Room:" + TempRoom);
                                
                                                    LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                                        Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                                        Meldung(TempRoom + "licht seit " + (Laufzeit[TempRoomIndex] / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                                    }, ZeitBisNachricht);
                                                }
                                                else { // Wenn einmalige Meldung eingestellt
                                                    if (logging) log("Setting Timeout to Room:" + TempRoom);
                                
                                                    LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () {
                                                        Meldung(TempRoom + "licht seit " + (ZeitBisNachricht / 1000 / 60).toFixed(1) + " Minuten eingeschalten!");
                                                    }, ZeitBisNachricht);
                                                };
                                            };
                                        };
                                    }
                                    else if (SensorVal[x] == "off") {
                                        if (LightOnCount > 0) LightOnCount--;
                                        if (RoomLightsOnCount[TempRoomIndex] > 0) RoomLightsOnCount[TempRoomIndex]--;
                                
                                        setState(praefix + "LightsOn", LightOnCount);
                                        setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                                
                                        log(TempRoom + " Licht ausgeschalten.");
                                        if (AlsoMsgLightOnOff) Meldung(TempRoom + " Licht ausgeschaltet!");
                                        if (UseEventLog == true) WriteEventLog(TempRoom + " Licht ausgeschaltet!");
                                        if (RoomLightsOnCount[TempRoomIndex] == 0) {
                                            setState(praefix + TempRoom + ".IsOn", false);
                                
                                            if (RepeatInfoMsg == true) {
                                                if (logging) log("reaching clearInterval - [x] = " + [x] + " TempRoomIndex= " + TempRoomIndex);
                                                clearInterval(LightsOnMsgHandler[TempRoomIndex]);
                                            }
                                            else {
                                                if (logging) log("reaching clearTimeout");
                                                clearTimeout(LightsOnMsgHandler[TempRoomIndex]);
                                            };
                                        };
                                
                                        if (LightOnCount == 0) { //Wenn kein Licht mehr eingeschalten
                                            setState(praefix + "AllLightsOff", true);
                                            setState(praefix + TempRoom + ".IsOn", false);
                                            log("Alle Lichter ausgeschalten.");
                                        };
                                    };
                                    if (logging) log("Eingeschaltene Lichter gesamt= " + LightOnCount);
                                    CreateRoomsWithLightsOnList();
                                    CreateOverviewTable();
                                }
                                
                                function CheckAllLights() { //Prüft bei Programmstart alle Lichter
                                    for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                                        let TempRoom = GetRoom(x);
                                        let TempRoomIndex = RoomList.indexOf(TempRoom);
                                        if (SensorVal[x] == "on") { //Licht ist eingeschalten
                                            LightOnCount = LightOnCount + 1;
                                            RoomLightsOnCount[TempRoomIndex] = RoomLightsOnCount[TempRoomIndex] + 1;
                                            if (logging) log("Temproom= " + TempRoom + " TempRoomIndex= " + RoomList.indexOf(TempRoom) + "  RoomLightsOnCount= " + RoomLightsOnCount[TempRoomIndex]);
                                
                                            setState(praefix + "AllLightsOff", false);
                                            setState(praefix + "LightsOn", LightOnCount);
                                
                                            setState(praefix + TempRoom + ".IsOn", true);
                                            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                                            if (InfoMsgAktiv == true && RoomLightsOnCount[RoomList.indexOf(TempRoom)] == 1) {
                                                if (RepeatInfoMsg == true) { // Wenn Intervallmeldung eingestellt Interval starten und Dauer bei Ansage aufaddieren
                                                    if (logging) log("Setting Interval at initialization to Room: " + TempRoom);
                                                    LightsOnMsgHandler[TempRoomIndex] = setInterval(function () {
                                                        Laufzeit[TempRoomIndex] = Laufzeit[TempRoomIndex] + ZeitBisNachricht;
                                                        Meldung(TempRoom + "licht seit " + Laufzeit[TempRoomIndex] / 1000 / 60 + " Minuten eingeschalten!");
                                                    }, ZeitBisNachricht);
                                                }
                                                else {
                                                    if (logging) log("Setting Timeout at initialization to Room: " + TempRoom);
                                
                                                    LightsOnMsgHandler[TempRoomIndex] = setTimeout(function () { // Wenn einmalige Meldung eingestellt
                                                        Meldung(TempRoom + "licht seit " + ZeitBisNachricht / 1000 / 60 + " Minuten eingeschalten!");
                                                    }, ZeitBisNachricht);
                                                };
                                            };
                                            if (logging) log(TempRoom + " Licht = eingeschalten");
                                        }
                                        else if (SensorVal[x] == "off") {
                                            //RoomLightsOnCount[TempRoomIndex] = getState(praefix + TempRoom + ".RoomLightsOnCount").val - 1;
                                            RoomLightsOnCount[TempRoomIndex]--;
                                            if (RoomLightsOnCount[TempRoomIndex] < 0) RoomLightsOnCount[TempRoomIndex] = 0;
                                            setState(praefix + TempRoom + ".IsOn", false);
                                            setState(praefix + TempRoom + ".RoomLightsOnCount", RoomLightsOnCount[TempRoomIndex]);
                                            //log(TempRoom + " Fenster = geschlossen.");
                                        };
                                    };
                                    if (LightOnCount == 0) {
                                        setState(praefix + "AllLightsOff", true);
                                        setState(praefix + "LightsOn", LightOnCount);
                                
                                        log("Alle Lichter ausgeschalten.");
                                    };
                                    CreateRoomsWithLightsOnList();
                                }
                                
                                function SimplyfyLightStates(x) { //Die verschiedenen Gerätestates zu on oder off vereinfachen
                                    //log("Sensor "+Sensor[x]+" mit Wert "+ SensorVal[x]+ " hat Typ " + typeof(SensorVal[x] ));
                                    if (LightIsOnWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichtereinnarray, wenn gefunden, Status auf on setzen
                                        SensorVal[x] = "on";
                                    }
                                    else if (LightIsOffWhen.indexOf(SensorVal[x]) != -1) { // Suche in Lichterausarray, wenn gefunden, Status auf off setzen
                                        SensorVal[x] = "off";
                                    };
                                
                                    if (SensorVal[x] != "on" && SensorVal[x] != "off") { // Suche in Lichtereinarray und Lichterausarray, wenn nirgends gefunden, Status auf closed setzen und Logwarnung ausgeben
                                        log("Unknown Lightstate " + SensorVal[x] + " detected at " + Sensor[x] + ", please check your configuration", "warn");
                                        SensorVal[x] = "unknown";
                                    };
                                
                                    if (LightIsOnWhen.indexOf(SensorOldVal[x]) != -1) {
                                        SensorOldVal[x] = "on";
                                    }
                                    else if (LightIsOffWhen.indexOf(SensorOldVal[x]) != -1) {
                                        SensorOldVal[x] = "off";
                                    };
                                }
                                
                                function CreateTrigger() {
                                    //Trigger für Sensoren erzeugen
                                    for (let x = 0; x < Sensor.length; x++) { //Alle Sensoren durchlaufen
                                        on(Sensor[x], function (dp) { //Trigger in Schleife erstellen
                                            if (logging) log("Trigger= " + x + " Wert= " + dp.state.val + " Alter Wert= " + dp.oldState.val);
                                            if (dp.channelId.search(praefix) == -1) { //Ausschliessen dass das Scriptverzeichnis zum Triggern verwendet wird
                                                SensorVal[x] = String(dp.state.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                                                SensorOldVal[x] = String(dp.oldState.val).toLowerCase(); // Alles in String und Kleinschreibweise wandeln
                                                SimplyfyLightStates(x);
                                                CheckLight(x);
                                            }
                                            else {
                                                log("Fehler, Datenpunkt im Scriptverzeichnis als Trigger definiert", "error");
                                            };
                                        });
                                    };
                                
                                    onStop(function () { //Bei Scriptende alle Timer löschen
                                        for (let x = 1; x < Sensor.length; x++) {
                                            if (RoomLightsOnCount[x] == 0) {
                                                if (RepeatInfoMsg == true) {
                                                    clearInterval(LightsOnMsgHandler[x]);
                                                }
                                                else {
                                                    clearTimeout(LightsOnMsgHandler[x]);
                                                };
                                            };
                                
                                        };
                                    }, 100);
                                }
                                
                                

                                edit:
                                Ich denke mir gerade ich sollte es für Jarvis irgendwie anders angehen.
                                Dafür ist das Script vermutlich ein bisschen zu viel des guten. Bei Vis habe ich mir daraus folgendes gebastelt.

                                licht4.PNG

                                licht5.PNG

                                Da brauche ich keinen HTMLTable.

                                M Offline
                                M Offline
                                MCU
                                schrieb am zuletzt editiert von MCU
                                #425

                                @marsmännchen In dem Script gibt es 2x table
                                a119f158-35f9-40c9-9268-d6ca5ee9773d-image.png

                                const HeadlessTable = false;
                                

                                Setze mal den Wert auf true.

                                NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                                Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                                1 Antwort Letzte Antwort
                                1
                                • Marc_el_KM Marc_el_K

                                  Hallo,

                                  ich habe ein IFrame eingebunden mit einer Kamera und das Bild aktualisiert sich regelmäßig ist aber leider zu groß für das Widget. Kann mir jemand verraten, wie man das Image auf 100% Widgetbreite bekommt, damit es auf jedem Endgerät automatisch angepasst wird?

                                  Dankeschön :-)

                                  M Offline
                                  M Offline
                                  MCU
                                  schrieb am zuletzt editiert von
                                  #426

                                  @marc_el_k Zeig mal die Einstellungen zum Widget.

                                  NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                                  Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                                  M Marc_el_KM 2 Antworten Letzte Antwort
                                  0
                                  • M MCU

                                    @marc_el_k Zeig mal die Einstellungen zum Widget.

                                    M Offline
                                    M Offline
                                    marsmännchen
                                    schrieb am zuletzt editiert von
                                    #427

                                    @mcu
                                    Danke, zumindest zeigt es jetzt irgendwas an.
                                    licht7.PNG

                                    Raspberry Pi 4 8GB, Debian 11, js-controller: 5.0.12, Nodejs: v18.18.2, NPM: 9.8.1 (Multihost),
                                    Wago PFC200 mit Dali Lichtsteuerung.

                                    M 1 Antwort Letzte Antwort
                                    0
                                    • M MCU

                                      @marc_el_k Zeig mal die Einstellungen zum Widget.

                                      Marc_el_KM Offline
                                      Marc_el_KM Offline
                                      Marc_el_K
                                      schrieb am zuletzt editiert von
                                      #428

                                      @mcu sagte in jarvis v3.1.x - just another remarkable vis:

                                      @marc_el_k Zeig mal die Einstellungen zum Widget.

                                      so sieht es bei mir aus
                                      widget.jpg

                                      M 1 Antwort Letzte Antwort
                                      0
                                      • Dominik F.D Offline
                                        Dominik F.D Offline
                                        Dominik F.
                                        schrieb am zuletzt editiert von
                                        #429

                                        @marsmännchen

                                        Ich nutze ein Skript vom ursprünglichen Verfasser wo die Tabelle ähnlich erstellt wurde.
                                        Bei mir funktioniert das in einer Statelist wie oben beschrieben in einem Popup.

                                        Unbenannt.JPG

                                        M 1 Antwort Letzte Antwort
                                        0
                                        • Marc_el_KM Marc_el_K

                                          @mcu sagte in jarvis v3.1.x - just another remarkable vis:

                                          @marc_el_k Zeig mal die Einstellungen zum Widget.

                                          so sieht es bei mir aus
                                          widget.jpg

                                          M Offline
                                          M Offline
                                          MCU
                                          schrieb am zuletzt editiert von
                                          #430

                                          @marc_el_k Nutze mal displayImage.
                                          https://mcuiobroker.gitbook.io/jarvis-infos/jarvis-v3/besonderheiten-v3/module/displayimage

                                          NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                                          Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                                          Marc_el_KM 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

                                          766

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          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