Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Tirador

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    T
    • Profile
    • Following 0
    • Followers 2
    • Topics 10
    • Posts 280
    • Best 39
    • Groups 2

    Tirador

    @Tirador

    Starter

    83
    Reputation
    160
    Profile views
    280
    Posts
    2
    Followers
    0
    Following
    Joined Last Online

    Tirador Follow
    Pro Starter

    Best posts made by Tirador

    • [Script] MessageHandler: Nachrichten protokollieren +VIS

      Ich habe ein paar Skript erstellt als Infrastruktur zur Protokollierung von Nachrichten/Ereignissen.
      Zusätzlich gibt es ein MDCSS v2 Widget, dass die protokollierten Nachrichten anzeigt.
      Nachrichten können damit als kompakte Darstellung des globalen Systemzustands in VIS verwendet werden.

      Die Idee ist es, alle relevanten Informationen auf "einen Blick" zu erkennen. Wichtige und kritische Ereignisse werden daher in der Liste zentral oben platziert. Unwichtigere Informationen eher unten.

      Beispiel Vis-Ansicht:
      demo_messagehandler.gif

      Beispiel: Lovelace-Ansicht
      lovelace.png

      Kernfunktionen:

      • Ermöglicht es Nachrichten aus Skripten auszulösen und zu entfernen. Dies kann über zwei Wege erfolgen:

        • Automatisches Erzeugen/Entfernen von Nachrichten über das Javascript MessageStateCreator.

          • Es werden konfigurierte Datenpunkte überwacht und bei konfigurierten Bedingungen Nachrichten erzeugt oder auch entfernt.
          • Die Textausgabe der Nachrichten kann auch konfiguriert werden und dynamisch erzeugt werden.
          • Nachrichten können erst nach einer Verzögerungszeit ausgelöst werden.
          • Nachrichten können kontinuierlich nach einer Wiederholungszeit ausgelöst werden (dient zum erneuten Senden von Pushs per Email / Telegram)
        • Javascript-Funktionen postMessage(..) oder removeMessage(..) für den Einsatz in eigenen Skripten.

      • Es können entweder alle Nachrichten eines Nachrichtentyps protokolliert werden oder immer nur die letzte eingetretende Nachricht.

      • Nachrichten werden nach Prioritäten visuell in VIS dargestellt. Es stehen zwei VIS-Ausgaben zur Verfügung:

        • einfache HTML-Tabelle (ohne Schnickschnack)
      • Lovelace-Kartenausgabe über Markdown-Card mit Datenpunkt {0_userdata.0.messageHandler.messages.markdown}

      • Material Design CSS 2.0 Card für Uhula.

      • Nachrichten können (optional) in VIS global und auch einzeln quittiert werden.

      • Nachrichten können mit einem VIS-View verknüpft werden. Aus dem VIS Widget kann somit direkt in den View verzweigt werden.

      • Mit einer Nachricht können ein oder mehrere Ereignisse ausgelöst werden:

        • Senden einer Email
        • Senden einer Pushover-Nachricht
        • Senden einer Telegram-Pushnachricht
      • Nachrichtendefinition: Nachrichten werden über eine Konfigurationsstruktur definiert und damit wesentliche Eigenschaften der Nachricht bestimmt, darunter:

        • Nachrichtenüberschrift
        • Nachrichtentext
        • Kritikalität (Information, Warnung, Alarm etc.) / Priorität
        • Icon für die VIS Ausgabe
        • Farbe des Icons
        • VIS-View
        • Nachrichtenereignis (Senden eines Telegrams / Email)

      Beispiele für Nachrichten:

      • Alarmanlage ausgelöst!
      • Wasseralarm
      • Erinnerung Fenster lüften!
      • Erinnerung Fenster zu lange geöffnet!
      • Aktuell offene Fenster
      • Aktuell
      • Aktuell offene Türen
      • Lichter angeschaltet
      • Aktive Steckdosen
      • Post im Briefkasten mit Datum letzter Einwurf
      • Nächster Müllabfuhrtermin mit Information zur Tonne
      • DWD Wetterwarnung
      • Bewegung erkannt
      • Internetverbindung Offline
      • Termine des Tages
      • Termine morgen
      • Corona-Statistiken
      • Temperaturen
      • ...

      Sourcen / Anleitung und Projekt auf Github:

      https://github.com/St0Ma/ioBroker-MessageHandler

      In diesem Thread könnt ihr gerne Fragen stellen. Ich versuche im Rahmen meiner Möglichkeiten Support zu geben.

      posted in JavaScript
      T
      Tirador
    • Der "ultimative" ioBroker Lovelace Leitfaden/Dokumentation

      Hallo Community,

      in Ermangelung eines passenden Bereichs poste ich mal hier 😉

      Das Dokument im Anhang entstand nach längerer Suche/Recherche/Ausprobieren und soll zukünftigen Benutzern als Hilfsmittel dienen einen schnellen aber doch auch tiefgreifenden Einstieg in Lovelace zu finden. Die Bezeichnung "ultimativ" im Leitfaden ist eher "scherzhaft" gemeint, da zum Zeitpunkt der Erstellung dieses Dokuments "bruchstückenhafte" Dokumentationen existieren, die der Autor nun versucht hat in diesem Leitfaden "ultimativ" zusammenzuführen. Daher erhebt dieser Leitfaden keine absolute Vollständigkeit und Richtigkeit und kann garantiert kontinuierlich erweitert werden. Gerne nehme ich weitere Ergänzungen vor, wenn jemand weitere Lösungswege beschreibt.

      Viel Spass damit! 🙂

      Version 1.3
      Der ultimative ioBroker Lovelace - Guide.pdf

      posted in ioBroker Allgemein
      T
      Tirador
    • RE: Material Design Widgets: Alerts Widget

      Hallo, ich habe jetzt etwas geforscht und bin zu einer "Blockly"-Lösung gelangt.
      Vielleicht ja auch für andere nützlich.

      Ich zeige dies anhand eines Beispiels:

      Mein Sensor im Postkasten signalisiert, dass neue Post eingewurfen wurde.
      Wenn dies geschehen ist, soll eine Nachricht ausgelöst werden.

      Im Blockly sieht das wie folgt aus:

      2020-02-15 11_44_23-javascript - ioBroker.png

      Sofern das jemand weiterverwenden will ist im Block der "Javascript-Funktion" auf das "</>" Zeichen zu klicken und im Funktionsaufruf der Datenpunkt für das Alert im Skript anzupassen:

      2020-02-15 11_46_13-javascript - ioBroker.png

      Das Beispiel-Blockly kann man hier herunterladen:

      BlocklyAlertExample.xml

      Ergebnis in der Visualisierung:

      2020-02-15 11_40_57-vis.png

      posted in Visualisierung
      T
      Tirador
    • RE: [Script] MessageHandler: Nachrichten protokollieren +VIS

      Die Abhängigkeit ist natürlich nicht ohne, aber die Anleitungen sollte man schon lesen.
      Korrekterweise muss man aber sagen, dass es ja auch einen Datenpunkt mit HTML Tabelle gibt, so dass nicht zwangsläufig MDCSS zum Einsatz kommen muss.

      Meine Idee wäre noch die Bereitstellung der Nachrichten als JSON Tabelle. Damit können nicht MDCSS User auch in ihrer VIS selbst die Nachrichten integrieren und das Layout freier gestalten. Natürlich mit gewissen Einschränkungen im Layout gegenüber MDCSS. Die bestehende HTML Tabelle würde dann rausgenommen werden.

      posted in JavaScript
      T
      Tirador
    • RE: Material Design Widgets: Alerts Widget

      @sigi234
      @skokarl

      Ich habe jetzt noch einmal eine Schritt für Schritt Anleitung ergänzt.

      Folgenden Datenpunkt habe ich angelegt:
      2020-02-15 17_00_25-Mozilla Firefox.png

      Im Vis ist das Widget aufzuziehen und der Datenpunkt einzutragen:

      2020-02-15 16_58_51-Edit vis.png

      Das Skript von Scrounger habe ich wie folgt abgelegt und gestartet:

      2020-02-15 17_01_22-javascript - ioBroker.png

      posted in Visualisierung
      T
      Tirador
    • Time Of Day - Design Pattern

      Hallo,

      nach Suche im Forum habe ich leider kein "Time Of Day"-Pattern gefunden und daher selbst ein kleines Skript geschrieben.

      Worum geht es:

      Abbildung einer Zeitschaltuhr über Zustände der aktuellen Tageszeit.
      Dies Zustände sind beispielweise: Morgen, Nachmittag, Abend, Bettzeit etc.
      Im Prinzip wird der Tag in mehrere Zeitabschnitte eingeteilt und diese in einem Datenpunkt vorgehalten.

      Beispiel:

      // Zustand 	          Start 	                
      //------------------------------------------
      // MORNING 	          05:30 	                
      // DAY 	                  Sunrise 	            
      // HIGHNOON               Solarnoon - 30 minutes   
      // AFTERNOON 	          Solarnoon + 30 minutes 	
      // LATEAFTERNOON          Sunset - 60 minutes
      // EVENING 	          Sunset -5 minutes       
      // NIGHT 	          23:00 	                
      // BED                    00:30     
      

      Bezogen auf das Beispiel nimmt der Datenpunkt den Zustand jeweils mit Eintritt des Start-Ereignisses an.
      D.h. der Zustand "MORNING" startet um 5:30 Uhr und gilt bis zum nächsten Zustandswechsel durch den Zustand "DAY" mit "Sunrise" (Sonnenaufgang).

      Mit Ausführung des Skripts wird ein Datenpunkt "javascript.0.TimeOfDay.timeOfDay.current" erzeugt, der die aktuelle Tageszeit wiederspiegelt:

      2020-02-23 11_30_37-objects - ioBroker.png

      Beispiel: Praktische Anwendung der Lösung:

      Ich nutze das Skript momentan, um die Lampen im Haus automatisiert ein- und auszuschalten.

      2020-02-23 11_32_22-javascript - ioBroker.png

      Jeden Morgen um 5:30 Uhr (MORNING) und 5 Minuten vor Sonnenuntergang (EVENING) werden bestimmte Lampen eingeschaltet. Mit Sonnenaufgang (DAY) und Beginn der Bettzeit (BED) werden die Lampen im gesamten Haus ausgeschaltet. Zusätzlich versende ich noch ein Telegram (zur Kontrolle).

      Beispiel-Blockly:

      <xml xmlns="http://www.w3.org/1999/xhtml">
       <block type="on_ext" id=":=MTl41KBycQ+;j/4`X_" x="-512" y="13">
         <mutation items="1"></mutation>
         <field name="CONDITION">ne</field>
         <field name="ACK_CONDITION"></field>
         <value name="OID0">
           <shadow type="field_oid" id="$PIzJ)HcJ+xW^^UEG!Up">
             <field name="oid">javascript.0.TimeOfDay.timeOfDay.current</field>
           </shadow>
         </value>
         <statement name="STATEMENT">
           <block type="controls_if" id="%-#j95VvTM-,$u6Mz+MR">
             <mutation elseif="1"></mutation>
             <value name="IF0">
               <block type="logic_operation" id="n9wS[qgYJ)B_e8r8?YJ?">
                 <field name="OP">OR</field>
                 <value name="A">
                   <block type="logic_compare" id="KR$c#/d`-MBsc!,@41r-">
                     <field name="OP">EQ</field>
                     <value name="A">
                       <block type="get_value" id="8o)EJuP;tmkRpzWOM8qO">
                         <field name="ATTR">val</field>
                         <field name="OID">javascript.0.TimeOfDay.timeOfDay.current</field>
                       </block>
                     </value>
                     <value name="B">
                       <block type="text" id="wiU7-[.r;FjKA[,L}f6d">
                         <field name="TEXT">EVENING</field>
                       </block>
                     </value>
                   </block>
                 </value>
                 <value name="B">
                   <block type="logic_compare" id="9O9n1tsFKlbi#z3[g,w6">
                     <field name="OP">EQ</field>
                     <value name="A">
                       <block type="get_value" id="y@M0[ZxUMj1SrzqS{9}:">
                         <field name="ATTR">val</field>
                         <field name="OID">javascript.0.TimeOfDay.timeOfDay.current</field>
                       </block>
                     </value>
                     <value name="B">
                       <block type="text" id="3~GJa11^N8F.TJk33JWj">
                         <field name="TEXT">MORNING</field>
                       </block>
                     </value>
                   </block>
                 </value>
               </block>
             </value>
             <statement name="DO0">
               <block type="control" id="6{WrpN%,Tcgb1FK%|ZRS">
                 <mutation delay_input="false"></mutation>
                 <field name="OID">deconz.0.Groups.8.on</field>
                 <field name="WITH_DELAY">FALSE</field>
                 <value name="VALUE">
                   <block type="logic_boolean" id="U3v*bCW~qTYEEPnP9mHq">
                     <field name="BOOL">TRUE</field>
                   </block>
                 </value>
                 <next>
                   <block type="telegram" id="gr#r0JyS*/3mA~htTJ+*">
                     <field name="INSTANCE"></field>
                     <field name="LOG"></field>
                     <field name="SILENT">FALSE</field>
                     <field name="PARSEMODE">default</field>
                     <value name="MESSAGE">
                       <shadow type="text" id="Q:Y1+kLP1aowN.$CUe{G">
                         <field name="TEXT">Abendlicht eingeschaltet!</field>
                       </shadow>
                     </value>
                   </block>
                 </next>
               </block>
             </statement>
             <value name="IF1">
               <block type="logic_operation" id="wz0][pQ5[{2_yS9{rG;Q">
                 <field name="OP">OR</field>
                 <value name="A">
                   <block type="logic_compare" id="B^LcDK@LwSt/bg~,F{=P">
                     <field name="OP">EQ</field>
                     <value name="A">
                       <block type="get_value" id="r6F~NlD.3Wj@ea;wj.5_">
                         <field name="ATTR">val</field>
                         <field name="OID">javascript.0.TimeOfDay.timeOfDay.current</field>
                       </block>
                     </value>
                     <value name="B">
                       <block type="text" id="TU2O.76[SJ+H$!bNb1b!">
                         <field name="TEXT">DAY</field>
                       </block>
                     </value>
                   </block>
                 </value>
                 <value name="B">
                   <block type="logic_compare" id="m?A%zTkx;f^PgTl@exL@">
                     <field name="OP">EQ</field>
                     <value name="A">
                       <block type="get_value" id="4HvOP7dGHdG^J[Grk749">
                         <field name="ATTR">val</field>
                         <field name="OID">javascript.0.TimeOfDay.timeOfDay.current</field>
                       </block>
                     </value>
                     <value name="B">
                       <block type="text" id="[4FUsfXLqE:LWggR0iw_">
                         <field name="TEXT">BED</field>
                       </block>
                     </value>
                   </block>
                 </value>
               </block>
             </value>
             <statement name="DO1">
               <block type="control" id="tD_70D[Bc2|MPyH~h]L/">
                 <mutation delay_input="false"></mutation>
                 <field name="OID">deconz.0.Groups.9.on</field>
                 <field name="WITH_DELAY">FALSE</field>
                 <value name="VALUE">
                   <block type="logic_boolean" id="e)3lrl#l30Z)|i0Lmu8T">
                     <field name="BOOL">FALSE</field>
                   </block>
                 </value>
                 <next>
                   <block type="telegram" id="[yu6jH3e]R57]5x8wDZK">
                     <field name="INSTANCE"></field>
                     <field name="LOG"></field>
                     <field name="SILENT">FALSE</field>
                     <field name="PARSEMODE">default</field>
                     <value name="MESSAGE">
                       <shadow type="text" id="_]MdGpslFX_)_cuH+^YA">
                         <field name="TEXT">Alle Lichter ausgeschaltet!</field>
                       </shadow>
                     </value>
                   </block>
                 </next>
               </block>
             </statement>
           </block>
         </statement>
       </block>
      </xml>
      

      Genauso wie die Lampen gesteuert werden können sind natürlich unendlich weitere Kombinationslogiken möglich.

      Vor/Nachteile der Lösung:

      Sehr einfache Lösung einer "Zeitschaltuhr" ohne komplexen Nebenlogiken.
      Zentralisierung der Logik der Zeitschaltuhr in einem Skript.
      In allen anderen Skripten / Logiken kann man auf den Datenpunkt zugreifen und einfach den Zustand der aktuellen Tageszeit abfragen. Nachteilig ist, dass es keine Überschneidungen von Zeiten gibt. Ebenso werden nur globale Zeiten vorgegeben.

      Ideen/Co-Autoren

      Die Idee des "Time Of Day"-Pattern habe ich von OpenHab übernommen (siehe Desing Pattern: Time of Day).
      Das Skript mit der Astrologik beruhet auf dem Skript von Pix (siehe Iobroker.net Community Post).

      Installation

      In den Haupteinstellungen von IOBroker sind Breiten- und Längengrad vorzugeben, damit die Astro-Funktion die richtigen Zeiten ermitteln kann (für Sonnenaufgang / Sonnenuntergang etc.).

      Das folgende Skript ist als JavaScript "TimeOfDay" einfügen.
      Die Zeiten bzw. weitere Tageszeitzustände können prinzipiell natürlich selbst nochmal an die eigenen Vorgaben angepasst werden.

      Javascript "TimeOfDay"

      //---------------------------------------------------------------
      // Calculating Time of Day Design Pattern
      //---------------------------------------------------------------
      // Idea by OpenHab: see https://community.openhab.org/t/design-pattern-time-of-day/15407)
      // Script see https://forum.iobroker.net/topic/30457/time-of-day-design-pattern
      //---------------------------------------------------------------
      //
      // State 	        Start 	                
      //------------------------------------------
      // MORNING 	        05:30 	                
      // DAY 	            Sunrise 	            
      // HIGHNOON         Solarnoon - 30 minutes   
      // AFTERNOON 	    Solarnoon + 30 minutes 	
      // LATEAFTERNOON    Sunset - 60 minutes
      // EVENING 	        Sunset -5 minutes       
      // NIGHT 	        23:00 	                
      // BED              00:30                   
      //---------------------------------------------------------------
      
      
      const sec = false; // Sekunden darstellen oder nicht
      
      const fC = false; // forceCreation ein/aus
      
      const pfad = "TimeOfDay"; // Pfad zum Objekt - Objektbaum-Hauptverzeichnis
      
      
      const idTageszeit = "javascript." + instance  + "." + pfad + ".timeOfDay.current";
      
       
      
      createState(idTageszeit, "", fC, {
      
        name: "Tageszeit",
      
        desc: "Name der Tageszeit",
      
        type: "string"
      
      });   
      
      
      function setTimeOfDay(newTimeOfDay) {
      
        setState(idTageszeit, newTimeOfDay);
      
        log("Calculating new TimeOfDay: " + newTimeOfDay);
      
      }
      
      //--------------------------------------------------------
      // MORNING - 
      // Start 05:30 
      //--------------------------------------------------------
      
      schedule({
      
        hour: 5, minute: 30
      
      }, function() {
      
          setTimeOfDay("MORNING"); 
      
      });
      
      //--------------------------------------------------------
      // DAY 
      // Start: Sonnenaufgangende Ende
      //--------------------------------------------------------
      
      schedule({
      
        astro: "sunriseEnd"
      
      }, function() {
      
          setTimeOfDay("DAY"); 
      
      });
      
      //--------------------------------------------------------
      // HIGHNOON
      // Start: -30 Minuten vor Sonnenhöchststand 
      //--------------------------------------------------------
      
      schedule({
      
        astro: "solarNoon",
      
        shift: -30
      
      }, function () {
      
        setTimeOfDay("HIGHNOON");
      
      });
      
      //--------------------------------------------------------
      // AFTERNOON
      // Start : +30 Minuten vor Sonnenhöchststand 
      //--------------------------------------------------------
      schedule({
      
        astro: "solarNoon",
      
        shift: 30
      
      }, function () {
      
        setTimeOfDay("AFTERNOON");
      
      });
      
      //--------------------------------------------------------
      // LATEAFTERNOON
      // Start: -60 Minuten vor Sonnenuntergang
      //--------------------------------------------------------
      schedule({
      
        astro: "sunsetStart",
      
        shift: -60
      
      }, function () {
      
         setTimeOfDay("LATEAFTERNOON"); 
      
      });
      
      //--------------------------------------------------------
      // EVENING 
      // Start: -5 Minuten vor Sonnenuntergang 
      //--------------------------------------------------------
      schedule({
      
        astro: "sunsetStart", 
      
        shift: -5
      
      }, function () { 
      
        setTimeOfDay("EVENING"); 
      
      });
      
      
      //--------------------------------------------------------
      // NIGHT
      // Start: 23:00 Uhr
      //--------------------------------------------------------
      schedule({
      
        hour: 23, minute: 0
      
      }, function () { 
      
        setTimeOfDay("NIGHT"); 
      
      });
      
      //--------------------------------------------------------
      // BED
      // Start: 23:00 Uhr
      //--------------------------------------------------------
      schedule({
      
        hour: 0, minute: 30
      
      }, function () { 
      
        setTimeOfDay("BED"); 
      
      });
      
      
      // *****************************************************************************
      
      // A S T O - T E I L 
      
      /* Objekt Astrotag 
      
       Astrotag liegt zwischen Sonnauf- und untergang, 
      
       Astronacht liegt zwischen Sonnenunter- und aufgang */
      
      const idAstrotag =  "javascript." + instance + "." + pfad + ".Astrotag";
      
      // Objekt für Uhrzeiten der Astrozeiten
      
      const astrotime = {
      
        "elements" : [
      
            // Astrotag beginnt
      
            {
      
                "fname" : "sunrise", // function name
      
                "de" : {
      
                    "name" : "Sonnenaufgang",
      
                    "nxt" : "nächster",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Sunrise",
      
                    "desc" : "top edge of the sun appears on the horizon"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            {
      
                "fname" : "sunriseEnd", // function name
      
                "de" : {
      
                    "name" : "Ende Sonnenaufgang",
      
                    "nxt" : "nächstes",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "End of sunrise",
      
                    "desc" : "bottom edge of the sun touches the horizon"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            {
      
                "fname" : "goldenHourEnd", // function name
      
                "de" : {
      
                    "name" : "Ende der goldenen Stunde am Morgen",
      
                    "nxt" : "nächstes",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "End of golden hour",
      
                    "desc" : "morning golden hour (soft light, best time for photography) ends"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            {
      
                "fname" : "solarNoon", // function name
      
                "de" : {
      
                    "name" : "Sonnenhöchststand",
      
                    "nxt" : "nächster",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Solar noon",
      
                    "desc" : "sun is in the highest position"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            {
      
                "fname" : "goldenHour", // function name
      
                "de" : {
      
                    "name" : "Goldene Stunde (am Abend)",
      
                    "nxt" : "nächste",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Golden hour",
      
                    "desc" : "evening golden hour starts"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            {
      
                "fname" : "sunsetStart", // function name
      
                "de" : {
      
                    "name" : "Beginn Sonnenuntergang",
      
                    "nxt" : "nächster",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Sunset starts",
      
                    "desc" : "bottom edge of the sun touches the horizon"
      
                },
      
                "astroday" : true //during astroday
      
            },
      
            // Astronacht beginnt
      
            {
      
                "fname" : "sunset", // function name
      
                "de" : {
      
                    "name" : "Sonnenuntergang",
      
                    "nxt" : "nächster",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Sunset",
      
                    "desc" : "sun disappears below the horizon, evening civil twilight starts"
      
                },
      
                "astroday" : false //during astronight
      
            },
      
            {
      
                "fname" : "dusk",
      
                "de" : {
      
                    "name" : "Abenddämmerung",
      
                    "nxt" : "nächste",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Dusk",
      
                    "desc" : "evening nautical twilight starts"
      
                },
      
                "astroday" : false //during astronight
      
            },
      
            {
      
                "fname" : "nauticalDusk",
      
                "de" : {
      
                    "name" : "nautische Abenddämmerung",
      
                    "nxt" : "nächste",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Nautical dusk",
      
                    "desc" : "evening astronomical twilight starts"
      
                },
      
                "astroday" : false //during astronight
      
            },
      
            {
      
                "fname" : "nadir",
      
                "de" : {
      
                    "name" : "Nadir",
      
                    "nxt" : "nächster",
      
                    "desc" : "Fußpunkt gegenüber dem Zenit"
      
                },
      
                "en" : {
      
                    "name" : "Nadir",
      
                    "desc" : "darkest moment of the night, sun is in the lowest position"
      
                },
      
                "astroday" : false //during astronight
      
            },
      
            {
      
                "fname" : "nauticalDawn",
      
                "de" : {
      
                    "name" : "nautische Morgendämmerung",
      
                    "nxt" : "nächste",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "Nautical dawn",
      
                    "desc" : "morning nautical twilight starts"
      
                },
      
                "astroday" : false //during astronight
      
            },
      
            {
      
                "fname" : "dawn",
      
                "de" : {
      
                    "name" : "Morgendämmerung",
      
                    "nxt" : "nächste",
      
                    "desc" : ""
      
                },
      
                "en" : {
      
                    "name" : "dawn",
      
                    "desc" : "morning nautical twilight ends, morning civil twilight starts"
      
                },
      
                "astroday" : false //during astronight
      
            }
      
       
      
        ]
      
      };
      
       
      
      function writeAstroTimes(i) {
      
        // führende Nummer zur Sortierung in Admin/Objekte
      
        var nr = (i+1 < 10) ? "0" + (i+1) : (i+1);
      
        // Erstelle Objekt, falls nicht bereits vorhanden
      
        var idAstroObject = "javascript." + instance + "." + pfad + ".Zeiten." + nr + " - " + astrotime.elements[i].fname;
      
        createState(idAstroObject, " ", fC, {
      
            name: astrotime.elements[i].de.nxt + " " + astrotime.elements[i].de.name + " Uhrzeit",
      
            desc: astrotime.elements[i].en.desc,
      
            type: "string"
      
        });
      
       
      
        setTimeout(function() { // kurz warten, damit Objekte ggf. erst angelgt werden können
      
            var astrotag = getState(idAstrotag).val,
      
                temp;
      
            var today = new Date();
      
            var tomorrow = new Date(today.setDate(today.getDate()+1));
      
            var next_event;
      
            if (astrotag) { 
      
                // Wenn Tag (Aufgang vorbei (erst wieder morgen, Untergang kommt noch heute)
      
                next_event = (astrotime.elements[i].astroday) ? tomorrow : today; // prüfen
      
            } else { 
      
                // nach Nacht (Untergang vorbei (erst wieder morgen, Aufgang kommt heute oder morgen)
      
                next_event = (astrotime.elements[i].astroday) ? today : tomorrow; // prüfen
      
            }
      
            var fname = astrotime.elements[i].fname;
      
            temp = getAstroDate(fname, next_event);
      
            setState(idAstroObject, checkSec(temp.toLocaleTimeString('de-DE', { hour12: false })) );
      
        }, 3 * 1000);
      
      }
      
       
      
      // Zeit mit oder ohne Sekunden anzeigen
      
      function checkSec (zeit) {
      
        if (!sec) {
      
            var newString_arr = zeit.split(":");
      
            var newString = newString_arr[0] + ":" + newString_arr[1];
      
            return (newString);
      
        } else return (zeit);
      
      }
      
       
      
      function getAstroday() {
      
        // Astrotag bestimmen (boolean)
      
        createState(idAstrotag, false, fC, {
      
            type: "boolean",
      
            name: "Astrologischer Tag",
      
            desc: "Liegt die aktuelle Zeit zwischen Sonnenauf- und untergang"
      
        }); 
      
        setState(idAstrotag, isAstroDay());
      
      }
      
       
      
      function iterateAstrotimes() {
      
        // Zeiten für jede Astrozeit schreiben
      
        for (var i = 0; i < astrotime.elements.length; i++) {
      
            writeAstroTimes(i);
      
        }
      
      }
      
       
      
      // Astrotag checken
      
      schedule("*/1 * * * *", function () { // jede Minute
      
        getAstroday();
      
        iterateAstrotimes();
      
      });
      
       
      
      iterateAstrotimes();
      
      getAstroday();
      
       
      
      

      Optimierungspotenziale

      Im Datenpunkt erscheint der aktuelle Tageszustand erst mit initialem Wechsel der Zeit (hier könnte man bei initialer Ausführung noch den aktuellen Zustand ermitteln!).

      Prizipiell sind die Astro-Funktionen nicht notwendig für das Skript (ich habe sie hier drin, damit ich selbst weiss welche Zeiten ich für Systemzustände setzen kann).

      Aktuell wird das Skript für die Astro-Funktion minütlich aufgerufen (ich hatte dies aus dem Skript von PIX übernommen). Dies ist gar nicht notwendig, es sollte denke ich ausreichen die Astro-Zeiten einmal am Tag neu zu ermitteln (mit Tageswechsel!).

      posted in Skripten / Logik
      T
      Tirador
    • [Vorlage] MDCSS v2: Protokollierte Nachrichten anzeigen

      Ich habe ein Skript "MessageHandler" erstellt zur Protokollierung von Nachrichten/Ereignissen.
      Zusätzlich gibt es ein MDCSS v2 Widget, dass die protokollierten Nachrichten anzeigt.
      Nachrichten können damit als kompakte Darstellung des globalen Systemzustands in VIS verwendet werden.

      Die Idee ist es, alle relevanten Informationen auf "einen Blick" zu erkennen. Wichtige und kritische Ereignisse werden daher in der Liste zentral oben platziert. Unwichtigere Informationen eher unten.

      Beispiel:

      2020-04-06 18_02_59-vis.png
      2020-04-06 17_31_14-vis.png

      Kernfunktionen:

      • Ermöglicht es Nachrichten aus Skripten auszulösen und zu entfernen. Dies kann über zwei Wege erfolgen:

        • Automatisches Erzeugen/Entfernen von Nachrichten über das Javascript MessageStateCreator. Es werden konfigurierte Datenpunkte überwacht und bei konfigurierten Bedingungen Nachrichten erzeugt oder auch entfernt. Die Textausgabe der Nachrichten kann auch konfiguriert werden und dynamisch erzeugt werden.
        • Javascript-Funktionen postMessage(..) oder removeMessage(..) für den Einsatz in eigenen Skripten.
      • Es können entweder alle Nachrichten eines Nachrichtentyps protokolliert werden oder immer nur die letzte eingetretende Nachricht.

      • Nachrichten werden nach Prioritäten visuell in VIS dargestellt. Es stehen zwei VIS-Ausgaben zur Verfügung:

        • einfache HTML-Tabelle (ohne Schnickschnack)
        • Material Design CSS 2.0 Card für Uhula.
      • Nachrichten können (optional) in VIS global quittiert werden.

      • Nachrichtendefintion: Nachrichten werden über eine Konfigurationsstruktur definiert und damit wesentliche Eigenschaften der Nachricht bestimmt, darunter:

        • Nachrichtenüberschrift
        • Nachrichtentext
        • Kritikalität (Information, Warnung, Alarm etc.) / Priorität
        • Icon für die VIS Ausgabe
        • Farbe des Icons

      Beispiele für Nachrichtenereignisse:

      • Alarmanlage ausgelöst!
      • Wasseralarm
      • Erinnerung Fenster lüften!
      • Erinnerung Fenster zu lange geöffnet!
      • Aktuell offene Fenster
      • Aktuell
      • Aktuell offene Türen
      • Lichter angeschaltet
      • Aktive Steckdosen
      • Post im Briefkasten mit Datum letzter Einwurf
      • Nächster Müllabfuhrtermin mit Information zur Tonne
      • Termine des Tages
      • Termine morgen

      Projekt auf Github:
      https://github.com/St0Ma/ioBroker-MessageHandler

      Support-Thread:
      https://forum.iobroker.net/topic/32207/script-messagehandler-nachrichten-protokollieren-vis

      posted in Visualisierung
      T
      Tirador
    • [Vorlage] Lovelace: ical Kalender Karte

      Dieses Skript (am Ende des Beitrags) ermöglicht aus dem ICAL-Adapter eine Kalenderanzeige in Lovelace:

      b039eec7-df6c-4b37-bed0-7341657d53eb-grafik.png

      Das Skript basiert auf der Vorlage von Uhula:
      MDCSS v2: ical Kalendar anzeigen

      Das Script überwacht den ical-Adapter und erzeugt bei Änderungen an dessen States

      • HTML-List States für die Anzeige als Kalender in Listform mit
      • Markdown Datenpunkt für die Anzeige der Kalender in Lovelace

      Das Skript bietet im einzelnen folgende Funktionen:

      • Tagesauflösung von "von/bis"-Terminen, inkl. Berücksichtigung der Uhrzeiten
      • Tagesdatum, Kalendarfarben aus ical oder optional aus dem Script
      • Termintext und -ort
      • optionalem Icon je Kalendar
      • optionalem "ignore", wenn ein Kalendar unberücksichtigt bleiben soll

      Installation

      Einfach als serverseitiges Script installieren und starten-5 Sek warten-stoppen-starten. Beim 1.Start werden
      die notwendigen States unter STATE_PATH = '0_userdata.0.lovelace.showIcal.' erzeugt. Erst beim 2.Start
      instanziiert das Script die Event-Handler und läuft dann.

      In Lovelace ist eine "Markdown-Karte" einzufügen mit folgendem Code:

      f41b1297-dfca-4594-953c-fcede17fb59c-grafik.png

      YAML-Code

      type: markdown
      content: '{0_userdata.0.lovelace.showIcal.log0.markdown}'
      title: Kalender
      
      

      Konfiguration

      Eigentlich ist keine notwendig.
      Optional in der Funktion MduiShowIcal|doInit() eine Anpassung der KONFIGURATION vornehmen
      Optional Anpassung der tmpList.

      States

      Es werden States für n-Logs erzeugt, jedem, Log kann ein Standardfilter mitgegeben werden. In jedem Log-Ordner
      befindet sich ein list-HTML State, welcher direkt in der vis angezeigt werden kann (jeweils im basic-string (unescaped) Widget).
      Über optionale Filter als string (Bsp:':Abfall:') oder als RegExp (Bsp:'/Feiertag|Geburtstag/') kann festgelegt werden,
      welche Einträge beim Aufbau der list-HTML States berücksichtigt werden.
      Bsp.:
      log0 Filter: "abfall" oder ":Abfall:" (=Kalendarname) -> Zeigt nur Abfalltermine
      log0 Filter: "ferien" oder ":Ferien:" (=Kalendarname) -> Zeigt nur Ferientermine

      Unter dem STATE_PATH (Standardpfad: 0_userdata.0.lovelace.showIcal) werden die folgenden States erzeugt:
      version : Script-Version, wird verwendet um Script-Updates zu erkennen
      updatePressed : auf true setzen, wenn ein table/list update außerhalb des Intervals erfolgen soll

      Weiterhin werden MAX_LOG_FOLDER Unterordner im STATE_PATH erzeugt (N=0-9):

      LogN.markdown : enthält die table-Markdown für die Nutzung in Lovelace
      LogN.table : enthält die table-HTML für ein basic-string (unescaped) Widget
      LogN.list : enthält die list-HTML für ein basic-string (unescaped) Widget
      LogN.count : Anzahl der Log-Zeilen (wenn das Log mit '/:error:|:warn:/' gefiltert ist, dann ist es die Anzahl der Fehler/Warnungen)
      LogN.filter : Filter, der auch die logCache angewendet wurde im .table/.list zu erzeugen (siehe Filter)
      LogN.lastUpdate : Timestamp des letzten Updates
      

      Skript

      LovelaceShowIcal.js

      posted in Visualisierung
      T
      Tirador
    • RE: Umfrage: Welchen Adapter soll ich als nächstes entwickeln?

      Hallo Mic, ich verwende dein aktuelles Bewegungsmelder Skript und habe gesehen, dass du nun einen Adapter in Planung hast.

      Generell sehe ich das Thema Lichtsteuerung sehr zentral und würde mir eine erweiterte Logik wünschen, die mehrere Anforderungen in einen Adapter für die zentrale Lichtsteuerung integriert. Die Steuerung des Lichts (zumindest bei mir) ist von mehreren Faktoren abhängig:

      • Benutzersteuerung (HUE Schalter, Licht an/aus an physischen Schaltern)

        • Merken des letzten Zustands eines Lichts auch bei physischem Ein/Ausschalten (Automatische Wiederherstellung)
      • Automatische Lichtsteuerung in Abhängigkeit:

        • der Tageszeit z.B. Sonnenaufgang, Sonnenuntergang
        • in Abhängigkeit von Bewegungsmeldern
        • Aufbau dynamischer Szenen (Farbwechsel, Alarmsteuerung d.h. Blinken von Lichtern)
        • Wechsel der Farbtemperatur in Abhängigkeit der Tageszeit (siehe Dynamisches Licht).
      • Nachrichtenereignisse, die alle anderen Lichtsteuerungen "übersteuern". Das Erzeugen / Verwalten und Visualisieren von Nachrichtenereignissen erfolgt über dieses MessageHandler-Skript Beispiele für die Lichtsteuerung nach Nachrichtenereignissen:

        • ein Ereignis ALARM (Feueralarm, Einbruchsalaram) sollte die Lampen im gesamten Haus anschalten (wenn es Nachts ist).
          Bestimmte Lampen sollen zudem auf rot gestellt werden.
        • ein Ereignis WARNUNG soll bestimmte Lampen gelb leuchten lassen.
        • ein Ereignis INFORMATION soll bestimmte Lampen blau leuchten lassen (z.B. das ein wichtiger Termin ansteht, oder dass Post eingewurfen wurde).
      • Ausnahmeregeln für die automatische Lichtsteuerung

        • bei Abwesenheit sollen keine Bewegungsmelder und Nachrichtenereignisse ausgelöst werden

      Lichtsteuerung ist damit ein komplexes Thema und Bedarf einer eigenen zentralen Steuerungslogik. Bisher habe ich leider noch kein Skript gesehen, was versucht hat alle Lichtsteuerungsregeln zu zentralisieren.

      Was hälst Du davon, die Punkte alle in einen Adapter einfließen zu lassen?
      DIe Punkte oben kann man schrittweise angehen.
      Was mir aktuell in meiner Lichtsteuerung fehlt ist eine Priorisierung der Automatiken untereinander.

      VG Tirador

      posted in ioBroker Allgemein
      T
      Tirador
    • RE: Umfassendes Alarmanlagen-Skript

      @andreaskos said in Umfassendes Alarmanlagen-Skript:

      @kilasat
      Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
      Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

      Noch genialer wäre es wenn die Aufzählungen durch das Skript generiert werden könnten. Ich habe keine Ahnung ob es dafür eine Funktion gibt.

      posted in Skripten / Logik
      T
      Tirador

    Latest posts made by Tirador

    • RE: deconz/Phoscon keine Stable-Updates mehr?

      Ich kam gestern in die "Verlegenheit" mal die Beta einzuspielen, weil ich einen Hue Switch nicht mit einer Lampe koppeln konnte. Das hat dann erfolgreich funktioniert. Allerdings hat es meine Hue Taps zerschossen. Beta ist hier wohl wirklich "beta". Ich würde auch nicht raten "produktiv" mit der Beta-Version zu experimentieren.

      posted in Hardware
      T
      Tirador
    • RE: [Vorlage] Lovelace: ical Kalender Karte

      Hallo Zusammen,

      ich habe das obere Skript nochmal aktualisiert. In der neuesten Lovelace Version gab es ein Problem mit dem Zeilenumbruch. Jetzt sieht die Struktur wieder wie eine Tabelle aus 😉

      posted in Visualisierung
      T
      Tirador
    • [Vorlage] Lovelace: Nachrichtenübersicht (MessageHandler)

      Dieses Skript (am Ende des Beitrags) ermöglicht es eine kompakte Übersicht aller "konfigurierten" Nachrichten in Lovelace auszugeben.

      Beispiel:
      e8ae7de5-192d-4050-896f-5ca5c3c8ff35-image.png

      Das Skript basiert auf dem MessageHandler:

      GitHub MessageHandler
      ioBroker Forum Messagehandler-Thread

      In Lovelace ist eine "Markdown-Karte" einzufügen mit folgendem Code:

      f9f063fb-0e78-4d76-89e2-2e2d75be520c-image.png

      YAML-Code

      type: markdown
      content: '{0_userdata.0.messageHandler.messages.markdown}'
      title: Nachrichten
      
      
      posted in Visualisierung
      T
      Tirador
    • RE: [Script] MessageHandler: Nachrichten protokollieren +VIS

      Hallo, ich habe die letzten Änderungen in eine neue Version (auf GitHub) überführt:

      Änderungen MessageHandler:

      • Fix Error "setForeignState: Error: The state property "ack" has the wrong type "number" (should be "boolean")"
      • Lovelace Datenpunkt "messages.markdown" hinzugefügt. Damit ist es möglich die "Übersicht aller Nachrichten" als Markdown in Lovelace anzuzeigen.

      Änderungen MessageStateCreator:

      • Ergänzung zur Formatierung von Zeitstempel Datenpunkten (Idee von BoehserWolf)

      Anmerkung zur Konfiguration der Lovelace-Ausgabe:

      Beispiel-Ausgabe:
      lovelace.png

      Konfiguration:

      4cff4b6f-dd81-4bff-ac89-41ff2ec4a3e1-image.png

      Beispiel: Markdown-Code der Karte in Lovelace

      type: markdown
      content: '{0_userdata.0.messageHandler.messages.markdown}'
      title: Nachrichten
      
      posted in JavaScript
      T
      Tirador
    • RE: [Vorlage] LightControl

      @Pittini ich wollte mich nun auch an die Lichtersteuerung wagen und habe Beispiele gesucht.

      Die Featureliste ist der Wahnsinn! Testinstallation folgt. 🙂

      posted in JavaScript
      T
      Tirador
    • RE: [Diskussion] Objektdefinition Licht

      Ich finde die Diskussion angestoßen durch @Jey-Cee super und eine Vereinheitlichung / Abstraktion der zahlreichen "States" für den Anwender "sehr" wünschenswert.

      Ich war vorher mit Openhab unterwegs. Dort hat man den "Komfort", dass man nur wenige Operationen auf "Geräten" ausführen kann. Lichter werden über einen "Color" Datentyp strukturiert und haben nur folgende Optionen:

      • An / Aus
      • Helligkeit über Dimmen in Prozent
      • Setzen Farbe / Sättigung

      46f98df7-b5aa-4822-b480-e4f0e31da209-image.png

      Das ganze wird in jedem Adapter "gemapped", d.h. der Benutzer muss sich nicht jeweils selbst, um die Konvertierung kümmern.

      Intern wird das ganze über ein "Objekt" gekappselt: Das HSBType-Objekt!

      HSBType
      HSB string values consist of three comma-separated values for hue (0-360°), saturation (0-100%), and brightness (0-100%) respectively, e.g. 240,100,100 for "maximum" blue.
      

      Beispiel zum Setzen der Farbe , Helligkeit und Sättigung durch den Anwender:

      new HSBType(new DecimalType(360), new PercentType(1), new PercentType(1))
      

      Im Hue-Adapter erfolgt dann das interne Mapping auf ct, hue, xy in diversen Klassen:

      7b625816-a972-4c6a-acdf-5927151d1558-image.png

      Code aus:
      https://github.com/openhab/openhab-addons/blob/main/bundles/org.openhab.binding.hue/src/main/java/org/openhab/binding/hue/internal/handler/LightStateConverter.java

      Man könnte ja die bestehenden Adapter mit ihren zahlreichen einzelnen Datenpunkten erhalten (auch aus Kompatibilität (und weil es immer wieder Sonderfälle geben mag) und anfangen eine "normalisierte" Welt daneben zu stellen in der es abstrakte Datentypen gibt.

      Kleine Anmerkung zu diesem "Lichtproblem" und einem noch generalisierterem Ansatz: Die Normalisierung der Datentypen gilt in Openhab für alle Arten von Zuständen (ich habe öfter auch schon mit 0/1, true, false und On/off gekämpft in IOBroker. In Openhab heisst das Switch und ist klar definiert!)

      posted in Entwicklung
      T
      Tirador
    • RE: Dynamisches Licht - Farbverlauf Tag/Nacht

      @FluffyIronBoots Danke für deine Lösung.

      Ich habe die beiden Skripte mal übernommen. Beim Ausführen gab es Fehler, dass die Datenpunkte "javascript.0.Dynamisches_Licht.Hilfswert_Brightness_log" und "javascript.0.Dynamisches_Licht.Hilfswert_Kelvin_log" noch fehlen. Ich habe dafür Angaben im Skript ergänzt, dass die Datenpunkte angelegt werden.

      Nun läuft das Skript (ohne Absturz). Es wurden aber direkt negative Kelvin-Werte ausgegeben:

      2c22e065-ae28-4018-9896-b73edfdd790d-image.png

      Hast Du ideen was falsch läuft? Hast Du noch Korrekturen an deiner Version ausgeführt?

      posted in Skripten / Logik
      T
      Tirador
    • RE: Test Adapter lovelace v1.2.x

      @David-G Im Markdown kann man mit Farben arbeiten.

      Das nutze ich auch im Markdown für den Kalender über ICAL

      [Vorlage] Lovelace: ical Kalender Karte - ioBroker Forum

      Das funktioniert über simple HTML-Tags im Markdown:

      <font color="#fffff">Text</font>
      
      posted in Tester
      T
      Tirador
    • RE: Sonos n. Zeitplan gruppieren Fav abspielen (Neuling)

      @Sam-Rubberduck Schau dir mal das Script von Mic an. Das hat so Optionen Favoriten abzuspielen und mit abspielen automatisch eine Gruppe (von Sonos) Geräten zu starten.

      https://github.com/Mic-M/iobroker-sonos-script

      posted in Skripten / Logik
      T
      Tirador
    • RE: Der "ultimative" ioBroker Lovelace Leitfaden/Dokumentation

      @All: Neue Version hochgeladen (siehe initiales Post).
      Ergänzung von call service (danke @KNXbroker )

      @Garfonso

      Das Markdown mit den Bildern befindet sich im Anhang:
      iob.zip

      posted in ioBroker Allgemein
      T
      Tirador
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo