[gelöst] Formatierung in UserReadings und stateFormat

Begonnen von Gisbert, 05 September 2025, 10:02:55

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo Rudi,

ich hab 2 Definitionen in userReadings:
attr VaillantSGReady userReadings _status:cmd_nr.* \
{if (ReadingsNum($name,'cmd_nr',0) =~ ("1|2|3|4|5|7")) {"SG Ready<span style='color: red'><b> 1: on<b/><span/>"} \
elsif (ReadingsNum($name,'cmd_nr',0) == 6) {"SG Ready: off"}},\
_forecast {round(ReadingsNum('mySolarForecast','Today_PVforecast','')/1000,1)." kWh"}
sowie im stateFormat:
attr VaillantSGReady stateFormat _status<br/>_forecast
Das 1. Reading hab ich teilweise in rot und fett formatiert - und das funktioniert auch soweit. Das 2. Reading hat keine Formatierung, wird aber dennoch in rot und fett dargestellt. Vermutlich hab ich einen Fehler gemacht, nur weiß ich noch nicht wo. Dann noch eine Frage: kann man die Formatierung des 1. Readings so machen, oder gibt es eine bessere Möglichkeit?

Das list:
define VaillantSGReady DOIF ([?08:00-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= 48 and [?mySolarForecast:Today_PVforecast:d] <= 30000) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1) \
DOELSEIF ([?08:45-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= ([?mySolarForecast:Today_PVforecast:d]/1000*0.23333+41) and 30000 < [?mySolarForecast:Today_PVforecast:d] <= 40000) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1) \
DOELSEIF ([?09:30-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= ([?mySolarForecast:Today_PVforecast:d]/1000*0.23333+41) and 40000 < [?mySolarForecast:Today_PVforecast:d] <= 60000) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1) \
DOELSEIF ([?10:20-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= 55 and [?mySolarForecast:Today_PVforecast:d] > 60000) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1) \
DOELSEIF ([?10:30-16:45] and $md ge "03-01" and $md lt "10-15" and [Deye_Inverter:heat_sink_temperature:avg25] >= 50 and [?VaillantaroSTOR:SGReady1] == 1) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1) \
DOELSEIF ([VaillantaroSTOR:Power_W] < 100 and [?VaillantaroSTOR:Innentemperatur] >= 58) \
(set VaillantaroSTOR:FILTER=SGReady1=0 SGReady1off) \
(set VaillantaroSTOR:FILTER=SGReady2=0 SGReady2off) \
##DOELSEIF ([?$SELF:ageSGReady2:sec] > 604800 and [?10:00-18:00] and [VaillantaroSTOR:Innentemperatur] >= 59.25 and [?mySolarForecast:ForecastNoonBatt] >= 10000 and $md ge "03-01" and $md le "10-31") \
##(set VaillantaroSTOR:FILTER=SGReady2=1 SGReady2on) \
##(setreading VaillantSGReady ageSGReady2 1) \
##(set VaillantaroSTOR:FILTER=SGReady1=0 SGReady1off) \
DOELSEIF ([?$SELF:ageSGReady1:sec] > 604800 and [?09:00-18:00] and [VaillantaroSTOR:Innentemperatur] <= 50 and ($md lt "03-01" or $md gt "10-15")) \
(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on) \
(setreading VaillantSGReady ageSGReady1 1)
attr VaillantSGReady alias Vaillant SGReady
attr VaillantSGReady icon sani_solar
attr VaillantSGReady room Heizung
attr VaillantSGReady stateFormat _status<br/>_forecast
attr VaillantSGReady userReadings _status:cmd_nr.* \
{if (ReadingsNum($name,'cmd_nr',0) =~ ("1|2|3|4|5|7")) {"SG Ready<span style='color: red'><b> 1: on<b/><span/>"} \
elsif (ReadingsNum($name,'cmd_nr',0) == 6) {"SG Ready: off"}},\
_forecast {round(ReadingsNum('mySolarForecast','Today_PVforecast','')/1000,1)." kWh"}
attr VaillantSGReady wait 0,5:0,5:0,5:0,5:0,5:0,5:0,5
#   CFGFN      ./FHEM/HeizungWarmwasser.cfg
#   DEF        ([?08:00-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= 48 and [?mySolarForecast:Today_PVforecast:d] <= 30000)
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#DOELSEIF ([?08:45-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= ([?mySolarForecast:Today_PVforecast:d]/1000*0.23333+41) and 30000 < [?mySolarForecast:Today_PVforecast:d] <= 40000)
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#DOELSEIF ([?09:30-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= ([?mySolarForecast:Today_PVforecast:d]/1000*0.23333+41) and 40000 < [?mySolarForecast:Today_PVforecast:d] <= 60000)
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#DOELSEIF ([?10:20-19:30] and $md ge "03-01" and $md lt "10-15" and [VaillantaroSTOR:Innentemperatur] <= 55 and [?mySolarForecast:Today_PVforecast:d] > 60000)
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#DOELSEIF ([?10:30-16:45] and $md ge "03-01" and $md lt "10-15" and [Deye_Inverter:heat_sink_temperature:avg25] >= 50 and [?VaillantaroSTOR:SGReady1] == 1)
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#DOELSEIF ([VaillantaroSTOR:Power_W] < 100 and [?VaillantaroSTOR:Innentemperatur] >= 58)
#(set VaillantaroSTOR:FILTER=SGReady1=0 SGReady1off)
#(set VaillantaroSTOR:FILTER=SGReady2=0 SGReady2off)
###DOELSEIF ([?$SELF:ageSGReady2:sec] > 604800 and [?10:00-18:00] and [VaillantaroSTOR:Innentemperatur] >= 59.25 and [?mySolarForecast:ForecastNoonBatt] >= 10000 and $md ge "03-01" and $md le "10-31")
###(set VaillantaroSTOR:FILTER=SGReady2=1 SGReady2on)
###(setreading VaillantSGReady ageSGReady2 1)
###(set VaillantaroSTOR:FILTER=SGReady1=0 SGReady1off)
#DOELSEIF ([?$SELF:ageSGReady1:sec] > 604800 and [?09:00-18:00] and [VaillantaroSTOR:Innentemperatur] <= 50 and ($md lt "03-01" or $md gt "10-15"))
#(set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on)
#(setreading VaillantSGReady ageSGReady1 1)
#   FUUID      6836a64b-f33f-e986-780b-73c0c46799752c89
#   MODEL      FHEM
#   NAME       VaillantSGReady
#   NOTIFYDEV  Deye_Inverter,global,VaillantaroSTOR
#   NR         1250
#   NTFY_ORDER 50-VaillantSGReady
#   STATE      SG Ready<span style='color: red'><b> 1: on<b/><span/><br/>58.9 kWh
#   TYPE       DOIF
#   VERSION    29460 2024-12-29 20:25:48
#   eventCount 23
#   READINGS:
#     2025-09-05 09:51:16   Device          Deye_Inverter
#     2025-09-05 09:51:16   _forecast       58.9 kWh
#     2025-09-05 09:30:22   _status         SG Ready<span style='color: red'><b> 1: on<b/><span/>
#     2025-09-05 09:30:22   ageSGReady1     1
#     2025-07-26 16:19:50   ageSGReady2     1
#     2025-09-05 09:30:22   cmd             3.2
#     2025-09-05 09:30:22   cmd_event       VaillantaroSTOR
#     2025-09-05 09:30:22   cmd_nr          3
#     2025-09-05 09:30:22   cmd_seqnr       2
#     2025-09-05 09:51:16   e_Deye_Inverter_heat_sink_temperature 34.90
#     2025-09-05 09:48:17   e_VaillantaroSTOR_Innentemperatur 47.60
#     2025-09-05 09:51:13   e_VaillantaroSTOR_Power_W 501.2
#     2025-09-04 09:37:50   mode            enabled
#     2025-09-05 09:30:22   state           cmd_3
#     2025-09-04 19:30:00   timer_01_c01    05.09.2025 08:00:00
#     2025-09-04 19:30:00   timer_02_c01    05.09.2025 19:30:00
#     2025-09-04 19:30:00   timer_03_c02    05.09.2025 08:45:00
#     2025-09-04 19:30:00   timer_04_c02    05.09.2025 19:30:00
#     2025-09-04 19:30:00   timer_05_c03    05.09.2025 09:30:00
#     2025-09-04 19:30:00   timer_06_c03    05.09.2025 19:30:00
#     2025-09-04 19:30:00   timer_07_c04    05.09.2025 10:20:00
#     2025-09-04 19:30:00   timer_08_c04    05.09.2025 19:30:00
#     2025-09-04 16:45:00   timer_09_c05    05.09.2025 10:30:00
#     2025-09-04 16:45:00   timer_10_c05    05.09.2025 16:45:00
#     2025-09-04 18:00:00   timer_11_c07    05.09.2025 09:00:00
#     2025-09-04 18:00:00   timer_12_c07    05.09.2025 18:00:00
#     2025-09-05 09:30:22   wait_timer      no timer
#   Regex:
#     accu:
#       Deye_Inverter:
#         accu:
#           heat_sink_temperature ^Deye_Inverter$:^heat_sink_temperature:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       Deye_Inverter:
#         0:
#         1:
#         2:
#         3:
#         4:
#           heat_sink_temperature ^Deye_Inverter$:^heat_sink_temperature:
#         5:
#         6:
#       VaillantaroSTOR:
#         0:
#           Innentemperatur ^VaillantaroSTOR$:^Innentemperatur:
#         1:
#           Innentemperatur ^VaillantaroSTOR$:^Innentemperatur:
#         2:
#           Innentemperatur ^VaillantaroSTOR$:^Innentemperatur:
#         3:
#           Innentemperatur ^VaillantaroSTOR$:^Innentemperatur:
#         4:
#         5:
#           Power_W    ^VaillantaroSTOR$:^Power_W:
#         6:
#           Innentemperatur ^VaillantaroSTOR$:^Innentemperatur:
#   accu:
#     Deye_Inverter heat_sink_temperature:
#       dim        25
#       value:
#         37.20
#         37.10
#         37.10
#         37.00
#         36.90
#         36.80
#         36.70
#         36.60
#         36.50
#         36.40
#         36.30
#         36.20
#         36.10
#         36.00
#         35.90
#         35.80
#         35.70
#         35.60
#         35.50
#         35.40
#         35.30
#         35.20
#         35.10
#         35.00
#         34.90
#   attr:
#     cmdState:
#     wait:
#       0:
#         0
#         5
#       1:
#         0
#         5
#       2:
#         0
#         5
#       3:
#         0
#         5
#       4:
#         0
#         5
#       5:
#         0
#         5
#       6:
#         0
#         5
#     waitdel:
#   condition:
#     0          ::DOIF_time($hash,0,1,$wday,$hms) and $md ge "03-01" and $md lt "10-15" and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') <= 48 and ::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d') <= 30000
#     1          ::DOIF_time($hash,2,3,$wday,$hms) and $md ge "03-01" and $md lt "10-15" and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') <= (::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d')/1000*0.23333+41) and 30000 < ::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d') <= 40000
#     2          ::DOIF_time($hash,4,5,$wday,$hms) and $md ge "03-01" and $md lt "10-15" and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') <= (::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d')/1000*0.23333+41) and 40000 < ::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d') <= 60000
#     3          ::DOIF_time($hash,6,7,$wday,$hms) and $md ge "03-01" and $md lt "10-15" and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') <= 55 and ::ReadingValDoIf($hash,'mySolarForecast','Today_PVforecast','','d') > 60000
#     4          ::DOIF_time($hash,8,9,$wday,$hms) and $md ge "03-01" and $md lt "10-15" and ::ReadingValDoIf($hash,'Deye_Inverter','heat_sink_temperature','','avg25') >= 50 and ::ReadingValDoIf($hash,'VaillantaroSTOR','SGReady1') == 1
#     5          ::ReadingValDoIf($hash,'VaillantaroSTOR','Power_W') < 100 and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') >= 58
#     6          ::ReadingSecDoIf('VaillantSGReady','ageSGReady1') > 604800 and ::DOIF_time($hash,10,11,$wday,$hms) and ::ReadingValDoIf($hash,'VaillantaroSTOR','Innentemperatur') <= 50 and ($md lt "03-01" or $md gt "10-15")
#   days:
#   do:
#     0:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     1:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     2:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     3:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     4:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     5:
#       0          set VaillantaroSTOR:FILTER=SGReady1=0 SGReady1off
#       1          set VaillantaroSTOR:FILTER=SGReady2=0 SGReady2off
#     6:
#       0          set VaillantaroSTOR:FILTER=SGReady1=1 SGReady1on
#       1          setreading VaillantSGReady ageSGReady1 1
#     7:
#   helper:
#     NOTIFYDEV  Deye_Inverter,global,VaillantaroSTOR
#     event      heat_sink_temperature: 34.90
#     globalinit 1
#     last_timer 12
#     sleepdevice VaillantaroSTOR
#     sleepsubtimer -1
#     sleeptimer -1
#     timerdev   VaillantaroSTOR
#     timerevent Innentemperatur: 47.60
#     triggerDev Deye_Inverter
#     bm:
#       DOIF_Attr:
#         cnt        7
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        05.09. 09:35:06
#         max        0.0495150089263916
#         tot        0.249834775924683
#         mAr:
#           set
#           VaillantSGReady
#           stateFormat
#           [$name:_status]<br/>Forecast: [mySolarForecast:Today_PVforecast:d]/1000 kWh
#       DOIF_Get:
#         cnt        13
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        05.09. 09:39:26
#         max        2.288818359375e-05
#         tot        0.000206947326660156
#         mAr:
#           HASH(0x560aa9f9c958)
#           VaillantSGReady
#           ?
#       DOIF_Notify:
#         cnt        67272
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        05.09. 09:30:17
#         max        0.0619218349456787
#         tot        9.82988047599792
#         mAr:
#           HASH(0x560aa9f9c958)
#           HASH(0x560aaa023730)
#       DOIF_Set:
#         cnt        58
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        05.09. 09:39:25
#         max        0.00245809555053711
#         tot        0.014190673828125
#         mAr:
#           HASH(0x560aa9f9c958)
#           VaillantSGReady
#           checkall
#     timerevents:
#       Innentemperatur: 47.60
#     timereventsState:
#       Innentemperatur: 47.60
#     triggerEvents:
#       heat_sink_temperature: 34.90
#     triggerEventsState:
#       heat_sink_temperature: 34.90
#   internals:
#   interval:
#     0          -1
#     1          0
#     10         -1
#     11         10
#     2          -1
#     3          2
#     4          -1
#     5          4
#     6          -1
#     7          6
#     8          -1
#     9          8
#   intervalfunc:
#   intervaltimer:
#   localtime:
#     0          1757052000
#     1          1757093400
#     10         1757055600
#     11         1757088000
#     2          1757054700
#     3          1757093400
#     4          1757057400
#     5          1757093400
#     6          1757060400
#     7          1757093400
#     8          1757061000
#     9          1757083500
#   perlblock:
#   readings:
#     all         VaillantaroSTOR:Innentemperatur Deye_Inverter:heat_sink_temperature VaillantaroSTOR:Power_W
#   realtime:
#     0          08:00:00
#     1          19:30:00
#     10         09:00:00
#     11         18:00:00
#     2          08:45:00
#     3          19:30:00
#     4          09:30:00
#     5          19:30:00
#     6          10:20:00
#     7          19:30:00
#     8          10:30:00
#     9          16:45:00
#   time:
#     0          08:00:00
#     1          19:30:00
#     10         09:00:00
#     11         18:00:00
#     2          08:45:00
#     3          19:30:00
#     4          09:30:00
#     5          19:30:00
#     6          10:20:00
#     7          19:30:00
#     8          10:30:00
#     9          16:45:00
#   timeCond:
#     0          0
#     1          0
#     10         6
#     11         6
#     2          1
#     3          1
#     4          2
#     5          2
#     6          3
#     7          3
#     8          4
#     9          4
#   timer:
#     0          0
#     1          0
#     10         0
#     11         0
#     2          0
#     3          0
#     4          0
#     5          0
#     6          0
#     7          0
#     8          0
#     9          0
#   timers:
#   trigger:
#   triggertime:
#     1757060400:
#       localtime  1757060400
#       hash:
#     1757061000:
#       localtime  1757061000
#       hash:
#     1757083500:
#       localtime  1757083500
#       hash:
#     1757088000:
#       localtime  1757088000
#       hash:
#     1757093400:
#       localtime  1757093400
#       hash:
#   uiState:
#   uiTable:
#
setstate VaillantSGReady SG Ready<span style='color: red'><b> 1: on<b/><span/><br/>58.9 kWh
setstate VaillantSGReady 2025-09-05 09:51:16 Device Deye_Inverter
setstate VaillantSGReady 2025-09-05 09:51:16 _forecast 58.9 kWh
setstate VaillantSGReady 2025-09-05 09:30:22 _status SG Ready<span style='color: red'><b> 1: on<b/><span/>
setstate VaillantSGReady 2025-09-05 09:30:22 ageSGReady1 1
setstate VaillantSGReady 2025-07-26 16:19:50 ageSGReady2 1
setstate VaillantSGReady 2025-09-05 09:30:22 cmd 3.2
setstate VaillantSGReady 2025-09-05 09:30:22 cmd_event VaillantaroSTOR
setstate VaillantSGReady 2025-09-05 09:30:22 cmd_nr 3
setstate VaillantSGReady 2025-09-05 09:30:22 cmd_seqnr 2
setstate VaillantSGReady 2025-09-05 09:51:16 e_Deye_Inverter_heat_sink_temperature 34.90
setstate VaillantSGReady 2025-09-05 09:48:17 e_VaillantaroSTOR_Innentemperatur 47.60
setstate VaillantSGReady 2025-09-05 09:51:13 e_VaillantaroSTOR_Power_W 501.2
setstate VaillantSGReady 2025-09-04 09:37:50 mode enabled
setstate VaillantSGReady 2025-09-05 09:30:22 state cmd_3
setstate VaillantSGReady 2025-09-04 19:30:00 timer_01_c01 05.09.2025 08:00:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_02_c01 05.09.2025 19:30:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_03_c02 05.09.2025 08:45:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_04_c02 05.09.2025 19:30:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_05_c03 05.09.2025 09:30:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_06_c03 05.09.2025 19:30:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_07_c04 05.09.2025 10:20:00
setstate VaillantSGReady 2025-09-04 19:30:00 timer_08_c04 05.09.2025 19:30:00
setstate VaillantSGReady 2025-09-04 16:45:00 timer_09_c05 05.09.2025 10:30:00
setstate VaillantSGReady 2025-09-04 16:45:00 timer_10_c05 05.09.2025 16:45:00
setstate VaillantSGReady 2025-09-04 18:00:00 timer_11_c07 05.09.2025 09:00:00
setstate VaillantSGReady 2025-09-04 18:00:00 timer_12_c07 05.09.2025 18:00:00
setstate VaillantSGReady 2025-09-05 09:30:22 wait_timer no timer


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

TomLee

Moin,

die Formatierung nimmt man in stateFormat (Perl) vor (oder in devStateIcon, dann bleibt STATE "sauber"), nicht im userReadings. Wie man Html-Tags richtig schliesst müsstest auch nochmal nachlesen.

Gruß Thomas

rudolfkoenig

Das Problem kommt vermutlich wg. <span/>, schliessen tut man mit </span> (und </b>).

<br/> ist diskussionwuerdig: ist nur fuer XHTML notwendig, HTML will <br> sehen.
In XHTML bezeichnet <blabla/> etwas was keinen Inhalt hat, und damit ist es ein oeffnender und schliessender Marker gleichzeitig.

Wg. HTML Formatierung in userReadings: laut Theorie sollten Readings nur Daten ohne Formatierung enthalten, weil sie per FileLog/DbLog persistiert, und mit notify/DOIF/etc ausgewertet werden, wo Formatierung nervt.
Formatiert werden sollte man eher mit FHEMWEB spezifischen Attributen wie devStateIcon.

Soweit die Theorie.


Gisbert

Zitat von: rudolfkoenig am 05 September 2025, 11:31:34Das Problem kommt vermutlich wg. <span/>, schliessen tut man mit </span> (und </b>).

Danke, das war entscheidende Hinweis.
An anderer Stelle hab ich's durchaus richtig gemacht, hier aber nicht aufgepasst.
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

TomLee

Zitat von: Gisbert am 05 September 2025, 15:45:58...
An anderer Stelle hab ich's durchaus richtig gemacht, hier aber nicht aufgepasst.

Sry, muss nochmal. Wie/aus welchem Grund kommt man auf die Idee HTML-Code in einem Reading abzulegen, zur Formatierung in der DeviceOverview?

Ich würds verstehen wenn der Readinginhalt selbst formatiert werden sollte, was auch geht, wenn die Rückgabe in <html></html>-Tags erfolgt.

Gisbert

Zitat von: TomLee am 05 September 2025, 19:51:44
Zitat von: Gisbert am 05 September 2025, 15:45:58...
An anderer Stelle hab ich's durchaus richtig gemacht, hier aber nicht aufgepasst.

Sry, muss nochmal. Wie/aus welchem Grund kommt man auf die Idee HTML-Code in einem Reading abzulegen, zur Formatierung in der DeviceOverview?

Ich würds verstehen wenn der Readinginhalt selbst formatiert werden sollte, was auch geht, wenn die Rückgabe in <html></html>-Tags erfolgt.

Hallo TomLee,

meine Intention war bei Geräten wie z.B. einer Wärmepumpe, den Durchfluss, Leistung, Kompressorfrequenz, Lüfterdrehzahl etc. in einer anderen Farbe (rot) und Schriftstärke (bold) zu haben, wenn das Gerät läuft und in einer unauffälligen Darstellung, wenn es nicht läuft.
Das Prinzip ist so, dass ich ein userReading definiere, welches werteabhängig in unterschiedlicher Farbe und Schriftgrad vorhanden ist. Im stateFormat wird dann das userReading aufgerufen, in der gewünschten Formatierung.

Ich verstehe leider zu wenig von der Materie, um beurteilen zu können, ob mein Unterfangen sinnvoll ist, oder ob es bessere Möglichkeiten für mein Vorhaben gibt.

Wie würde eine bessere Lösung anhand des angehängten list aussehen? Ein Reading ist dabei z.B. dieses: "AC_an_aus". So bekomme ich "on hold" in orange, wenn die Anlage aus ist, "läuft" in rot, wenn sie heizt und "läuft" in blau, wenn sie kühlt.
define DaikinPerfera MQTT_DEVICE
attr DaikinPerfera IODev MyBroker
attr DaikinPerfera alias Daikin Perfera
attr DaikinPerfera autoSubscribeReadings DaikinPerfera/#
attr DaikinPerfera cmdIcon _on:sani_heating_heatpump@darkred _off:sani_heating_heatpump@grey Leer1:rc_BLANK Leer2:rc_BLANK
attr DaikinPerfera comment IP-Adresse: 192.168.2.39\
ESPEasy_ESP82xx_mega-20220616\
Relais GPIO-12 (D6):\
0 = Klimaanlage bekommt Strom (on)\
1 = Klimaanlage ist stromlos (off)
attr DaikinPerfera event-on-change-reading Power_W,Energy_WH,Power_kW:0.0001,Relais,Uptime:300
attr DaikinPerfera event-on-update-reading Energy_WH
attr DaikinPerfera eventMap /cmd event,Einschalten:_on/cmd event,Ausschalten:_off
attr DaikinPerfera group Daikin Perfera
attr DaikinPerfera icon sani_heating_heatpump
attr DaikinPerfera publishSet_cmd DaikinPerfera/cmd
attr DaikinPerfera room Heizung
attr DaikinPerfera sortby 1
attr DaikinPerfera stateFormat Daikin Perfera [$name:AC_an_aus]<br/>\
Outside temperature: [TH.Kuhlmannweg8:temperature]°C<br/>\
Air temperature: [CUL_TX_80:temperature]°C<br/>\
current power: [$name:Power_W:r1] W</br>voltage: [$name:Voltage_V] V<br/>\
uptime: [$name:Laufzeit]<br/>\
[$name:IPaddress]<br/>\
<div style='vertical-align: middle;; font-size: 85%;;'>[$name:Zeitstempel]</div>
attr DaikinPerfera subscribeReading_Current_A DaikinPerfera/DaikinPerfera/Current_A
attr DaikinPerfera subscribeReading_Energy_WH DaikinPerfera/DaikinPerfera/Energy_WH
attr DaikinPerfera subscribeReading_Free_Stack DaikinPerfera/DaikinPerfera.System.Info/Free_Stack
attr DaikinPerfera subscribeReading_LWT DaikinPerfera/status/LWT
attr DaikinPerfera subscribeReading_Power_W DaikinPerfera/DaikinPerfera/Power_W
attr DaikinPerfera subscribeReading_Relais DaikinPerfera/Relais/Relais
attr DaikinPerfera subscribeReading_System_load DaikinPerfera/DaikinPerfera.System.Info/System_load
attr DaikinPerfera subscribeReading_Uptime DaikinPerfera/DaikinPerfera.System.Info/Uptime
attr DaikinPerfera subscribeReading_Voltage_V DaikinPerfera/DaikinPerfera/Voltage_V
attr DaikinPerfera subscribeReading_Wifi_RSSI DaikinPerfera/DaikinPerfera.System.Info/Wifi_RSSI
attr DaikinPerfera subscribeReading_cmd DaikinPerfera/cmd
attr DaikinPerfera userReadings Power_kW:Power_W.* {ReadingsVal($name,'Power_W','')/1000}, \
readingsGroup_power:Power_W.* {round(ReadingsVal($name,'Power_W',''),0)}, \
readingsGroup_temp {ReadingsNum('CUL_TX_80','temperature','')}, \
Laufzeit {min2human(ReadingsVal($name,'Uptime',''))}, \
Zeitstempel {substr(ReadingsTimestamp($name,'transmission-state',''),0,16)}, \
AC_an_aus {if (ReadingsVal($name,'Power_W','') <= 5) {"<span style='color:#000000'>ist aus</span>"} \
elsif (5 < ReadingsVal($name,'Power_W','') <= 10) {"<span style='color:orange'><b>on hold</b></span>"} \
elsif (ReadingsVal($name,'Power_W','') > 10 and ReadingsVal('DaikinCloud_DaikinAP09627','operationMode','') eq "heating") {"<span style='color:red'><b>läuft</b></span>"} \
elsif (ReadingsVal($name,'Power_W','') > 10 and ReadingsVal('DaikinCloud_DaikinAP09627','operationMode','') eq "cooling") {"<span style='color:blue'><b>läuft</b></span>"}}, \
IPaddress {"<a href=\"http://192.168.2.39\" style=\"color: green;; text-decoration: underline;;\" target=\"_blank\" rel=\"noopener noreferrer\">http://192.168.2.39</a>"}
attr DaikinPerfera webCmd _on:_off:Leer1:Leer2
#   CFGFN      ./FHEM/myDaikinCloud.cfg
#   FUUID      62cf2200-f33f-e986-c396-915a0df32ed36afa
#   IODev      MyBroker
#   NAME       DaikinPerfera
#   NR         1436
#   STATE      Daikin Perfera <span style='color:orange'><b>on hold</b></span><br/>
#Outside temperature: 18.7°C<br/>
#Air temperature: 25.0°C<br/>
#current power: 6.4 W</br>voltage: 234.7 V<br/>
#uptime: 64<span style='vertical-align: +4px;; font-size: 75%;;'>d</span><font size=2> </font>21<span style='vertical-align: +4px;; font-size: 75%;;'>h</span><font size=2> </font>5<span style='vertical-align: +4px;; font-size: 75%;;'>m</span><br/>
#<a href="http://192.168.2.39" style="color: green; text-decoration: underline;" target="_blank" rel="noopener noreferrer">http://192.168.2.39</a><br/>
#<div style='vertical-align: middle; font-size: 85%;'>2025-09-05 20:12</div>
#   TYPE       MQTT_DEVICE
#   eventCount 5301
#   READINGS:
#     2025-09-05 20:12:36   AC_an_aus       <span style='color:orange'><b>on hold</b></span>
#     2025-09-05 20:12:35   Current_A       0.181
#     2025-09-05 20:12:35   Energy_WH       581.512
#     2025-09-05 20:09:36   Free_Stack      3264
#     2025-09-04 11:19:24   IODev           MyBroker
#     2025-09-05 20:12:36   IPaddress       <a href="http://192.168.2.39" style="color: green; text-decoration: underline;" target="_blank" rel="noopener noreferrer">http://192.168.2.39</a>
#     2025-09-05 14:27:14   LWT             Connected
#     2025-09-05 20:12:36   Laufzeit        64<span style='vertical-align: +4px;; font-size: 75%;;'>d</span><font size=2> </font>21<span style='vertical-align: +4px;; font-size: 75%;;'>h</span><font size=2> </font>5<span style='vertical-align: +4px;; font-size: 75%;;'>m</span>
#     2025-09-05 20:12:35   Power_W         6.4
#     2025-09-05 20:06:35   Power_kW        0.0064
#     2025-09-05 20:12:36   Relais          0
#     2025-09-05 20:09:36   System_load     11
#     2025-09-05 20:09:36   Uptime          93425
#     2025-09-05 20:12:35   Voltage_V       234.7
#     2025-09-05 20:09:36   Wifi_RSSI       -68
#     2025-09-05 20:12:36   Zeitstempel     2025-09-05 20:12
#     2025-07-03 09:08:15   cmd             event,Einschalten
#     2024-08-16 19:39:08   readingsGroup_name Daikin Perfera
#     2025-09-05 20:06:35   readingsGroup_power 6
#     2025-09-05 20:12:36   readingsGroup_temp 25.0
#     2025-09-05 20:12:36   transmission-state incoming publish received
#   helper:
#     bm:
#       MQTT::DEVICE::Set:
#         cnt        890
#         dmx        -1000
#         dtot       0
#         dtotcnt    0
#         mTS        05.09. 10:02:06
#         max        0.000349044799804688
#         tot        0.0469989776611328
#         mAr:
#           HASH(0x560aab724cc8)
#           DaikinPerfera
#           ?
#   message_ids:
#   publishSets:
#     cmd:
#       topic      DaikinPerfera/cmd
#       values:
#   sets:
#     cmd       
#   subscribe:
#     DaikinPerfera/#
#     DaikinPerfera/DaikinPerfera/Current_A
#     DaikinPerfera/DaikinPerfera/Energy_WH
#     DaikinPerfera/DaikinPerfera.System.Info/Free_Stack
#     DaikinPerfera/status/LWT
#     DaikinPerfera/DaikinPerfera/Power_W
#     DaikinPerfera/Relais/Relais
#     DaikinPerfera/DaikinPerfera.System.Info/System_load
#     DaikinPerfera/DaikinPerfera.System.Info/Uptime
#     DaikinPerfera/DaikinPerfera/Voltage_V
#     DaikinPerfera/DaikinPerfera.System.Info/Wifi_RSSI
#     DaikinPerfera/cmd
#   subscribeExpr:
#     ^DaikinPerfera.*$
#     ^DaikinPerfera\/DaikinPerfera\/Current_A$
#     ^DaikinPerfera\/DaikinPerfera\/Energy_WH$
#     ^DaikinPerfera\/DaikinPerfera.System.Info\/Free_Stack$
#     ^DaikinPerfera\/status\/LWT$
#     ^DaikinPerfera\/DaikinPerfera\/Power_W$
#     ^DaikinPerfera\/Relais\/Relais$
#     ^DaikinPerfera\/DaikinPerfera.System.Info\/System_load$
#     ^DaikinPerfera\/DaikinPerfera.System.Info\/Uptime$
#     ^DaikinPerfera\/DaikinPerfera\/Voltage_V$
#     ^DaikinPerfera\/DaikinPerfera.System.Info\/Wifi_RSSI$
#     ^DaikinPerfera\/cmd$
#   subscribeQos:
#     DaikinPerfera/#
#     DaikinPerfera/DaikinPerfera.System.Info/Free_Stack 0
#     DaikinPerfera/DaikinPerfera.System.Info/System_load 0
#     DaikinPerfera/DaikinPerfera.System.Info/Uptime 0
#     DaikinPerfera/DaikinPerfera.System.Info/Wifi_RSSI 0
#     DaikinPerfera/DaikinPerfera/Current_A 0
#     DaikinPerfera/DaikinPerfera/Energy_WH 0
#     DaikinPerfera/DaikinPerfera/Power_W 0
#     DaikinPerfera/DaikinPerfera/Voltage_V 0
#     DaikinPerfera/Relais/Relais 0
#     DaikinPerfera/cmd 0
#     DaikinPerfera/status/LWT 0
#   subscribeReadings:
#     DaikinPerfera/DaikinPerfera.System.Info/Free_Stack:
#       cmd       
#       name       Free_Stack
#     DaikinPerfera/DaikinPerfera.System.Info/System_load:
#       cmd       
#       name       System_load
#     DaikinPerfera/DaikinPerfera.System.Info/Uptime:
#       cmd       
#       name       Uptime
#     DaikinPerfera/DaikinPerfera.System.Info/Wifi_RSSI:
#       cmd       
#       name       Wifi_RSSI
#     DaikinPerfera/DaikinPerfera/Current_A:
#       cmd       
#       name       Current_A
#     DaikinPerfera/DaikinPerfera/Energy_WH:
#       cmd       
#       name       Energy_WH
#     DaikinPerfera/DaikinPerfera/Power_W:
#       cmd       
#       name       Power_W
#     DaikinPerfera/DaikinPerfera/Voltage_V:
#       cmd       
#       name       Voltage_V
#     DaikinPerfera/Relais/Relais:
#       cmd       
#       name       Relais
#     DaikinPerfera/cmd:
#       cmd       
#       name       cmd
#     DaikinPerfera/status/LWT:
#       cmd       
#       name       LWT
#
setstate DaikinPerfera Daikin Perfera <span style='color:orange'><b>on hold</b></span><br/>\
Outside temperature: 18.7°C<br/>\
Air temperature: 25.0°C<br/>\
current power: 6.4 W</br>voltage: 234.7 V<br/>\
uptime: 64<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>d</span><font size=2> </font>21<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>h</span><font size=2> </font>5<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>m</span><br/>\
<a href="http://192.168.2.39" style="color: green;; text-decoration: underline;;" target="_blank" rel="noopener noreferrer">http://192.168.2.39</a><br/>\
<div style='vertical-align: middle;; font-size: 85%;;'>2025-09-05 20:12</div>
setstate DaikinPerfera 2025-09-05 20:12:36 AC_an_aus <span style='color:orange'><b>on hold</b></span>
setstate DaikinPerfera 2025-09-05 20:12:35 Current_A 0.181
setstate DaikinPerfera 2025-09-05 20:12:35 Energy_WH 581.512
setstate DaikinPerfera 2025-09-05 20:09:36 Free_Stack 3264
setstate DaikinPerfera 2025-09-04 11:19:24 IODev MyBroker
setstate DaikinPerfera 2025-09-05 20:12:36 IPaddress <a href="http://192.168.2.39" style="color: green;; text-decoration: underline;;" target="_blank" rel="noopener noreferrer">http://192.168.2.39</a>
setstate DaikinPerfera 2025-09-05 14:27:14 LWT Connected
setstate DaikinPerfera 2025-09-05 20:12:36 Laufzeit 64<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>d</span><font size=2> </font>21<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>h</span><font size=2> </font>5<span style='vertical-align: +4px;;;; font-size: 75%;;;;'>m</span>
setstate DaikinPerfera 2025-09-05 20:12:35 Power_W 6.4
setstate DaikinPerfera 2025-09-05 20:06:35 Power_kW 0.0064
setstate DaikinPerfera 2025-09-05 20:12:36 Relais 0
setstate DaikinPerfera 2025-09-05 20:09:36 System_load 11
setstate DaikinPerfera 2025-09-05 20:09:36 Uptime 93425
setstate DaikinPerfera 2025-09-05 20:12:35 Voltage_V 234.7
setstate DaikinPerfera 2025-09-05 20:09:36 Wifi_RSSI -68
setstate DaikinPerfera 2025-09-05 20:12:36 Zeitstempel 2025-09-05 20:12
setstate DaikinPerfera 2025-07-03 09:08:15 cmd event,Einschalten
setstate DaikinPerfera 2024-08-16 19:39:08 readingsGroup_name Daikin Perfera
setstate DaikinPerfera 2025-09-05 20:06:35 readingsGroup_power 6
setstate DaikinPerfera 2025-09-05 20:12:36 readingsGroup_temp 25.0
setstate DaikinPerfera 2025-09-05 20:12:36 transmission-state incoming publish received


Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

TomLee

Die Logik legst nicht in Readings ab, sowas macht man in stateFormat oder devStateIcon dann in Perl.

Wenn ich am PC bin (später/morgen), versuch ich ein Beispiel zum Verständnis zu basteln.

Prof. Dr. Peter Henning

Kreativer Vorschlag: Bau für das Device eine readingsGroup zusammen, auch wenn diese nur ein Device enthält. Diese enthält diverse Möglichkeiten, das Ausgabeformat (z.B. Schriftschnitt und Farbe) an den Wert der Readings anzupassen. Beispiel hier: https://wiki.fhem.de/wiki/Wertpapieranzeige

LG

pah

TomLee

#8
Hier ein Beispielcode den man in devStateIcon oder stateFormat as is verwenden kann und genau das gleiche wie dein Gebastel machen sollte:
{
my $outtemp = ReadingsNum('TH.Kuhlmannweg8','temperature',23);
my $airtemp = ReadingsNum('CUL_TX_80','temperature',23);
my $current = ReadingsNum('$name','Power_W',23,1);
my $voltage = ReadingsNum($name,'Voltage_V',23);
#my $duration = min2human(ReadingsVal($name,'Uptime',''));
my $timestamp = "<span style='vertical-align: middle; font-size: 85%;'>".substr(ReadingsTimestamp($name,'transmission-state',''),0,16).'</span>';
my $ac_on_off =     ReadingsNum($name,'Power_W','') <= 5
    ? "<span style='color:#000000'>ist aus</span>"
    : ReadingsNum($name,'Power_W','') <= 10
      ? "<span style='color:orange'><b>on hold</b></span>"
      : ReadingsVal('DaikinCloud_DaikinAP09627','operationMode','') eq 'heating'
        ? "<span style='color:red'><b>läuft</b></span>"
        : ReadingsVal('DaikinCloud_DaikinAP09627','operationMode','') eq 'cooling'
          ? "<span style='color:blue'><b>läuft</b></span>"
          : "";
my $ipaddr = qq(<a href="http://192.168.2.39" style="color: green; text-decoration: underline;" target="_blank" rel="noopener noreferrer">http://192.168.2.39</a>);

"<div>Daikin Perfera $ac_on_off<br>
Outside temperature: $outtemp°C<br>
Air temperature: $airtemp °C<br>
current power: $current W</br>
voltage: $voltage V<br>
uptime: duration<br>
$ipaddr<br>
$timestamp</div>";
}

Gisbert

Hallo TomLee,

ich werde deinen Vorschlag sehr gerne testen. Ob ich das flächendeckend umsetzen werde, kann ich aber nicht sagen, da es sehr viele Stellen gibt, an die ich dann ran muss.

Wie sieht es mit Resourcen (hauptsächlich Rechenzeit) aus, die mein Gebastel im Vergleich zu deiner Lösung benötigt? Wenn das einen deutlichen positiven Beitrag liefert, dann ist das eine starke Motivation. Kann man überhaupt abschätzen, welche Lösung wieviel Rechenzeit benötigt?

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

TomLee

Zitat von: Gisbert am 06 September 2025, 18:54:06...

Wie sieht es mit Resourcen (hauptsächlich Rechenzeit) aus, die mein Gebastel im Vergleich zu deiner Lösung benötigt? Wenn das einen deutlichen positiven Beitrag liefert, dann ist das eine starke Motivation. Kann man überhaupt abschätzen, welche Lösung wieviel Rechenzeit benötigt?

Viele Grüße Gisbert

Wenn Du dir über Resourcen Gedanken machst, dann ist mVn. dein Gebastel das kleinere Übel.

Resourcen kannst du schonen indem Du mal den Umstieg auf MQTT2 in Erwägung ziehst.

Hab die Vorteile mal von ChatGPT zusammenfassen lassen:

ZitatSehr gern – hier die kompakte Zusammenfassung der Vorteile von MQTT2 gegenüber dem alten MQTT-Modul:
🚀 Vorteile von MQTT2 (MQTT2_SERVER / MQTT2_CLIENT + MQTT2_DEVICE)
Keine externen Perl-Module nötig
Läuft komplett ohne zusätzliche Abhängigkeiten wie Net::MQTT::Simple.
Out-of-the-box einsatzbereit → weniger Ärger bei Updates.
Integriertes JSON-Handling
MQTT2_DEVICE versteht JSON direkt.
Kein expandJSON oder manuelles Parsen → weniger CPU-Last, weniger Events.
Autocreate & Templates
Geräte können automatisch erzeugt werden.
Templates erleichtern die Einrichtung und sorgen für saubere Strukturen.
Filtermöglichkeiten
Mit ignoreRegexp lassen sich unnötige Topics von Anfang an aussortieren.
Spart Events, CPU und Speicher.
Bessere Performance
Weniger Overhead, optimierte interne Strukturen.
Besonders bei vielen Geräten/hohem Nachrichtenaufkommen deutlich schneller.
Ressourcenschonender
Keine doppelten Events und weniger Parsing-Arbeit.
Geringere CPU-Last und RAM-Belastung im Vergleich zum alten MQTT.
Flexibler Einsatz
MQTT2_SERVER: FHEM wird selbst Broker → kein externer Broker nötig.
MQTT2_CLIENT: Anbindung an externe Broker (z. B. Mosquitto) möglich.
Damit volle Wahlfreiheit.
Moderne Features
SetExtensions (on-for-timer, etc.) integriert.
Bessere Unterstützung für komplexe Payloads.
Zukunftssicher, da aktiv gepflegt.
Weniger Pflegeaufwand
Kein zusätzlicher Broker oder Perl-Paket-Installationen.
Einheitliche Modulbasis für alle MQTT-Geräte in FHEM.
✅ Fazit:
MQTT2 ist performanter, ressourcenschonender, leichter einzurichten und zukunftssicher.
Das alte MQTT-Modul lohnt sich heute nur noch, wenn du ein ganz spezielles Setup hast, das zwingend Net::MQTT::Simple braucht – ansonsten: klarer Vorteil für MQTT2.
Willst du, dass ich dir eine Vergleichstabelle (MQTT vs. MQTT2) baue, die du direkt im FHEM-Forum oder als Notiz verwenden kannst?

Zitat# 📊 Vergleich: MQTT vs. MQTT2 in FHEM

| Kriterium              | **MQTT (alt)** | **MQTT2 (neu)** |
|------------------------|----------------|-----------------|
| **Perl-Abhängigkeiten** | Benötigt zusätzlich `Net::MQTT::Simple` | Keine zusätzlichen Module nötig |
| **Broker**             | Extern (z. B. Mosquitto) erforderlich | `MQTT2_SERVER` = interner Broker, `MQTT2_CLIENT` = externer Broker möglich |
| **Geräte-Integration** | `MQTT_DEVICE`, eher manuell | `MQTT2_DEVICE`, Autocreate & Templates |
| **JSON-Unterstützung** | Nur über `expandJSON` oder DOIF | Direkt integriert → effizienter |
| **Event-Handling**     | Viele Events, oft doppelter Overhead | Weniger Events, gezieltes Filtern mit `ignoreRegexp` |
| **Performance**        | Höherer Overhead, mehr CPU-Last bei vielen Geräten | Deutlich performanter, optimierte Strukturen |
| **Ressourcenverbrauch**| Mehr CPU & RAM durch Zusatzmodule & Event-Overhead | Ressourcenschonend durch integriertes Handling |
| **Pflegeaufwand**      | Zusätzliche Perl-Module und externer Broker pflegen | Alles direkt in FHEM, weniger Abhängigkeiten |
| **Funktionsumfang**    | Basis-MQTT | Moderne Features (SetExtensions, bessere Payload-Verarbeitung, Zukunftssicherheit) |
| **Status**             | Legacy, nur noch Wartung | Aktiv gepflegt und empfohlen |

✅ **Kurzfazit:** 
- Das alte `MQTT`-Modul = mehr Aufwand, mehr Abhängigkeiten, weniger effizient. 
- Das neue `MQTT2` = **performanter, ressourcenschonender, leichter zu warten und zukunftssicher**.



Gisbert

Hallo TomLee,

danke für deinen Hinweis zu MQTT2. Da ich sehr viele Geräte hab, wird das ein ziemlicher Aufwand, den ich diesmal umsetzen werde - ich hatte vorher schon Ratschläge dazu, hab mich aber vor dem Aufwand gedrückt. Ich werde mir das in Ruhe anschauen, einen Plan machen und den dann nach und nach umsetzen.

Viele Dank für deine Mühe
Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

TomLee

Du musst dich dabei gar nicht verrückt machen und große Pläne schmieden.

"MQTT" läuft mit "MQTT2" auch parallel.

Definier einfach eine MQTT2_SERVER-Definition:
define MQTT2_Server MQTT2_SERVER 1884 globalund leite je nach Priorität und deinem Verständnis die Geräte auf den Port 1884 um.