[FTUI3] Entwicklung Thermometer/Thermostat

Begonnen von mr_petz, 23 September 2021, 18:17:49

Vorheriges Thema - Nächstes Thema

omnior

@OdfFhem
Klasse, vielen Dank, wie einfach :)

curt

Zitat von: LuGu am 02 Februar 2022, 22:30:54
Das solltest du hinbekommen. Aber die Farben ... ;)

Ja, habe ich hinbekommen, sehr herzlichen Dank für Deine ausführliche Erklärung!
(Die Farben sind perfekt, muss ja nur mir gefallen ...)

Ich zitiere auszugsweise:

<ftui-meter [value]="ftuitest" min="0" max="100" width="2em" height="10em"
                    color="low-medium-high"
                    is-vertical has-scale has-color-scale>
</ftui-meter>


@mr_petz
In Deinem ftui-thermostat funktioniert diese Vereinfachung offenbar nicht. Dabei wäre das ja ganz schön: Man hat typischerweise viele Temperaturen bzw. auch Thermostaten - hat hat man doch nur ein oder höchstens zwei Farbschemen - anders gesagt: Das wäre eine tolle Vereinfachung. @LuGu beschreibt das Vorgehen aus Nutzersicht in Beitrag #102.

Kannst Du bitte darüber nachdenken, das in ftui-thermostat einzubauen?

P.S: Die Gradientverschiebung darf ja gern bleiben ... das wäre dann wohl die Erweiterung des Konzepts, ja?
Ich weiß, ich weiß ...
RPI 4 - Jeelink HomeMatic Z-Wave

curt

Zitat von: omnior am 05 Februar 2022, 20:06:36
erstmal vielen Dank für die viele Arbeit die in dem Widget schon drinsteckt.
Ich habe mehrere ZWave Eurotronics Spirit Thermostate und die haben ja ein paar Besonderheiten,

Wie schön, endlich noch jemand mit ZWave-Thermostaten.

Ich habe das Thema für FTUI3 noch gar nicht angefasst: Ich fange mit der obersten Ebene an, da kommen meine Thermostate gar nicht vor.

Das ist bei mir so sortiert (FTUI2): Home ist der Taktikbildschirm, da gibt es nur die Aussage Fenster-auf oder Fenster-zu. Wenn ich da draufklicke, bekomme ich eine Seite mit den Stati aller Fenster und zugeordnet der Raumtemperaturen. Wenn ich dann auf einen konkreten Raum klicke, bekomme ich (u.a.) die Grafik des Temperaturverlaufs nebst Fenster auf/zu. Und erst wenn ich dann weiterklicke, bekomme ich ein Popup für den Thermostat. Und dort kann ich die Solltemperatur via Rädchen einstellen, ich habe zudem Schaltflächen für Boost, Aus usw.

Übrigens ist die Rückmeldung des Soll durchaus machbar, Du musst dann nach dem Setzen der neuen Solltemperatur und nach sleep 3 ein get auf die Temperatur nachschieben. Das hilft natürlich nicht, wenn unten an einem Heizkörper jemand rumspielt - bei den fraglichen Heizkörpern frage ich alle 30min via get ab. Natürlich geht das auf die Batterie ... irgendwie muss man sich für einen Kompromiss entscheiden.

Sei hier also herzlich gegrüßt, ich will gern von Deinen Erfolgen lernen (Codebeispiele!). Und ich will gern zeigen, wie ich das dann realisiere.
RPI 4 - Jeelink HomeMatic Z-Wave

mr_petz

#108
@curt
Hier hatte ich das stylen für jedes einzelne Thermostat schon einmal beschrieben.
Das geht im Übrigen mit fast allen Modulen in FTUI3.

https://forum.fhem.de/index.php/topic,123084.msg1197659.html#msg1197659

LG mr_petz

Edit:
An dem svg-gradient bin ich ja schon dran, siehe Anhang!

omnior

@curt
genau so ähnlich stelle ich mir das auch vor. Mein FTUI2 ist mittlerweile einfach zu überladen und mir gefällt die Idee deiner "taktischen" Bildschirme ;)
Ich hatte bisher die beiden Sollwerte (heating und energySaveHeating) in Userattributen abgelegt, aber 100%ig hat das nie funktioniert, es gab immer wieder Kombinationen wo diese nicht aktuell waren.
Jetzt bin ich am überlegen ob ich nicht komplett auf den Energiesparmodus verzichte.

Schön wäre es in der Tat wenn man je nach gewählten Modus einen anderen Sollwert in die Mitte setzen könnte, denn es ist verwirrend wenn im Energiesparmodus noch der Sollwert des Heizmodus angezeigt wird. Da es bei den Spirits ja nur ein desired-temp gibt und dies sich nicht ändert wenn der Modus gewechselt wird, müsste man den Sollwert des Energiesparmodus immer über get device setpoint 11 ermitteln und dann eventuell in desired-temp reinschieben. Vielleicht denke ich da aber zu kompliziert.

Eine andere kleine Frage hätte ich zur Darstellung der Isttemperatur. Momentan wird die immer auf 0,5 Grad gerundet. Wie stelle ich ein, dass diese auf 0,1 Grad genau dargestellt wird?

mr_petz

Zitat von: omnior am 06 Februar 2022, 15:08:17
Schön wäre es in der Tat wenn man je nach gewählten Modus einen anderen Sollwert in die Mitte setzen könnte, denn es ist verwirrend wenn im Energiesparmodus noch der Sollwert des Heizmodus angezeigt wird. Da es bei den Spirits ja nur ein desired-temp gibt und dies sich nicht ändert wenn der Modus gewechselt wird, müsste man den Sollwert des Energiesparmodus immer über get device setpoint 11 ermitteln und dann eventuell in desired-temp reinschieben. Vielleicht denke ich da aber zu kompliziert.
Hi, omnior.
Kannst du das bitte genauer erklären. Was soll je nach Zustand in der Mitte Stehen und worauf muss ich dann triggern?

Zitat
Eine andere kleine Frage hätte ich zur Darstellung der Isttemperatur. Momentan wird die immer auf 0,5 Grad gerundet. Wie stelle ich ein, dass diese auf 0,1 Grad genau dargestellt wird?
Und ich dachte es kommen immer nur 0.5 Werte. Ich muss da wissen ob es einstellbar sein soll oder ich es allgemein auf 0.1+tofixed() setze.

LG mr_petz

omnior

Zitat von: mr_petz am 06 Februar 2022, 19:02:22
Hi, omnior.
Kannst du das bitte genauer erklären. Was soll je nach Zustand in der Mitte Stehen und worauf muss ich dann triggern?
Ich will es mal versuchen. Diese Eurotronics Spirit können mit dem Befehl set device tmHeating oder tmEnergySaveHeating in zwei verschiedene Betriebsmodi gebracht werden. Dieser Betriebsmodus ist abrufbar mit get device thermostatMode abrufbar. Man erhält dann "thermostatMode:energySaveHeating" oder "thermostatMode:Heating"zurück. Der Betriebsmodus steht im Reading thermostatMode.
Jeder Modus hat aber seinen eigenen Sollwert! Während der Wert von desired-temp aber immer den Sollwert des Heating Mode darstellt, kann der Sollwert des jeweiligen Betriebsmodus über get device setpoint 1 oder set device setpoint 11abgerufen werden. Man erhält dann jeweils folgendes zurück: "setpointTemp:xx.x C heating
desired-temp:xx.x" (bzw. setpointTemp:xx.x C energySaveHeating". Dieser Sollwert ist immer auf 0.5 Grad gerundet. Er ist leider nirgends in einem Reading gespeichert, es gibt lediglich das Reading desired-temp und das bezieht sich auf den Heating Mode.
Das Setzen des Sollwerts erfolgt durch: set devicethermostatSetpointSet xx C 1 bzw. set devicethermostatSetpointSet xx C 11 .
Je nach eingestelltem Betriebsmodus sollte also derjenige Sollwert der gerade gültig ist in der Mitte angezeigt werden.

Zitat
Und ich dachte es kommen immer nur 0.5 Werte. Ich muss da wissen ob es einstellbar sein soll oder ich es allgemein auf 0.1+tofixed() setze.
Die Istwerte des Eurotronics kommen mit zwei Dezimalstellen hinter dem Komma ein Möglichkeit zum Runden wäre prima.

Vielleicht mögen ja auch andere Eurotronics-kundige noch ergänzen falls ich etwas wichtiges vergessen haben sollte...

LG Robert

mr_petz

#112
Hi Robert.
Anderer Vorschlag um dein Problem zu lösen.
Du erstellst 2 mal das selbe Thermostat an gleicher Stelle, einmal mit device:tmHeating und einmal mit device:tmEnergySaveHeating als value.
Dann noch einen Button zum Umschalten der Modi worauf du dann mit [hidden] im Thermostat triggerst und so wird entweder das device:tmHeating oder device:tmEnergySaveHeating Thermostat angezeigt.
Das funktioniert. Wenn du da Hilfe brauchst beim einrichten, dann sag einfach Bescheid.
Das ist die einfachste Lösung und wir nutzen FTUI3 Boardmittel ;)
Das Runden mache ich noch rein.

LG mr_petz

ps. Der trigger reagiert dann auf fhem und den Button.

curt

#113
Zitat von: omnior am 06 Februar 2022, 15:08:17
genau so ähnlich stelle ich mir das auch vor. Mein FTUI2 ist mittlerweile einfach zu überladen und mir gefällt die Idee deiner "taktischen" Bildschirme ;)

Ich kann gern mal zeigen, wohin die Reise (bei mir) gehen soll; ich habe das ja bei FTUI2 schon so. Aber nicht jetzt, es ist spät.

Nach meinen ersten Erfahrungen würde ich Dir empfehlen, nichts zu überstürzen, vielleicht können wir uns zudem gegenseitig stützen: Das ist hier Alpha, höchstens frühes Beta. Es gibt keine Doku, alle naselang fliegt Dir irgendwas um die Ohren ... seit dem letzten Update ist der schöne Farbverlauf bei "meter" wieder weg, den mir eine milde Seele schenkte. Nur so als Beispiel.

Zitat von: omnior am 06 Februar 2022, 15:08:17
Jetzt bin ich am überlegen ob ich nicht komplett auf den Energiesparmodus verzichte.

Die Frage ist, wofür man den überhaupt braucht. Man kann das unter verschiedenen Gesichtspunkten betrachten, allen gleich ist, dass es für den Regelkreis ein SOLL gibt. Bei diesem Energiesparmodus wird ja lediglich -mit einfachen Worten- langsamer geheizt. Bezogen auf nur einen Heizkörper bedeutet das (Hauptsätze der Wärmelehre), dass da überhaupt nichts gespart wird. Das liegt daran, dass unser Thermostat nach meiner Beobachtung bei tmHeating nicht überschwingt, der ist schon nahe am asymptodischen Grenzfall.

Mal unterstellt man hat ein Haus - das wird es deutlich komplexer. Da hat man zum Beispiel eine Brennwerttherme, die selbst schon ein Regler ist (abhängig mindestens von der Außentemperatur). Und angenommen exakt einen Heizkörper - schon haben wir zwei verkettete Regelkreise.
Normalerweise hat man mehrere Heizkörper, es wird schnell unübersichtlich - da sind sogar Situationen vorstellbar, in denen dieser Energiesparmodus sich in sein Gegenteil verkehrt - weil die Heizung für längere Zeit und damit konstanter heißes Wasser zur Verfügung stellen muss.
Aber da will ich gar keine Diskussion anstroßen, ich wollte nur begründen, warum ich diesen zweiten Heizmodus (Energiesave) nicht nutze.

Zitat von: omnior am 06 Februar 2022, 15:08:17
Eine andere kleine Frage hätte ich zur Darstellung der Isttemperatur. Momentan wird die immer auf 0,5 Grad gerundet. Wie stelle ich ein, dass diese auf 0,1 Grad genau dargestellt wird?

In meiner Erinnerung: step.
RPI 4 - Jeelink HomeMatic Z-Wave

omnior

Zitat von: mr_petz am 07 Februar 2022, 18:15:41
Dann noch einen Button zum Umschalten der Modi worauf du dann mit [hidden] im Thermostat triggerst und so wird entweder das device:tmHeating oder device:tmEnergySaveHeating Thermostat angezeigt.
Das ist eine gute Idee und ich will es gerne probieren. Im Moment scheitere ich aber schon an diesem einfachen Button bzw. dem @click. Das umschalten funktioniert im Prinzip, aber irgendwie kommt der get Befehl (über den @click) immer vor dem set und somit wird nach dem Umschalten noch nichts in der Oberfläche aktualisiert. Vermutlich hab ich irgendwas nicht richtig verstanden bzw. umgesetzt.
       <ftui-button
       [hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('heating: true, energySaveHeating: false')"
       [(value)]="ZWave_THERMOSTAT_46"
       fill="outline" shape="circle" states="tmHeating,tmEnergySaveHeating"
       @click="javascript:sendFhem('get ZWave_THERMOSTAT_46 thermostatMode')"
       >Energiesparmodus</ftui-button>
       <ftui-button
       [hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('heating: false, energySaveHeating: true')"
       [(value)]="ZWave_THERMOSTAT_46"
       fill="outline" shape="circle"
       width="auto"
       states="tmEnergySaveHeating,tmHeating"
       @click="javascript:sendFhem('get ZWave_THERMOSTAT_46 thermostatMode')"

mr_petz

#115
Ja der @click wird zuerst gesendet (Stand jetzt).
Dann schreibe mal beide Befehle in den @click getrennt mit ; und ein fake value zum triggern.
Ich kann erst heute Nachmittag Unterstützung leisten.

LG mr_petz

Edit: Was mich jetzt wundert ist, dass deine Befehle/Readings/States unterschiedlich sind?
Bsp.:
energySaveHeating und tmEnergySaveHeating
heating und tmHeating
Wenn dem so ist, dann musst du es im Beispiel anpassen oder mir sagen was im state und was im thermostatMode steht.

Ansonsten probiere es mal so V1:

<ftui-button fill="outline" shape="circle"
        color="green"
[hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('tmHeating: true, tmEnergySaveHeating: false')"
[value]="ZWave_THERMOSTAT_46:thermostatMode"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Energiesparmodus
</ftui-button>
<ftui-button fill="outline" shape="circle"
        color="red"
[hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('tmHeating: false, tmEnergySaveHeating: true')"
[value]="ZWave_THERMOSTAT_46:thermostatMode"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmEnergySaveHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Heating
</ftui-button>

Hier wird per [value] nur für den trigger [hidden] das Reading gelesen und per @click die Befehle gesendet.

alternativ wenn dein Reading thermostatMode heating und energySaveHeating hat V2:

<ftui-button fill="outline" shape="circle"
        color="green"
[hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('heating: true, energySaveHeating: false')"
[value]="ZWave_THERMOSTAT_46:thermostatMode"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Energiesparmodus
</ftui-button>
<ftui-button fill="outline" shape="circle"
        color="red"
[hidden]="ZWave_THERMOSTAT_46:thermostatMode | map('heating: false, energySaveHeating: true')"
[value]="ZWave_THERMOSTAT_46:thermostatMode"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmEnergySaveHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Heating
</ftui-button>


alternativ wenn dein Devicestate heating und energySaveHeating hat V3:

<ftui-button fill="outline" shape="circle"
        color="green"
[hidden]="ZWave_THERMOSTAT_46 | map('heating: true, energySaveHeating: false')"
[value]="ZWave_THERMOSTAT_46"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Energiesparmodus
</ftui-button>
<ftui-button fill="outline" shape="circle"
        color="red"
[hidden]="ZWave_THERMOSTAT_46 | map('heating: false, energySaveHeating: true')"
[value]="ZWave_THERMOSTAT_46"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmEnergySaveHeating; get ZWave_THERMOSTAT_46 thermostatMode')">Heating
</ftui-button>


ps. Beim ftui-button wirkt kein width="" sondern nur mit style="width:auto;". k.A. ob das schon mal ging...

Hier ist auch ein gerade erstelltes, ähnliches und funktionierendes Beispiel:
https://forum.fhem.de/index.php/topic,126067.msg1206862.html#msg1206862

mr_petz

Zitat von: curt am 08 Februar 2022, 03:05:50
...
Nach meinen ersten Erfahrungen würde ich Dir empfehlen, nichts zu überstürzen, vielleicht können wir uns zudem gegenseitig stützen: Das ist hier Alpha, höchstens frühes Beta. Es gibt keine Doku, alle naselang fliegt Dir irgendwas um die Ohren ... seit dem letzten Update ist der schöne Farbverlauf bei "meter" wieder weg, den mir eine milde Seele schenkte. Nur so als Beispiel.
Bitte nicht ganz so schlecht reden. Beta ist hier schon richtig! Wobei ich gerne von Entwicklung rede. ;) Es müssen hier alle durch die hier mitentwickeln und testen.
Und ausserdem wird sich hier gegenseitig geholfen/unterstütz wenn einer mal probleme hat.
@setstate macht hier super Arbeit und gibt hier sein ganzes Wisssen an alle weiter und behebt immer zeitnah Fehler (wenn welche aufkommen).

ps. Beim Meter funktioniert immer noch Gradient:
https://knowthelist.github.io/ftui/www/ftui/examples/meter.html

Zitat
...
In meiner Erinnerung: step.
step ist nur für den Sollwert.

LG mr_petz

curt

Zitat von: mr_petz am 08 Februar 2022, 20:32:11
Bitte nicht ganz so schlecht reden.

Es hat nichts mit "Dinge schlecht reden" zu tun, wenn man ganz sachlich Dinge beim Namen nennt.

Zitat von: mr_petz am 08 Februar 2022, 20:32:11
Und ausserdem wird sich hier gegenseitig geholfen/unterstütz wenn einer mal probleme hat.

Mein Thermostat mit eigenem Farbübergang funktioniert dank der Hilfe eines freundlichen anderen Users. Die Auslagerung in user.css bekam ich nicht hin, Du hattest mir da einen Link zugeworfen, der genau garnichts erklärt; jedenfalls für mich nicht.

Zitat von: mr_petz am 08 Februar 2022, 20:32:11
@setstate macht hier super Arbeit und gibt hier sein ganzes Wisssen an alle weiter und behebt immer zeitnah Fehler (wenn welche aufkommen).

Bei allem Respekt: Bei Meter ist der Farbverlauf weg, das ist jetzt wieder hellblau.

Zitat von: mr_petz am 08 Februar 2022, 20:32:11
ps. Beim Meter funktioniert immer noch Gradient:

Die ständig verlinkte Seite nützt (mir) genau gar nichts. Eine treue Seele zeigte mir, wie man das schön mit Farbverlauf macht - das ist jetzt putt. Und ich habe keinen Ansatz, wo ich da suchen muss - ich weiß ja nichtmal, was er da änderte. Und wenn ich das letzte Update so ansehe, bin ich da wohl nicht so ganz der Einzige.

Schau: Wir gehen da mit unterschiedlichen realen Möglichkeiten ran, ich erwähnte ja schon, dass ich doof bin: Ich bin nicht in der Lage, das bis in die letzten Verästelungen zu studieren. Obwohl ich ein klein wenig Ahnung habe, bin ich Nutzer. Und da ist es dann schlussendlich das Selbstverständnis des Projekts: Geht es um Selbstbeschäftigung als Zweck? Oder ist der Zweck die Hausautomation nebst Virtualisierung?

Du wirst mir gleich mangelnde Dankbarkeit und opensource vorwerfen, ich weiß. Nein, ich bin nicht undankbar, ich bin sogar sehr dankbar - sehr vielen hier. Wenn aber ein Update fröhlich ziemlich viel wegschießt, ist es halt Alpha und nicht Beta - in meinem Verständnis, so weit bin ich dann doch vom Fach.

Ich habe da tatsächlich auch eine ganz persönliche Bitte an Dich. Du gehst bei einem Teil der Nutzerschaft, also zumindest bei mir, vielleicht aber auch bei stumm Mitlesenden, von einer falschen Voraussetzung aus. Zumindest glaube ich, das so verstanden zu haben. Mein Ziel ist nicht, dass wirklich alles so zu verstehen, dass ich nächstens Entwickler bin. Ich will das nutzen. Und dafür brauche ich ein funktionierendes Codebeispiel - welches ich entweder einfach so nutze oder halt mit dem rumspiele und für mich anpasse. (Und irgendwann später will ich es gar nicht mehr anfassen, dann soll das einfach nur tun.)

Übrigens funktioniert der ausgelagerte Homescreen bei mir immer noch nicht. Aber das ist mein Problem, das Codebeispiel von @setstate funktioniert (auch) bei mir. Ich muss da gelegentlich in Ruhe prüfen, wo da der Unterschied ist - Dein Hinweis war es jedenfalls leider nicht.

@omnior
Ich denke Du machst da noch einen Fehler. So schnell kann der ZWave-Thermostat aufeinanderfolgende Befehle gar nicht verarbeiten, es besteht die Gefahr, dass der zweite Befehl gar nicht ankommt oder weggeworfen wird. Ich lernte hier, dass man zwischen zwei Befehle (sagen wir set und get) schlauerweise ein "sleep 3" einschieben sollte. Und tatsächlich habe ich seitdem keine Probleme.
RPI 4 - Jeelink HomeMatic Z-Wave

omnior

Zitat von: mr_petz am 08 Februar 2022, 09:32:15
Was mich jetzt wundert ist, dass deine Befehle/Readings/States unterschiedlich sind?
Bsp.:
energySaveHeating und tmEnergySaveHeating
heating und tmHeating
Ja, das ist bei den ZWave Spirits so. Man erhält ein Reading aus thermostatMode zurück (z.B. heating) und wenn man diesen Modus aber setzen will schickt man direkt den Befehl tmHeating.
Das Beispiel ist mir so klar danke für die ganzen Hinweise.

Eine kleine Frage hätte ich noch. Bei dem ftui-button, wenn der Button einen Text anzeigen soll. Für statischen Text ist klar, aber was benutze ich wenn der Text aus einem Reading kommen soll. Mit [text] scheint es nicht zu gehen.
Und nochmal kurz zu dem style="width:auto;" das klappt zwar, allerdings ist der Rand etwas knapp bemessen, damit will ich sagen, dass der Text dann direkt am Rand des Buttons endet, optisch ansprechender wäre es wenn der Knopf dann noch etwas breiter sein könnte. Kann man das irgendwo einstellen?

@curt
Ich probier das jetzt auch mal mit dem zusätzlichen sleep, vielleicht kam daher ja auch manchmal das Problem dass es nicht richtig funktionieren wollte.

mr_petz

#119
@omnior
Fügst du ein Label ein mit map oder alleinstehend.
Bsp.:

<ftui-button
    fill="solid"
    states="true,false"
    style="width:40px;"
    [(value)]="dummy">
    <ftui-label [text]="dummy | map('true:Mode1, false:Mode2')"></ftui-label>
</ftui-button>

Hier wird wenn dummy true ist dem Button Mode1 als text gegeben und wenn false Mode2.
Ansonsten:

<ftui-button
    fill="solid"
    states="true,false"
    style="width:40px;"
    [(value)]="dummy">
    <ftui-label [text]="dummy"></ftui-label>
</ftui-button>


ps. ich habe jetzt das Round bei IstTemp von mir rausgenommen. Du kannst jetzt mit
Bsp.:

[temp]="dummy | round(2)"

auf zwei nachkomma runden. Ich hoffe das ist so ok für dich.
Du kannst natürlich auch das round() weglassen, dann nimmt er das was kommt.

LG mr_petz

Edit: Deine Lösung wäre dann hier für alle hilfreich. :)

Achso, zu style="width:auto;" im button.
Hier kannst du im label mit margin="0.1" arbeiten um die seitlichen Abstände zu erhöhen.
Ich zeige es dir an deinem Beispiel:

<ftui-button fill="outline" shape="circle" style="width:auto;"
        color="green"
[hidden]="ZWave_THERMOSTAT_46 | map('heating: true, energySaveHeating: false')"
[value]="ZWave_THERMOSTAT_46"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmHeating; get ZWave_THERMOSTAT_46 thermostatMode')">
<ftui-label [text]="ZWave_THERMOSTAT_46" margin="0.5"></ftui-label>
</ftui-button>
<ftui-button fill="outline" shape="circle" style="width:auto;"
        color="red"
[hidden]="ZWave_THERMOSTAT_46 | map('heating: false, energySaveHeating: true')"
[value]="ZWave_THERMOSTAT_46"
@click="javascript:sendFhem('set ZWave_THERMOSTAT_46 thermostatMode tmEnergySaveHeating; get ZWave_THERMOSTAT_46 thermostatMode')">
<ftui-label [text]="ZWave_THERMOSTAT_46" margin="0.5"></ftui-label>
</ftui-button>