Hauptmenü

Neueste Beiträge

#11
DOIF / Aw: Energy-Card
Letzter Beitrag von Per - 17 April 2026, 22:02:15
Andere Frage: warum wird der Speicher bei 89% schon nicht mehr geladen?
#12
TabletUI / Aw: [FTUI2] Widget Thermostat ...
Letzter Beitrag von romakrau - 17 April 2026, 21:59:43
Habe das Device mal neu mit dem Template AVATTO TRV06 TS0601 neu angelegt.

Internals:
   CFGFN     
   CID        Kinderzimmer
   DEF        Kinderzimmer
   FUUID      69e28685-f33f-e93f-3a0c-27570ae43d8deed5
   IODev      myBroker
   LASTInputDev myBroker
   MSGCNT     70
   NAME       Kinderzimmer
   NR         425
   STATE      lock:LOCK\modus:off
Measured: 21&deg;C / Desired: 17.5&deg;C<br>Battery: ok
   TYPE       MQTT2_DEVICE
   eventCount 98
   myBroker_CONN myBroker_192.168.187.76_54192
   myBroker_MSGCNT 70
   myBroker_TIME 2026-04-17 21:53:34
   periodicCounter 42
   JSONMAP:
     Battery    battery_low
     current_heating_setpoint desired-temp
     local_temperature temperature
     system_mode mode
   OLDREADINGS:
   READINGS:
     2026-04-17 21:23:46   IODev           myBroker
     2026-04-17 21:14:13   associatedWith  zigbee2mqtt
     2026-04-17 21:25:00   attrTemplateVersion 20251221
     2026-04-17 21:53:34   batteryState    ok
     2026-04-17 21:53:34   battery_low     false
     2026-04-17 21:53:34   child_lock      LOCK
     2026-04-17 21:53:34   desired-temp    17.5
     2026-04-17 21:53:34   frost_protection ON
     2026-04-17 21:53:34   linkquality     149
     2026-04-17 21:53:34   local_temperature_calibration 4
     2026-04-17 21:53:34   mode            off
     2026-04-17 21:53:34   pi_heating_demand 20
     2026-04-17 21:53:34   running_state   idle
     2026-04-17 21:53:34   scale_protection ON
     2026-04-17 21:53:34   schedule_friday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_monday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_saturday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_sunday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_thursday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_tuesday 06:00/21.0 08:00/16.0 12:00/21.0 14:00/16.0 18:00/21.0 22:00/16.0
     2026-04-17 21:53:34   schedule_wednesday 06:00/17.0 08:00/17.0 12:00/17.0 14:00/16.0 20:00/16.0 22:00/16.0
     2026-04-17 21:53:34   temperature     21
Attributes:
   comment    For use with weekprofile, additional configuration and code would be needed, 6 Transitions required, format example: "HH:MM/C HH:MM/C HH:MM/C HH:MM/C HH:MM/C HH:MM/C"
   devStateIcon lock.LOCK:secur_locked:child_lock+UNLOCK lock.UNLOCK:secur_open:child_lock+LOCK modus.auto:sani_heating_automatic modus.heat:sani_heating_manual modus.off:sani_heating_level_0
   devicetopic z2m/Kinderzimmer
   getList    desired-temp:noArg desired-temp $DEVICETOPIC/get {"current_heating_setpoint": ""}
  temperature:noArg temperature $DEVICETOPIC/get {"local_temperature": ""}
attr Kinderzimmer periodicCmd temperature:55
   icon       temp_control
   jsonMap    current_heating_setpoint:desired-temp local_temperature:temperature Battery:battery_low system_mode:mode
   model      zigbee2mqtt_thermostat_AVATTO_TRV06_TS0601
   periodicCmd temperature:55
   readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
   room       MQTT2_DEVICE
   setList    desired-temp:slider,5.0,0.5,30.0,1 $DEVICETOPIC/set {"current_heating_setpoint": $EVTPART1 }
  child_lock:LOCK,UNLOCK $DEVICETOPIC/set {"child_lock": "$EVTPART1"}
  schedule_monday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_monday":"$payload"})}
  schedule_tuesday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_tuesday":"$payload"})}
  schedule_wednesday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_wednesday":"$payload"})}
  schedule_thursday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_thursday":"$payload"})}
  schedule_friday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_friday":"$payload"})}
  schedule_saturday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_saturday":"$payload"})}
  schedule_sunday:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set {"schedule_sunday":"$payload"})}
  mode:heat,auto,off $DEVICETOPIC/set {"system_mode": "$EVTPART1"}
  frost_protection:ON,OFF $DEVICETOPIC/set {"frost_protection": "$EVTPART1"}
  scale_protection:ON,OFF $DEVICETOPIC/set {"scale_protection": "$EVTPART1"}
  local_temperature_calibration:slider,-9.0,1,9.0,1 $DEVICETOPIC/set {"local_temperature_calibration": $EVTPART1 }
  x_send_set_payload:textField { my $payload = $EVENT;$payload =~ s/$EVTPART0 //; qq($DEVICETOPIC/set $payload)}
   setStateList on off
   stateFormat lock:child_lock\modus:mode
Measured: temperature&deg;C / Desired: desired-temp&deg;C<br>Battery: batteryState
   userReadings batteryState:battery_low.* {ReadingsVal($name,'battery_low','false') eq 'false'?'ok':'low'}
   userattr   weekprofile
   webCmd     desired-temp
   weekprofile zigbee_Kinderzimmer

Entfernt habe ich folgendes setList, da nicht vorhanden:

pi_heating_demand:slider,0,1,100,1 $\DEVICETOPIC/set {"pi_heating_demand": $EVTPART1 }

Und das Attribut da ich lieber mit dem Slider arbeite:

attr DEVICE widgetOverride desired-temp@set:knob,min:5,max:30,angleArc:.....

Zumindest klappt jetzt das Get und die desired-temp wird im Widget und WebUI nachgeführt.
Das Setzen mittels WebUI klappt. Das Setzen per Widget nicht. Das Widget scheint das $DEVICETOPIC
nicht auflösen zu können.

Ergebnis MQTT Explorer:

$DEVICETOPIC
set = {"current_heating_setpoint": 0 }

Ein get Kinderzimmer desired-temp im WebUI ergibt
"Timeout reading answer for z2m/Kinderzimmer/get {"current_heating_setpoint": ""}"
Ein get Kinderzimmer temperature im WebUI ergibt
"Timeout reading answer for z2m/Kinderzimmer/get {"local_temperature": ""}"

Ich bin da etwas ratlos.
#13
Server - Linux / Aw: docker image - health chec...
Letzter Beitrag von Sidey - 17 April 2026, 21:55:23
Zitat von: CoolTux am 17 April 2026, 08:55:08Leider finde ich keinen weiteren Hinweis auf das Verzeichnis .dockerenv ausser im Modulcode von DockerImageInfo.
Woher sollte das Verzeichnis denn kommen?

Eigentlich ist es eine Datei und jetzt weiss ich, dass die nur von der Docker Engine angelegt wird.
Da muss ich mal ran und eine universellere Erkennung einbauen.


Grüße Sidey
#14
Server - Linux / Aw: Offizielles FHEM Docker Ba...
Letzter Beitrag von Sidey - 17 April 2026, 21:50:19
Zitat von: passibe am 17 April 2026, 13:13:26
Zitat von: ch.eick am 17 April 2026, 11:15:37Soap::Lite
Vielleicht ist das im Modul einfach auch falsch geschrieben? Also Soap statt SOAP?
Nein, es ist korrekt referenziert, nur die Textausgabe ist in falscher Schreibweise.
#16
FHEM Code changes / Revision 31131: 98_DOIF.pm: ui...
Letzter Beitrag von System - 17 April 2026, 21:10:58
Revision 31131: 98_DOIF.pm: uiTable: executing own JS code

98_DOIF.pm: uiTable: executing own JS code

Source: Revision 31131: 98_DOIF.pm: uiTable: executing own JS code
#17
Wallboxen und E-Fahrzeuge / Aw: Integration My BMW Daten m...
Letzter Beitrag von passibe - 17 April 2026, 21:00:55
Zitat von: Prof. Dr. Peter Henning am 17 April 2026, 19:25:05Dass BMW diese Daten abgreift, ist klar - aber die Weitergabe ist in der Form nicht statthaft.
Was? Wenn schon ist das Abgreifen durch BMW das Datenschutzproblem. Die Weitergabe an die betroffene Person ist doch dann sogar eher noch begrüßenswert (zumal diese Daten sowieso vom Anspruch aus Art. 15 Abs. 3 DSGVO umfasst sein dürften).
Das ist ja immer das lächerlichste und nervigste, wenn Unternehmen, die Daten über jemanden sammeln, sich bezüglich dieser Daten gegenüber der betroffenen Person selbst auf "Datenschutz" berufen, so als müsste man jemanden vor dem Zugriff auf seine eigenen Daten schützen.

Ansonsten: https://www.youtube.com/watch?v=iHsz6jzjbRc
#18
Unterstützende Dienste / Aw: Neues Modul: Signalbot (In...
Letzter Beitrag von HarryT - 17 April 2026, 20:55:04
Hi all


Reregister a numbwer works for me now.

For the people who want to know more:
I am not sure what made the difference. I normally had my Raspberry connected with WiFi and Cable over 2 routers after each other. The last router works only in ipv4.
Today I decided to connect my WiFi through another network. Just 1 modem/router and ipv6. After that the registration worked immediately. 10 minutes before not.
But it might be that something else triggered this the difference.

Some findings:
- "signal_install.sh restore"  restores also signal.service. If you have "JAVA_HOME=/opt/java" in the backup file a restart of signal might fail after the restore. Not much to do about it but be aware. With "sudo nano -c /etc/systemd/system/signal.service" you can change it in "#JAVA_HOME=" save it and restart your computer.
After that make a fresh backup with signal_install.sh backup

- the signalbot module works fine. I would prefer if it says what you should do when starting registering a new number. But that might also be in the wiki. However whether the registering is correct or not, you have to find this out in the logging. After a short time you get the call with the verification code when the registration was succesfull.

Thanks Jorg for your work

Greetings
 Harry
#19
DOIF / Aw: Energy-Card
Letzter Beitrag von Damian - 17 April 2026, 20:51:40
Ich habe nun die Energy_card fertiggestellt. Dafür wurde allerdings eine neue DOIF-Version erstellt (morgen per Update verfügbar oder direkt von hier ladbar https://svn.fhem.de/trac/browser/trunk/fhem/FHEM?desc=1&order=date). Diese erlaubt nun ohne Umwege Javascript auszuführen. Das war erforderlich damit ich per Änderung von CSS-Attributen den animierten Energiefluss besser abhängig von der Leistung dynamisch anpassen konnte.

Die Definition kann beliebig angepasst werden. Man könnte z. B. statt Haus sein E-Auto darstellen.

Im einfachsten Fall braucht man am Ende der Definition nur die Readings auf eigene anzupassen und jeweils die maximale Leistung entsprechend zu ändern.

Die Geschwindigkeit und die Richtung der Stromfluss-Animation wird abhängig der aktuellen Leistung visualisiert, siehe GIF-Animation im Anhang.


Du darfst diesen Dateianhang nicht ansehen.

defmod di_energy_card DOIF {}
attr di_energy_card uiTable {\
$ATTRIBUTESFIRST = 1;;\
\
## Energy_card kann über das Attribut zoom skaliert werden\
\
$TABLE = 'zoom: 1;; width: 473px;; height: 374px;; text-align: left;; vertical-align: top;; border-radius:0%;;  position:relative;; background: linear-gradient(to bottom, rgb(40,40,40), rgb(60, 60, 60));; ';;\
\
package ui_Table;;\
\
sub move {\
my ($left, $top, $content) = @_;;\
my $value;;\
if (ref($content) eq "ARRAY") {\
  $value = $content->[0];;\
} else {\
  $value =$content;;\
}\
\
my $out = '<div style="position:absolute;; left:'\
  . $left . 'px;; top:'\
  . $top . 'px;;">'\
  . $value .\
  '</div>';;\
  \
if (ref($content) eq "ARRAY") {\
  return ([$out,$content->[1]]);;\
} else {\
  return ($out);;\
}\
}## end of move\
\
sub flow {\
\
my ($d,$item,$power,$max,$leftright)=@_;;\
my $dur;;\
if ($power == 0) {\
  $dur=0;;\
} else {\
  $power=$max if ($power>$max);;\
  $dur=int((6-abs(5*$power/$max))*10)/10;;\
}\
\
\
my $from;;\
my $to;;\
my $x1;;\
my $x2;;\
\
\
if ($leftright) {\
  $from="-1 -1";;\
  $to="1 1";;\
  $x1=0;;\
  $x2=100;;\
} else {\
  $from="1 1";;\
  $to="-1 -1";;\
  $x1=100;;\
  $x2=0;;\
}\
\
my $out='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 90 35" width="90" height="35" style="width:90px;; height:35px;; ">';;\
\
$out .= '<defs>\
<linearGradient id="flowGradient_'.$item.'" \
    x1="'.$x1.'%" y1="0%" \
    x2="'.$x2.'%" y2="0%" \
    >\
    <stop offset="0%" stop-color="white" stop-opacity="0.2"/>\
    <stop offset="95%" stop-color="white" stop-opacity="1"/>\
    <stop offset="100%" stop-color="white" stop-opacity="0.2"/>\
    <animateTransform \
        id="flowAnim_'.$item.'" \
        attributeName="gradientTransform" \
        type="translate" \
        from="'.$from.'" \
        to="'.$to.'" \
        dur="'.$dur.'s" \
        repeatCount="indefinite" \
        calcMode="linear"/>\
</linearGradient>\
</defs>\
<path d="'.$d.'" fill="none" stroke="url(#flowGradient_'.$item.')" stroke-width="3" />';;\
\
##$out .= '<defs> <linearGradient id="flowGradient_'.$item.'" x1="'.$x1.'%" y1="0%" x2="'.$x2.'%" y2="0%"> <stop offset="0%" stop-color="gray" stop-opacity="0.2"/> <stop offset="100%" stop-color="white" stop-opacity="1"/> <stop offset="0%" stop-color="gray" stop-opacity="0.2"/></defs><path d="'.$d.'" fill="none" stroke="gray" stroke-opacity="0.2" stroke-width="3"/><path d="'.$d.'" fill="none" stroke="url(#flowGradient_'.$item.')" stroke-width="2" stroke-dasharray="3 9"><animate id="flowAnim_'.$item.'" attributeName="stroke-dashoffset" from="'.$from.'" to="'.$to.'" dur="'.$dur.'s" repeatCount="indefinite"/></path>';;\
\
return ([$out,'var e=document.getElementById("flowAnim_'.$item.'");;if (e) {e.setAttribute("dur","'.$dur.'s");;e.setAttribute("from","'.$from.'");;e.setAttribute("to","'.$to.'");;};; var e=document.getElementById("flowGradient_'.$item.'");;if (e) {e.setAttribute("x1","'.$x1.'%");;e.setAttribute("x2","'.$x2.'%");;}'])\
}  ## end of flow\
\
sub grid_power {\
my ($power,$max)=@_;;\
return (move(110,149,flow("M 5 0 A 30 30 0 0 0 35 30 L 90 30","grid",$power,$max,($power  > 0 ? 0 : 1))));;\
} \
\
sub solar_power {\
my ($power,$max)=@_;;\
  return move(274,149,flow("M 85 0 A 30 30 0 0 1 55 30 L 0 30","solar",$power,$max,0));;\
} \
\
sub home_power {\
my ($power,$max)=@_;;  \
return move(110,185,flow("M 5 35 A 30 30 0 0 1 35 5 L 90 5","home",$power,$max,0));;\
}\
\
sub battery_power {\
my ($power,$max)=@_;;\
return move(274,185,flow("M 85 35 A 30 30 0 0 0 55 5 L 0 5","battery",$power,$max,($power < 0 ? 0:1)));;\
}\
\
sub grid {\
my ($power,$feed,$consum)=@_;;\
move(2,2,card($power,"Netz","scene_power_grid\@silver",-5,5,undef,undef,"kW",[(-1,20,-0.01,40,1,65,5,85)],"3","130,autoscaling,steps,footer,noycolor,ring,180","nogradient,,innerring,nopointer,negzeropos",undef, [[$feed,0,30,undef,undef,"Einsp.",[(10,65,30,85)]],[$consum,0,10,undef,undef,"Bezug",[(3,40,10,20)]]],0,10,undef,undef,["",""],undef,"1,,fill:silver, kWh"));;\
}\
\
\
sub self {\
my ($autark,$EVG)=@_;;\
move(200,151,ring2($autark,0,100,undef,undef,"Autarkie",120,[(33.3,40,66.6,65,100,85)],"0,,fill:silver, %",$EVG,0,100,undef,undef,"EVQ",[(33.3,40,66.6,65,100,85)],"0,,fill:silver, %",undef,undef,"nogradient,,innerring,nopointer"))\
}\
\
sub solar { \
my ($power,$energy)=@_;;  move(237,2,card($power,"PV","solar_icon\@silver",0,3.6,undef,undef,"kW",[(1.2,45,2.4,65,3.6,85)],"3,,,","130,autoscaling,steps,footer,noycolor,ring,180","nogradient,,innerring,nopointer",undef, [$energy],0,30,undef,undef,"",[(10,45,20,65,30,85)],"1,,, kWh"))\
}\
\
sub home {\
my ($power,$consum)=@_;;\
  move(2,222,card($power,"Haus ","fa_home\@silver",0,5,undef,undef,"kW",[(1,40,5,20)],"3","130,autoscaling,steps,footer,noycolor,ring,180","nogradient,,innerring,nopointer,negzeropos",undef, [[$consum]],0,10,undef,undef,[""],[(5,40,10,20)],"1,,, kWh"));;\
}\
\
sub battery {\
my ($power,$Cap)=@_;;\
    move(237,222,card($power,"Speicher","battery_100\@silver",-1000,1000,undef,undef,"Watt",[(-300,30,-0.01,40,300,190,1000,170)],"0,,,","130,fixedscaling,steps,footer,noycolor,ring,180","1,,1,0,negzeropos",undef,[$Cap],0,100,undef,undef,"",[(20,20,50,40,80,65,100,85)],"0,font-size:120%,, %"))\
}\
\
} ## end of perl area\
\
## Tabellendefinition\
## Hier auf eigene Readings anpassen\
\
grid([MQTT2_DVES_C58DCB:power_fc:144col1d],[di_counter_new:MQTT2_DVES_C58DCB.total_f.day],[di_counter_new:MQTT2_DVES_C58DCB.total_c_positiv.day]).\
solar([MQTT2_DVES_C58DCB:power_pv:144col1d],[di_counter_new:MQTT2_DVES_C58DCB.total_pv.day]).\
home ([MQTT2_DVES_C58DCB:power_consum:144col1d],[di_counter_new:MQTT2_DVES_C58DCB.total_consum.day]).\
battery([ecoflowStreamACpro:quota_powGetBpCms:144col1d],[ecoflowStreamACpro:quota_soc]).\
self([energy:autark],[energy:evg]).\
grid_power([MQTT2_DVES_C58DCB:power_fc],3.6).\
solar_power([MQTT2_DVES_C58DCB:power_pv],3.6).\
battery_power([ecoflowStreamACpro:quota_powGetBpCms],1050).\
home_power([MQTT2_DVES_C58DCB:power_consum],3.6)

#20
Ankündigungen / Aw: readingsProxy: überarbeite...
Letzter Beitrag von Dr. Boris Neubert - 17 April 2026, 20:27:34
Zitat von: Beta-User am 13 April 2026, 18:51:10setstate Aussentemperatur_Nord 10.8 °C

Die dritte Zeile ist das state-Reading, das aus dem primären Proxy kommt, und die erste Zeile wird vom stateFormat-Attribut produziert. Das habe ich auch so. Die dritte Zeile kommt vom legacy code in Zeile 154:

    readingsProxy_readingsSingleUpdate($hash, "state", $value);
Aus Gründen der Abwärtskompatibiltät nicht angepackt.