<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SONOFF NSPanel mit Lovelace UI (TypeScript Version)]]></title><description><![CDATA[<h3>SONOFF NSPanel Touch Display Switch</h3>
<p dir="auto"><strong>mit Lovelace UI und TASMOTA Firmware</strong></p>
<p dir="auto"><img src="/assets/uploads/files/1675114772294-60848839-53b0-4e2b-a370-28e02960bfcd-image.png" alt="60848839-53b0-4e2b-a370-28e02960bfcd-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Das Thema <a href="https://forum.iobroker.net/topic/50888/sonoff-nspanel/1542">https://forum.iobroker.net/topic/50888/sonoff-nspanel/1542</a> wird hier jetzt fortgesetzt...</p>
<h2>An alle begeisterten NSPanel'er</h2>
<p dir="auto">Dieser Thread soll sich jetzt ausschließlich mit den Fragen und Themen rund um das SONOFF NSPanel mit Lovelace UI beschäftigen.</p>
<h3>Wie alles begann:</h3>
<ul>
<li>22.10.2021<br />
Blakadder's Dokumentation der Dekodierung des NSPanel-Kommunikationsprotokolls und Einrichtung der Steuerung des Nextion-Bildschirms mit benutzerdefinierter Firmware.<br />
<a href="https://blakadder.com/nspanel-hacking/" rel="nofollow ugc">https://blakadder.com/nspanel-hacking/</a></li>
<li>01.01.2022<br />
Erste Gehversuche mit Blockly-Scripts auf der Original-Firmware nach einer ersten coolen Anleitung für den ioBroker von <a class="plugin-mentions-user plugin-mentions-a" href="/user/haus-automatisierung" aria-label="Profile: haus-automatisierung">@<bdi>haus-automatisierung</bdi></a>.</li>
<li>...<br />
Funkstille auf allen Kanälen, da das Panel in der Originalsoftware einfach zu wenig Funktionalität hat. Ein Vergleich mit "Jugend forscht" wäre maßlos übertrieben...</li>
<li>15.01.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: jobr99">@<bdi>jobr99</bdi></a> Erstes POC von Lovelace Konzept mit ESPhome Komponente, da Nextion Upload Protcol unter tasmota nicht umsetzbar ist (berry tcpclient crashed ESP, HTTP Libary ist auf viel zu kleine Dateien limitiert)</li>
<li>17.01.2022<br />
peepshow-21 Erste implementierung von Nextion Upload Protocol 1.1 mit Workaround für HTTP Libary über Java Converter um tft files für tasmota vorzubereiten</li>
<li>20.01.2022<br />
s-hadinger fixt bug in berry tcpclient</li>
<li>31.01.2022<br />
Erste Version für HomeAssistant mit Nodered und Tasmota</li>
<li>08.02.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> Erste Implementierung von Nextion Upload Protokoll 1.2 in Berry basiertend auf HTTP Range Header Requests und lokalem Buffer (funktioniert nur mit -nspanel tasmota build uns PSRAM Support)</li>
<li>12.02.2022<br />
peepshow-21 Implementierung von Nextion Upload Protocol 1.2 mit vollständigem Download und "streaming" zum Nextion Screen während dem Download</li>
<li>05.03.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> Portierung von Node-Red Flow zu AppDaemon, da AppDaemon sich besser eignet zur Implementierung vom Backend</li>
<li>13.03.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> Erste Version von Lovelace Berry Driver basierend auf Upload Protocol Implementierung von peepshow-21, da diese etwas stabiler läuft mit zusätzlichem Error Handling</li>
<li>30.03.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> kommt mit der Info um die Ecke, dass es ein erstes Script v1.9.0 für den ioBroker von <a class="plugin-mentions-user plugin-mentions-a" href="/user/britzelpuf" aria-label="Profile: Britzelpuf">@<bdi>Britzelpuf</bdi></a> gibt. Zu diesem Zeitpunkt gab es bereits den Screensaver die Seitennavigation und die Möglichkeit eine Lampe, einen Dimmer eine Taste und eine Info, sowie die popUps für Licht (Brightness) und Shutter (Position) und einen Thermostaten zur Steuerung einzubinden.</li>
<li>10.04.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> Firmware got bigger and bigger with &gt;15 Minutes Flashing Time for the tft file<br />
Increased Flashing Speed of Berry Driver from 115200 to 921600 and added skipping to the End with HTTP Range Headers, resulted in faster display flashing</li>
<li>11.04.2022<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: Armilar">@<bdi>Armilar</bdi></a> macht seine ersten Änderungen auf github und hört seit dem nicht mehr auf, weitere Funktionen in das TSScript hinzuzufügen... ;-)<br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> entwickelt die HMI und neue Funktionen für Home Assistant schneller als der Wind  - und macht das Panel zur echten Bereicherung für jedes Smart Home <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /> <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f44f.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--clap" style="height:23px;width:auto;vertical-align:middle" title=":clap:" alt="👏" /></li>
</ul>
<h3>heute</h3>
<ul>
<li>Eine der besten Community's die ich jemals erlebt habe. Hilfsbereit und kompetent wird jeder mit Hilfestellungen und Problemlösungen in kürzester Zeit versorgt.</li>
</ul>
<p dir="auto">Es macht großen Spaß zusammen mit euch...</p>
<p dir="auto">VG<br />
Armilar</p>
<hr />
<h2>Beispiele:</h2>
<p dir="auto"><img src="/assets/uploads/files/1675119213649-09ae2c13-c606-4ef5-88dc-26fccd14dd85-image.png" alt="09ae2c13-c606-4ef5-88dc-26fccd14dd85-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119277762-cf500331-70d8-4150-ac59-aabff1a27f7f-image.png" alt="cf500331-70d8-4150-ac59-aabff1a27f7f-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119352890-a5dbb6f4-403b-4081-b2e9-a17cbc3af26c-image.png" alt="a5dbb6f4-403b-4081-b2e9-a17cbc3af26c-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119410740-b41e2fed-abaa-4993-ae6f-2344f4e3afc8-image.png" alt="b41e2fed-abaa-4993-ae6f-2344f4e3afc8-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119451138-048fc1af-d72e-45fe-9102-688d40b2df18-image.png" alt="048fc1af-d72e-45fe-9102-688d40b2df18-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675295660195-08edcab4-03b7-4c0f-923e-0f5b1c639cca-image.png" alt="08edcab4-03b7-4c0f-923e-0f5b1c639cca-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119651164-ad94cddf-a0d0-40a7-971c-16504e8949fd-image.png" alt="ad94cddf-a0d0-40a7-971c-16504e8949fd-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119702138-263b23cc-d003-4af6-98b6-ed994c244890-image.png" alt="263b23cc-d003-4af6-98b6-ed994c244890-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675119746477-07373515-a92e-4cc9-b717-716e4fd4413f-image.png" alt="07373515-a92e-4cc9-b717-716e4fd4413f-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1675458251390-7c4a1f2f-26d7-4aeb-987d-3e30a671378d-image.png" alt="7c4a1f2f-26d7-4aeb-987d-3e30a671378d-image.png" class=" img-fluid img-markdown" /></p>
<hr />
<h2>Features:</h2>
<ul>
<li>cardEntities für die Unterstützung diverser Steuerelemente (siehe Beispiele)</li>
<li>cardGrid (3x2-Raster) für die Unterstützung diverser Steuerelemente (siehe Beispiele)</li>
<li>cardGrid2 (4x2) für die Unterstützung diverser Steuerelemente (siehe Beispiele)</li>
<li>cardGrid3 (2x2) für die Unterstützung diverser Steuerelemente (siehe Beispiele)</li>
<li>cardPower zur Visualisierung der Energieverteilung</li>
<li>cardAlarm als Seite für Alarmanlagen</li>
<li>cardMedia - der Media-Player (Diverse Adapter)</li>
<li>cardThermo - Seite für Thermostat oder Klimaanlage</li>
<li>cardQR - Seite mit QRCode zur Anzeige von WLAN-Informationen</li>
<li>cardChart - Balkendiagramme</li>
<li>Detailseiten für Leuchtmittel (Helligkeit, Temperatur und Farbe)</li>
<li>Detailseite für  Jalousien/Rollos (Position und Tilt)</li>
<li>Detailseite für  Ventilatoren</li>
<li>Detailseite für Timer</li>
<li>Auswahl Detailseite für Werteliste</li>
<li>Bildschirmschonerseite mit Uhrzeit, Datum und Wetterinformationen oder/und Infos</li>
<li>Multilingual (unterstützt über 40 Sprachen)</li>
<li>Unbegrenzte Anzahl an Seiten und Unterseiten</li>
<li>Abfallkalender</li>
<li>Favoritenseiten</li>
<li>etc.<br />
<section class="spoiler-wrapper"><button class="spoiler-control btn btn-default">Spoiler</button><section style="display:none" class="spoiler-content"><br />
ich glaube da ist eine verbesserte "cardMedia" in der Entwicklung - sieht cool aus...<br />
<img src="/assets/uploads/files/1671219845609-72571469-4a78-4caf-ba0e-7a67865bb13c-image.png" alt="72571469-4a78-4caf-ba0e-7a67865bb13c-image.png" class=" img-fluid img-markdown" /><br />
</section></section></li>
</ul>
<hr />
<p dir="auto">NsPanel Lovelace UI ist eine Firmware für den Nextion-Bildschirm innerhalb des NSPanel.</p>
<p dir="auto">Die allgemeine Idee ist, dass das Nextion-Display einen Seitenzähler durchläuft und der ESP32 dem Display sagt, was zu tun ist. Alles ist dynamisch durch Alias-Erstellung konfigurierbar, es ist nicht erforderlich, Nextion Editor zu programmieren. Neben der Seiten-Definition sind im ioBroker keine Programmierkenntnisse erforderlich. Es ist im ioBroker ebenfalls kein Lovelace-Adapter erforderlich.</p>
<p dir="auto">Das Panel arbeitet mit Tasmota und MQTT. Um das Panel zu steuern und mit Inhalten von ioBroker zu aktualisieren, gibt es ein vordefiniertes TypeScript (TS) für den JavaScript-Adapter.</p>
<hr />
<h3>Aktuelle Wiki (Anleitung) für den ioBroker</h3>
<p dir="auto"><a href="https://github.com/joBr99/nspanel-lovelace-ui/wiki" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/wiki</a> by <a class="plugin-mentions-user plugin-mentions-a" href="/user/kuckuckmann" aria-label="Profile: Kuckuckmann">@<bdi>Kuckuckmann</bdi></a></p>
<h3>NsPanelTs.ts (TypeScript) für ioBroker v4.9.3.X</h3>
<p dir="auto">zur Steuerung des SONOFF NSPanel mit dem ioBroker by <a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: Armilar">@<bdi>Armilar</bdi></a> und <a class="plugin-mentions-user plugin-mentions-a" href="/user/tt-tom" aria-label="Profile: TT-Tom">@<bdi>TT-Tom</bdi></a><br />
<strong><a href="https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker</a></strong><br />
abgestimmt auf:</p>
<ul>
<li>TFT 58 / v4.9.3 ( by <a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a> / Armilar &gt; 4.4.0)</li>
<li>BerryDriver 9 ( by peepshow-21 (based on code by blakadder and s-hadinger))</li>
<li>Tasmota 15.1.0 ( by Theo Arends ) --&gt; <strong>T</strong>heo-<strong>A</strong>rends-<strong>S</strong>onoff-<strong>M</strong>QTT-<strong>OTA</strong></li>
</ul>
<h3>Projekt:</h3>
<p dir="auto">by <a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a></p>
<ul>
<li>main (Home Assistant - Version und Nextion HMI): <a href="https://github.com/joBr99/nspanel-lovelace-ui" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui</a> by <a class="plugin-mentions-user plugin-mentions-a" href="/user/jobr99" aria-label="Profile: joBr99">@<bdi>joBr99</bdi></a></li>
<li>ioBroker: <a href="https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/tree/main/ioBroker</a> by <a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: Armilar">@<bdi>Armilar</bdi></a> (HA - Adaption)</li>
</ul>
<h3>Icon-Mapper:</h3>
<ul>
<li>icon_mapping.ts:<br />
<a href="https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/icon_mapping.ts</a><br />
(TypeScript muss in global liegen)</li>
</ul>
<h3>Icons:</h3>
<p dir="auto">unter: <a href="https://docs.nspanel.pky.eu/icon-cheatsheet.html" rel="nofollow ugc">https://docs.nspanel.pky.eu/icon-cheatsheet.html</a></p>
<h3>Video-Tutorial:</h3>
<p dir="auto"><a href="https://www.youtube.com/watch?v=ZPLJk2ZLo_8" rel="nofollow ugc">https://www.youtube.com/watch?v=ZPLJk2ZLo_8</a> by <a class="plugin-mentions-user plugin-mentions-a" href="/user/haus-automatisierung" aria-label="Profile: haus-automatisierung">@<bdi>haus-automatisierung</bdi></a></p>
]]></description><link>https://forum.iobroker.net/topic/58170/sonoff-nspanel-mit-lovelace-ui-typescript-version</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 19:47:04 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/58170.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Sep 2022 20:10:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 21:28:38 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ticaki" aria-label="Profile: ticaki">@<bdi>ticaki</bdi></a><br />
<a class="plugin-mentions-user plugin-mentions-a" href="/user/icebear" aria-label="Profile: icebear">@<bdi>icebear</bdi></a></p>
<p dir="auto">Bitte die 5.1.1.10 von Github installieren. Das Fix für den JS-Adapter v10.0.0 ist schon seit heute Online...</p>
<p dir="auto"><a href="https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/NsPanelTs.ts</a></p>
<p dir="auto"><img src="/assets/uploads/files/1786050955881-399a9801-11aa-4aef-92e5-1435c155a9d1-image.jpeg" alt="399a9801-11aa-4aef-92e5-1435c155a9d1-image.jpeg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Wie immer den unteren Teil ab:</p>
<pre><code>// _________________________________ DE: Ab hier keine Konfiguration mehr _____________________________________
// _________________________________ EN:  No more configuration from here _____________________________________
</code></pre>
<p dir="auto">ersetzten. <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60a.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--blush" style="height:23px;width:auto;vertical-align:middle" title=":blush:" alt="😊" /></p>
<p dir="auto">Das TFT muss nicht aktualisiert werden.</p>
<p dir="auto">Dieses Skript ist auf die neuen Restriktionen des JS-Adapters (TypeScript 6) bereits vollständig abgestimmt. Und ja, es ist sehr viel restriktiver als die Vorversionen...</p>
<p dir="auto">Kurzer Tipp:<br />
Wenn ihr weitere TypeScript habt, dann solltet ihr in die oberste Zeile ein</p>
<pre><code>//@ts-nocheck
</code></pre>
<p dir="auto">schreiben. Dann funktionieren erstmal alle Skripte wieder wie gewohnt und man kann eines nach dem anderen überarbeiten und migrieren.  <img src="https://forum.iobroker.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f60f.png?v=ba16ebd4856" class="not-responsive emoji emoji-android emoji--smirk" style="height:23px;width:auto;vertical-align:middle" title=":smirk:" alt="😏" /></p>
]]></description><link>https://forum.iobroker.net/post/1350706</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350706</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Thu, 06 Aug 2026 21:28:38 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 20:38:37 GMT]]></title><description><![CDATA[<p dir="auto">Ich würde ja gerne auf den Adapter wechseln,  der hat aber noch ein Problem mit dem neuen Admin</p>
]]></description><link>https://forum.iobroker.net/post/1350705</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350705</guid><dc:creator><![CDATA[Gargano]]></dc:creator><pubDate>Thu, 06 Aug 2026 20:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 18:03:15 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/tt-tom" aria-label="Profile: TT-Tom">@<bdi>TT-Tom</bdi></a> <a href="/post/1350663">sagte</a>:</p>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/icebear" aria-label="Profile: icebear">@<bdi>icebear</bdi></a><br />
Die 10 Version scheint Typscript noch weiter zu implementieren. Heißt die Typenprüfung wird immer schärfer. Das Script muss dahingehend angepasst werden.</p>
</blockquote>
<p dir="auto">im code sind gefühlt ne millionen impilzierte any - das wir spassig :D</p>
]]></description><link>https://forum.iobroker.net/post/1350691</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350691</guid><dc:creator><![CDATA[ticaki]]></dc:creator><pubDate>Thu, 06 Aug 2026 18:03:15 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 15:24:29 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/tt-tom" aria-label="Profile: TT-Tom">@<bdi>TT-Tom</bdi></a> <a href="/post/1350663">sagte</a>:</p>
<p dir="auto">Also bitte Geduld, ist ja auch noch Beta Stadium.</p>
</blockquote>
<p dir="auto">Ist ja kein Problem, wie du schon gesagt hast ist der JavaScript-Adapter ja noch ganz frisch.</p>
<p dir="auto">Die Frage die ich mir dabei gestellt habe, ob das dann in solchen Fällen auch den NSPanel-Adapter betrifft und ob es nicht langsam Zeit wird auf den Adapter umzusteigen, wenn die Probleme damit nicht auftreten?</p>
]]></description><link>https://forum.iobroker.net/post/1350664</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350664</guid><dc:creator><![CDATA[icebear]]></dc:creator><pubDate>Thu, 06 Aug 2026 15:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 15:12:25 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/icebear" aria-label="Profile: icebear">@<bdi>icebear</bdi></a><br />
Die 10 Version scheint Typscript noch weiter zu implementieren. Heißt die Typenprüfung wird immer schärfer. Das Script muss dahingehend angepasst werden.</p>
<p dir="auto">Wir melden uns, wenn es eine angepasste Version gibt.</p>
<p dir="auto">Das große Ding an der ganze Sache ist die Umstellung des Admin auf Version 8.x, das bedeutet neue Testumgebungen erstellen und zum Teil dann zweigleisig fahren.</p>
<p dir="auto">Also bitte Geduld, ist ja auch noch Beta Stadium.</p>
]]></description><link>https://forum.iobroker.net/post/1350663</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350663</guid><dc:creator><![CDATA[TT-Tom]]></dc:creator><pubDate>Thu, 06 Aug 2026 15:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Thu, 06 Aug 2026 14:21:47 GMT]]></title><description><![CDATA[<p dir="auto">Ich hab heute den Javascript-Adapter von v9.3.1 auf v10.0.0 geupdatet, danach liefen die Scripte für die NSPanel nicht mehr.<br />
Bin mit den NSPanel auf den aktuellen Versionen. Mit dem Javascript-Adapter kommen beim Start des Script die Fehlermeldungen:</p>
<pre><code>Compiling TypeScript source
javascript.0	14:58:53.843	error	
TypeScript compilation failed:
                .then(async function (response) {
                                      ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                .catch(function (error) {
                                 ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

function addDimTime(strTime) {
                    ^
ERROR: Parameter 'strTime' implicitly has an 'any' type.

function isDimTimeInRange(strLower, strUpper) {
                          ^
ERROR: Parameter 'strLower' implicitly has an 'any' type.

function isDimTimeInRange(strLower, strUpper) {
                                    ^
ERROR: Parameter 'strUpper' implicitly has an 'any' type.

        .concat(NSPanel_Path + 'NSPanel_Dimmode_brightnessDay')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'NSPanel_Dimmode_brightnessNight')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'ScreensaverInfo.activeBrightness')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'ScreensaverInfo.activeDimmodeBrightness')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'Relay.1')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'Relay.2')
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

        .concat(NSPanel_Path + 'ActivePage.id0'),
                ^
ERROR: No overload matches this call.
  Overload 1 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.
  Overload 2 of 2, '(...items: ConcatArray&lt;never&gt;[]): never[]', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'ConcatArray&lt;never&gt;'.

                    .then(async function (response) {
                                          ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                    .catch(function (error) {
                                     ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            on({ id: config.mrIcon1ScreensaverEntity.ScreensaverEntity, change: 'ne' }, async function () {
            ^
ERROR: No overload matches this call.
  Overload 1 of 4, '(pattern: string | RegExp | string[], handler: StateChangeHandler&lt;any, any&gt;): any', gave the following error.
    Object literal may only specify known properties, and 'id' does not exist in type 'RegExp | string[]'.
  Overload 2 of 4, '(astroOrScheduleOrOptions: AstroSchedule | SubscribeTime | SubscribeOptions, handler: StateChangeHandler&lt;any, any&gt;): any', gave the following error.
    Type 'string | null' is not assignable to type 'string | RegExp | string[] | SubscribeOptions[] | RegExp[] | undefined'.
      Type 'null' is not assignable to type 'string | RegExp | string[] | SubscribeOptions[] | RegExp[] | undefined'.
  Overload 3 of 4, '(id1: string, id2: string): void', gave the following error.
    Argument of type '{ id: string | null; change: string; }' is not assignable to parameter of type 'string'.

            on({ id: config.mrIcon2ScreensaverEntity.ScreensaverEntity, change: 'ne' }, async function () {
            ^
ERROR: No overload matches this call.
  Overload 1 of 4, '(pattern: string | RegExp | string[], handler: StateChangeHandler&lt;any, any&gt;): any', gave the following error.
    Object literal may only specify known properties, and 'id' does not exist in type 'RegExp | string[]'.
  Overload 2 of 4, '(astroOrScheduleOrOptions: AstroSchedule | SubscribeTime | SubscribeOptions, handler: StateChangeHandler&lt;any, any&gt;): any', gave the following error.
    Type 'string | null' is not assignable to type 'string | RegExp | string[] | SubscribeOptions[] | RegExp[] | undefined'.
      Type 'null' is not assignable to type 'string | RegExp | string[] | SubscribeOptions[] | RegExp[] | undefined'.
  Overload 3 of 4, '(id1: string, id2: string): void', gave the following error.
    Argument of type '{ id: string | null; change: string; }' is not assignable to parameter of type 'string'.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

        .then(async function (response) {
                              ^
ERROR: Parameter 'response' implicitly has an 'any' type.

        .catch(function (error) {
                         ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            .then(async function (response) {
                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

            .catch(function (error) {
                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                            .then(async function (response) {
                                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                            .catch(function (error) {
                                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                    .then(async function (response) {
                                          ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                    .catch(function (error) {
                                     ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                    .then(async function (response) {
                                          ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                    .catch(function (error) {
                                     ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                            tempId = activePage!.items[tempPageItem[0]].id;
                                                       ^
ERROR: Element implicitly has an 'any' type because index expression is not of type 'number'.

        let buttonConfig: NSPanel.ConfigButtonFunction = config[method];
                                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'EventMethod' can't be used to index type 'Config'.
  Property 'startup' does not exist on type 'Config'.

function GeneratePageElements(page: PageType): string {
                                               ^
ERROR: Function lacks ending return statement and return type does not include 'undefined'.

            let name = page.heading !== undefined ? page.heading : o.common.name &amp;&amp; typeof o.common.name === 'object' ? o.common.name.de : o.common.name;
                                                                   ^
ERROR: 'o.common' is possibly 'undefined'.

            let name = page.heading !== undefined ? page.heading : o.common.name &amp;&amp; typeof o.common.name === 'object' ? o.common.name.de : o.common.name;
                                                                                           ^
ERROR: 'o.common' is possibly 'undefined'.

            let name = page.heading !== undefined ? page.heading : o.common.name &amp;&amp; typeof o.common.name === 'object' ? o.common.name.de : o.common.name;
                                                                                                                        ^
ERROR: 'o.common' is possibly 'undefined'.

            let name = page.heading !== undefined ? page.heading : o.common.name &amp;&amp; typeof o.common.name === 'object' ? o.common.name.de : o.common.name;
                                                                                                                                           ^
ERROR: 'o.common' is possibly 'undefined'.

            let modeStatus = obj.common['states'][getState(page.thermoItems[3].id).val] ?? '';
                             ^
ERROR: 'obj.common' is possibly 'undefined'.

            let modeStatus = obj.common['states'][getState(page.thermoItems[3].id).val] ?? '';
                             ^
ERROR: Element implicitly has an 'any' type because expression of type '"states"' can't be used to index type 'InstanceCommon | AdapterCommon | (InstanceCommon &amp; Record&lt;string, any&gt;) | (AdapterCommon &amp; Record&lt;string, any&gt;) | ... 24 more ... | SystemConfigCommon'.
  Property 'states' does not exist on type 'InstanceCommon | AdapterCommon | (InstanceCommon &amp; Record&lt;string, any&gt;) | (AdapterCommon &amp; Record&lt;string, any&gt;) | ... 24 more ... | SystemConfigCommon'.

                page.items[0].speakerList[0] = v1Adapter[0] + '.' + v1Adapter[1];
                ^
ERROR: Object is possibly 'undefined'.

                            .then(async function (response) {
                                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                            .catch(function (error) {
                                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                        .then(async function (response) {
                                              ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                        .catch(function (error) {
                                         ^
ERROR: Parameter 'error' implicitly has an 'any' type.

            heading = page.heading !== undefined ? page.heading : typeof o.common.name === 'object' ? o.common.name.de : o.common.name;
            ^
ERROR: Type 'string | undefined' is not assignable to type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                const color = obj[obji].iconColor !== '' ? obj[obji].iconColor : 0;
                              ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

                const color = obj[obji].iconColor !== '' ? obj[obji].iconColor : 0;
                                                           ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

                array_icon[obji] = obj[obji].icon;
                                   ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

                array_powerspeed[obji] = obj[obji].speed;
                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

                array_powerstate[obji] = obj[obji].value + ' ' + obj[obji].unit;
                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

                array_powerstate[obji] = obj[obji].value + ' ' + obj[obji].unit;
                                                                 ^
ERROR: Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{}'.
  No index signature with a parameter of type 'number' was found on type '{}'.

            array_icon[0] = obj[0].icon;
                            ^
ERROR: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  Property '0' does not exist on type '{}'.

            array_powerstate[0] = obj[0].value + ' ' + obj[0].unit;
                                  ^
ERROR: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  Property '0' does not exist on type '{}'.

            array_powerstate[0] = obj[0].value + ' ' + obj[0].unit;
                                                       ^
ERROR: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  Property '0' does not exist on type '{}'.

            array_icon_color[0] = arrayColorScale[obj[0].iconColor];
                                                  ^
ERROR: Element implicitly has an 'any' type because expression of type '0' can't be used to index type '{}'.
  Property '0' does not exist on type '{}'.

                        log('HandleButtonEvent -&gt; OnOff: ' + words[4] + ' - ' + id + ' - Role - ' + o.common.role, 'info');
                                                                                                    ^
ERROR: 'o.common' is possibly 'undefined'.

                    const role = o.common.role as NSPanel.roles;
                                 ^
ERROR: 'o.common' is possibly 'undefined'.

                        log(o.common.role);
                            ^
ERROR: 'o.common' is possibly 'undefined'.

                    switch (o.common.role as NSPanel.roles) {
                            ^
ERROR: 'o.common' is possibly 'undefined'.

                                                .then(async function (response) {
                                                                      ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                                                .catch(function (error) {
                                                                 ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'toggle') {
                    ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'toggle') {
                    ^
ERROR: Object is possibly 'undefined'.

                if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'toggle') {
                                                                                      ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'toggle') {
                                                                                      ^
ERROR: Object is possibly 'undefined'.

                    toggleState(pageItemShutterButton1.shutterIcons[0].id);
                                ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                    toggleState(pageItemShutterButton1.shutterIcons[0].id);
                                ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'press') {
                         ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'press') {
                         ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'press') {
                                                                                           ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton1.shutterIcons[0].buttonType != undefined &amp;&amp; pageItemShutterButton1.shutterIcons[0].buttonType == 'press') {
                                                                                           ^
ERROR: Object is possibly 'undefined'.

                    setIfExists(pageItemShutterButton1.shutterIcons[0].id, true);
                                ^
ERROR: 'pageItemShutterButton1.shutterIcons' is possibly 'null' or 'undefined'.

                    setIfExists(pageItemShutterButton1.shutterIcons[0].id, true);
                                ^
ERROR: Object is possibly 'undefined'.

                if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'toggle') {
                    ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'toggle') {
                    ^
ERROR: Object is possibly 'undefined'.

                if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'toggle') {
                                                                                      ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'toggle') {
                                                                                      ^
ERROR: Object is possibly 'undefined'.

                    toggleState(pageItemShutterButton2.shutterIcons[1].id);
                                ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                    toggleState(pageItemShutterButton2.shutterIcons[1].id);
                                ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'press') {
                         ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'press') {
                         ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'press') {
                                                                                           ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton2.shutterIcons[1].buttonType != undefined &amp;&amp; pageItemShutterButton2.shutterIcons[1].buttonType == 'press') {
                                                                                           ^
ERROR: Object is possibly 'undefined'.

                    setIfExists(pageItemShutterButton2.shutterIcons[1].id, true);
                                ^
ERROR: 'pageItemShutterButton2.shutterIcons' is possibly 'null' or 'undefined'.

                    setIfExists(pageItemShutterButton2.shutterIcons[1].id, true);
                                ^
ERROR: Object is possibly 'undefined'.

                if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'toggle') {
                    ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'toggle') {
                    ^
ERROR: Object is possibly 'undefined'.

                if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'toggle') {
                                                                                      ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'toggle') {
                                                                                      ^
ERROR: Object is possibly 'undefined'.

                    toggleState(pageItemShutterButton3.shutterIcons[2].id);
                                ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                    toggleState(pageItemShutterButton3.shutterIcons[2].id);
                                ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'press') {
                         ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'press') {
                         ^
ERROR: Object is possibly 'undefined'.

                else if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'press') {
                                                                                           ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                else if (pageItemShutterButton3.shutterIcons[2].buttonType != undefined &amp;&amp; pageItemShutterButton3.shutterIcons[2].buttonType == 'press') {
                                                                                           ^
ERROR: Object is possibly 'undefined'.

                    setIfExists(pageItemShutterButton3.shutterIcons[2].id, true);
                                ^
ERROR: 'pageItemShutterButton3.shutterIcons' is possibly 'null' or 'undefined'.

                    setIfExists(pageItemShutterButton3.shutterIcons[2].id, true);
                                ^
ERROR: Object is possibly 'undefined'.

                        const role = o.common.role as NSPanel.roles;
                                     ^
ERROR: 'o.common' is possibly 'undefined'.

                switch (o.common.role as NSPanel.roles) {
                        ^
ERROR: 'o.common' is possibly 'undefined'.

                            .then(async function (response) {
                                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                            .catch(function (error) {
                                             ^
ERROR: Parameter 'error' implicitly has an 'any' type.

                            .then(async function (response) {
                                                  ^
ERROR: Parameter 'response' implicitly has an 'any' type.

                switch (nobj.common.role as NSPanel.roles) {
                        ^
ERROR: 'nobj.common' is possibly 'undefined'.

                        let tSlider1: string = pageItem.equalizerSlider[0].Slider1.heading ?? "Bass";
                                               ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS1M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider1.icon1 ?? "minus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS1P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider1.icon2 ?? "plus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider1MinVal: number = pageItem.equalizerSlider[0].Slider1.minValue ?? 0;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider1MaxVal: number = pageItem.equalizerSlider[0].Slider1.maxValue ?? 12;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider1ZeroVal: number = pageItem.equalizerSlider[0].Slider1.zeroValue ?? 6;
                                                      ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider1Step: number = pageItem.equalizerSlider[0].Slider1.stepValue ?? 1;
                                                   ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tSlider2: string = pageItem.equalizerSlider[0].Slider2.heading ?? "MidRange";
                                               ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS2M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider2.icon1 ?? "minus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS2P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider2.icon2 ?? "plus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider2MinVal: number = pageItem.equalizerSlider[0].Slider2.minValue ?? 0;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider2MaxVal: number = pageItem.equalizerSlider[0].Slider2.maxValue ?? 12;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider2ZeroVal: number = pageItem.equalizerSlider[0].Slider2.zeroValue ?? 6;
                                                      ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider2Step: number = pageItem.equalizerSlider[0].Slider2.stepValue ?? 1;
                                                   ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tSlider3: string = pageItem.equalizerSlider[0].Slider3.heading ?? "Treble";
                                               ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS3M: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider3.icon1 ?? "minus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let tIconS3P: string = Icons.GetIcon(pageItem.equalizerSlider[0].Slider3.icon2 ?? "plus-box");
                                                             ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider3MinVal: number = pageItem.equalizerSlider[0].Slider3.minValue ?? 0;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider3MaxVal: number = pageItem.equalizerSlider[0].Slider3.maxValue ?? 12;
                                                     ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider3ZeroVal: number = pageItem.equalizerSlider[0].Slider3.zeroValue ?? 6;
                                                      ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                        let hSlider3Step: number = pageItem.equalizerSlider[0].Slider3.stepValue ?? 1;
                                                   ^
ERROR: 'pageItem.equalizerSlider' is possibly 'undefined'.

                            bEntity1Color = rgb_dec565(pageItem.shutterIcons[0].iconOnColor) ?? bEntity1Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            bEntity1Icon = Icons.GetIcon(pageItem.shutterIcons[0].icon2) ?? bEntity1Icon;
                                                         ^
ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                            bEntity1Color = rgb_dec565(pageItem.shutterIcons[0].iconOffColor) ?? bEntity1Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            bEntity2Color = rgb_dec565(pageItem.shutterIcons[1].iconOnColor) ?? bEntity2Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            bEntity2Icon = Icons.GetIcon(pageItem.shutterIcons[1].icon2) ?? bEntity2Icon;
                                                         ^
ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                            bEntity2Color = rgb_dec565(pageItem.shutterIcons[1].iconOffColor) ?? bEntity2Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            bEntity3Color = rgb_dec565(pageItem.shutterIcons[2].iconOnColor) ?? bEntity3Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            bEntity3Icon = Icons.GetIcon(pageItem.shutterIcons[2].icon2) ?? bEntity3Icon;
                                                         ^
ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                            bEntity3Color = rgb_dec565(pageItem.shutterIcons[2].iconOffColor) ?? bEntity3Color;
                                                       ^
ERROR: Argument of type 'RGB | undefined' is not assignable to parameter of type 'RGB'.
  Type 'undefined' is not assignable to type 'RGB'.

                            icon = Icons.GetIcon(leftScreensaverEntity.ScreensaverEntityIconOn);
                                                 ^
ERROR: Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                                ? GetOpenWeatherMapIconColor(String(getState('openweathermap.' + weatherAdapterInstanceNumber + '.forecast.day' + String(i - 1) + '.icon').val).split('/').pop().split('.').shift())
                                                             ^
ERROR: Object is possibly 'undefined'.

                                ? GetOpenWeatherMapIconColor(String(getState('openweathermap.' + weatherAdapterInstanceNumber + '.forecast.day' + String(i - 1) + '.icon').val).split('/').pop().split('.').shift())
                                                             ^
ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                            Icons.GetIcon(config.bottomScreensaverEntity[4].ScreensaverEntityIconOn) +
                                          ^
ERROR: Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                        icon = Icons.GetIcon(entity.ScreensaverEntityIconOn);
                                             ^
ERROR: Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

                        icon = Icons.GetIcon(indicatorScreensaverEntity.ScreensaverEntityIconOn);
                                             ^
ERROR: Argument of type 'string | null | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

            if (iconData[a].ScreensaverEntityValue !== null) {
                ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                switch (typeof iconData[a].ScreensaverEntityValue) {
                               ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        if (iconData[a].ScreensaverEntityValue === '' || isNaN(iconData[a].ScreensaverEntityValue))
                            ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        if (iconData[a].ScreensaverEntityValue === '' || isNaN(iconData[a].ScreensaverEntityValue))
                                                                               ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        iconData[a].ScreensaverEntityValue = Number(iconData[a].ScreensaverEntityValue).toFixed(iconData[a].ScreensaverEntityValueDecimalPlace);
                        ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        iconData[a].ScreensaverEntityValue = Number(iconData[a].ScreensaverEntityValue).toFixed(iconData[a].ScreensaverEntityValueDecimalPlace);
                                                                    ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        iconData[a].ScreensaverEntityValue = Number(iconData[a].ScreensaverEntityValue).toFixed(iconData[a].ScreensaverEntityValueDecimalPlace);
                                                                                                                ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        iconData[a].ScreensaverEntityValue = null;
                        ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

            let hwBtn1Col: RGB = iconData[a].ScreensaverEntityOffColor;
                                 ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

            if (iconData[a].ScreensaverEntity != null || iconData[a].ScreensaverEntityValue != null) {
                ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

            if (iconData[a].ScreensaverEntity != null || iconData[a].ScreensaverEntityValue != null) {
                                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                if (iconData[a].ScreensaverEntity != null) {
                    ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    if (typeof iconData[a].ScreensaverEntity == 'string') {
                               ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        switch (String(iconData[a].ScreensaverEntity).toUpperCase()) {
                                       ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                                hwBtn1Col = iconData[a].ScreensaverEntityOnColor;
                                            ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                            log('Value: ' + iconData[a].ScreensaverEntity + ' Color: ' + JSON.stringify(hwBtn1Col), 'info');
                                            ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        if (!!iconData[a].ScreensaverEntity) {
                              ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                            hwBtn1Col = iconData[a].ScreensaverEntityOnColor;
                                        ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                if (iconData[a].ScreensaverEntityIconSelect &amp;&amp; iconData[a].ScreensaverEntity != null) {
                    ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                if (iconData[a].ScreensaverEntityIconSelect &amp;&amp; iconData[a].ScreensaverEntity != null) {
                                                               ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    const icon = iconData[a].ScreensaverEntityIconSelect[iconData[a].ScreensaverEntity];
                                 ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    const icon = iconData[a].ScreensaverEntityIconSelect[iconData[a].ScreensaverEntity];
                                                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                else if (iconData[a].ScreensaverEntity) {
                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    payloadString += iconData[a].ScreensaverEntityIconOn;
                                     ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    if (iconData[a].ScreensaverEntityIconOff) {
                        ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        payloadString += iconData[a].ScreensaverEntityIconOff;
                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                        payloadString += iconData[a].ScreensaverEntityIconOn;
                                         ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                if (iconData[a].ScreensaverEntityValue != null) {
                    ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    payloadString += iconData[a].ScreensaverEntityValue;
                                     ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    payloadString += iconData[a].ScreensaverEntityValueUnit == null ? '' : iconData[a].ScreensaverEntityValueUnit;
                                     ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

                    payloadString += iconData[a].ScreensaverEntityValueUnit == null ? '' : iconData[a].ScreensaverEntityValueUnit;
                                                                                           ^
ERROR: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.
  No index signature with a parameter of type 'string' was found on type 'Record&lt;"mrIcon1" | "mrIcon2", ScreenSaverMRDataElement&gt;'.

function rad2deg(rad): number {
                 ^
ERROR: Parameter 'rad' implicitly has an 'any' type.

function ColorToHex(color): string {
                    ^
ERROR: Parameter 'color' implicitly has an 'any' type.

            Icons.GetIcon(iconKey) ||
                          ^
ERROR: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.

} | undefined | number, ref: number, repeatTime: number, callback, init: boolean = false) {
                                                         ^
ERROR: Parameter 'callback' implicitly has an 'any' type.
</code></pre>
<p dir="auto">Bin dann wieder zurück auf die v9.3.1 vom Javascript-Adapter, da läuft es dann wieder.</p>
]]></description><link>https://forum.iobroker.net/post/1350653</link><guid isPermaLink="true">https://forum.iobroker.net/post/1350653</guid><dc:creator><![CDATA[icebear]]></dc:creator><pubDate>Thu, 06 Aug 2026 14:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Tue, 07 Jul 2026 13:29:12 GMT]]></title><description><![CDATA[<p dir="auto">Nach etwas rumprobieren: CardChart verkraftet keine Werte &gt; 211 und die Ticks müssen ebenfalls mit Faktor 10 skaliert angegeben werden. Gleichzeitig rundet es dummerweise nur auf eine Nachkommastelle, sodass ich bei Strompreisen weder Cent (27 Ct -&gt; 270 -&gt; Anzeigefehler) noch Euro (wird auf volle 10 Cent gerundet --&gt; zu ungenau) angeben kann. Man könnte es ja skalieren, aber dann stimmen die Werte natürlich hinten und vorne nicht mehr.</p>
]]></description><link>https://forum.iobroker.net/post/1347374</link><guid isPermaLink="true">https://forum.iobroker.net/post/1347374</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Tue, 07 Jul 2026 13:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 26 Jun 2026 15:25:23 GMT]]></title><description><![CDATA[<p dir="auto">Ich brauch nochmal eure Hilfe. Ich versuche, die stundenaktuellen Strompreise per ChardCard anzuzeigen. Ich hab aber ein Problem mit der Skalierung. Die Preise hab ich im Original in Euro, ich hätte aber gerne Cent. Deswegen multipliziere ich sie mit Faktor 1000 (100 * 10 für den Panel-Skalierungsfaktor). Dann sieht das so aus:</p>
<p dir="auto"><img src="/assets/uploads/files/1782486813712-20260626_171130_resized-resized.jpg" alt="20260626_171130_resized.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Der Wert oben ist richtig und die Balken sind falsch.</p>
<pre><code>javascript.0	17:11:11.351	info	
ChartPayload: entityUpd~Strompreis~button~bPrev~~65535~~~button~bNext~~65535~~~65504~Preis [Ct]~0:50:100~335^00h~317~303~301^03h~300~313~332^06h~341~317~294^09h~286~259~226^12h~204~221~262^15h~295~311~405^18h~596~636~635^21h~460~363
</code></pre>
<pre><code>let Strompreis: PageType = {
    "type": "cardChart",
    "heading": "Strompreis",
    "subPage": false,
    "parent": undefined,
    'items': [{ 
                id: 'alias.0.NSPanel.Strompreis',
                yAxis: 'Preis [Ct]',
                yAxisTicks: [0, 50, 100],
                onColor: Yellow
             }]
};
</code></pre>
<p dir="auto">Skaliere ich nur mit 100 oder weniger, ist der Wert oben natürlich falsch und die Balken richtig:</p>
<p dir="auto"><img src="/assets/uploads/files/1782487031030-20260626_171558_resized-resized.jpg" alt="20260626_171558_resized.jpg" class=" img-fluid img-markdown" /></p>
<pre><code>javascript.0	17:17:19.055	info	
ChartPayload: entityUpd~Strompreis~button~bPrev~~65535~~~button~bNext~~65535~~~65504~Preis [Ct]~0:500:1000~33^00h~32~30~30^03h~30~31~33^06h~34~32~29^09h~29~26~23^12h~20~22~26^15h~30~31~41^18h~60~64~63^21h~46~36
</code></pre>
<p dir="auto">Wie mache ich das mit den Ticks (sollte es da nicht ein Auto-Skalieren geben?) und der Skalierung richtig?</p>
<p dir="auto">Mit den yAxisTicks stehe ich auch auf Kriegsfuß. Lasse ich die leer wie beschrieben, erscheint "no data" im Display.</p>
]]></description><link>https://forum.iobroker.net/post/1346141</link><guid isPermaLink="true">https://forum.iobroker.net/post/1346141</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Fri, 26 Jun 2026 15:25:23 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Wed, 24 Jun 2026 10:14:51 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/australien" aria-label="Profile: australien">@<bdi>australien</bdi></a> <a href="/post/1345612">sagte</a>:</p>
<p dir="auto">Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.</p>
</blockquote>
<p dir="auto">Das Skript prüft mit dem Start korrekt und sendet die auch, dass es keine Portüberschneidungen gibt (unterer Log-Auszug)</p>
<p dir="auto">Da der Fehler aber mit <code>Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet</code>. ausgegeben wird, gehe ich mal von einer fehlerhaften Seiten-Konfiguration aus, da diese Meldung im Seitenaufbau der  <code>function GeneratePage</code>  eigentlich ein abgefangener Error: <code>Cannot read properties of undefined (reading 'type')</code> ist und als nur Warnung ausgegeben wird.</p>
<p dir="auto">Die Fehlermeldung <code>Cannot read properties of undefined (reading 'type')</code> ist ein JavaScript-Fehler. Er bedeutet, dass der Code versucht, auf die Eigenschaft .type eines Objekts zuzugreifen, dieses Objekt zu diesem Zeitpunkt aber überhaupt nicht existiert (es ist undefined).</p>
<p dir="auto">Also kein Zeitproblem, sondern eine fehlerhafte oder fehlende Seitendefinition (oder fehlender Datenpunkt) führt zu deinem Problem.</p>
<p dir="auto">Kannst du die Seite eingrenzen und sehen, wann der Fehler passiert? Dann wäre das der Anhaltspunkt zur Suche in der Seiten-Konfiguration.</p>
<p dir="auto">Den Screensaver würde ich aktuell ausschließen, da der andere Funktionen durchläuft...</p>
]]></description><link>https://forum.iobroker.net/post/1345896</link><guid isPermaLink="true">https://forum.iobroker.net/post/1345896</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Wed, 24 Jun 2026 10:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Mon, 22 Jun 2026 12:20:22 GMT]]></title><description><![CDATA[<p dir="auto">da ich seit geraumer Zeit folgende Fehlermelungen bekomme:</p>
<pre><code>javascript.0	14:13:02.803	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:02.804	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:11.799	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:11.800	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:20.907	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:20.907	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:29.924	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:29.924	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:38.948	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:38.948	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:47.996	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.

javascript.0	14:13:47.996	warn	

Please wait a few seconds longer when launching the NSPanel. Not all parameters are loaded yet.
</code></pre>
<p dir="auto">hab ich von 5_1_1_1 auf 5_1_1_7 upgedatet, leider noch immer alles beim allten.</p>
<p dir="auto">Tasmota 15.0.1</p>
<pre><code>javascript.0	14:15:29.238	info	

--- start of NsPanelTs: 0_userdata.0.NSPanel.Kueche. ---

javascript.0	14:15:29.250	info	

setObjects enabled - create Alias Channels possible

javascript.0	14:15:29.254	info	

weather alias for pirate-weather.0. already exists

javascript.0	14:15:29.271	info	

registered 41 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions

javascript.0	14:15:29.276	info	

Updates for NSPanel available

javascript.0	14:15:29.365	info	

Desired TFT Firmware: 61 / v5.1.1

javascript.0	14:15:29.365	info	

Installed TFT Firmware: 61 / v5.1.1

javascript.0	14:15:29.479	info	

Debug mode disabled

javascript.0	14:15:30.108	info	

hidden Cards disabled

javascript.0	14:15:32.279	info	

Start MQTT-Port-Check -------------------------------------

javascript.0	14:15:32.279	info	

-- admin.0                   - 8081

javascript.0	14:15:32.279	info	

-- influxdb.0                - 8086

javascript.0	14:15:32.279	info	

-- mqtt.0                    - 1886

javascript.0	14:15:32.279	info	

-- mqtt.1                    - 1883

javascript.0	14:15:32.279	info	

-- proxmox.0                 - 8006

javascript.0	14:15:32.279	info	

-- shelly.0                  - 1882

javascript.0	14:15:32.279	info	

-- simple-api.0              - 8087

javascript.0	14:15:32.279	info	

-- sonoff.0                  - 1884

javascript.0	14:15:32.279	info	

-- telegram.0                - 8443

javascript.0	14:15:32.279	info	

-- unifi-network.0           - 1144

javascript.0	14:15:32.279	info	

-- web.0                     - 8082

javascript.0	14:15:32.279	info	

- MQTT-Port-Check OK: Instance of Adapter: mqtt.0 is running on Port:1886

javascript.0	14:15:32.279	info	

End MQTT-Port-Check ---------------------------------------
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1345612</link><guid isPermaLink="true">https://forum.iobroker.net/post/1345612</guid><dc:creator><![CDATA[australien]]></dc:creator><pubDate>Mon, 22 Jun 2026 12:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 18:32:11 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: Armilar">@<bdi>Armilar</bdi></a> Hier, inklusive des Fix von <a class="plugin-mentions-user plugin-mentions-a" href="/user/ticaki" aria-label="Profile: ticaki">@<bdi>ticaki</bdi></a></p>
<pre><code>function GenerateMediaPage (page: NSPanel.PageMedia): NSPanel.Payload[] {
    try {
        unsubscribeMediaSubscriptions();

        if (!page.items[0].id) throw new Error('Missing page id for cardMedia!');

        let id = page.items[0].id;
        let tid = 0;
        let out_msgs: NSPanel.Payload[] = [];

        if (!page.items[0].adapterPlayerInstance!) throw new Error('page.items[0].adapterPlayerInstance is undefined!');
        let vInstance = page.items[0].adapterPlayerInstance!;
        let v1Adapter = vInstance.split('.');
        let v2Adapter: NSPanel.PlayerType = v1Adapter[0] as NSPanel.PlayerType;

        let vMediaDevice = page.items[0].mediaDevice != undefined ? page.items[0].mediaDevice : '';

        if (isPlayerWithMediaDevice(v2Adapter)) {
            if (!vMediaDevice) throw new Error(`Error in cardMedia! mediaDevice is empty! Page: ${JSON.stringify(page)}`);
        }
        createAutoMediaAlias(id, vMediaDevice, page.items[0].adapterPlayerInstance!);

        // Leave the display on if the alwaysOnDisplay parameter is specified (true)
        if (page.type == 'cardMedia' &amp;&amp; pageCounter == 0 &amp;&amp; page.items[0].alwaysOnDisplay != undefined) {
            out_msgs.push({payload: 'pageType~cardMedia'});
            if (page.items[0].alwaysOnDisplay != undefined) {
                if (page.items[0].alwaysOnDisplay) {
                    pageCounter = 1;
                    if (alwaysOn == false) {
                        alwaysOn = true;
                        SendToPanel({payload: 'timeout~0'});
                        subscribeMediaSubscriptions(page.items[0].id);
                        if (v2Adapter == 'sonos') {
                            subscribeMediaSubscriptionsSonosAdd(page.items[0].id);
                        } else if (v2Adapter == 'spotify-premium') {
                            setState(vInstance + 'getDevices', true);
                            setState(vInstance + 'getPlaybackInfo', true);
                            setState(vInstance + 'getPlaylists', true);
                        }
                    }
                }
            }
        } else if (page.type == 'cardMedia' &amp;&amp; pageCounter == 1) {
            alwaysOn = true;
            subscribeMediaSubscriptions(page.items[0].id);
            if (v2Adapter == 'sonos') {
                subscribeMediaSubscriptionsSonosAdd(page.items[0].id);
            }
        } else if (page.type == 'cardMedia' &amp;&amp; pageCounter == -1) {
            //Do Nothing
        } else {
            out_msgs.push({payload: 'pageType~cardMedia'});
        }

        if (existsObject(id)) {

            let name = "";
            if (page.items[0].showOnlyPlayerHeadline &amp;&amp; page.items[0].showOnlyPlayerHeadline != undefined) {
                //name = getState(page.items[0].adapterPlayerInstance + "Players.SqueezePlay.Playername").val;
                name = getState(page.items[0].adapterPlayerInstance + "Players." + page.items[0].mediaDevice + ".Playername").val;
                //name = page.heading;
            } else {
                name = getState(id + '.ALBUM').val;
                console.log("##### else name");
            }
            let title = getState(id + '.TITLE').val;
            if (title &amp;&amp; title.indexOf('~') !== -1) {
                title = title.split('~')[0].trim();
            }

            if (title.length &gt; 24) {
                title = title.slice(0, 24) + '...';
            }
            if (existsObject(id + '.DURATION') &amp;&amp; existsObject(id + '.ELAPSED')) {
                if (v2Adapter == 'alexa2') {
                    if (Debug) log(getState(id + '.DURATION').val, 'info');
                    let Seconds = parseInt(getState(id + '.DURATION').val) % 60 &lt; 10 ? '0' : '';
                    let Duration = Math.floor(getState(id + '.DURATION').val / 60) + ':' + Seconds + (getState(id + '.DURATION').val % 60);
                    let vElapsed = getState(id + '.ELAPSED').val;

                    if (vElapsed.length == 5) {
                        if (parseInt(vElapsed.slice(0, 2)) &lt; 9) {
                            vElapsed = vElapsed.slice(1);
                        }
                    }
                    if (vElapsed == 0) {
                        vElapsed = '0:00';
                    }
                    let vDuration = Duration;
                    if (vDuration.length == 5) {
                        if (parseInt(vDuration.slice(0, 2)) &lt; 9) {
                            vDuration = vDuration.slice(1);
                        }
                    }
                    if (vDuration != '0:00') {
                        title = title + ' (' + vElapsed + '|' + vDuration + ')';
                    } else {
                        title = title + ' (' + vElapsed + ')';
                    }
                    if (title == ' (0:00)') {
                        title = '';
                    }
                } else if (v2Adapter == 'sonos' &amp;&amp; getState(page.items[0].adapterPlayerInstance + 'root.' + page.items[0].mediaDevice + '.current_type').val == 0) {
                    let vElapsed = getState(id + '.ELAPSED').val;
                    if (vElapsed.length == 5) {
                        if (parseInt(vElapsed.slice(0, 2)) &lt; 9) {
                            vElapsed = vElapsed.slice(1);
                        }
                    } else if (vElapsed.length == 8) {
                        vElapsed = vElapsed.slice(4);
                    }
                    let vDuration = getState(id + '.DURATION').val;
                    if (vDuration.length == 5) {
                        if (parseInt(vDuration.slice(0, 2)) &lt; 9) {
                            vDuration = vDuration.slice(1);
                        }
                    } else if (vDuration.length == 8) {
                        vDuration = vDuration.slice(4);
                    }
                    title = title + ' (' + vElapsed + '|' + vDuration + ')';
                } else if (v2Adapter == 'bosesoundtouch') {
                    if (Debug) log(getState(id + '.ELAPSED').val, 'info');
                    let elapsedSeconds = parseInt(getState(id + '.ELAPSED').val) % 60 &lt; 10 ? '0' : '';
                    let vElapsed = Math.floor(getState(id + '.ELAPSED').val / 60) + ':' + elapsedSeconds + (getState(id + '.ELAPSED').val % 60);
                    if (Debug) log(getState(id + '.DURATION').val, 'info');
                    let durationSeconds = parseInt(getState(id + '.DURATION').val) % 60 &lt; 10 ? '0' : '';
                    let vDuration = Math.floor(getState(id + '.DURATION').val / 60) + ':' + durationSeconds + (getState(id + '.DURATION').val % 60);
                    title = title + ' (' + vElapsed + '|' + vDuration + ')';
                } else if (v2Adapter == 'mpd') {
                    let vElapsed: string = getState(id + '.ELAPSED').val;
                    let vDuration: string = getState(id + '.DURATION').val;
                    title = title + ' (' + vElapsed + '|' + vDuration + ')';
                    if (getState(id + '.STATE').val === 'stop') {
                        title = '(00:00|00:00)';
                    }
                }
            }

            let author = getState(id + '.ARTIST').val;

            if (v2Adapter == 'squeezeboxrpc' &amp;&amp; author.length &gt; 0) {
                if (existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) {
                    if (existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) {
                        let lmstracklist = JSON.parse(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join('')).val);
                        let currentIndex: number = parseInt(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.PlaylistCurrentIndex'].join('')).val);
                        
                        author = lmstracklist[currentIndex].Artist;
                        if (author == undefined || author == "undefined") {
                            author = getState(id + '.ARTIST').val;
                        } 
                        author = author + '|' + lmstracklist[currentIndex].Album;
                        if (author.length &gt; 37) {
                            author = author.slice(0, 37) + '...';
                        }
                        let elapsedTime: number = parseInt(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Time'].join('')).val);
                        let elapsedSeconds = elapsedTime % 60 &lt; 10 ? '0' : '';
                        let vElapsed = Math.floor(elapsedTime / 60) + ':' + elapsedSeconds + (elapsedTime % 60);

                        let durationSeconds = parseInt(lmstracklist[currentIndex].Duration) % 60 &lt; 10 ? '0' : '';
                        let vDuration = Math.floor(parseInt(lmstracklist[currentIndex].Duration) / 60) + ':' + durationSeconds + (parseInt(lmstracklist[currentIndex].Duration) % 60);
                        title = lmstracklist[currentIndex].title;
                        if (title.length &gt; 25) {
                            title = title.slice(0, 25) + '...';
                        }
                        title = title + ' (' + vElapsed + '|' + vDuration + ')';
                    }
                }
            }

            // Settings &gt;&gt;Aktualisierungsintervall für Statusinformationen&lt;&lt; = 1 !
            // If the refresh time is set to 1 second in the spotify-premium.X instance,
            // the elapsed refresh bug '00:00' is not visible
            if (v2Adapter == 'spotify-premium') {
                let vElapsed: string = getState(id + '.ELAPSED').val;
                if (vElapsed.substring(0, 1) == '0') {
                    vElapsed = vElapsed.slice(1);
                }
                let vDuration: string = getState(id + '.DURATION').val;
                if (vDuration.substring(0, 1) == '0') {
                    vDuration = vDuration.slice(1);
                }
                title = title + ' (' + vElapsed + '|' + vDuration + ')';
                if (title == ' (0:00|0:00)') {
                    title = '';
                }
            }

            let shuffle = getState(id + '.SHUFFLE').val;

            //New Adapter/Player
            let media_icon = Icons.GetIcon('playlist-music');

            //Spotify-Premium
            if (v2Adapter == 'spotify-premium') {
                media_icon = Icons.GetIcon('spotify');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-spotify') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                name = getState(id + '.CONTEXT_DESCRIPTION').val;
                let nameLength = name.length;
                if (name.substring(0, 17) == 'Playlist: This Is') {
                    name = name.slice(18, 34) + '...';
                } else if (name.substring(0, 9) == 'Playlist:') {
                    name = name.slice(10, 26) + '...';
                } else if (name.substring(0, 6) == 'Album:') {
                    name = name.slice(7, 23) + '...';
                } else if (name.substring(0, 6) == 'Track:') {
                    name = name.slice(7, 23) + '...';
                } else if (name.substring(0, 7) == 'Artist:') {
                    name = name.slice(8, 24) + '...';
                }
                if (nameLength == 0) {
                    name = 'Spotify-Premium';
                }
                author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
                if (author.length &gt; 37) {
                    author = author.slice(0, 37) + '...';
                }
                if (getState(id + '.ARTIST').val.length == 0) {
                    author = findLocale('media', 'no_music_to_control');
                }
            }

            //Sonos
            if (v2Adapter == 'sonos') {
                media_icon = Icons.GetIcon('alpha-s-circle');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-sonos') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                name = getState(id + '.CONTEXT_DESCRIPTION').val;
                let nameLenght = name.length;
                if (nameLenght == 0) {
                    name = page.heading;
                } else if (nameLenght &gt; 16) {
                    name = name.slice(0, 16) + '...';
                }
                if (getState(id + '.ALBUM').val.length &gt; 0) {
                    author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
                    if (author.length &gt; 37) {
                        author = author.slice(0, 37) + '...';
                    }
                } else {
                    author = getState(id + '.ARTIST').val;
                }
                if (getState(id + '.ARTIST').val.length == 0) {
                    author = findLocale('media', 'no_music_to_control');
                }
            }

            //Bose Soundtouch
            if (v2Adapter == 'bosesoundtouch') {
                media_icon = Icons.GetIcon('alpha-b-circle');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-bose') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                name = page.heading;

                if (getState(id + '.ALBUM').val.length &gt; 0) {
                    author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
                    if (author.length &gt; 37) {
                        author = author.slice(0, 37) + '...';
                    }
                } else {
                    author = getState(id + '.ARTIST').val;
                }
                if (getState(id + '.ARTIST').val.length == 0) {
                    author = findLocale('media', 'no_music_to_control');
                }
            }

            //Logitech Squeezebox RPC
            if (v2Adapter == 'squeezeboxrpc') {
                media_icon = Icons.GetIcon('dlna');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-dnla') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                if (name.length == 0) {
                    name = page.heading;
                } else if (name.length &gt; 16) {
                    name = name.slice(0, 16) + '...';
                }
            }

            //Alexa2
            if (v2Adapter == 'alexa2') {
                media_icon = Icons.GetIcon('alpha-a-circle');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-alexa') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                name = getState(id + '.ALBUM').val;
                let nameLength = name.length;
                if (name.substring(0, 9) == 'Playlist:') {
                    name = name.slice(10, 26) + '...';
                } else if (name.substring(0, 6) == 'Album:') {
                    name = name.slice(7, 23) + '...';
                } else if (name.substring(0, 6) == 'Track') {
                    name = 'Alexa Player';
                }
                if (nameLength == 0) {
                    name = 'Alexa Player';
                } else {
                    name = name.slice(0, 16) + '...';
                }
                author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
                if (author.length &gt; 30) {
                    author = getState(id + '.ARTIST').val;
                }
                if (getState(id + '.ARTIST').val.length == 0) {
                    author = findLocale('media', 'no_music_to_control');
                }
            }

            //Volumio
            if (v2Adapter == 'volumio') {
                media_icon = Icons.GetIcon('clock-time-twelve-outline');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-volumio') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                if (name != undefined) {
                    author = author + ' | ' + name;
                }
                name = page.heading;
            }

            //MPD
            if (v2Adapter == 'mpd') {
                media_icon = Icons.GetIcon('alpha-m-circle');
                if (page.items[0].playerMediaIcon !== undefined) {
                    if (page.items[0].playerMediaIcon == 'logo-mpd') {
                        media_icon = page.items[0].playerMediaIcon;
                    } else {
                        media_icon = Icons.GetIcon(page.items[0].playerMediaIcon);
                    }
                }
                if (getState(id + '.ALBUM').val.length &gt; 0) {
                    author = getState(id + '.ARTIST').val + ' | ' + getState(id + '.ALBUM').val;
                    if (author.length &gt; 37) {
                        author = author.slice(0, 37) + '...';
                    }
                } else {
                    author = getState(id + '.ARTIST').val;
                }
                if (getState(id + '.ARTIST').val.length == 0) {
                    author = findLocale('media', 'no_music_to_control');
                }
                name = page.heading;
            }

            let volume = scale(getState(id + '.VOLUME').val, activePage!.items[0]!.minValue ?? 0, activePage!.items[0]!.maxValue ?? 100, 100, 0);
            let iconplaypause = Icons.GetIcon('pause'); //pause
            let shuffle_icon = Icons.GetIcon('shuffle-variant'); //shuffle
            let onoffbutton = 1374;

            if (shuffle == 'off' || shuffle == false || shuffle == 0 || shuffle == 'false') {
                shuffle_icon = Icons.GetIcon('shuffle-disabled'); //shuffle
            }

            // Todo: Refresh automatisieren und dafür wieder Shuffle nutzen
            //if (v2Adapter == 'volumio') { shuffle_icon = Icons.GetIcon('shuffle-disabled'); } //Volumio: refresh playlist

            //For all players
            if (getState(id + '.STATE').val) {
                onoffbutton = 65535;
                iconplaypause = Icons.GetIcon('pause'); //pause
            } else {
                iconplaypause = Icons.GetIcon('play'); //play
            }

            //Ausnahme für squeezebox, da State = Power
            if (v2Adapter == 'squeezeboxrpc') {
                if (getState(id + '.PAUSE').val === false) {
                    onoffbutton = 65535;
                    iconplaypause = Icons.GetIcon('pause'); //pause
                } else {
                    iconplaypause = Icons.GetIcon('play'); //play
                }
            }

            //Ausnahme für mpd, da State = play, pause,....
            if (v2Adapter == 'mpd') {
                if (getState(id + '.STATE').val === 'play') {
                    onoffbutton = 65535;
                    iconplaypause = Icons.GetIcon('pause'); //pause
                } else if (getState(id + '.STATE').val === 'pause') {
                    iconplaypause = Icons.GetIcon('play'); //play
                } else if (getState(id + '.STATE').val === 'stop') {
                    onoffbutton = 1374;
                    iconplaypause = Icons.GetIcon('play'); //play
                }

            }

            //Ausnahme Volumio: status = string: play, pause, stop usw.
            if (v2Adapter == 'volumio') {
                if (getState(id + '.status').val == 'play') {
                    onoffbutton = 65535;
                    iconplaypause = Icons.GetIcon('pause'); //pause
                } else {
                    iconplaypause = Icons.GetIcon('play'); //play
                }
            }

            let currentSpeaker: string = findLocale('media', 'no_speaker_found');

            if (v2Adapter == 'alexa2') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'Echo-Devices.', page.items[0].mediaDevice, '.Info.name'].join('')).val;
            } else if (v2Adapter == 'spotify-premium') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'player.device.name'].join('')).val;
            } else if (v2Adapter == 'sonos') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.members'].join('')).val;
            } else if (v2Adapter == 'squeezeboxrpc') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playername'].join('')).val;
            } else if (v2Adapter == 'bosesoundtouch') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'deviceInfo.name'].join('')).val;
            } else if (v2Adapter == 'volumio') {
                currentSpeaker = getState([page.items[0].adapterPlayerInstance, 'info.name'].join('')).val;
            } else if (v2Adapter == 'mpd') {
                currentSpeaker = v1Adapter[0] + '.' + v1Adapter[1];
            }
            //-------------------------------------------------------------------------------------------------------------
            // All Alexa devices (the online / player and commands directory is available) are listed and linked below
            // If the constant alexaSpeakerList contains at least one entry, the constant is used - otherwise all devices from the Alexa adapter
            let speakerListArray: string[] = [];
            if (page.items[0].speakerList &amp;&amp; page.items[0].speakerList.length &gt; 0) {
                for (let i_index in page.items[0].speakerList) {
                    speakerListArray.push(page.items[0].speakerList[i_index]);
                }
            } else if (v2Adapter == 'squeezeboxrpc') {
                // Beim Squeezeboxrpc ist jeder Player ein eigener Knoten im Objektbaum. Somit werden einzelne Aliase benötigt.
                const squeezeboxPlayerQuery: iobJS.QueryResult = $('channel[state.id=' + page.items[0].adapterPlayerInstance + '.Players.*.Playername]');
                squeezeboxPlayerQuery.each((playerId: string, playerIndex: number) =&gt; {
                    speakerListArray.push(getState(playerId).val);
                    page.items[0].speakerList = speakerListArray;
                });
            } else if (v2Adapter == 'spotify-premium') {
                // All possible Devices if page.items[0].speakerList empty
                if (Debug) log(getState(page.items[0].adapterPlayerInstance + 'devices.availableDeviceListString').val);
                speakerListArray = getState(page.items[0].adapterPlayerInstance + 'devices.availableDeviceListString').val.split(';');
                page.items[0].speakerList = speakerListArray;
            } else if (v2Adapter == 'mpd') {
                // All possible Devices if page.items[0].speakerList empty
                page.items[0].speakerList[0] = v1Adapter[0] + '.' + v1Adapter[1];
            } else {
                let i_list = Array.prototype.slice.apply($('[state.id="' + page.items[0].adapterPlayerInstance + 'Echo-Devices.*.Info.name"]'));
                for (let i_index in i_list) {
                    let i = i_list[i_index];
                    let deviceId = i;
                    deviceId = deviceId.split('.');
                    if (
                        getState([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.online'].join('')).val &amp;&amp;
                        existsObject([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.Player'].join('')) &amp;&amp;
                        existsObject([page.items[0].adapterPlayerInstance, 'Echo-Devices.', deviceId[3], '.Commands'].join(''))
                    ) {
                        speakerListArray.push(getState(i).val);
                    }
                }
            }
            //--------------------------------------------------------------------------------------------------------------

            let colMediaIcon = page.items[0].colorMediaIcon != undefined ? page.items[0].colorMediaIcon : White;
            let colMediaTitle = page.items[0].colorMediaTitle != undefined ? page.items[0].colorMediaTitle : White;
            let colMediaArtist = page.items[0].colorMediaArtist != undefined ? page.items[0].colorMediaArtist : White;

            //InSel Speaker
            let speakerListString: string = '~~~~~~';
            let speakerListIconCol = rgb_dec565(HMIOff);
            if (speakerListArray.length &gt; 0) {
                speakerListIconCol = rgb_dec565(HMIOn);
                speakerListString = 'input_sel' + '~' + tid + '?speakerlist' + '~' + Icons.GetIcon('speaker') + '~' + speakerListIconCol + '~' + findLocale('media', 'speaker') + '~' + 'media0~';
            }

            //InSel Playlist
            let playListString: string = '~~~~~~';
            let playListIconCol = rgb_dec565(HMIOff);
            if (page.items[0].playList != undefined) {
                /* Volumio: get actual playlist if empty */
                if (v2Adapter == 'volumio') {
                    if (page.items[0].playList.length == 0) {
                        let urlString: string = `${getState(vInstance + 'info.host').val}/api/listplaylists`;

                        axios
                            .get(urlString, {headers: {'User-Agent': 'ioBroker'}})
                            .then(async function (response) {
                                if (response.status === 200) {
                                    if (Debug) {
                                        log(JSON.stringify(response.data), 'info');
                                    }
                                    page.items[0].playList = JSON.parse(JSON.stringify(response.data));
                                    if (Debug) log('volumio-playlist: ' + page.items[0].playList, 'info');
                                } else {
                                    log('Axios Status - get_volumio-playlist: ' + response.state, 'warn');
                                }
                            })
                            .catch(function (error) {
                                log(error, 'warn');
                            });
                    }
                    /* Spotify: get all playlists if empty */
                } else if (v2Adapter == 'spotify-premium') {
                    page.items[0].playList = getState(page.items[0].adapterPlayerInstance + 'playlists.playlistListString').val.split(';');
                } else if (v2Adapter == 'mpd') {
                    let tempPL = getState(page.items[0].adapterPlayerInstance + 'listplaylists').val;
                    tempPL = tempPL.replace('[', '');
                    tempPL = tempPL.replace(']', '');
                    tempPL = tempPL.replaceAll('"', '');
                    page.items[0].playList = tempPL.split(',');
                }
                playListIconCol = rgb_dec565(HMIOn);
                playListString =
                    'input_sel' +
                    '~' +
                    tid +
                    '?playlist' +
                    '~' +
                    Icons.GetIcon('playlist-play') +
                    '~' +
                    playListIconCol +
                    '~' +
                    //'PlayL ' + page.heading + '~' +
                    findLocale('media', 'playlist') +
                    '~' +
                    'media1~';
            }

            //InSel Tracklist
            globalTracklist = '';

            let trackListString: string = '~~~~~~';
            let trackListIconCol = rgb_dec565(HMIOff);
            if (v2Adapter == 'volumio') {
                /* Volumio: get queue */
                setTimeout(async function () {
                    let urlString: string = `${getState(vInstance + 'info.host').val}/api/getQueue`;

                    axios
                        .get(urlString, {headers: {'User-Agent': 'ioBroker'}})
                        .then(async function (response) {
                            if (response.status === 200) {
                                if (Debug) {
                                    log(JSON.stringify(response.data), 'info');
                                }
                                const QUEUELIST = JSON.parse(JSON.stringify(response.data));
                                page.items[0].globalTracklist = QUEUELIST.queue;
                                if (Debug) {
                                    for (let i_index in QUEUELIST.queue) {
                                        log('volumio-queue: ' + QUEUELIST.queue[i_index], 'info');
                                    }
                                }
                            } else {
                                log('Axios Status - get_volumio-queue: ' + response.state, 'warn');
                            }
                        })
                        .catch(function (error) {
                            log(error, 'warn');
                        });
                }, 2000);
                globalTracklist = page.items[0].globalTracklist;
            } else if (v2Adapter == 'squeezeboxrpc' &amp;&amp; existsObject([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join(''))) {
                let lmstracklist = JSON.parse(getState([page.items[0].adapterPlayerInstance, 'Players.', page.items[0].mediaDevice, '.Playlist'].join('')).val);
                globalTracklist = lmstracklist;
            } else if (v2Adapter == 'sonos' &amp;&amp; existsObject([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.playlist_set'].join(''))) {
                let lmstracklist = getState([page.items[0].adapterPlayerInstance, 'root.', page.items[0].mediaDevice, '.queue'].join('')).val;
                lmstracklist = lmstracklist.replace(/\s*[\[{(].*?[)}\]]\s*/g, '');
                let lmstracklistTemp = lmstracklist.split(', ');
                let trackList: string = '[';
                if (getState(page.items[0].adapterPlayerInstance + 'root.' + page.items[0].mediaDevice + '.current_type').val == 0) {
                    for (let i = 0; i &lt; lmstracklistTemp.length; i++) {
                        let trackTemp = lmstracklistTemp[i].split(' - ');
                        trackList = trackList + '{"id":"' + i + '","name":"' + trackTemp[0] + '","title":"' + trackTemp[1] + '"}';
                        if (i &lt; lmstracklistTemp.length - 1) {
                            trackList = trackList + ',';
                        }
                    }
                }
                trackList = trackList + ']';
                if (Debug) log(trackList, 'info');
                globalTracklist = trackList;
            } else if (v2Adapter == 'spotify-premium') {
                try {
                    let tempTrackList = JSON.parse(getState(page.items[0].adapterPlayerInstance + 'player.playlist.trackListArray').val);
                    globalTracklist = tempTrackList;
                } catch {
                    log('Hello Mr. Developer something went wrong in tracklist!', 'debug');
                }
            } else if (v2Adapter == 'mpd') {
                try {
                    let tempTrackList = JSON.parse(getState(page.items[0].adapterPlayerInstance + 'playlist_list').val);
                    globalTracklist = tempTrackList;
                } catch {
                    log('Hello Mr. Developer something went wrong in tracklist!', 'debug');
                }
            }

            if (globalTracklist != null &amp;&amp; globalTracklist.length != 0) {
                trackListIconCol = rgb_dec565(HMIOn);
                trackListString =
                    'input_sel' + '~' + tid + '?tracklist' + '~' + Icons.GetIcon('animation-play-outline') + '~' + trackListIconCol + '~' + findLocale('media', 'tracklist') + '~' + 'media2~';
            }

            // InSel/Slider EQ
            let equalizerListString: string = '~~~~~~';
            let equalizerListIconCol = rgb_dec565(HMIOff);

            if (page.items[0].equalizerList != undefined) {
                equalizerListIconCol = rgb_dec565(HMIOn);
                equalizerListString =
                    'input_sel' + '~' + tid + '?equalizer' + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~';
            } else if (page.items[0].equalizerSlider != undefined &amp;&amp; v2Adapter == 'alexa2') {
                equalizerListIconCol = rgb_dec565(HMIOn);
                equalizerListString =
                    'slider' + '~' + tid + '~' + Icons.GetIcon('equalizer-outline') + '~' + equalizerListIconCol + '~' + findLocale('media', 'equalizer') + '~' + 'media3~';
            } else if (page.items[0].equalizerList == undefined &amp;&amp; v2Adapter == 'sonos') {
                let equalizerListIconCol = rgb_dec565(HMIOn);
                //equalizerListString is used for favariteList
                equalizerListString =
                    'input_sel' + '~' + tid + '?favorites' + '~' + Icons.GetIcon('playlist-star') + '~' + equalizerListIconCol + '~' + findLocale('media', 'favorites') + '~' + 'media3~';
            }

            //Repeat Control Button
            let repeatIcon = Icons.GetIcon('repeat-variant');
            let repeatIconCol = rgb_dec565(HMIOff);
            let repeatButtonString: string = '~~~~~~';

            if (v2Adapter == 'spotify-premium') {
                if (getState(id + '.REPEAT').val == 'context') {
                    repeatIcon = Icons.GetIcon('repeat-variant');
                    repeatIconCol = rgb_dec565(HMIOn);
                } else if (getState(id + '.REPEAT').val == 'track') {
                    repeatIcon = Icons.GetIcon('repeat-once');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'alexa2') {
                if (getState(id + '.REPEAT').val == true) {
                    repeatIcon = Icons.GetIcon('repeat-variant');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'sonos') {
                if (getState(id + '.REPEAT').val == 1) {
                    repeatIcon = Icons.GetIcon('repeat-variant');
                    repeatIconCol = rgb_dec565(HMIOn);
                } else if (getState(id + '.REPEAT').val == 2) {
                    repeatIcon = Icons.GetIcon('repeat-once');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'bosesoundtouch') {
                if (getState(id + '.REPEAT').val == 'REPEAT_ALL') {
                    repeatIcon = Icons.GetIcon('repeat-variant');
                    repeatIconCol = rgb_dec565(HMIOn);
                } else if (getState(id + '.REPEAT').val == 'REPEAT_ONE') {
                    repeatIcon = Icons.GetIcon('repeat-once');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'squeezeboxrpc') {
                if (getState(id + '.REPEAT').val == 1) {
                    repeatIcon = Icons.GetIcon('repeat-once');
                    repeatIconCol = rgb_dec565(HMIOn);
                } else if (getState(id + '.REPEAT').val == 2) {
                    repeatIcon = Icons.GetIcon('repeat');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'volumio') {
                /* Volumio: only Repeat true/false with API */
                if (getState(id + '.REPEAT').val == true) {
                    repeatIcon = Icons.GetIcon('repeat-variant');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            } else if (v2Adapter == 'mpd') {
                if (getState(id + '.REPEAT').val == true &amp;&amp; getState(id + '.SINGLE').val == 0) {
                    repeatIcon = Icons.GetIcon('repeat');
                    repeatIconCol = rgb_dec565(HMIOn);
                } else if (getState(id + '.REPEAT').val == true &amp;&amp; getState(id + '.SINGLE').val == 1) {
                    repeatIcon = Icons.GetIcon('repeat-once');
                    repeatIconCol = rgb_dec565(HMIOn);
                }
            }

            if (v2Adapter == 'spotify-premium' || v2Adapter == 'alexa2' || v2Adapter == 'sonos' || v2Adapter == 'bosesoundtouch' || v2Adapter == 'volumio' || v2Adapter == 'squeezeboxrpc' || v2Adapter == 'mpd') {
                repeatButtonString = 'button' + '~' + tid + '?repeat' + '~' + repeatIcon + '~' + repeatIconCol + '~' + 'Repeat' + '~' + 'media4';
            }

            //popUp Tools
            let toolsString: string = '~~~~~~';
            let toolsIconCol = rgb_dec565(colMediaIcon);
            if (v2Adapter == 'sonos' || v2Adapter == 'mpd') {
                if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) {
                    toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~';
                } else {
                    toolsString = 'input_sel' + '~' + tid + '?crossfade' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'crossfade') + '~' + 'media5~';
                }
            } else if (v2Adapter == 'squeezeboxrpc') {
                if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) {
                    toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~';
                }
            } else if (v2Adapter == 'spotify-premium') {
                if (page.items[0].crossfade == undefined || page.items[0].crossfade == false) {
                    toolsString = 'input_sel' + '~' + tid + '?seek' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'seek') + '~' + 'media5~';
                }
            } else {
                toolsString = 'button' + '~' + tid + '' + '~' + media_icon + '~' + toolsIconCol + '~' + findLocale('media', 'tools') + '~' + 'media5~';
            }

            out_msgs.push({
                payload:
                    'entityUpd~' + //entityUpd
                    name +
                    '~' + //heading
                    getNavigationString(pageId) +
                    '~' + //navigation
                    tid +
                    '~' + //internalNameEntiy
                    title +
                    '~' + //title
                    rgb_dec565(colMediaTitle) +
                    '~' + //titleColor
                    author +
                    '~' + //author
                    rgb_dec565(colMediaArtist) +
                    '~' + //authorColor
                    volume +
                    '~' + //volume
                    iconplaypause +
                    '~' + //playpauseicon
                    onoffbutton +
                    '~' + //On/Off Button Color
                    shuffle_icon +
                    '~' + //iconShuffle                     --&gt; Code
                    toolsString +
                    speakerListString +
                    playListString +
                    trackListString +
                    equalizerListString +
                    repeatButtonString,
            });
        }
        if (Debug) {
            log('GenerateMediaPage payload: ' + JSON.stringify(out_msgs), 'info');
        }
        return out_msgs;
    } catch (err: any) {
        log('error at function GenerateMediaPage: ' + err.message, 'warn');
        return [];
    }
}
</code></pre>
<p dir="auto">Danke euch!</p>
]]></description><link>https://forum.iobroker.net/post/1336354</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336354</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Sat, 25 Apr 2026 18:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 18:25:37 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a></p>
<p dir="auto">Das hier ist trotzdem nötig - da darf kein undefined auf length geprüft werden...</p>
<p dir="auto"><code>if (name.length == 0)</code>  -&gt; <code>if (typeof name !== 'string' || name.length == 0)</code></p>
<p dir="auto">wobei das ist kürzer (aber auch unsicherer)<br />
<code>if ((name ?? '').length == 0)</code></p>
]]></description><link>https://forum.iobroker.net/post/1336349</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336349</guid><dc:creator><![CDATA[ticaki]]></dc:creator><pubDate>Sat, 25 Apr 2026 18:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 17:53:11 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a></p>
<p dir="auto">Wenn es jetzt funktioniert, dann bitte mal hier die komplette GenerateMediaPage reinwerfen. Dann kann ich mir das zusammensuchen sparen.</p>
]]></description><link>https://forum.iobroker.net/post/1336345</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336345</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Sat, 25 Apr 2026 17:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 14:52:34 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/ticaki" aria-label="Profile: ticaki">@<bdi>ticaki</bdi></a> siehe oben, das hab ich noch gefunden und nachgetragen. Das ".SqueezePlay." im Datenpunkt-Pfad ist falsch. Das existiert schlicht nicht.</p>
<p dir="auto">Hab aber immer noch mein "undefined". <em>heul</em></p>
<pre><code>author = lmstracklist[currentIndex].Artist + '|' + lmstracklist[currentIndex].Album;
if (author == undefined || author == "undefined") {
      author = getState(id + '.ARTIST').val;
}
</code></pre>
<p dir="auto">Das kann aber auch nicht klappen, author wird ja zugewiesen und kann nnicht undefined sein.</p>
<pre><code>                      author = lmstracklist[currentIndex].Artist;
                        if (author == undefined || author == "undefined") {
                            author = getState(id + '.ARTIST').val;
                        } 
                        author = author + '|' + lmstracklist[currentIndex].Album;
</code></pre>
<p dir="auto">klappt bei mir.</p>
]]></description><link>https://forum.iobroker.net/post/1336328</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336328</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Sat, 25 Apr 2026 14:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 14:41:44 GMT]]></title><description><![CDATA[<p dir="auto">Ich bin da nicht drin daher:</p>
<p dir="auto">ergibt das bei dir eine gültige id? <code>adapterPlayerInstance + "Players.SqueezePlay.Playername"</code></p>
<p dir="auto">aber nicht wichtig - hier <code>if (name.length == 0)</code> muß ein <code>if (typeOf name !== 'string' || name.length == 0)</code> rein.<br />
<a href="https://github.com/joBr99/nspanel-lovelace-ui/blob/b8649caa2714e0594d14c334550e2ba8e33f8cfb/ioBroker/DEV/NSPanelTs.ts#L7884" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/blob/b8649caa2714e0594d14c334550e2ba8e33f8cfb/ioBroker/DEV/NSPanelTs.ts#L7884</a></p>
<p dir="auto">EDIT: du benutzt doch <code>squeezeboxrpc</code></p>
]]></description><link>https://forum.iobroker.net/post/1336326</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336326</guid><dc:creator><![CDATA[ticaki]]></dc:creator><pubDate>Sat, 25 Apr 2026 14:41:44 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Sat, 25 Apr 2026 14:45:38 GMT]]></title><description><![CDATA[<pre><code>javascript.0	01:03:40.994	warn	
error at function GenerateMediaPage: Cannot read properties of null (reading 'length')
javascript.0	01:03:41.959	warn	
    at GenerateMediaPage (script.js.common.NSPanel:9087:26)
javascript.0	01:03:41.959	warn	
    at GeneratePage (script.js.common.NSPanel:6065:29)
javascript.0	01:03:41.959	warn	
    at Object.&lt;anonymous&gt; (script.js.common.NSPanel:8421:21)
javascript.0	01:03:41.959	warn	
    at step (script.js.common.NSPanel:33:23)
javascript.0	01:03:41.959	warn	
    at Object.next (script.js.common.NSPanel:14:53)
javascript.0	01:03:41.959	warn	
    at script.js.common.NSPanel:8:71
javascript.0	01:03:41.959	warn	
    at __awaiter (script.js.common.NSPanel:4:12)
</code></pre>
<p dir="auto">Die Seite wird jetzt nicht mehr angezeigt.</p>
<p dir="auto">Ich kann aber grad nicht sagen, wo genau das auftaucht - im squeezeboxrpc-Block sind sowohl author.length als auch title.length immer vorhanden.</p>
<p dir="auto">Nachtrag: mit showOnlyPlayerHeadline: false tritt es nicht auf. Ich kriegs auf die Schnelle im Code aber nicht eingegrenzt. <a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: armilar">@<bdi>armilar</bdi></a></p>
<p dir="auto">Nachtrag 2:</p>
<pre><code>	
{
  id: 'alias.0.NSPanel.1.Media.PlayerSqueezeboxRPC',
  adapterPlayerInstance: 'squeezeboxrpc.0.',
  speakerList: [ 'Heartbeat_4', 'Squeezebox' ],
  mediaDevice: 'Heartbeat_4',
  playList: [],
  colorMediaIcon: { red: 0, green: 255, blue: 0 },
  colorMediaArtist: { red: 255, green: 255, blue: 0 },
  colorMediaTitle: { red: 255, green: 255, blue: 0 },
  alwaysOnDisplay: true,
  autoCreateALias: true,
  showOnlyPlayerHeadline: true
}
</code></pre>
<p dir="auto">Ich habe</p>
<pre><code>name = getState(page.items[0].adapterPlayerInstance + "Players.SqueezePlay.Playername").val;
</code></pre>
<p dir="auto">mal so geändert, dann klappts:</p>
<pre><code>name = getState(page.items[0].adapterPlayerInstance + "Players." + page.items[0].mediaDevice + ".Playername").val;
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1336319</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336319</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Sat, 25 Apr 2026 14:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 21:21:09 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a></p>
<p dir="auto">Noch mal den unteren Teil aus dem DEV Script ersetzen:</p>
<p dir="auto"><a href="https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/DEV/NSPanelTs.ts" rel="nofollow ugc">https://github.com/joBr99/nspanel-lovelace-ui/blob/main/ioBroker/DEV/NSPanelTs.ts</a></p>
<p dir="auto">Danach sollte der Player und der Artist angezeigt werden...</p>
]]></description><link>https://forum.iobroker.net/post/1336262</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336262</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Fri, 24 Apr 2026 21:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 21:01:01 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a> <a href="/post/1336255">sagte</a>:</p>
<p dir="auto">Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)</p>
</blockquote>
<p dir="auto">Okay, den können wir natürlich auch nehmen... Ist bei mir etwas schwieriger... Ich steuere damit exakt einen Player... Daher sehe ich auch keine anderen...</p>
<p dir="auto">Ich ändere das ab...</p>
]]></description><link>https://forum.iobroker.net/post/1336257</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336257</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Fri, 24 Apr 2026 21:01:01 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:58:02 GMT]]></title><description><![CDATA[<p dir="auto">Ja, genau den. Die Card lässt mich den ja sogar wählen, aber ich sehe den dann nirgendwo. Ich würd aber gern wissen, ob ich Bad oder Esszimmer steuere. :)</p>
]]></description><link>https://forum.iobroker.net/post/1336255</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336255</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:54:29 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a> <a href="/post/1336253">sagte</a>:</p>
<p dir="auto">das ausgewählte Wiedergabegerät erwartet</p>
</blockquote>
<p dir="auto">du meinst Playername?:</p>
<p dir="auto"><img src="/assets/uploads/files/1777064030260-2b3c8e2e-36cc-49cd-ae35-94e2f6366891-image.jpeg" alt="2b3c8e2e-36cc-49cd-ae35-94e2f6366891-image.jpeg" class=" img-fluid img-markdown" /></p>
]]></description><link>https://forum.iobroker.net/post/1336254</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336254</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:42:02 GMT]]></title><description><![CDATA[<p dir="auto">Ich glaubs euch ja. :) Die Frage ist, warum schickt entweder der LMS die Daten nicht an den Adapter oder der Adapter die Daten nicht ins JSON. Wenn es häufiger vorkommt, dann wäre ein Fallback vielleicht nicht schlecht. (Der author ist ja eh schon da, warum nochmal beschaffen?)</p>
<p dir="auto">showOnlyPlayerHeadline liefert den "Heading" String, vom Parameternamen (und meinem Wunsch her) hätte ich das ausgewählte Wiedergabegerät erwartet. Dann sehe ich sofort, welches der Geräte ich eigentlich steuere. Sorry wegen der Unklarheit.</p>
]]></description><link>https://forum.iobroker.net/post/1336253</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336253</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:34:12 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/smartstuffcoyote" aria-label="Profile: SmartStuffCoyote">@<bdi>SmartStuffCoyote</bdi></a></p>
<p dir="auto"><img src="/assets/uploads/files/1777062754887-a9e56847-f589-42e9-a3c8-7ee7ead9d8c5-image.jpeg" alt="a9e56847-f589-42e9-a3c8-7ee7ead9d8c5-image.jpeg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Bei mir alles da und auch kein flackern, ist auch ein Album</p>
]]></description><link>https://forum.iobroker.net/post/1336252</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336252</guid><dc:creator><![CDATA[Armilar]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:30:09 GMT]]></title><description><![CDATA[<p dir="auto">Ich glaube, das Problem ist nicht das MP3. Sondern die Playlist. Es werden ja nicht die Daten der Datei abgefragt, sondern die der Playlist. Der Artist fehlt da bei mir einfach. Egal, ob ich eine gespeicherte Playlist oder ein Album oder nur einen einzelnen Song starte.</p>
<pre><code>[
  {
    "index": 0,
    "id": 31792,
    "url": "file:///music/Alben/Metric%20-%20Romanticize%20The%20Dive/01%20Metric%20-%20Victim%20Of%20Luck.mp3",
    "title": "Victim Of Luck",
    "ArtworkUrl": "http://localhost:9900/music/94f7888d/cover.jpg",
    "Type": "mp3",
    "Bitrate": "320kb/s CBR",
    "Duration": 203.306,
    "Album": "Romanticize The Dive"
  }
]
</code></pre>
]]></description><link>https://forum.iobroker.net/post/1336251</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336251</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to SONOFF NSPanel mit Lovelace UI (TypeScript Version) on Fri, 24 Apr 2026 20:25:26 GMT]]></title><description><![CDATA[<blockquote>
<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/armilar" aria-label="Profile: Armilar">@<bdi>Armilar</bdi></a> <a href="/post/1336245">sagte</a>:</p>
<p dir="auto">Oder im Script etwas angepasst?</p>
</blockquote>
<p dir="auto">Nö. Außer das, wo ich den "author" wie oben beschrieben reingeimpft habe. Deswegen lief das ja auch bei den Liedern. <em>facepalm</em> Mit der unangepassten latest-Version des Skripts steht bei mir bei <em>allen</em> Songs wieder "undefined". Hm.</p>
<p dir="auto">Meine Squeezebox-Adapter-Einstellungen sind wie bei dir. ioBroker ist frisch neu gestartet, half nicht.</p>
]]></description><link>https://forum.iobroker.net/post/1336250</link><guid isPermaLink="true">https://forum.iobroker.net/post/1336250</guid><dc:creator><![CDATA[SmartStuffCoyote]]></dc:creator><pubDate>Fri, 24 Apr 2026 20:25:26 GMT</pubDate></item></channel></rss>