[ControlMiniDash]Fhemweb Widget für Thermostat,KlimaControl,....,

Begonnen von schwatter, 25 Oktober 2025, 12:09:21

Vorheriges Thema - Nächstes Thema

schwatter

Du darfst diesen Dateianhang nicht ansehen.

Du darfst diesen Dateianhang nicht ansehen.Du darfst diesen Dateianhang nicht ansehen.


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

Damian

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).
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

#4
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

Damian

#5
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

schwatter

#7
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.

Damian

Der Anfang ist gemacht. Jetzt muss das Widget noch auf Eingaben reagieren, also direkt bedienbar sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

#9
Du darfst diesen Dateianhang nicht ansehen.

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

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

Damian

#12
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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

Du darfst diesen Dateianhang nicht ansehen.

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

Damian

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?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

Damian

OK. Dann wäre es das erste Widget, was es nicht unterstützt. Raumansicht ist leider kein Ersatz für eine "Dashboard"-Darstellung.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

#17
Du darfst diesen Dateianhang nicht ansehen.

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


Damian

#18
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)]);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

schwatter

#20
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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

#23
Morgen,


funktioniert super in deinem Table. Werde das im ersten Post als Info einfügen.

Du darfst diesen Dateianhang nicht ansehen.

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

Damian

#24
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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

Nabend,

ich habe das Beispiel 1zu1 im ersten Post übernommen.

Gruß schwatter

schwatter

Du darfst diesen Dateianhang nicht ansehen.

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

schwatter

Du darfst diesen Dateianhang nicht ansehen.

Nabend,

Update im ersten Post.

  • Color für DataUrlSVG im Arcslider gefixed.


Gruß schwatter

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

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


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

schwatter

#32
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

schwatter

Nabend,

ich habe unter Ankündigungen keine Schreibrechte. Daher mache ich das hier.


Ich glaube, ich muss noch einen Hinweis in der Commandref unter widgetOverride ablegen?
Habe ich noch etwas vergessen?

Gruß schwatter

appi

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

appi

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


schwatter

#36
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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

appi

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.


Damian

Offenbar setzt du die Soll-Temperatur mit "set EG_Buero_Klima value <Wert>". Wo ist die dann im KNX-Device sichtbar?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

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

appi

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 %





Damian

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")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

schwatter

@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

appi

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

schwatter

Schön das es funktioniert. Ich nehme das Beispiel mit dem abweichenden Reading
mit im Wiki auf.

Gruß schwatter

Damian

@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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

appi

@ Damian  die event_Readings waren nur für Testzwecke im Device

appi

hallo
wenn ich die Buttons nicht brauche, wie kann ich die Breite des Widget aufs nötige reduzieren?

schwatter

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

appi

ich arbeite mit f18 zwei Spalten und muss mit der Breite zurechtkommen.... ;D
Du darfst diesen Dateianhang nicht ansehen. 

In der Kombination mit UiTable gefällt es mir schon recht gut

schwatter


erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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

erwin

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

FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

#57
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

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

Tag,

ein weiteres Update im contrib.

  • Kompaktmodus hinzugefügt

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

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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

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

Reinhart

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?

FHEM auf Raspy5 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

erwin

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
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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

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

Reinhart

Danke euch Beiden, Dummy funktioniert nun bei mir! Ich bau das dann so ein!
FHEM auf Raspy5 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Reinhart

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,#
  

FHEM auf Raspy5 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

Reinhart

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,#,#,#,#,#,#
FHEM auf Raspy5 mit Bullseye + SSD, Homematic, ESP8266, ESP32, Sonoff, eBus, NanoCUL, MapleCUL, , MQTT2, Alexa

schwatter

#70
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

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

erwin

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

FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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 &nbsp;;\
:&nbsp;;
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   

erwin

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
 
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

schwatter

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

rudolfkoenig

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.

schwatter

Vielen Dank! Da habe ich im Codeeditor die Einstellung vergessen zu setzen.
Ich werde die anderen Widgets nachziehen.

Gruß schwatter

schwatter

Nabend Rudi,

schau mal:
root@ubuntufhem:/opt/fhem/www/pgm2# file fhemweb_controlminidash.js
fhemweb_controlminidash.js: JavaScript source, Non-ISO extended-ASCII text, with LF, NEL line terminators

root@ubuntufhem:/opt/fhem/www/pgm2# sed -i 's/\r//g; s/\x85//g' fhemweb_controlminidash.js
root@ubuntufhem:/opt/fhem/www/pgm2# file fhemweb_controlminidash.js
fhemweb_controlminidash.js: JavaScript source, Non-ISO extended-ASCII text

root@ubuntufhem:/opt/fhem/www/pgm2# file fhemweb_iconAnimated.js
fhemweb_iconAnimated.js: JavaScript source, ISO-8859 text, with very long lines (494)

root@ubuntufhem:/opt/fhem/www/pgm2# file fhemweb_minichart.js
fhemweb_minichart.js: JavaScript source, Non-ISO extended-ASCII text

root@ubuntufhem:/opt/fhem/www/pgm2#

1. Zu fhemweb_controlminidash.js
Müssen da noch die NEL line terminators weg? Denke ja.

root@ubuntufhem:/opt/fhem/www/pgm2# sed -i 's/\r//g; s/\x85//g' fhemweb_controlminidash.js
2. Die anderen Beiden sehen sauber aus. Außer das fhemweb_iconAnimated.js ISO-8859 text hat.

3. Wo genau hattest du die Warnung gesehen?
*** EN www/pgm2/fhemweb_controlminidash.js: ignoring text due to DOS encoding
Gruß schwatter

rudolfkoenig

ZitatMüssen da noch die NEL line terminators weg? Denke ja.
Ja bitte.
Wusste bis vor gerade eben nicht, was NEL ist.
Laut Wiki kommt das von EBCDIC/IBM-Mainframe.
Wie hast Du es da reingekriegt?

Zitat2. Die anderen Beiden sehen sauber aus. Außer das fhemweb_iconAnimated.js ISO-8859 text hat.
utf-8 waere mir lieber :)

Zitat3. Wo genau hattest du die Warnung gesehen?
Kommt aus commandref_join.pl, ich habe versucht ein Problem nachzustellen: https://forum.fhem.de/index.php?topic=143719


schwatter

Ich habe dein angepasstes Widget normal per Update gezogen und es mit file im
Terminal angeschaut. Da kam das bei raus. Daher denke ich, du hast es ein eingeschleppt? Oder ich vorher...
Zu UTF8, ok. Schaue wegen konvertieren. Im pgm2 sind viele JS mit Non-ISO extended-ASCII.

Gruß schwatter

schwatter

Ok, ich war es. Ich gelobe Besserung  :) 

root@ubuntufhem:/opt/svn-fhem/www/pgm2# file fhemweb_controlminidash.js
fhemweb_controlminidash.js: JavaScript source, Non-ISO extended-ASCII text, with CRLF, NEL line terminators
root@ubuntufhem:/opt/svn-fhem/www/pgm2#

Ich passe das an und checke es dann ein.

Gruß schwatter