widget_test.png
widget_arcslider_flex.pngwidget_arcslider_f18.png
03.01.26 - Diverse Bugs gefixed. Silder vom Infofeld entkoppelt.
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.
Besten Dank für eure Hilfe, aber ich kapier das nicht.... sorry.
Ich kann aus dem KNX Device das Reading desired-tem im DoIF Device setzen und bekomme es auch angezeigt. perfekt.
Wenn ich aber im DoIF Device mit dem Arc-Slider eine neue desired-temp setze bekomme ich das Reading nicht im KNX Device geändert.
Anbei das DoIF:
defmod di_Klima_Buero DOIF {}
attr di_Klima_Buero alias Klima Büro Widget
attr di_Klima_Buero event_Readings measured-temp: [EG_Buero_Klima:measured-temp-get-num-only],\
temp_soll: [EG_Buero_Klima:temp_soll_num_only],\
valve: [EG_Buero_Klima:getG4]
attr di_Klima_Buero room Buero
attr di_Klima_Buero uiTable {package ui_Table;;;;}\\
card([[EG_Buero_Klima:getG2:col],[EG_Buero_Klima:getG3:col]],"Büro","temp_inside",15,40,undef,undef,["Ist °C,red","Soll °C,#287afc"],\&temp_hue,"1","180,,,,,,200",undef,undef)|\
widget([di_Klima_Buero:measured-temp],'controlminidash,measured-temp,#,temp_soll,valve,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")
und das KNX Device:
defmod EG_Buero_Klima KNX 4/2/101:dpt9.001:desired-temp 4/1/1:dpt9.001:measured-temp:listenonly 4/2/1:dpt9.001:desired-temp-read:listenonly 4/3/1:dpt5.001:listenonly
attr EG_Buero_Klima IODev myKNXGW
attr EG_Buero_Klima alias Temp Büro
attr EG_Buero_Klima group Raumklima
attr EG_Buero_Klima room Buero,Klima/ Heizung
attr EG_Buero_Klima sortby 8
attr EG_Buero_Klima stateFormat Ist:getG2 | Soll:getG3 | Ventil:getG4
attr EG_Buero_Klima userReadings measured-temp-get-num-only:measured-temp-get.* { ReadingsNum($name, 'measured-temp-get', 0) }, temp_soll_num_only:desired-temp-read-get.* { ReadingsNum($name, 'desired-temp-read-get', 0) }, value_num_only:getG4.* { ReadingsNum($name, 'getG4', 0) }
attr EG_Buero_Klima webCmd value
attr EG_Buero_Klima widgetOverride value:16.5,17.5,18.5,19.5,20.5,21.5,22.5,23.5,24.5 g1
Um eine Hilfestellung wäre ich sehr dankbar.
Offenbar setzt du die Soll-Temperatur mit "set EG_Buero_Klima value <Wert>". Wo ist die dann im KNX-Device sichtbar?
Morgen appi,
kannst du bitte bei beiden Devices jeweils unten auf "Copy for forum.fhem.de" klicken und hier einstellen.
Vielleicht wird daraus das Problem ersichtlich.
Gruß schwatter
Ich hab heute noch etwas geübt, allerdings mit mässigem Erfolg.....
Das widgetOverride direkt im KNX Device funktioniert eigentlich, ausser wenn ich die solltemp direkt am Thermostat an der Wand ändere bekommt dieses Device das nicht mit, weil der neue Soll im Reading solltemp_ist upgedatet wird.
define EG_Buero_Klima KNX 4/2/101:dpt9:solltemp:set:nosuffix 4/1/1:dpt9:measured_temp:get:nosuffix 4/2/1:dpt9:solltemp_ist:get:nosuffix 4/3/1:dpt5.001:valvepos:get:nosuffix
attr EG_Buero_Klima IODev myKNXGW
attr EG_Buero_Klima alias Temp Büro
attr EG_Buero_Klima btn5Cmd { fhem("set widgetControlUserAttr solltemp ".(ReadingsVal("widgetControlUserAttr","solltemp_ist",0)+0.5)) }
attr EG_Buero_Klima comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition
attr EG_Buero_Klima group Raumklima
attr EG_Buero_Klima room Buero,Klima/ Heizung
attr EG_Buero_Klima sortby 8
attr EG_Buero_Klima stateFormat Ist: measured_temp °C | Soll: solltemp_ist °C | Ventil: valvepos
attr EG_Buero_Klima webCmd climacontrol
attr EG_Buero_Klima widgetOverride climacontrol:controlminidash,measured_temp,#,solltemp,valvepos,#,#,#,#,#,#
# CFGFN
# DEF 4/2/101:dpt9:solltemp:set:nosuffix 4/1/1:dpt9:measured_temp:get:nosuffix 4/2/1:dpt9:solltemp_ist:get:nosuffix 4/3/1:dpt5.001:valvepos:get:nosuffix
# FUUID 693a69cd-f33f-fb60-6cfa-11e02ca9bd002cea
# IODev myKNXGW
# LASTInputDev myKNXGW
# MSGCNT 793
# NAME EG_Buero_Klima
# NR 1229
# STATE Ist: 23.3 °C | Soll: 19.5 °C | Ventil: 0 %
# STILLDONETIME 0
# TYPE KNX
# eventCount 887
# model dpt9
# myKNXGW_MSGCNT 793
# myKNXGW_TIME 2025-12-11 15:55:46
# GADDETAILS:
# measured_temp:
# CODE 04101
# MODEL dpt9
# NO 2
# OPTION get
# RDNAMEGET measured_temp
# RDNAMESET measured_temp
# SETLIST
# solltemp:
# CODE 04265
# MODEL dpt9
# NO 1
# OPTION set
# RDNAMEGET solltemp
# RDNAMESET solltemp
# SETLIST
# solltemp_ist:
# CODE 04201
# MODEL dpt9
# NO 3
# OPTION get
# RDNAMEGET solltemp_ist
# RDNAMESET solltemp_ist
# SETLIST
# valvepos:
# CODE 04301
# MODEL dpt5.001
# NO 4
# OPTION get
# RDNAMEGET valvepos
# RDNAMESET valvepos
# SETLIST :slider,0,1,100
# GADTABLE:
# 04101 measured_temp
# 04201 solltemp_ist
# 04265 solltemp
# 04301 valvepos
# Helper:
# READINGS:
# 2025-12-11 13:45:02 IODev myKNXGW
# 2025-12-11 15:55:46 last-sender 1.1.8
# 2025-12-11 15:55:46 measured_temp 23.3
# 2025-12-11 15:53:53 solltemp 22.0
# 2025-12-11 15:54:34 solltemp_ist 19.5
# 2025-12-11 15:55:46 state 23.3
# 2025-12-11 15:54:59 valvepos 0 %
#
setstate EG_Buero_Klima Ist: 23.3 °C | Soll: 19.5 °C | Ventil: 0 %
setstate EG_Buero_Klima 2025-12-11 13:45:02 IODev myKNXGW
setstate EG_Buero_Klima 2025-12-11 15:55:46 last-sender 1.1.8
setstate EG_Buero_Klima 2025-12-11 15:55:46 measured_temp 23.3
setstate EG_Buero_Klima 2025-12-11 15:53:53 solltemp 22.0
setstate EG_Buero_Klima 2025-12-11 15:54:34 solltemp_ist 19.5
setstate EG_Buero_Klima 2025-12-11 15:55:46 state 23.3
setstate EG_Buero_Klima 2025-12-11 15:54:59 valvepos 0 %
Da funktioniert die Version mit dem widgetOverride in einem separaten DoIF Device etwas besser.
Das KNX Device bekommt die Aenderungen des Soll im DoIF nicht mit , hier stehe ich nun etwas hilfloss da..
define di_Klima_Buero DOIF {}
attr di_Klima_Buero alias Klima Büro Widget
attr di_Klima_Buero event_Readings measured-temp: [EG_Buero_Klima:measured_temp],\
solltemp: [EG_Buero_Klima:solltemp],\
solltemp_ist: [EG_Buero_Klima:solltemp_ist],\
valve: [EG_Buero_Klima:valvepos]
attr di_Klima_Buero room Buero
attr di_Klima_Buero uiTable {package ui_Table;;;;}\\
card([[EG_Buero_Klima:measured_temp:col],[EG_Buero_Klima:solltemp_ist:col]],"Büro","temp_inside",15,40,undef,undef,["Ist °C,red","Soll °C,#287afc"],\&temp_hue,"1","180,,,,,,200",undef,undef)|\
widget([EG_Buero_Klima:measured-temp],'controlminidash,measured_temp,#,solltemp,valvepos,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 solltemp")
# CFGFN
# DEF {}
# FUUID 6939b694-f33f-fb60-cdbd-68861a665f10b40c
# MODEL Perl
# NAME di_Klima_Buero
# NOTIFYDEV global,EG_Buero_Klima
# NR 1225
# NTFY_ORDER 50-di_Klima_Buero
# STATE initialized
# TYPE DOIF
# VERSION 30377 2025-10-12 09:46:59
# eventCount 891
# READINGS:
# 2025-12-11 16:37:05 measured-temp 23.1
# 2025-12-10 19:06:12 mode enabled
# 2025-12-11 16:38:54 solltemp 23.0
# 2025-12-11 16:38:54 solltemp_ist 23
# 2025-12-10 19:06:12 state initialized
# 2025-12-11 14:29:06 temp_soll 20.0
# 2025-12-10 19:10:40 temp_soll_num_only 20.5
# 2025-12-11 16:38:59 valve 0 %
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# EG_Buero_Klima:
# collect:
# getG2 ^EG_Buero_Klima$:^getG2:
# getG3 ^EG_Buero_Klima$:^getG3:
# measured-temp ^EG_Buero_Klima$:^measured-temp:
# measured_temp ^EG_Buero_Klima$:^measured_temp:
# solltemo ^EG_Buero_Klima$:^solltemo:
# solltemp_ist ^EG_Buero_Klima$:^solltemp_ist:
# event_Readings:
# EG_Buero_Klima:
# measured-temp:
# measured_temp ^EG_Buero_Klima$:^measured_temp:
# solltemp:
# solltemp ^EG_Buero_Klima$:^solltemp:
# solltemp_ist:
# solltemp_ist ^EG_Buero_Klima$:^solltemp_ist:
# valve:
# valvepos ^EG_Buero_Klima$:^valvepos:
# uiTable:
# EG_Buero_Klima:
# di_Klima_Buero_uiTable_c_1_0_0_0:
# measured_temp ^EG_Buero_Klima$:^measured_temp:
# solltemp_ist ^EG_Buero_Klima$:^solltemp_ist:
# di_Klima_Buero_uiTable_c_1_1_0_0:
# measured-temp ^EG_Buero_Klima$:^measured-temp:
# card:
# collect:
# EG_Buero_Klima getG2:
# 24:
# animate 0
# dim 72
# hours 24
# last
# last_slot 1471159
# last_v 22.3
# max_value 22.3
# max_value_slot 71
# max_value_time 1765390947
# min_value 22.3
# min_value_slot 71
# min_value_time 1765390947
# name EG_Buero_Klima
# reading getG2
# ring 1
# time 1765390987
# type col
# value 22.3
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765390283
# 1765390947
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 22.3
# 22.3
# EG_Buero_Klima getG3:
# 24:
# animate 0
# dim 72
# hours 24
# last
# last_slot 1471214
# last_v 18.5
# max_value 18.5
# max_value_slot 16
# max_value_time 1765390947
# min_value 0
# min_value_slot 71
# min_value_time 1765457756
# name EG_Buero_Klima
# reading getG3
# ring 1
# time 1765457756
# type col
# value 0
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765390283
# 1765390947
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765457756
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 18.5
# 18.5
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 0
# EG_Buero_Klima measured-temp:
# 24:
# animate 0
# dim 72
# hours 24
# last
# last_slot 1471215
# last_v 0
# max_value 0
# max_value_slot 71
# max_value_time 1765458749
# min_value 0
# min_value_slot 71
# min_value_time 1765458749
# name EG_Buero_Klima
# reading measured-temp
# time 1765458749
# type col
# value 0
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765457756
# 1765458749
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 0
# 0
# EG_Buero_Klima measured_temp:
# 24:
# animate 0
# dim 72
# hours 24
# last
# last_slot 1471222
# last_v 23
# max_value 23.3
# max_value_slot 69
# max_value_time 1765464946
# min_value 22.9
# min_value_slot 68
# min_value_time 1765463228
# name EG_Buero_Klima
# reading measured_temp
# ring 1
# time 1765467534
# type col
# value 23.1
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765460228
# 1765460822
# 1765462030
# 1765463228
# 1765464946
# 1765466227
# 1765467425
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 22.9
# 22.9
# 22.9
# 22.9
# 23.3
# 23
# 23.1
# EG_Buero_Klima solltemo:
# 24:
# animate 0
# dim 72
# hours 24
# last_slot 1471215
# last_v
# max_value 0
# max_value_slot 71
# max_value_time 1765458749
# min_value 0
# min_value_slot 71
# min_value_time 1765458749
# name EG_Buero_Klima
# reading solltemo
# time 1765458749
# type col
# value 0
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765458749
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 0
# EG_Buero_Klima solltemp_ist:
# 24:
# animate 0
# dim 72
# hours 24
# last 23
# last_slot 1471222
# last_v 25
# max_value 25.5
# max_value_slot 68
# max_value_time 1765463825
# min_value 19
# min_value_slot 71
# min_value_time 1765466948
# name EG_Buero_Klima
# reading solltemp_ist
# ring 1
# time 1765467534
# type col
# value 23
# times:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 1765460228
# 1765460822
# 1765462030
# 1765463825
# 1765464874
# 1765466061
# 1765466948
# values:
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# undef
# 20
# 20
# 20
# 25.5
# 19.5
# 25
# 19
# condition:
# 0
# event_Readings:
# measured-temp ::ReadingValDoIf($hash,'EG_Buero_Klima','measured_temp')
# solltemp ::ReadingValDoIf($hash,'EG_Buero_Klima','solltemp')
# solltemp_ist ::ReadingValDoIf($hash,'EG_Buero_Klima','solltemp_ist')
# valve ::ReadingValDoIf($hash,'EG_Buero_Klima','valvepos')
# helper:
# NOTIFYDEV global,EG_Buero_Klima
# event last-sender: 1.1.8,valvepos: 0 %,0 %
# globalinit 1
# last_timer 0
# sleeptimer -1
# triggerDev EG_Buero_Klima
# triggerEvents:
# last-sender: 1.1.8
# valvepos: 0 %
# 0 %
# triggerEventsState:
# last-sender: 1.1.8
# valvepos: 0 %
# state: 0 %
# perlblock:
# 0 block_01
# uiState:
# uiTable:
# dev EG_Buero_Klima
# header
#<table uitabid='DOIF-di_Klima_Buero' class=' block wide uiTabledoif doif-di_Klima_Buero ' style='border-top:none;'>
# package package ui_Table;
# reading measured-temp
# table:
# 0:
# 0:
# 0:
# 0 'error syntax error at (eval 2378030) line 1, at EOF
# in expression: \'
# 1:
# 0:
# 0:
# 0 package ui_Table;::DOIF_Widget($hash,$reg,'di_Klima_Buero_uiTable_c_1_0_0_0',card([::ReadingValDoIf($hash,'EG_Buero_Klima','measured_temp','','col'),::ReadingValDoIf($hash,'EG_Buero_Klima','solltemp_ist','','col')],"Büro","temp_inside",15,40,undef,undef,["Ist °C,red","Soll °C,#287afc"],\&temp_hue,"1","180,,,,,,200",undef,undef),"")
# 1:
# 0:
# 0 package ui_Table;::DOIF_Widget($hash,$reg,'di_Klima_Buero_uiTable_c_1_1_0_0',widget(::ReadingValDoIf($hash,'EG_Buero_Klima','measured-temp'),'controlminidash,measured_temp,#,solltemp,valvepos,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 solltemp"),'EG_Buero_Klima','measured-temp')
# tc:
# td:
# 0:
# 1:
# tr:
#
setstate di_Klima_Buero initialized
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_getG2_24_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765390283,1765390947
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_getG2_24_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,22.3,22.3
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_getG3_24_times ,,,,,,,,,,,,,,,1765390283,1765390947,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765457756
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_getG3_24_values ,,,,,,,,,,,,,,,18.5,18.5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_measured-temp_24_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765457756,1765458749
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_measured-temp_24_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_measured_temp_24_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765460228,1765460822,1765462030,1765463228
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_measured_temp_24_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,22.9,22.9,22.9,22.9
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_solltemo_24_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765458749
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_solltemo_24_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_solltemp_ist_24_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1765460228,1765460822,1765462030,1765463228
setstate di_Klima_Buero 2025-12-11 15:36:33 .col_72_EG_Buero_Klima_solltemp_ist_24_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,20,20,20
setstate di_Klima_Buero 2025-12-11 16:37:05 measured-temp 23.1
setstate di_Klima_Buero 2025-12-10 19:06:12 mode enabled
setstate di_Klima_Buero 2025-12-11 16:38:54 solltemp 23.0
setstate di_Klima_Buero 2025-12-11 16:38:54 solltemp_ist 23
setstate di_Klima_Buero 2025-12-10 19:06:12 state initialized
setstate di_Klima_Buero 2025-12-11 14:29:06 temp_soll 20.0
setstate di_Klima_Buero 2025-12-10 19:10:40 temp_soll_num_only 20.5
setstate di_Klima_Buero 2025-12-11 16:38:59 valve 0 %
Normalerweise wird ein FHEM-Widget an ein Device gebunden und nicht an mehrere. Innerhalb des angegebenen Devices kann man die Reading angeben, die man haben will. Beim DOIF kann man im letzten Parameter zusätzlich definieren, wie der Wert gesetzt werden soll, insbesondere wenn die Angabe vom anzuzeigenden Wert abweicht.
Wenn solltemp_ist den aktuellen Wert beinhaltet und man per set EG_Buero_Klima solltemp <Wert> die Temperatur setzt, dann sollte es so funktionieren:
widget([EG_Buero_Klima:solltemp_ist],'controlminidash,measured_temp,#,solltemp_ist,valvepos,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 solltemp")
@appi
Probier mal ein userreading für dein Device EG_Buero_Klima
solltemp:solltemp_ist.* {
my $s = ReadingsVal("EG_Buero_Klima","solltemp_ist","?");
return $s;
}
Gruß schwatter
das wars, besten Dank. Nun funktionieren beide Varianten, als widgetOverride oder im DoIf.
Anbei die zwei Definitionen:
im KNX Device:
defmod EG_Buero_Klima KNX 4/2/101:dpt9:solltemp:set:nosuffix 4/1/1:dpt9:measured_temp:get:nosuffix 4/2/1:dpt9:solltemp_ist:get:nosuffix 4/3/1:dpt5.001:valvepos:get:nosuffix
attr EG_Buero_Klima_neu IODev myKNXGW
attr EG_Buero_Klima_neu alias Temp Büro
attr EG_Buero_Klima_neu comment GAs: SollTemp-schreiben, IstTemp, SollTemp-lesen, ValvePosition
attr EG_Buero_Klima_neu group Raumklima
attr EG_Buero_Klima_neu room Buero,Klima/ Heizung
attr EG_Buero_Klima_neu sortby 8
attr EG_Buero_Klima_neu userReadings solltemp:solltemp_ist.* {\
my $s = ReadingsVal("EG_Buero_Klima","solltemp_ist","?");;\
return $s;;\
}
attr EG_Buero_Klima_neu webCmd climacontrol
attr EG_Buero_Klima_neu widgetOverride climacontrol:controlminidash,measured_temp,#,solltemp,valvepos,#,#,#,#,#,#
und im DoIF:
defmod di_Klima_Buero DOIF {}
attr di_Klima_Buero alias Klima Büro Widget
attr di_Klima_Buero event_Readings measured-temp: [EG_Buero_Klima:measured_temp],solltemp: [EG_Buero_Klima:solltemp],solltemp_ist: [EG_Buero_Klima:solltemp_ist],valve: [EG_Buero_Klima:valvepos]
attr di_Klima_Buero room Buero
attr di_Klima_Buero uiTable {package ui_Table;;;;}\\
card([[EG_Buero_Klima:measured_temp:col],[EG_Buero_Klima:solltemp_ist:col]],"Büro","temp_inside",15,40,undef,undef,["Ist °C,red","Soll °C,#287afc"],\&temp_hue,"1","180,,,,,,200",undef,undef)|\
widget([EG_Buero_Klima:solltemp],'controlminidash,measured_temp,#,solltemp,valvepos,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 solltemp")
Danke fürs verschönern von FHEM
Schön das es funktioniert. Ich nehme das Beispiel mit dem abweichenden Reading
mit im Wiki auf.
Gruß schwatter
@appi Warum hast du im DOIF die event_Readings definiert? Sowohl im card-Aufruf als auch im Widget benutzt du Readings aus dem KNX-Device.
@ Damian die event_Readings waren nur für Testzwecke im Device
hallo
wenn ich die Buttons nicht brauche, wie kann ich die Breite des Widget aufs nötige reduzieren?
Morgen,
das habe ich noch nicht berücksichtig. Wo wäre das denn notwendig? Gerne auch ein Bild wenn möglich.
Bei mir sehe ich da kein Bedarf. Würde ich das einbauen, dann wäre mir das Widget optisch zu groß auf dem Handy.
Gruß schwatter
ich arbeite mit f18 zwei Spalten und muss mit der Breite zurechtkommen.... ;D
Screenshot 2025-12-18 083737.png
In der Kombination mit UiTable gefällt es mir schon recht gut
Ah ok, schaue ich mir an.
Gruß schwatter
Danke für dieses großartige Widget!
Die Funktionalität löst unmittelbar neue Wünsche aus...
Bitte nicht als Kritik verstehen, sondern als Anregung das generischer verwenden zu können, z.B. für Kühl/Gefrier-Räume, Geschwindigkeit-Anzeige, usw...
Daher die Wunschliste:
Slider: definieren min/max values. Auch negative werte sollten möglich sein.
ein optionales Attr "cmdTemplate", Beispiel siehe ASC-Modul: ASC_CommandTemplate
Parameterlist:
1.parameter: slider wert und set(cmd) wert.
2.-5. param.: readings die im Zentrum dargestellt werden, wie bisher, allerdings ohne (hart vergebene) Unit, die Unit steht evtl. bereits im reading oder könnte mittels userreading hinzugefügt werden, oder als optionaler param?
6.-xx. param.(buttons): no keine Meinung, denke das passt so perfekt. :)
l.g. und danke für dieses Widget!
erwin
Mahlzeit,
das freut mich.
Zu 1. Das musst du mir nochmal genauer erklären.
Zu 2 bis 5. Ich habe erstmal alles fest verheiratet in Bezug auf Thermostat damit es flutscht. Aber deine Gedanken Teile ich. Steht auf dem Plan.
Das sind ca. 3 Baustellen -> Units, HueBogen und Value.
Zu 6. Bei den Buttons fehlt mir noch ein Togglebutton.
Ich hatte früher schon einen, aber der musste erstmal weichen.
Gruß schwatter
zu 1. parameter:
der readingname(value) soll der wert für den slider sein, und natürlich auch für das set-cmd,
unabhängig von den folgenden 4 parametern, die die darstellung im Zentrum sind - ohne "set-cmd" Möglichkeit.
Entweder den gesamten Text aus dem readingvalue verwenden (inkl. einer Unit), oder wie im Beispiel 2.-5.para "inline".
als Beispiel:
climacontrol:controlminidash,solltemp,measured_temp [°C],solltemp [°C],valvepos [%],Wert4,#,#,#,#,#,#...aber wie schon geschrieben, units kann man auch mittels userreadings oder stateFormat hinzufügen.
PS: Evtl. den set-cmd erst mit mouse-out triggern, bei mir passiert das mehrfach während ich den slider verstelle... - oder ich bin heute zu zittrig....
l.g & danke erwin
Moin,
ah ok, jetzt versteh ich. Der momentane Arrayabruf war einfach Bequemlichkeit in Bezug auf die Anzeige in der Mitte.
Das passt so einfach sehr gut zusammen. Das entkoppeln und ein Reading bzw. String mehr ist unerheblich.
Die variable Angabe mit String und Units habe ich auch beim MinichartWidget so eingebaut wie du es beschreibst. Daher
werde ich das wahrscheinlich so oder so ähnlich übernehmen können. Da das Widget schon sehr groß ist und viel Code aufeinander
prallt, muss ich schauen, das nicht zu viel asynchrones Rendering entsteht. Das mag ich überhaupt nicht, tritt jetzt
aber auch schon etwas auf.
Zum Set des Buttons. Das ist bei mir Rock-Solid. Egal ob Handy mit Finger oder am Pc mit der Mouse. Wird der Button per Touch
oder Klick aktiviert, kann ich Kilometerweit aus dem Widget rausziehen und auch durch die Bewegung den Slider verstellen,
ohne das ein Event im EventMonitor sichtbar ist. Erst beim loslassen wird bei mir das Set gesetzt. Ich nutze Chrome (Handy,Desktop).
Passiert das bei dir auf dem Desktop? Ich kann mich erinnern, vor Jahren hatte ich mal eine Mouse mit defekten Button.
Die gleichen Symptome, Drag and Drap war nicht mehr möglich.
Gruß schwatter
Hi,
Danke fürs Feedback,
ich freue mich, dass du über meine Vorschläge nachdenkst.
Das mit dem Mouse-out: Du hast recht, es liegt an meiner prellenden Mouse-Taste, hab HW getauscht- funktioniert!!
Danke erwin
Nabend,
ich habe zum Testen im contrib ein Update bereitgestellt.
- Readings für Slider und Infofeld in der Mitte sind jetzt getrennt.
- Dadurch ergeben sich jetzt 6 statt 4 Readings. 2 für den Slider und 4 für das Infofeld.
- Neue userattr sind knobColor und knobMinMax.
- Units können jetzt dynamisch mit widgetOverride gesetzt werden.
Einfach downloaden mit:
{ Svn_GetFile('contrib/fhemweb_controlminidash.js', 'www/pgm2/fhemweb_controlminidash.js') }Beispiel dummy:
defmod widgetDummyFhemSVG dummy
attr widgetDummyFhemSVG userattr btn2Cmd btn2Color btn2Icon btn5Cmd btn5Color btn5Icon knobMinMax knobColor
attr widgetDummyFhemSVG btn2Cmd { fhem("set widgetDummyFhemSVG mspeed ".(ReadingsVal("widgetDummyFhemSVG","mspeed",0) - 0.5)) }
attr widgetDummyFhemSVG btn2Color blue
attr widgetDummyFhemSVG 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%22M7%2C12L12%2C7V10H16V14H12V17L7%2C12M22%2C12A10%2C10%200%200%2C1%2012%2C22A10%2C10%200%200%2C1%202%2C12A10%2C10%200%200%2C1%2012%2C2A10%2C10%200%200%2C1%2022%2C12M20%2C12A8%2C8%200%200%2C0%2012%2C4A8%2C8%200%200%2C0%204%2C12A8%2C8%200%200%2C0%2012%2C20A8%2C8%200%200%2C0%2020%2C12Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetDummyFhemSVG btn5Cmd { fhem("set widgetDummyFhemSVG mspeed ".(ReadingsVal("widgetDummyFhemSVG","mspeed",0) + 0.5)) }
attr widgetDummyFhemSVG btn5Color red
attr widgetDummyFhemSVG 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%22M17%2C12L12%2C17V14H8V10H12V7L17%2C12M2%2C12A10%2C10%200%200%2C1%2012%2C2A10%2C10%200%200%2C1%2022%2C12A10%2C10%200%200%2C1%2012%2C22A10%2C10%200%200%2C1%202%2C12M4%2C12A8%2C8%200%200%2C0%2012%2C20A8%2C8%200%200%2C0%2020%2C12A8%2C8%200%200%2C0%2012%2C4A8%2C8%200%200%2C0%204%2C12Z%22%20%2F%3E%3C%2Fsvg%3E
attr widgetDummyFhemSVG knobColor purple,blue,green,yellow,orange,blue
attr widgetDummyFhemSVG knobMinMax -500,500
attr widgetDummyFhemSVG readingList mspeed dspeed boost state test1 test2 test3 test4
attr widgetDummyFhemSVG room Test
attr widgetDummyFhemSVG setList mspeed dspeed boost state test1 test2 test3 test4
attr widgetDummyFhemSVG subType Thermostat
attr widgetDummyFhemSVG webCmd climacontrol
attr widgetDummyFhemSVG widgetOverride climacontrol:controlminidash,mspeed,dspeed,mspeed@km/h,test1@%,dspeed@km/h,test3@%,#,rc_MINUS,#,#,#,#
setstate widgetDummyFhemSVG desired-temp 21.5
setstate widgetDummyFhemSVG 2025-12-25 08:45:59 boost 50
setstate widgetDummyFhemSVG 2025-12-25 21:25:47 dspeed 500.0
setstate widgetDummyFhemSVG 2025-12-25 21:10:04 mspeed 126
setstate widgetDummyFhemSVG 2025-12-25 09:16:59 state desired-temp 21.5
setstate widgetDummyFhemSVG 2025-12-25 09:08:49 test1 boost 30
setstate widgetDummyFhemSVG 2025-12-25 08:48:47 test2 windy
setstate widgetDummyFhemSVG 2025-12-25 09:08:17 test3 fuel 50
Wichtig bei zum Beispiel Thermostat:Vorher:
... widgetOverride
controlMD:controlminidash,measured-temp,humidity,desired-temp,valveState,#,#,#,#,#,#
Nachher:
... widgetOverride
controlMD:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,valveState,#,#,#,#,#,#
Gruß schwatter
Guten Abend,
ich hab soeben getestet, funktioniert wunderbar!
PS: mein widgetoverride:
climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,valvepos,#,#,#,#,#,#,#die ersten 2 param sind für den slider set-cmd / slider-wert, die folgenden für die Anzeige im Zentrum.
Auch knobColor und knobMinMax funktionieren.
Danke erwin
Tag,
ein weiteres Update im contrib.
Beispiel:
attr <deviceNAme> widgetOverride climacontrol:controlminidash,dspeed,dspeed,mspeed@km/h,test1@%,dspeed@km/h,test3@%,#,rc_MINUS,#,#,#,#,compact
Download mit:
{ Svn_GetFile('contrib/fhemweb_controlminidash.js', 'www/pgm2/fhemweb_controlminidash.js') }STRG+F5 nicht vergessen!Gruß schwatter
Hi,
danke für die Weiterentwicklung, funktioniert, auch "compact" - Aufgefallen ist, das bei meine style nicht viel Unterschied in der Höhe ist, die "buttons" links/rechts aber nicht vorhanden sind.
Ich hab jetzt mein KNX-Beispiel aufgebohrt, dass mit plus/minus buttons die Soll-Temp um einen fixen Wert erhöht/reduziert wird.
Bei Bedarf stelle ich das gern zur Verfügung, entweder hier oder im Wiki, würde jedoch warten bis dein code im "offiziellen" SVN ist.
l.g.erwin
Nabend,
das ist so beabsichtigt. Es geht darum nur den Slider und Infos in einem UiTable
im DOIF zu haben. Keine Buttons. Siehe Post #50.
Gruß schwatter
Moin
@erwin
Ich habe gesehen, du hast eine Beispielseite für KNX
https://wiki.fhem.de/wiki/KNX_Device_Definition_-_Beispiele
Da passt es super hin und ich kann ein Querverweis dahin machen.
Ich denke, wenn sich in 7 Tagen keiner meldet, dann checke ich das Update ein.
Gruß schwatter
Danke für das tolle Widget!
funktioniert soweit mit im Kreis mit der Maus, aber wie kann ich die 6 Buttons aktivieren? Laut Wiki nennen sich die btnXCmd.
btn2Cmd { fhem("set _OG_Wohnz_Kamin desired-temp ".(ReadingsVal("_OG_Wohnz_Kamin","desired-temp",0)-0.5)) }ich habe die Minus Taste jetzt so als userattr definiert, klappt aber nicht.
Unknown argument temp-5 choose one of clear defaults:reset,update,old,forceReset readingFilter:multiple-strict,VALVE_ADAPTION,BOOST_TIME,VALVE_STATE_ADJUSTMENT_TOO_SMALL,QUICK_VETO_TIME,PARTY_SET_POINT_TEMPERATURE,WINDOW_STATE,VALVE_STATE,VALVE_STATE_ERROR_POSITION,PARTY_MODE,VALVE_STATE_TOO_TIGHT,SWITCH_POINT_OCCURED,FROST_PROTECTION,ACTUAL_TEMPERATURE,SET_POINT_TEMPERATURE,VALVE_STATE_ADJUSTMENT_TOO_BIG,BOOST_MODE,ACTIVE_PROFILE,LEVEL,SET_POINT_MODE,PARTY_TIME_END,LEVEL_STATUS,ACTUAL_TEMPERATURE_STATUS,PARTY_TIME_START config datapoint boost:off,on off:noArg manu on:noArg desired-temp holiday week-program:1,2,3 party auto:noArgbekomme dann diese Fehlermeldung. Habe ich da was falsch verstanden oder ist die Bezeichnung der Taste "temp-5" und nicht btn2Cmd?
Hi Reinhart!
ich habe gestern begonnen ein Beispiel für KNX ins wiki zu stellen, siehe link in #62, das basiert allerdings auf der version im contrib!
Sollte eigentlich auch für andere DeviceTypen funktionieren, es geht ja "nur" um die entsprechenden readings....
Die in diesem Beispiel gezeigte eventmap behandelt die beiden buttons - und löst das richtige set-cmd aus.
die buttons werden so definert, im widget: <iconname>@<cmd> . .. und das wird mittels eventmap weiterverarbeitet.
l.g. erin
Hallo zusammen,
in dem Zusammenhang habe ich wahrscheinlich einen Bug in der aktuellen contrib-Version gefunden.
Individuell funktioniert nicht richtig mit Fhemsvg, nach dem großen Umbau. Bzw wenn widgetOverride so angelegt ist:
climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,#,#,#,#,#
@Reinhart
Nutz du die aktuelle contrib-Version? Wenn ja, dann funktionieren Fhemperl-Cmd's gerade nur in Verbindung mit externen SVG's. Hier ein einfaches Beispiel:
defmod tcmdWidget dummy
attr tcmdWidget userattr btn2Cmd btn2Color btn2Icon btn5Cmd btn5Color btn5Icon
attr tcmdWidget btn2Cmd { fhem("set tcmdWidget desired-temp ".(ReadingsVal("tcmdWidget","desired-temp",0)-0.5)) }
attr tcmdWidget btn2Color blue
attr tcmdWidget 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 tcmdWidget btn5Cmd { fhem("set tcmdWidget desired-temp ".(ReadingsVal("tcmdWidget","desired-temp",0) + 0.5)) }
attr tcmdWidget btn5Color red
attr tcmdWidget 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 tcmdWidget readingList measured-temp desired-temp humidity state
attr tcmdWidget room Test
attr tcmdWidget setList measured-temp desired-temp humidity state
attr tcmdWidget webCmd climacontrol
attr tcmdWidget widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,#,#,#,#,#
setstate tcmdWidget auto - V.45%
setstate tcmdWidget 2025-12-28 14:56:58 desired-temp 20
setstate tcmdWidget 2025-12-28 14:11:59 humidity 55
setstate tcmdWidget 2025-12-28 14:11:52 measured-temp 22
setstate tcmdWidget 2025-12-28 14:57:11 state auto - V.45%
Bzw. der erwin hat da einen Workaround:
https://wiki.fhem.de/wiki/KNX_Device_Definition_-_Beispiele#RaumThermostat_/_HeizungsAktor
Ich schaue es mir an.
Gruß schwatter
Hallo zusammen,
im contrib ist ein weiteres Update:
- Setbefehle mit mehr als einem String --> "set <devicename> boost on"
- Mit widgetOverride funktionieren jetzt auch Perlbefehle in Verbindung mit userattr. --> fhemsvg@# <-- Hashtag ist dafür der Trigger
Ich hoffe jetzt ist alles abgedeckt.
Installieren mit:
{ Svn_GetFile('contrib/fhemweb_controlminidash.js', 'www/pgm2/fhemweb_controlminidash.js') }Hier 3 widgetOverride-Beispiele
Fhemicon + Fhemcmd only:
attr tcmdWidget widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,rc_MINUS@boost.off,#,#,rc_PLUS@boost.on,#Fhemicon + Fhemcmd bzw. Perlcmd aus userattr
attr tcmdWidget widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,rc_MINUS@#,#,#,rc_PLUS@#,#SVG Data URL aus userattr + + Fhemcmd bzw. Perlcmd aus userattr
attr tcmdWidget widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,#,#,#,#,#Schmeißt die Beispiele hier in den dummy:
defmod tcmdWidget dummy
attr tcmdWidget userattr btn2Cmd btn2Color btn2Icon btn5Cmd btn5Color btn5Icon
attr tcmdWidget btn2Cmd { fhem("set tcmdWidget desired-temp ".(ReadingsVal("tcmdWidget","desired-temp",0) - 0.5)) }
attr tcmdWidget btn2Color blue
attr tcmdWidget 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%22M12%2C20C7.59%2C20%204%2C16.41%204%2C12C4%2C7.59%207.59%2C4%2012%2C4C16.41%2C4%2020%2C7.59%2020%2C12C20%2C16.41%2016.41%2C20%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%2C2M7%2C13H17V11H7%22%20%2F%3E%3C%2Fsvg%3E
attr tcmdWidget btn5Cmd { fhem("set tcmdWidget desired-temp ".(ReadingsVal("tcmdWidget","desired-temp",0) + 0.5)) }
attr tcmdWidget btn5Color red
attr tcmdWidget 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%22M12%2C20C7.59%2C20%204%2C16.41%204%2C12C4%2C7.59%207.59%2C4%2012%2C4C16.41%2C4%2020%2C7.59%2020%2C12C20%2C16.41%2016.41%2C20%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%2C2M13%2C7H11V11H7V13H11V17H13V13H17V11H13V7Z%22%20%2F%3E%3C%2Fsvg%3E
attr tcmdWidget readingList measured-temp desired-temp humidity state
attr tcmdWidget room Test
attr tcmdWidget setList measured-temp desired-temp humidity state
attr tcmdWidget webCmd climacontrol
attr tcmdWidget widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,humidity@%,desired-temp@°C,state,#,rc_MINUS@boost.off,#,#,rc_PLUS@boost.on,#
setstate tcmdWidget boost on
setstate tcmdWidget 2025-12-28 16:40:00 desired-temp 18.5
setstate tcmdWidget 2025-12-28 14:11:59 humidity 55
setstate tcmdWidget 2025-12-28 15:48:53 measured-temp 22
setstate tcmdWidget 2025-12-28 16:45:38 state boost on
Gruß schwatter
Danke euch Beiden, Dummy funktioniert nun bei mir! Ich bau das dann so ein!
im Prinzip hat sich leider nichts geändert, die + und - Tasten steuern ja jetzt den Boost, das funktioniert aber versuche ich das auf den desired-temp (temp-5, temp+5) zu ändern erhalte ich wieder dieselben Fehlermeldungen.
Internals:
DEF 00399F29A00749:1
FUUID 65c75411-f33f-27bd-cd9f-99b80195ed8296b2
IODev d_ccu
NAME Stiegenhaus
NR 2800
STATE T: 14.9, desired: 22.0, valve: 100
TYPE HMCCUCHN
ccuaddr 00399F29A00749:1
ccudevstate active
ccuif HmIP-RF
ccuname HmIP-eTRV-B-2 R4M 00399F29A00749:1
ccurolectrl HEATING_CLIMATECONTROL_TRANSCEIVER
ccurolestate HEATING_CLIMATECONTROL_TRANSCEIVER
ccusubtype TRV-B
ccutype HmIP-eTRV-B-2,R4M
eventCount 446
firmware 1.2.26
readonly no
OLDREADINGS:
READINGS:
2025-12-31 11:11:34 ACTIVE_PROFILE 1
2025-12-31 11:11:34 ACTUAL_TEMPERATURE 14.9
2025-12-31 11:11:34 ACTUAL_TEMPERATURE_STATUS NORMAL
2025-12-31 11:11:34 BOOST_MODE off
2025-12-31 11:11:34 BOOST_TIME 0
2025-12-31 11:11:34 CONFIG_PENDING false
2025-12-31 11:11:34 DUTY_CYCLE false
2025-12-31 11:11:34 FROST_PROTECTION false
2025-12-29 09:43:22 INSTALL_TEST true
2025-12-31 11:11:34 LEVEL 100
2025-12-31 11:11:34 LEVEL_STATUS NORMAL
2025-12-31 11:11:34 LOW_BAT ok
2025-12-31 11:11:34 OPERATING_VOLTAGE 2.6
2025-12-31 11:11:34 OPERATING_VOLTAGE_STATUS NORMAL
2025-12-31 11:11:34 PARTY_MODE false
2025-12-29 09:43:22 PARTY_SET_POINT_TEMPERATURE 0.0
2025-12-29 09:43:22 PARTY_TIME_END
2025-12-29 09:43:22 PARTY_TIME_START
2025-12-31 11:11:34 QUICK_VETO_TIME 0
2025-12-31 11:11:34 RSSI_DEVICE -52
2025-12-31 11:11:34 RSSI_PEER -50
2025-12-31 11:11:34 SET_POINT_MODE auto
2025-12-31 11:11:34 SET_POINT_TEMPERATURE 22.0
2025-12-31 11:11:34 SWITCH_POINT_OCCURED false
2025-12-31 11:11:34 UNREACH alive
2025-12-29 09:43:22 UPDATE_PENDING false
2025-12-29 09:43:22 VALVE_ADAPTION false
2025-12-31 11:11:34 VALVE_STATE ADAPTION_DONE
2025-12-31 11:11:34 VALVE_STATE_ADJUSTMENT_TOO_BIG false
2025-12-31 11:11:34 VALVE_STATE_ADJUSTMENT_TOO_SMALL false
2025-12-31 11:11:34 VALVE_STATE_ERROR_POSITION false
2025-12-31 11:11:34 VALVE_STATE_TOO_TIGHT false
2025-12-31 11:11:34 WINDOW_STATE closed
2025-12-31 11:11:34 activity alive
2025-12-31 11:11:34 battery ok
2025-12-31 11:11:34 boost off
2025-12-31 11:11:34 control 22.0
2025-12-31 11:11:34 desired-temp 22.0
2025-12-31 11:11:34 devstate ok
2025-12-31 11:11:34 hmstate 14.9
2025-12-31 11:11:34 measured-temp 14.9
2025-12-31 11:11:34 rssidevice -52
2025-12-31 11:11:34 rssipeer -50
2025-12-31 11:11:34 state 14.9
2025-12-31 11:11:34 voltage 2.6
2025-12-31 11:11:34 week-program 1
Attributes:
btn2Cmd { fhem("set Stiegenhaus desired-temp ".(ReadingsVal("Stiegenhaus","desired-temp",0) - 0.5)) }
btn2Color blue
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%22M12%2C20C7.59%2C20%204%2C16.41%204%2C12C4%2C7.59%207.59%2C4%2012%2C4C16.41%2C4%2020%2C7.59%2020%2C12C20%2C16.41%2016.41%2C20%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%2C2M7%2C13H17V11H7%22%20%2F%3E%3C%2Fsvg%3E
btn5Cmd { fhem("set Stiegenhaus desired-temp ".(ReadingsVal("Stiegenhaus","desired-temp",0) + 0.5)) }
btn5Color red
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%22M12%2C20C7.59%2C20%204%2C16.41%204%2C12C4%2C7.59%207.59%2C4%2012%2C4C16.41%2C4%2020%2C7.59%2020%2C12C20%2C16.41%2016.41%2C20%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%2C2M13%2C7H11V11H7V13H11V17H13V13H17V11H13V7Z%22%20%2F%3E%3C%2Fsvg%3E
ccuflags ackState,showDeviceReadings
ccuget Value
ccureadingfilter .*
cmdIcon auto:sani_heating_automatic manu:sani_heating_manual boost:sani_heating_boost on:general_an off:general_aus
genericDeviceType thermostat
group CUL_HM
icon hc_wht_regler
room HM_Regler,HomematicIP,Test,_Stiegenhaus
stateFormat T: measured-temp, desired: desired-temp, valve: LEVEL
substexcl desired-temp
userattr btn2Cmd btn2Color btn2Icon btn5Cmd btn5Color btn5Icon
webCmd climacontrol
widgetOverride climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,LEVEL@%,desired-temp@°C,state,#,rc_MINUS@temp-5,#,#,rc_PLUS@temp+5,#
Nachtrag:
wenn ich im widgetoverride die Definition von temp-5 mit "#" ersetze funktioniert die Sollwertvorgabe und es kommt keine Fehlermeldung mehr!
Ich teste das immer wenn ich parallel ein Fenster im QpenCCU öffne und sehe sofort den neuen Sollwert.
climacontrol:controlminidash,measured-temp,desired-temp,measured-temp@°C,LEVEL@%,desired-temp@°C,state,#,#,#,#,#,#
Mahlzeit Reinhart,
temp-5 und temp+5 sind schlechte Platzhalter die suggerieren, sie würden funktionieren.
Weder das Homematic Fhemmodul oder das Widget unterstützen das direkt. Wenn ich demnächst das Widget
update, passe ich auch die Doku an. Benutz dafür die Custombuttons mit z.B btn2Cmd
fhem("set HmIP_WZ_WTH desired-temp ".(ReadingsVal("HmIP_WZ_WTH","desired-temp",0) - 0.5)) }
Gruß schwatter
Nabend,
neues Update im contrib.
- Hijacking von fremden Popup's blockiert
Der Grund dafür, ich hatte eine Idee zu einem Popup-Widget. Dann habe ich mich an einen ganz alten Thread
von justme1968 erinnert.
https://forum.fhem.de/index.php?topic=33766.msg261329#msg261329
Dabei stellte sich heraus, dass die Funktion bereits vorhanden ist.
Unter bestimmten Umständen – wenn sich ein Device mit Popup-Definition und ControlMiniDash im selben Raum befanden – wurde ControlMiniDash in das Popup injiziert.
Frage:
Ich habe in der Commandref DE und ENG, sowie im Wiki geschaut. Finde aber keinen Hinweis auf das PopupWidgetFeature.
Beispieldummy:
defmod popupTest dummy
attr popupTest devStateIcon .*:on:slider:dropDown:dropDownOnOff .*:off:slider:dropDown:dropDownOnOff
attr popupTest room popup
attr popupTest setList slider:slider,0,5,100 dropDown:0,1,2,3,4,5 dropDownOnOff:on,off
attr popupTest webCmd slider:dropDown:dropDownOnOff
setstate popupTest slider 25
setstate popupTest 2026-01-01 22:41:02 state slider 25
Habt ihr dazu einen Hinweis in der Doku gesehen, oder ist es noch nicht dokumentiert?
Gruß schwatter
HI,
ja das geht ganz normal mit den webCmd und widgetoverride Attributen:
attr test_Thermostat webCmd climacontrol:humidity
attr test_Thermostat webCmdLabel TC:Hum
attr test_Thermostat widgetOverride humidity:slider,0,1,100 climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos,clock@.13.3,rc_MINUS@minus.1,#,#,rc_PLUS@plus.1,#
wichtig ist, dass das slider widgetoverride NICHT als letztes steht, sonst würfelt es die contorlmindash param durcheinander.
Edit: es geht auch unterhalb (einzige Änderung):
attr test_Thermostat webCmdLabel TC
:Hum
Moin erwin,
wir reden aneinander vorbei. Mir geht es nicht um die Anordnung der Widgets im Device. Aber danke für das Beispiel.
1.
Ich möchte auf meinem Handy ein Popup der Widgets haben, wenn ich auf z.B das Lampensymbol klicke ohne das Handy dafür immer drehen zu müssen. (Wurde schon eingebaut).
Sogar schon 2015... https://forum.fhem.de/index.php?topic=33766.msg261329#msg261329
Das Popup interessiert mich in diesem Thread aber nur, da sich ControlMiniDash einfach ungefragt in ein anderes Device eingeschmuggelt hat.
Mit dem Patch hab ich das unterbunden.
2.
Wurde die Funktion irgendwo dokumentiert? Wenn nicht hole ich das nach oder wende mich an Rudolf.
https://forum.fhem.de/index.php?topic=33766.msg261329#msg261329
Beispiel:
Wenn du das letzte Update von ControlMiniDash hast. Kommentiere das mal aus:
// Schutz gegen Dialog-Container
//const parentDialog = $('#FW_okDialog').closest('.ui-dialog-content');
//if (parentDialog.length) {
// return null;
//}
Dann die 2 Dummys anlegen:
defmod popupTest dummy
attr popupTest devStateIcon .*:on:slider:dropDown:dropDownOnOff .*:off:slider:dropDown:dropDownOnOff
attr popupTest readingList humidity
attr popupTest room popup
attr popupTest setList slider:slider,0,5,100 dropDown:0,1,2,3,4,5 dropDownOnOff:on,off
attr popupTest webCmd slider:dropDown:dropDownOnOff
setstate popupTest slider 25
setstate popupTest 2026-01-02 01:25:05 state 13 3
defmod thermostatTest dummy
attr thermostatTest readingList desired-temp temperature humidity valvepos
attr thermostatTest room popup
attr thermostatTest setList desired-temp temperature humidity valvepos
attr thermostatTest webCmd climacontrol:humidity
attr thermostatTest webCmdLabel ;\
: ;
attr thermostatTest widgetOverride humidity:slider,0,1,100 climacontrol:controlminidash,desired-temp,desired-temp,temperature@°C,desired-temp@°C,humidity@%,valvepos@%,clock@.13.3,rc_MINUS@minus.1,#,#,rc_PLUS@plus.1,#
setstate thermostatTest 2026-01-02 10:06:51 desired-temp 22
setstate thermostatTest 2026-01-02 10:05:14 humidity 44
setstate thermostatTest 2026-01-02 10:06:43 temperature 22
setstate thermostatTest 2026-01-02 10:06:58 valvepos 15
Zum Abschluss klick bei dem popupTest Dummy auf das Lampensymbol. Dann siehst was ich meine.
1. Das Widget was da nicht sein darf.
2. Das Popup, was wahrscheinlich undokumentiert in devStateIcon existiert.
Gruß schwatter
Ah verstehe,
du nutzt devStateIcon (wg Handy drehen...) , während mein Beispiel ausschlieslich mit webcmd/widgetoverride auskommt (Handy in landscapemode). Das NaN kommt daher, das im state/STATE in deinem Beispiel kein Zahl vorkommt.
Das "einmischen" in andere devices hast du ja bereits gefixt.
re devStateIcon: erlaubt ist lt. doku auch perl in {} und darin auch HTML-code als return string. Daher sollten auch SVG's funktionieren. Das FHEM widgets dort auch funktionieren, war mir nicht bewußt.
l.g. erwin
Moin,
Die Version 0.3.6 aus dem contrib ist eingecheckt und morgen früh im Update.
Die Doku habe ich leicht angepasst und ziehe ich weiter nach.
Gruß schwatter
Um die Warnungen
*** EN www/pgm2/fhemweb_controlminidash.js: ignoring text due to DOS encodingzu vermeiden habe ich die DOS (CR/NL) Line-Endings aus www/pgm2/fhemweb_controlminidash.js entfernt, und diese Version versehentlich eingecheckt, statt es hier zu melden.
Bitte keine Programmdateien mit DOS Zeilenenden einchecken.
Bei .pm wird das per SVN commit hook geprueft, bei .js noch nicht.
Vielen Dank! Da habe ich im Codeeditor die Einstellung vergessen zu setzen.
Ich werde die anderen Widgets nachziehen.
Gruß schwatter