widget_test.png
widget_arcslider_flex.pngwidget_arcslider_f18.png
07.12.25 - Das Widget wird automatisch mit dem Update von Fhem verteilt.
30.11.25 - Anstatt Readings zum individualisieren, wird jetzt userattr verwendet.
29.11.25 - RadialArcButtonSlider nimmt Wert von gemessener Temperatur. Luftfeuchte ausblendbar mit #. Nicht verwendete Buttons komplett ausgeblendet.
23.11.25 - Color for DataUrlSvg repariert.
14.11.25 - RadialArcButtonSlider hinzugefügt. Inputfield entfernt.
08.11.25 - Fhemcmd: "set <devicename> controlMode manual" und Tempbogen gefixed.
08.11.25 - FhemIcons werden korrekt per Skinfarbe eingefärbt.
08.11.25 - Separator :fhem entfernt. Überbleibsel vom externen auswählen der SvgIcons.
Hallo zusammen,
ControlMiniDash ist ein kleines Dashboard-Widget, das sich zum Steuern von Thermostaten und Klimageräten eignet.
Das Widget wird ab dem 07.12.25 automatisch mit dem FHEM-Update verteilt und kann direkt im jeweiligen Device definiert werden.
Aktuell enthaltene Funktionen:
- Es besteht aus vier Textelementen in der Mitte:
- Gemessene Temperatur
- Luftfeuchtigkeit
- Gewünschte Temperatur
- Freitextfeld bzw. Statusfeld
- Auf dem Bogen befindet sich ein Sliderbutton für die gewünschte Temperatur.
- Der Außenring ändert seine Farbe abhängig von der Temperatur (7 °C bis 30 °C).
- Links (Von oben nach unten - 1 bis 3) und rechts (von oben nach unten 4 -6) können jeweils drei frei belegbare Buttons definiert werden.
- Den Buttons können DataURLs sowie FHEM-SVGs zugewiesen werden.
- Unterstützt werden sowohl typische FHEM-Befehle als auch direktes Perl.
Alle Informationen zum Widget sammele ich nach und nach im Wikiartikel:
https://wiki.fhem.de/wiki/FHEMWEB/ControlMiniDash
Gruß schwatter
Da hast du viel Code in einen Dummy gesteckt. Kann man machen. Besser wäre, wenn man schon so viel Aufwand investiert, ein FHEM-Widget mit dieser Funktionalität zu erstellen, welches man in anderen Modulen nutzen könnte, die FHEM-Widgets unterstützen (siehe https://wiki.fhem.de/wiki/FHEMWEB/Widgets).
Moin,
mh, ja – ich bin da so reingerutscht, weil ich ein echter DAU bin :)
Eigentlich ist es nur ein angepasster Powerflow/Energyflow. Ich hatte mir schon mal die DateTimePicker-Widgets in FHEM angeschaut.
Auf den ersten Blick scheint es so, als bräuchte ich einen Wrapper. Außerdem muss ich prüfen, ob alles so funktioniert, wie ich es will,
oder ob ich mit Abstrichen leben kann. Deinem Ring würden ein paar Cmd-Knöpfe übrigens auch gut stehen ;)
Gruß schwatter
Naja, wenn du es selbst programmiert hast und nicht die KI, dann kannst du kein DAU sein :)
Die Card-Funktion auf Widgets auszuweiten, habe ich auch schon überlegt. Deswegen hatte ich sie schon vorausschauend Card und nicht Plot genannt. Allerdings habe ich mich bisher nicht durchgerungen, da was zu machen. Zumal man dann intensiver in Javascript einsteigen müsste. Ein paar vernünftige FHEM-Widgets würden dem FHEM-System nicht schaden, zumal die bisherigen nur rudimentäre Funktionalität bieten und vor allem keine zeitgemäße Optik aufweisen. Klar, kann man sich schöne Dashboards mit TabletUI basteln, aber dann müsste ich zwei Oberflächen/Systeme pflegen. Dann würde ich vermutlich direkt auf Home Assistent wechseln, da hat man gleich eine schöne Oberfläche dabei.
Mal sehen, ein Widget konnte ich laut Konsole schonmal laden. Nur noch nichts anzeigen. Ich schaue mir mal alle Widgets an, vielleicht wird es ja.
Edit:
Zum bearbeiten der SVG und Korrekturlesen nehme ich aber definitiv KI. Früher habe ich manchmal Wochenlang einen Fehler gesucht.
Da ist mir die Zeit mittlerweile zu schade. Und selbst der DEV von Valetudo outet sich da. Das Beste aus beiden Welten vereinen,
würde ich sagen.
Edit2:
Ich will einfach das Fhemweb etwas schöner wird.
Gruß schwatter
Wenn du etwas Brauchbares ans laufen bekommst, dann kann ich mir das anschauen und darauf basierend aus dem uitable-Arsenal evtl. weitere bauen. Im DOIF kann man in uitable beliebig viele FHEM-Widgets tabellarisch nutzen. Ich weiß gerade nicht, ob man mehrere Informationen (Readings) an das FHEM-Widget übergeben kann oder nur eine. Ggf. müsste man die Schnittstelle erweitern oder etwas Eigenes bauen.
Nabend,
ich habe mich an fhemweb_iconButtons.js orientiert. Hier der erste Versuch , daraus ein Widget zu machen.
Was funktioniert:
- SVG wird direkt mit JS gebaut.
- 4 Werte können übergeben werden
- Die Werte werden auch aktualisiert beim set
- Was funktioniert noch nicht:
- Die Buttons (Icons,Cmd's,...)
- Mobileansicht
Installieren zum Test:
1. fhemweb_controlminidash.js nach /opt/fhem/www/pgm2. Eigentümer:fhem, Gruppe:dialout.
2. Dummy zum testen
defmod widgetDummy dummy
attr widgetDummy readingList measured-temp humidity desired-temp status
attr widgetDummy room Test
attr widgetDummy setList measured-temp humidity desired-temp status
attr widgetDummy webCmd controlMD
attr widgetDummy widgetOverride controlMD:controlminidash,measured-temp,humidity,desired-temp,status
setstate widgetDummy cooling
setstate widgetDummy 2025-10-31 19:36:42 desired-temp 22
setstate widgetDummy 2025-10-31 18:47:19 humidity 53
setstate widgetDummy 2025-10-31 19:36:57 measured-temp 15
setstate widgetDummy 2025-10-31 16:06:19 status cooling
Mh, wenn ich in f18 "Wrap columns on small screen" und "Show all columns in portrait mode" aktiviere, dann funktioniert Mobile.
Ja klar, weil sonst der erweiterte CmdInput ausgeblendet wird, in dem sich das Widget befindet.
Weiß noch nicht, ob ich das gut finde.
Der Anfang ist gemacht. Jetzt muss das Widget noch auf Eingaben reagieren, also direkt bedienbar sein.
beta9.png
Moin,
ich hab mein Problem mit der Mobileansicht lösen können. Dazu die informid vom dev, sprich Device, komplett entfernen.
$(`td[informid="${dev}"]`).remove();Und zack ist das Widget immer sichtbar.
Update:
- SVG als Data-URL funktionieren
- Fix für Mobileansicht
- CmdButtons funktionieren
- Text wird von Fhem eingefärbt. Dadurch ist Backgroundcolor obsolet.
- Smooth Transition für den Farbbogen.
ToDo
- Einfärben der Icons
- Einfügen von Fhemicons ermöglichen
- Ausblenden von CmdButtons wenn nicht gesetzt
- Sliderbutton auf dem Bogen
- ...
Beispieldummy:
defmod widgetDummyBeta9 dummy
attr widgetDummyBeta9 readingList measured-temp humidity desired-temp status
attr widgetDummyBeta9 room Test
attr widgetDummyBeta9 setList measured-temp humidity desired-temp status
attr widgetDummyBeta9 webCmd controlMD
attr widgetDummyBeta9 widgetOverride controlMD:controlminidash,measured-temp,humidity,desired-temp,status
setstate widgetDummyBeta9 cooling
setstate widgetDummyBeta9 2025-11-01 23:06:38 btn1Color grey
setstate widgetDummyBeta9 2025-11-01 23:23:48 btn1Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.79%2C13.95L18.46%2C14.57L16.46%2C13.44V10.56L18.46%2C9.43L20.79%2C10.05L21.31%2C8.12L19.54%2C7.65L20%2C5.88L18.07%2C5.36L17.45%2C7.69L15.45%2C8.82L13%2C7.38V5.12L14.71%2C3.41L13.29%2C2L12%2C3.29L10.71%2C2L9.29%2C3.41L11%2C5.12V7.38L8.5%2C8.82L6.5%2C7.69L5.92%2C5.36L4%2C5.88L4.47%2C7.65L2.7%2C8.12L3.22%2C10.05L5.55%2C9.43L7.55%2C10.56V13.45L5.55%2C14.58L3.22%2C13.96L2.7%2C15.89L4.47%2C16.36L4%2C18.12L5.93%2C18.64L6.55%2C16.31L8.55%2C15.18L11%2C16.62V18.88L9.29%2C20.59L10.71%2C22L12%2C20.71L13.29%2C22L14.7%2C20.59L13%2C18.88V16.62L15.5%2C15.17L17.5%2C16.3L18.12%2C18.63L20%2C18.12L19.53%2C16.35L21.3%2C15.88L20.79%2C13.95M9.5%2C10.56L12%2C9.11L14.5%2C10.56V13.44L12%2C14.89L9.5%2C13.44V10.56Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-01 23:00:47 btn2Cmd { fhem("set HmIP_WZ_WTH desired-temp ".(ReadingsVal("HmIP_WZ_WTH","desired-temp",22)-0.5)) }
setstate widgetDummyBeta9 2025-11-01 23:06:28 btn2Color grey
setstate widgetDummyBeta9 2025-11-01 23:17:23 btn2Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M17%2C11V13H7V11H17Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-01 22:50:44 btn3Cmd set Lampe02_Arb off
setstate widgetDummyBeta9 2025-11-01 23:06:43 btn3Color grey
setstate widgetDummyBeta9 2025-11-01 23:25:18 btn3Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M13.13%2022.19L11.5%2018.36C13.07%2017.78%2014.54%2017%2015.9%2016.09L13.13%2022.19M5.64%2012.5L1.81%2010.87L7.91%208.1C7%209.46%206.22%2010.93%205.64%2012.5M19.22%204C19.5%204%2019.75%204%2019.96%204.05C20.13%205.44%2019.94%208.3%2016.66%2011.58C14.96%2013.29%2012.93%2014.6%2010.65%2015.47L8.5%2013.37C9.42%2011.06%2010.73%209.03%2012.42%207.34C15.18%204.58%2017.64%204%2019.22%204M19.22%202C17.24%202%2014.24%202.69%2011%205.93C8.81%208.12%207.5%2010.53%206.65%2012.64C6.37%2013.39%206.56%2014.21%207.11%2014.77L9.24%2016.89C9.62%2017.27%2010.13%2017.5%2010.66%2017.5C10.89%2017.5%2011.13%2017.44%2011.36%2017.35C13.5%2016.53%2015.88%2015.19%2018.07%2013C23.73%207.34%2021.61%202.39%2021.61%202.39S20.7%202%2019.22%202M14.54%209.46C13.76%208.68%2013.76%207.41%2014.54%206.63S16.59%205.85%2017.37%206.63C18.14%207.41%2018.15%208.68%2017.37%209.46C16.59%2010.24%2015.32%2010.24%2014.54%209.46M8.88%2016.53L7.47%2015.12L8.88%2016.53M6.24%2022L9.88%2018.36C9.54%2018.27%209.21%2018.12%208.91%2017.91L4.83%2022H6.24M2%2022H3.41L8.18%2017.24L6.76%2015.83L2%2020.59V22M2%2019.17L6.09%2015.09C5.88%2014.79%205.73%2014.47%205.64%2014.12L2%2017.76V19.17Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-01 23:47:05 btn4Color red
setstate widgetDummyBeta9 2025-11-01 23:25:56 btn4Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M8.5%204.5L5.4%209.5L8.5%2014.7L5.2%2020.5L3.4%2019.6L6.1%2014.7L3%209.5L6.7%203.6L8.5%204.5M14.7%204.4L11.6%209.5L14.7%2014.5L11.4%2020.3L9.6%2019.4L12.3%2014.5L9.2%209.5L12.9%203.5L14.7%204.4M21%204.4L17.9%209.5L21%2014.5L17.7%2020.3L15.9%2019.4L18.6%2014.5L15.5%209.5L19.2%203.5L21%204.4%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-01 23:01:16 btn5Cmd { fhem("set HmIP_WZ_WTH desired-temp ".(ReadingsVal("HmIP_WZ_WTH","desired-temp",22)+0.5)) }
setstate widgetDummyBeta9 2025-11-01 23:06:54 btn5Color grey
setstate widgetDummyBeta9 2025-11-01 23:26:33 btn5Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M11%2C7H13V11H17V13H13V17H11V13H7V11H11V7Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-01 22:57:32 btn6Cmd set Lampe02_Arb on:set Lampe02_Arb off
setstate widgetDummyBeta9 2025-11-01 23:06:59 btn6Color grey
setstate widgetDummyBeta9 2025-11-01 23:26:59 btn6Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C3A9%2C9%200%200%2C0%203%2C12A9%2C9%200%200%2C0%2012%2C21A9%2C9%200%200%2C0%2021%2C12A9%2C9%200%200%2C0%2012%2C3M12%2C19A7%2C7%200%200%2C1%205%2C12A7%2C7%200%200%2C1%2012%2C5A7%2C7%200%200%2C1%2019%2C12A7%2C7%200%200%2C1%2012%2C19M13%2C17H11V7H13V17Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyBeta9 2025-11-02 08:58:20 desired-temp 7
setstate widgetDummyBeta9 2025-10-31 18:47:19 humidity 53
setstate widgetDummyBeta9 2025-11-02 09:18:37 measured-temp 15
setstate widgetDummyBeta9 2025-10-31 16:06:19 status cooling
Ich denke, das wird was.
Es sollte allerdings möglich sein, ein Standard-Thermostat ohne zusätzliche Readings zu definieren und die Individualisierung über Readings optional anzubieten. Vor allem die Angabe der Icons im Reading ist zu kryptisch für den Normalanwender. Aber du bastelst ja noch.
Moin,
ich stimme dir zu, möglichst einfach. Anhand der Readingposition kann der Setter bestimmt werden. In meinem Fall mit Hm und HmIp ist es desired-temp.
Dann gibt es aber noch viele andere Optionen bzw Setter. Manual, Automatik,Tag,Nacht,On,Off,...
Da muss ich schauen, welche nehmen und welche nicht.
Fhemicons klappt jetzt. Auch diese müssten dann direkt gesetzt werden, damit der Benutzer nicht viel machen muss.
Ich denke da müsste ich die Readings von 4 auf 10 erhöhen.
Und per widgetOverride dann zuteilen.
Ich mag alles lieber frei definierbar, mal sehen ob es 2 Versionen werden oder alles
unter einen Hut.
Gruß schwatter
Ja, es ist nicht immer einfach. Zu komplizierte Dinge werden allerdings erfahrungsgemäß von Anwendern nicht angenommen. Daher besser möglichst viel vorbelegen und im Bedarfsfall optional konfigurierbar machen. Für den Einstieg sollte die Hemmschwelle nicht zu hoch sein. Wenn es erstmal läuft, fangen die Leute an die Doku genauer zu studieren, weil sie dann individualisieren wollen ;)
Zwei Versionen will man nicht wirklich dauerhaft pflegen.
climacontrol.png
Nabend,
ja, ich stimme zu. Zwei Versionen will ich nicht pflegen. Ich habe jetzt versucht, alles zu verschmelzen.
Hier und da nach ein paar Bugs. Einen Bogenslider hatte ich auch schon drin, aber wir Beiden stehen noch
auf Kriegsfuß. Daher erstmal ein MiniSetFeld, unten in der Mitte.
Hier 2 Beispiele:
User-freundlich:
defmod widgetDummyFhemSVG dummy
attr widgetDummyFhemSVG readingList measured-temp humidity desired-temp status btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyFhemSVG room Test
attr widgetDummyFhemSVG setList measured-temp humidity desired-temp status btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyFhemSVG subType Thermostat
attr widgetDummyFhemSVG webCmd climacontrol
attr widgetDummyFhemSVG widgetOverride climacontrol:controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual:fhem@manual,rc_MINUS:fhem@temp-5,sani_heating_boost:fhem@boost,sani_heating_automatic:fhem@automatic,rc_PLUS:fhem@temp+5,sani_heating_mode:fhem@night_day
setstate widgetDummyFhemSVG night_day
setstate widgetDummyFhemSVG 2025-11-06 20:43:22 desired-temp 15
setstate widgetDummyFhemSVG 2025-11-03 21:05:23 humidity 54
setstate widgetDummyFhemSVG 2025-11-06 11:51:34 measured-temp 15
setstate widgetDummyFhemSVG 2025-11-06 20:43:13 state night_day
setstate widgetDummyFhemSVG 2025-11-03 21:05:27 status heating
User-feindlich
defmod widgetDummyDataUrlSVG dummy
attr widgetDummyDataUrlSVG readingList on off measured-temp humidity desired-temp status btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyDataUrlSVG room Test
attr widgetDummyDataUrlSVG setList on off measured-temp humidity desired-temp status btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyDataUrlSVG subType Thermostat
attr widgetDummyDataUrlSVG webCmd climacontrol
attr widgetDummyDataUrlSVG widgetOverride climacontrol:controlminidash,measured-temp,humidity,desired-temp,status
setstate widgetDummyDataUrlSVG 21.5
setstate widgetDummyDataUrlSVG 2025-11-06 20:28:15 btn1Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.79%2C13.95L18.46%2C14.57L16.46%2C13.44V10.56L18.46%2C9.43L20.79%2C10.05L21.31%2C8.12L19.54%2C7.65L20%2C5.88L18.07%2C5.36L17.45%2C7.69L15.45%2C8.82L13%2C7.38V5.12L14.71%2C3.41L13.29%2C2L12%2C3.29L10.71%2C2L9.29%2C3.41L11%2C5.12V7.38L8.5%2C8.82L6.5%2C7.69L5.92%2C5.36L4%2C5.88L4.47%2C7.65L2.7%2C8.12L3.22%2C10.05L5.55%2C9.43L7.55%2C10.56V13.45L5.55%2C14.58L3.22%2C13.96L2.7%2C15.89L4.47%2C16.36L4%2C18.12L5.93%2C18.64L6.55%2C16.31L8.55%2C15.18L11%2C16.62V18.88L9.29%2C20.59L10.71%2C22L12%2C20.71L13.29%2C22L14.7%2C20.59L13%2C18.88V16.62L15.5%2C15.17L17.5%2C16.3L18.12%2C18.63L20%2C18.12L19.53%2C16.35L21.3%2C15.88L20.79%2C13.95M9.5%2C10.56L12%2C9.11L14.5%2C10.56V13.44L12%2C14.89L9.5%2C13.44V10.56Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:30:51 btn2Cmd { fhem("set widgetDummyDataUrlSVG desired-temp ".(ReadingsVal("widgetDummyDataUrlSVG","desired-temp",0)+0.5)) }
setstate widgetDummyDataUrlSVG 2025-11-05 21:16:23 btn2Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M17%2C11V13H7V11H17Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:25:41 btn3Cmd set widgetDummyDataUrlSVG off
setstate widgetDummyDataUrlSVG 2025-11-06 20:27:05 btn3Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:27:32 btn4Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M8.5%204.5L5.4%209.5L8.5%2014.7L5.2%2020.5L3.4%2019.6L6.1%2014.7L3%209.5L6.7%203.6L8.5%204.5M14.7%204.4L11.6%209.5L14.7%2014.5L11.4%2020.3L9.6%2019.4L12.3%2014.5L9.2%209.5L12.9%203.5L14.7%204.4M21%204.4L17.9%209.5L21%2014.5L17.7%2020.3L15.9%2019.4L18.6%2014.5L15.5%209.5L19.2%203.5L21%204.4%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 12:27:15 btn5Cmd { fhem("set widgetDummyDataUrlSVG desired-temp ".(ReadingsVal("widgetDummyDataUrlSVG","desired-temp",0)+0.5)) }
setstate widgetDummyDataUrlSVG 2025-11-05 21:16:01 btn5Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M11%2C7H13V11H17V13H13V17H11V13H7V11H11V7Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:25:31 btn6Cmd set widgetDummyDataUrlSVG on
setstate widgetDummyDataUrlSVG 2025-11-06 20:26:48 btn6Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2M12%2C7A5%2C5%200%200%2C0%207%2C12A5%2C5%200%200%2C0%2012%2C17A5%2C5%200%200%2C0%2017%2C12A5%2C5%200%200%2C0%2012%2C7Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:30:54 desired-temp 25
setstate widgetDummyDataUrlSVG 2025-10-31 18:47:19 humidity 53
setstate widgetDummyDataUrlSVG 2025-11-06 19:07:00 measured-temp 12
setstate widgetDummyDataUrlSVG 2025-11-06 20:29:01 off
setstate widgetDummyDataUrlSVG 2025-11-06 20:28:57 on
setstate widgetDummyDataUrlSVG 2025-11-02 19:10:30 state 21.5
setstate widgetDummyDataUrlSVG 2025-11-05 20:18:40 status Heating
Schön. Sobald ich etwas mehr Zeit habe, werde ich mir deine Lösung genauer anschauen, um ggf. weitere Widgets auf deiner Basis zu erstellen.
Ich könnte mir vorstellen in einer uiTable alle Räume mit Thermostaten abzubilden, allerdings sehe ich das Problem, dass du offenbar immer nur von einem Widget pro Device ausgehst. Wäre es nicht sinnvoller für die Konfiguration statt Readings user-Attribute zu verwenden?
Momentan ja, 1 Widget pro Device. Wenn ich mehrere, sagen wir Thermostate, gruppieren möchte, würde ich zu room und subType greifen.
Du hast vom DOIF den Anspruch, möglichst viel in einen Table zu packen, aber da sag ich als User, find ich zu viel.
Manchmal kann es auch mal nur ein kleines Element sein.
Ich nutze viel Handy anstatt Desktop.
Abgesehen davon, mag ich Strings in Readings abzulegen.
Ich muss aber auch gestehen, userattr hab ich noch nie genutzt.
Nicht mal angeschaut, mach ich jetzt mal.
Gruß schwatter
OK. Dann wäre es das erste Widget, was es nicht unterstützt. Raumansicht ist leider kein Ersatz für eine "Dashboard"-Darstellung.
widget_test.png
Meinst du das in etwa so? Die Buttons und auch das set sind noch nicht gemapped. Aber die angezeigten Readings. Ob ich das will, weiß ich noch nicht.
Ein Kontrolwidget reicht mir. Aber, ich gebe zu, zur Visualierung für mehrere Ringe oder was man sonst noch aus SVG basteln kann ist es super.
Auch sowas könnte damit umgesetzt werden:https://previews.123rf.com/images/liborpal/liborpal2301/liborpal230100005/197028818-old-analog-ammeter-on-a-white-background-measurement-of-electric-current.jpg
Edit:
Mehrere Def per widgetOverride funktionieren doch. Daher habe ich das JS im Anhang wieder entfernt.
defmod widgetDummyDataUrlSVG dummy
attr widgetDummyDataUrlSVG readingList on off measured-temp humidity desired-temp status measured-temp1 humidity1 desired-temp desired-temp1 desired-temp2 status1 measured-temp2 humidity2 desired-temp status2 btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyDataUrlSVG room Test
attr widgetDummyDataUrlSVG setList on off measured-temp humidity desired-temp status measured-temp1 humidity1 desired-temp desired-temp1 desired-temp2 status1 measured-temp2 humidity2 desired-temp status2 btn1Icon btn2Icon btn3Icon btn4Icon btn5Icon btn6Icon btn1Cmd btn2Cmd btn3Cmd btn4Cmd btn5Cmd btn6Cmd
attr widgetDummyDataUrlSVG subType Thermostat
attr widgetDummyDataUrlSVG webCmd climacontrol:climacontrol1:climacontrol2
attr widgetDummyDataUrlSVG widgetOverride climacontrol:controlminidash,measured-temp,humidity,desired-temp,status climacontrol1:controlminidash,measured-temp,humidity,desired-temp,status climacontrol2:controlminidash,measured-temp,humidity,desired-temp,status climacontrol:controlminidash,measured-temp,humidity,desired-temp,status climacontrol1:controlminidash,measured-temp1,humidity1,desired-temp1,status climacontrol2:controlminidash,measured-temp2,humidity2,desired-temp2,status
setstate widgetDummyDataUrlSVG 21.5
setstate widgetDummyDataUrlSVG 2025-11-06 20:28:15 btn1Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.79%2C13.95L18.46%2C14.57L16.46%2C13.44V10.56L18.46%2C9.43L20.79%2C10.05L21.31%2C8.12L19.54%2C7.65L20%2C5.88L18.07%2C5.36L17.45%2C7.69L15.45%2C8.82L13%2C7.38V5.12L14.71%2C3.41L13.29%2C2L12%2C3.29L10.71%2C2L9.29%2C3.41L11%2C5.12V7.38L8.5%2C8.82L6.5%2C7.69L5.92%2C5.36L4%2C5.88L4.47%2C7.65L2.7%2C8.12L3.22%2C10.05L5.55%2C9.43L7.55%2C10.56V13.45L5.55%2C14.58L3.22%2C13.96L2.7%2C15.89L4.47%2C16.36L4%2C18.12L5.93%2C18.64L6.55%2C16.31L8.55%2C15.18L11%2C16.62V18.88L9.29%2C20.59L10.71%2C22L12%2C20.71L13.29%2C22L14.7%2C20.59L13%2C18.88V16.62L15.5%2C15.17L17.5%2C16.3L18.12%2C18.63L20%2C18.12L19.53%2C16.35L21.3%2C15.88L20.79%2C13.95M9.5%2C10.56L12%2C9.11L14.5%2C10.56V13.44L12%2C14.89L9.5%2C13.44V10.56Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 22:11:25 btn2Cmd { fhem("set widgetDummyDataUrlSVG desired-temp ".(ReadingsVal("widgetDummyDataUrlSVG","desired-temp",0)-0.5)) }
setstate widgetDummyDataUrlSVG 2025-11-05 21:16:23 btn2Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M17%2C11V13H7V11H17Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:25:41 btn3Cmd set widgetDummyDataUrlSVG off
setstate widgetDummyDataUrlSVG 2025-11-06 20:27:05 btn3Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:27:32 btn4Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M8.5%204.5L5.4%209.5L8.5%2014.7L5.2%2020.5L3.4%2019.6L6.1%2014.7L3%209.5L6.7%203.6L8.5%204.5M14.7%204.4L11.6%209.5L14.7%2014.5L11.4%2020.3L9.6%2019.4L12.3%2014.5L9.2%209.5L12.9%203.5L14.7%204.4M21%204.4L17.9%209.5L21%2014.5L17.7%2020.3L15.9%2019.4L18.6%2014.5L15.5%209.5L19.2%203.5L21%204.4%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 12:27:15 btn5Cmd { fhem("set widgetDummyDataUrlSVG desired-temp ".(ReadingsVal("widgetDummyDataUrlSVG","desired-temp",0)+0.5)) }
setstate widgetDummyDataUrlSVG 2025-11-05 21:16:01 btn5Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M11%2C7H13V11H17V13H13V17H11V13H7V11H11V7Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-06 20:25:31 btn6Cmd set widgetDummyDataUrlSVG on
setstate widgetDummyDataUrlSVG 2025-11-06 20:26:48 btn6Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2M12%2C7A5%2C5%200%200%2C0%207%2C12A5%2C5%200%200%2C0%2012%2C17A5%2C5%200%200%2C0%2017%2C12A5%2C5%200%200%2C0%2012%2C7Z%22%20%2F%3E%3C%2Fsvg%3E
setstate widgetDummyDataUrlSVG 2025-11-07 13:12:56 desired-temp 22.5
setstate widgetDummyDataUrlSVG 2025-11-07 13:12:20 desired-temp1 17.5
setstate widgetDummyDataUrlSVG 2025-11-07 13:12:00 desired-temp2 24
setstate widgetDummyDataUrlSVG 2025-10-31 18:47:19 humidity 53
setstate widgetDummyDataUrlSVG 2025-11-07 12:59:56 humidity1 54
setstate widgetDummyDataUrlSVG 2025-11-07 13:02:19 humidity2 68
setstate widgetDummyDataUrlSVG 2025-11-06 19:07:00 measured-temp 12
setstate widgetDummyDataUrlSVG 2025-11-07 12:59:47 measured-temp1 15
setstate widgetDummyDataUrlSVG 2025-11-07 13:01:21 measured-temp2 25
setstate widgetDummyDataUrlSVG 2025-11-07 13:12:55 off
setstate widgetDummyDataUrlSVG 2025-11-07 13:12:56 on
setstate widgetDummyDataUrlSVG 2025-11-02 19:10:30 state 21.5
setstate widgetDummyDataUrlSVG 2025-11-05 20:18:40 status Heating
Gruß schwatter
Als Beispiel ist hier alles in einem Device. Sowohl die Steuerung als auch die Visualisierung wurde durch eine Schleife generiert. Was hier zeilenweise aus mehreren Widgets definiert wurde, könnte ich mir kompakter und schöner jeweils als ein Widget vorstellen.
Und es macht auch keinen Sinn jeweils die gleichen Definitionen pro Raum auf viele Dummys oder sonstige Devices zu verteilen.
Wenn ich hierbei einen weiteren Raum mit Visualisierung und Steuerung hinzufügen will, dann brauche ich nur eine Zeile in der Definition hinzuzufügen:
z. B.
push (@{$_sc},[qw(Bad TH_Bad_HM H_Bad)]);
Verstehe, das Widget einmalig definieren und einmalig alle Devices als attr ablegen. Und dann kommt ein fertiger Table raus mit allem pro Device.
So, habe den ersten Beitrag mal auf Widget getrimmt und auch die Überschrift vom Thread.
Gruß schwatter
Nabend,
Update im ersten Post.
- Setter überarbeitet. Vorher war nur ein String möglich. "set <devicename> on". Jetzt funktioniert z.B auch "set <devicename> controlMode manual"
- Dadurch habe ich als Separator den Punkt (.) eingeführt. "svgname@controlMode.manual"
- Der SVG-Separator ":fhem" wurde entfernt. Da ich jetzt Fhem interne SVG und externe Data-Url-SVG aus Readings trenne.
- Tempbogen gefixed. Vorher wurde der Bogen über 30°C immer länger
- Doku überarbeitet
- ...
Gruß schwatter
Hab´s mal im DOIF mit einem echten HM-Wandthermostat getestet. Grundfunktionalität scheint gegeben zu sein.
defmod di_widget DOIF ##
attr di_widget room Test
attr di_widget uiTable {package ui_Table;;}\
widget([TH_DG_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")
setstate di_widget initialized
setstate di_widget 2025-11-08 22:35:14 cmd 0
setstate di_widget 2025-11-08 22:35:14 mode enabled
setstate di_widget 2025-11-08 22:35:14 state initialized
Auch mehrere Thermostate in einem Device funktionieren:
defmod di_widget DOIF ##
attr di_widget room Test
attr di_widget uiTable {package ui_Table;;}\
widget([TH_DG_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")|\
widget([TH_Kz_w_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")\
widget([TH_Kz_o_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")|\
widget([TH_Kueche_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")\
widget([TH_Keller_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")|\
widget([TH_Bad_HM:desired-temp],'controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day',"set desired-temp")
Allerdings würde sich der Name des Raumes im Widget gut machen.
Morgen,
funktioniert super in deinem Table. Werde das im ersten Post als Info einfügen.
Screenshot 2025-11-09 084503.png
Zu Raum. Wie immer kann man alles mit Strings erschlagen oder es kurz und knapp halten. Da HM ohnehin alles auf die Channels aufgeteilt hat und man sich bei Devices hier und da userReadings anlegt, mache ich es so: Ich sammle die Informationen in einem Channel, der mir wichtig erscheint. In meinem Fall, ist es die ValvePosition, welche ich aus den HM-CC-RT-DN und meinem HmIP_FALMOT_C12 in die WTH_Climate als Reading setze. Wie du selber siehst, ist der state T: 19.9 desired: 21.0 unglücklich.
Mein userReading mit einen zusätzlichen Hinweis für den Raum wäre dann so:
valveState {
my $v = ReadingsVal("TH_El_Clima","ValvePosition","?");
return "Kdz - V ${v}%";
}
Und dann hier einfügen:
controlminidash,measured-temp,humidity,desired-temp,valveState,...,...
Mal sehen, wenn der Bogenslider richtig funktioniert und das Eingabefeld mit dem Setbutton wegfällt, ob dann noch ein 5tes Stringfeld einzieht.
Gruß schwatter
Im DOIF kann man mit Instanzvariablen arbeiten. Diese lassen sich pro Device deklarieren und innerhalb des Devices nutzen. Damit lassen sich gleichartige Aufrufe kürzer darstellen, siehe unten.
Ebenfalls ist im Regelfall im DOIF, im Gegensatz zu Dummy und Co., die Angabe der Attribute: readingList, setList, webCmd , widgetOverride nicht erforderlich.
defmod di_widget DOIF ##
attr di_widget room Test
attr di_widget uiTable {package ui_Table;;\
$_param='controlminidash,measured-temp,humidity,desired-temp,state,sani_heating_manual@controlMode.manual,rc_MINUS@temp-5,sani_heating_boost@boost,sani_heating_automatic@controlMode.automatic,rc_PLUS@temp+5,sani_heating_mode@night_day';;\
$_set="set desired-temp";;\
}\
widget([TH_DG_HM:desired-temp],$_param,$_set)|\
widget([TH_Kz_w_HM:desired-temp],$_param,$_set)\
widget([TH_Kz_o_HM:desired-temp],$_param,$_set)|\
widget([TH_Kueche_HM:desired-temp],$_param,$_set)\
widget([TH_Keller_HM:desired-temp],$_param,$_set)|\
widget([TH_Bad_HM:desired-temp],$_param,$_set)
Nabend,
ich habe das Beispiel 1zu1 im ersten Post übernommen.
Gruß schwatter
widget_arcslider.png
Nabend,
Update im ersten Post.
- Das Input-Feld wurde durch einen ArcSlider ersetzt.
- Button und HueRing zeigen jederzeit die aktuelle Temperatur an.
- Durch Ziehen des Buttons kann die gewünschte Temperatur eingestellt werden.
- Der Livewert der gewünschten Temperatur wird an der dritten Position angezeigt.
- Nach dem Loslassen des Buttons setzen sich HueRing und Button automatisch wieder auf die aktuelle Temperatur zurück.
Gruß schwatter
Screenshot 2025-11-23 201555.png
Nabend,
Update im ersten Post.
- Color für DataUrlSVG im Arcslider gefixed.
Gruß schwatter
Nachdem du alles getestet hast, kannst nach einem developer-Account anfragen. Damit kannst du deine widgets ins FHEM-Repository einchecken, dann stehen sie allen Usern automatisch zur Verfügung. Natürlich vorher eine vollständige Doku im FHEM-Wiki verfassen.
Nabend,
danke für den Zuspruch, aber das wird noch nichts. Es gibt da ein paar Probleme mit der Fhemkonformität.
- zu wenig Tester.
- mit $(`td[informid="${dev}"]`).remove(); schalte ich den state tot. Vielleicht ist das auch ok und wird geduldet.
- Ist das Widget geladen, dann sind subsets nicht mehr im Deviceoverview sichtbar. Bzw, das Widget drängt sich da rein.
- Erreichbar sind diese aber trotzdem noch, wenn ich z.B ein " set <name> boost on" absetze, aber schön ist das nicht...ich suche noch nach einer Lösung.
Gruß schwatter
Nabend,
Update im ersten Post für Arcsliderwidget.
- Mehrfachladen vom Widget unterbunden. Dadurch wird es in set/get nicht mehr dynamisch erzeugt.
Gruß schwatter
Nabend,
Update im ersten Post für Arcsliderwidget.
- Der Arc-Slider startet jetzt vom gemessenen Wert (measured-temp) statt vom Sollwert, für harmonischere Ring- und Button-Positionen.
- Unbenutzte Buttons werden jetzt komplett ausgeblendet.
- Die 3 Position Luftfeuchte ist jetzt ausblendbar mit #.
Beispiel:
attr HmIP_KLHR_STHD webCmd controlMD auto:manu:boost:on:off
attr HmIP_KLHR_STHD widgetOverride controlMD:controlminidash,measured-temp,#,desired-temp,HEATING_COOLING,#,#,#,#,#,#Gruß schwatter
Moin,
Update im ersten Post für Arcsliderwidget.
- Anstatt Readings zum individualisieren, wird jetzt userattr verwendet.
Hier ein funktionierendes Beispiel:
defmod widgetControlUserAttr dummy
attr widgetControlUserAttr userattr btn1Cmd btn1Color btn1Icon btn2Cmd btn2Color btn2Icon btn3Cmd btn3Color btn3Icon btn4Cmd btn4Color btn4Icon btn5Cmd btn5Color btn5Icon btn6Cmd btn6Color btn6Icon
attr widgetControlUserAttr btn1Cmd set widgetControlUserAttr state cooling
attr widgetControlUserAttr btn1Color blue
attr widgetControlUserAttr btn1Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M20.79%2C13.95L18.46%2C14.57L16.46%2C13.44V10.56L18.46%2C9.43L20.79%2C10.05L21.31%2C8.12L19.54%2C7.65L20%2C5.88L18.07%2C5.36L17.45%2C7.69L15.45%2C8.82L13%2C7.38V5.12L14.71%2C3.41L13.29%2C2L12%2C3.29L10.71%2C2L9.29%2C3.41L11%2C5.12V7.38L8.5%2C8.82L6.5%2C7.69L5.92%2C5.36L4%2C5.88L4.47%2C7.65L2.7%2C8.12L3.22%2C10.05L5.55%2C9.43L7.55%2C10.56V13.45L5.55%2C14.58L3.22%2C13.96L2.7%2C15.89L4.47%2C16.36L4%2C18.12L5.93%2C18.64L6.55%2C16.31L8.55%2C15.18L11%2C16.62V18.88L9.29%2C20.59L10.71%2C22L12%2C20.71L13.29%2C22L14.7%2C20.59L13%2C18.88V16.62L15.5%2C15.17L17.5%2C16.3L18.12%2C18.63L20%2C18.12L19.53%2C16.35L21.3%2C15.88L20.79%2C13.95M9.5%2C10.56L12%2C9.11L14.5%2C10.56V13.44L12%2C14.89L9.5%2C13.44V10.56Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr btn2Cmd { fhem("set widgetControlUserAttr desired-temp ".(ReadingsVal("widgetControlUserAttr","desired-temp",0)-0.5)) }
attr widgetControlUserAttr btn2Color blue
attr widgetControlUserAttr btn2Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M17%2C11V13H7V11H17Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr btn3Cmd set widgetControlUserAttr state off
attr widgetControlUserAttr btn3Icon data:image/svg+xml;;;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr btn4Cmd set widgetControlUserAttr state heating
attr widgetControlUserAttr btn4Color red
attr widgetControlUserAttr btn4Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M8.5%204.5L5.4%209.5L8.5%2014.7L5.2%2020.5L3.4%2019.6L6.1%2014.7L3%209.5L6.7%203.6L8.5%204.5M14.7%204.4L11.6%209.5L14.7%2014.5L11.4%2020.3L9.6%2019.4L12.3%2014.5L9.2%209.5L12.9%203.5L14.7%204.4M21%204.4L17.9%209.5L21%2014.5L17.7%2020.3L15.9%2019.4L18.6%2014.5L15.5%209.5L19.2%203.5L21%204.4%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr btn5Cmd { fhem("set widgetControlUserAttr desired-temp ".(ReadingsVal("widgetControlUserAttr","desired-temp",0)+0.5)) }
attr widgetControlUserAttr btn5Color red
attr widgetControlUserAttr btn5Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M19%2C19V5H5V19H19M19%2C3A2%2C2%200%200%2C1%2021%2C5V19A2%2C2%200%200%2C1%2019%2C21H5A2%2C2%200%200%2C1%203%2C19V5C3%2C3.89%203.9%2C3%205%2C3H19M11%2C7H13V11H17V13H13V17H11V13H7V11H11V7Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr btn6Cmd set widgetControlUserAttr state on
attr widgetControlUserAttr btn6Color green
attr widgetControlUserAttr btn6Icon data:image/svg+xml;;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M12%2C20A8%2C8%200%200%2C1%204%2C12A8%2C8%200%200%2C1%2012%2C4A8%2C8%200%200%2C1%2020%2C12A8%2C8%200%200%2C1%2012%2C20M12%2C2A10%2C10%200%200%2C0%202%2C12A10%2C10%200%200%2C0%2012%2C22A10%2C10%200%200%2C0%2022%2C12A10%2C10%200%200%2C0%2012%2C2M12%2C7A5%2C5%200%200%2C0%207%2C12A5%2C5%200%200%2C0%2012%2C17A5%2C5%200%200%2C0%2017%2C12A5%2C5%200%200%2C0%2012%2C7Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetControlUserAttr readingList measured-temp humidity desired-temp state
attr widgetControlUserAttr room Test
attr widgetControlUserAttr setList measured-temp humidity desired-temp state
attr widgetControlUserAttr subType Thermostat
attr widgetControlUserAttr webCmd climacontrol
attr widgetControlUserAttr widgetOverride climacontrol:controlminidash,measured-temp,humidity,desired-temp,state,#,#,#,#,#,#
setstate widgetControlUserAttr heating
setstate widgetControlUserAttr 2025-11-30 11:51:37 desired-temp 20.0
setstate widgetControlUserAttr 2025-11-30 11:42:42 humidity 56
setstate widgetControlUserAttr 2025-11-30 11:42:48 measured-temp 19
setstate widgetControlUserAttr 2025-11-30 11:51:21 state heating
So langsam wird es was für das SVN. Wikizugang habe ich schonmal beantragt.
Gruß schwatter
Nabend,
ich habe unter Ankündigungen keine Schreibrechte. Daher mache ich das hier.
- Das Widget ist jetzt im SVN
- Hier habe ich einen Querverweis angelegt: https://wiki.fhem.de/wiki/FHEMWEB/Widgets
- Dokumentation ist hier abgelegt: https://wiki.fhem.de/wiki/FHEMWEB/ControlMiniDash
Ich glaube, ich muss noch einen Hinweis in der Commandref unter widgetOverride ablegen?
Habe ich noch etwas vergessen?
Gruß schwatter
hallo Schwatter
das ist ja ein super Widget, endlich geht's mit Fhem in die richtige Richtung weiter.
Ich glaub langsam ich kann bei Fhem bleiben und muss mich nicht mit HA beschäftigen. 😁
Besten Dank
Hallo
soweit funktioniert das Widget schon recht gut.
Ich bin mit dem Sollwert im Konflikt.... In meiener Installation (KNX) habe ich ein Objekt für Sollwert setzen im Regler und eins für Sollwert lesen aus dem Regler. Somit können Aenderungen im Regler und in der Fhem gemacht werden und der jeweils Andere bekommt die Aenderung mit.
Gibt es eine Möglichkeit das einfach zu implementieren oder habe ich etwas falsch verstanden?
gruss
Morgen,
mh, ich kenne KNX nicht vom Aufbau in Fhem. Bzw, wie die Devices sich darstellen. Ist Objekt = Device?.
Ich würde das Widget in dem Device setzen, in dem die Temperatur per set gesetzt wird. Und wenn
es 2 Devices sind, eins für get und eins für set, die Temp vom get-Device per notify in das set-Device
setzen.
Das ist das Beispiel:
attr <device> widgetOverride climacontrol:controlminidash,measured-temp,humidity,desired-temp,state,#,#,#,#,#,#
Die beiden Readings measured-temp und desired-temp sind wichtig:
measured-temp = Ein Reading, Name egal. Wichtig, muss gemessene Temperatur liefern.
humidity = Ein Reading, Name egal. Für Luftfeuchtigkeit oder mit # einfach ausblenden.
desired-temp = Ein Reading, Name egal. Wichtig, muss gewünschte Temperatur setzen.
state = Ein Reading, Name egal. Zur freien Verfügung.
Gruß schwatter
Sollte das Reading der Soll-Temperatur zum Auslesen anders sein als mit set zum Setzen, dann kannst das Widget über DOIF definieren, da geht so was. Man kann sogar die Soll-Temperatur des Widgets im DOIF per setreading setzen.