FTUI3 Inhalte in JavaScript verwenden

Aus FHEMWiki
Version vom 17. Februar 2025, 15:40 Uhr von Pahenning (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „==Ziel== Ziel ist, eine beliebige JavaScript-Funktion, z.B. function1(param1) function2(param1, param2) zu rufen, wenn sich ein Datenwert in FTUI3 ändert. ==Vorbereitung== Dazu muss in den Seitenheader oder in einer externen Datei zusätzlich zu den Funktionsdefinitionen etwas JavaScript-Code aufgenommen werden: <script> const ftui_function1 = () => input => function1(input); const ftui_function2 = value => input => function2(input,value)…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Ziel

Ziel ist, eine beliebige JavaScript-Funktion, z.B.

 function1(param1)
 function2(param1, param2)

zu rufen, wenn sich ein Datenwert in FTUI3 ändert.

Vorbereitung

Dazu muss in den Seitenheader oder in einer externen Datei zusätzlich zu den Funktionsdefinitionen etwas JavaScript-Code aufgenommen werden:

<script>
  const ftui_function1  = ()    => input => function1(input);
  const ftui_function2  = value => input => function2(input,value);
  function function1(param1){
    ...
  }
  function function2(param1,param2){
    ...
  }
</script>

Dadurch werden die beidne zusätzlichen Funktionen ftui_function1, ftui_function2 zu Pipeline-Funktionen in FTUI3.

Verwendung in FTUI3-Elementen

In FTUI3-Elementen kann durch den Namen der Pipeline-Funktionen der JavaScript-Code ausgeführt werden. Beispielsweise wird durch

 <ftui-label [text]="DEVICE:READING | ftui_function1()"></ftui-label>

der Wert des Readings READING aus dem FHEM-Device DEVICE als Parameter an die JavaScript-Funktion function1 übergeben. Durch

 <ftui-label [text]="DEVICE:READING | ftui_function2(WERT)"></ftui-label>

wird der Wert des Readings READING aus dem FHEM-Device DEVICE als erster Parameter und zusätzlich der explizit angegebene Wert WERT als zweiter Parameter an die JavaScript-Funktion function übergeben.

Anwendungsbeispiel

Die Richtung eines mit SVG dargestellten Pfeils (ID ist pf_sp), sowie die Flussrichtung des zur Füllung dieses Pfeils verwendeten animierten Gradienten soll sich in Abhängigkeit des Vorzeichens eines FHEM-Readings ändern. Der zugehörige JavaScript-Code ist

<script>
  const ftui_sp_power     = () => input => sp_power(input);
  function sp_power(power) {
   var a = document.getElementById('pf_sp');
   var s, t;
   if (power > 0.01) {
       s = "url(#r_h_l)";
       t = "";
   } else {
       if (power < -0.01) {
           s = "url(#g_h_r)";
           t = "translate(135,0) scale(-1,1)";
       } else {
           s = "url(#b_t)";
           t = "";
       }
   }
   a.style.fill = s;
   a.setAttribute("transform", t);
   return power;
 }
</script>

Die notwendige Verschiebung bei der Richtungsumkehr (durch scale(-1,1), 135 Pixel horizontal) muss durch Versuch und Irrtum festgestellt werden.

Wichtig ist, dass diese Funktion einen Rückgabewert liefert, mit welchem das FTUI3-Element auch etwas anfangen kann. Im Beispiel wird der Parameter power einfach durchgereicht.

In der Funktion sind r_h_l, g_h_r und b_t die lokalen IDs der Füllgradienten, z.B.

       <svg xmlns="http://www.w3.org/2000/svg">
           <defs>
               <pattern id="g_h_r" patternUnits="userSpaceOnUse" width="15" height="15">
                   <line x1="0" y1="0" x2="0" y2="15" stroke="#0FD673" stroke-width="15"/>
                   <animatetransform attributeName="patternTransform" type="translate" by="15 0"
                       dur="1s" repeatCount="indefinite"/>
               </pattern>
               ...
           </defs>
       </svg>

Der Pfeil selbst wird ebenfalls mit SVG definiert,

           <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 405 150" width="400px"
               height="150px">
               <path id="pf_sp" transform="" style="fill:url(#b_s);stroke:#0000f8;stroke-width:1"
                   d="M 0,15 h 120 v -10 l 15 15 l -15 15 v -10 h -120 Z"/>
           </svg>

Die Umschaltung selbst wird in ein Label integriert, das den betreffenden Datenwert aus dem Reading auch gleich anzeigt:

           <ftui-label class="size-1" [text]="PowerFlow:power_battery | fix(2) | ftui_sp_power()" unit=" kW">
           </ftui-label>