Hauptmenü

Neueste Beiträge

#1
Sonstige Systeme / Using Modbus to Control Batter...
Letzter Beitrag von middlejoyeux - 23 März 2026, 04:12:24
Hello everyone,

I'm looking to use the module mentioned above to control or block battery charging at specific times via Modbus on my SMA TP inverter and/or Sunny Home Manager.

I understand that something similar has already been implemented before. MadMax has kindly agreed to share his code again here, which would be greatly appreciated.

Thanks in advance for the support!
#2
Einplatinencomputer / Aw: USB Verbindung funktionier...
Letzter Beitrag von RalfRog - 23 März 2026, 00:31:35
Zitat von: Beta-User am 22 März 2026, 07:58:13Na ja, "irgendwann" muss man halt konsequent sein und "deprecated" features deaktivieren. Vermutlich war das aber schon unter bullseye ein (nicht so verbreitetes) Problem. Die Entscheidung scheint schon 2018 gefallen zu sein: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=897916.
Muss man dann aber nicht verstehen warum im PI-OS mit Bookworm (und Trixie?) die USB-Interfaces "plugdev" bekommen haben.
#3
Einplatinencomputer / Aw: USB Verbindung funktionier...
Letzter Beitrag von RalfRog - 23 März 2026, 00:08:48
Zitat von: KölnSolar am 21 März 2026, 18:54:25Du meinst die Group plugdev ?(Dein Link ist falsch)
Ja sorry, da war Copy&Paste auf dem Smartphone etwas daneben. Ich habe den Link oben korrigiert.

Die geänderte Gruppe "plugdev" war ja tatsächlich schon im bookworm -- in #1 hat es @Beta-User schon erwähnt.
Aktuell ist bei mir kein Pi aktiv - auf Debian ist die Gruppe noch "dialout"

Gruß Ralf


#4
DOIF / Aw: "di_counter" get_data
Letzter Beitrag von Damian - 22 März 2026, 23:51:31
Er findet offenbar nicht den Hash zum Device di_counter.

Es gibt ja eine aktualisierte Version di_counter_new:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Tages-,_Monats-_und_Jahresstatistik_f%C3%BCr_Strom-,_Gas-,_Wasserz%C3%A4hler_und_andere_Z%C3%A4hler

Könntest die mal probieren.


#5
Solaranlagen / Aw: Modul für Ecoflow-Komponen...
Letzter Beitrag von Damian - 22 März 2026, 23:26:28
Ich habe nun den API-Key erstellt.

Beim Laden des Ecoflow-Moduls bekomme ich die Meldung:

Can't locate URL/Encode.pm in @INC (you may need to install the URL::Encode module) ...
Was muss ich da noch installieren?

git clone http://github.com/chansen/p5-url-encode

reicht offenbar nicht aus.
#6
DOIF / "di_counter" get_data
Letzter Beitrag von hajo23 - 22 März 2026, 23:08:38
Hallo Damian,

ich versuche gerade mit meinem Zählermodul nach Deinem Beispiel "di_counter" auf ein neues System umzuziehen. Ich habe dazu logs auf das neue System kopiert.
Jetzt wollte die Daten per get_data importieren. Das führt zu "Can't use string ("") as a HASH ref while "strict refs" in use at ./FHEM/98_DOIF.pm line 1552.

Auf dem (noch) laufenden System geht es auch nicht. Ich gestehe, ich habe es erst jetzt zum ersten Mal versucht. Auch ein Versuch manuell mit
{{::DOIF_set_card_data ("di_counter","di_counter","Zaehler180.last_month","bar2year",0,fhem("get counter.di_counter.Zaehler180.log - - 2022-11-01 2023-02-03 4:Zaehler180.last_month"))}}führt zum gleichen Fehler. Die log-Dateien (z.B. counter.di_counter.Zaehler180.log) kann ich einsehen.

An dieser Stelle komme ich nicht weiter. Hast Du eine Idee?

defmod di_counter DOIF subs {\
  ##                     Device        Reading   \
  push (@{$_counter},["SolaxModbus","wr_cum"]);;         ## Solarenergie\
  push (@{$_counter},["Smartmeter","Zaehler280"]);;      ## Einspeisezähler\
  push (@{$_counter},["Smartmeter","Zaehler180n"]);;     ## Bezugszähler neg\
  push (@{$_counter},["di_counter","EgZaehler"]);;       ## Eigenverbrauch\
  push (@{$_counter},["di_counter","Zaehler180"]);;      ## Bezugszähler pos\
  push (@{$_counter},["SD_WS_207_D34B","rain_total"]);;  ## Regenmenge\
  push (@{$_counter},["Smartmeter","Zaehler180"]);;      ## Bezugszähler\
  \
  sub midnight { ## Diese Funktion wird um Mitternacht ausgeführt\
    my ($device,$reading,$mday,$yday)=@_;;\
    set_Reading("EgZ_last", 0,0);;\
    set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));;\
    set_Reading("$device.$reading.last_day",get_Reading("$device.$reading.day",0),1);;\
    set_Reading("$device.$reading.day",0,1);;\
    if ($mday == 1) {\
      set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.last_month",get_Reading("$device.$reading.month",0),1);;\
      set_Reading("$device.$reading.month",0,1);;\
      if ($yday == 0) {\
        set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
        set_Reading("$device.$reading.last_year",get_Reading("$device.$reading.year",0),1);;\
        set_Reading("$device.$reading.year",0,1);;\
      }\
    }\
  }\
  \
  sub init_readings {\
    my ($device,$reading)=@_;;\
    if (get_Reading("$device.$reading.day_counter","") eq "") {   ## Initialisierung der Readings\
      ## aktuellen Zählerstand initialisieren\
      set_Reading("$device.$reading.last_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.day_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.month_counter",ReadingsVal($device, $reading,0));;\
      set_Reading("$device.$reading.year_counter",ReadingsVal($device, $reading,0));;\
      set_Reading ("$device.$reading.day",0);;           ## aktueller Tagesverbrauch\
      set_Reading ("$device.$reading.month",0);;         ## aktueller Monatsverbrauch\
      set_Reading ("$device.$reading.year",0);;          ## aktueller Jahresverbrauch\
      set_Reading ("$device.$reading.last_day",0);;      ## Verbrauch des letzten Tages\
      set_Reading ("$device.$reading.last_month",0);;    ## Verbrauch des letzten Monats\
      set_Reading ("$device.$reading.last_year",0);;     ## Verbrauch des letzten Jahres\
\
      ## Log definieren\
      fhem ("defmod log.counter.$device.$reading FileLog ./log/counter.$device.$reading.log $SELF:$device.$reading.last_(day|month|year):.*");;\
      fhem ("attr log.counter.$device.$reading room Filelogs");;\
    }\
  }\
} ## Ende subs-Block\
\
get_data {                             ## Optionale Übernahme bestehender Daten aus dem Log\
  for (my $i=0;;$i<@{$_counter};;$i++) {\
    ## my $i=3;;\
  set_Reading("$i last_hour $_counter[$i][0] $_counter[$i][1]", "log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_hour",1);;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_hour","bar2day",-10,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_hour"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_day","bar2month",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_day"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_month","bar2year",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_month"));;\
    ::DOIF_set_card_data ("$SELF","$SELF","$_counter[$i][0].$_counter[$i][1].last_year","bar2decade",-300,fhem("get log.counter.$_counter[$i][0].$_counter[$i][1] ./log/counter.$_counter[$i][0].$_counter[$i][1].log - 2000 3000 4:last_year"));;\
  }\
}\
\
mid {[00:01];;                          ## Sicherung der Daten um Mitternacht\
  for (my $i=0;;$i<@{$_counter};;$i++) { ## Für jeden Zähler wird die Funktion midnight aufgerufen\
    midnight($_counter[$i][0],$_counter[$i][1],$mday,$yday);;\
  }\
}\
tgz { if ([$SELF:EgZ] > [$SELF:EgZ_last]) { \
    set_Reading("EgZaehler.delta", get_Reading("EgZ",0) - get_Reading("EgZ_last",0),0);;\
    set_Reading("EgZ_last", get_Reading("EgZ",0),0);;\
set_Reading("EgZaehler", get_Reading("EgZaehler",0) + get_Reading("EgZaehler.delta",0),0);;\
  }\
}\
init {                                ## initialisierung aller Readings\
  for (my $i=0;;$i<@{$_counter};;$i++) {## Für jeden Zähler werden Readings über die Funktion init_readings initialisiert\
    init_readings($_counter[$i][0],$_counter[$i][1]);;\
  }\
}\
DEF TPL_stat (\
  day_count_$1_$2 { ## bei einem Event des Zählers, wird der tägliche, monatliche und jährliche Verbrauch im jeweiligen Reading festgehalten\
                    ##  $1 Zählerdevice, $2 Zählerreading\
    my $diff = int(([$1:$2,0]-(get_Reading("$1.$2.last_counter",0)))*1000)/1000;;\
    if ($diff < 0 and get_Reading("$1.$2.last_counter",0) > 0  or $diff > 0 and get_Reading("$1.$2.last_counter",0) < 0) {  ## Wenn der Zähler zurückgesetzt wurde, dann Zählerstände zurückrechnen\
      set_Reading("$1.$2.day_counter",-(get_Reading("$1.$2.day",0)));;\
      set_Reading("$1.$2.month_counter",-(get_Reading("$1.$2.month",0)));;\
      set_Reading("$1.$2.year_counter",-(get_Reading("$1.$2.year",0)));;\
    }\
    set_Reading ("$1.$2.last_counter",[$1:$2,0]);;\
    set_Reading ("$1.$2.day",int(([$1:$2,0]-(get_Reading("$1.$2.day_counter",0)))*1000)/1000,1);;\
    set_Reading ("$1.$2.month",int(([$1:$2,0]-(get_Reading("$1.$2.month_counter",0)))*1000)/1000,1);;\
    set_Reading ("$1.$2.year",int(([$1:$2,0]-(get_Reading("$1.$2.year_counter",0)))*1000)/1000,1);;\
  }\
)\
## Pro Zähler wird über eine FOR-Schleife ein day_count_<Device>_<Reading>-Block generiert\
FOR(@{$_counter},TPL_stat($1$1,$1$2)) ## $1$1 entspricht dem Device, $1$2 entspricht dem Reading
attr di_counter DOIF_Readings Bilanz: sprintf("%.2f", [$SELF:Smartmeter.Zaehler280.day]*0.08 + [$SELF:di_counter.EgZaehler.day]*0.19 + [$SELF:Smartmeter.Zaehler180n.day]*0.27)
attr di_counter comment # EgZaehler: ([$SELF:EgZ] > [$SELF:EgZaehler] ? [$SELF:EgZ] : [$SELF:EgZaehler]),
attr di_counter disable 0
attr di_counter event_Readings EgVerbrauch:[$SELF:SolaxModbus.wr_cum.day] - [?$SELF:Smartmeter.Zaehler280.day],\
EgZ:sprintf("%.3f", ([$SELF:SolaxModbus.wr_cum.day] - [?$SELF:Smartmeter.Zaehler280.day])),\
Zaehler180:[Smartmeter:Zaehler180]
attr di_counter group Solar
attr di_counter room Devices,Wetter
attr di_counter uiTable {package ui_Table} ## Optionale Visualisierung der Energie-Verbräuche/-Produktion im DOIF-Device\
## Template für die Darstellung eines Wertes\
DEF TPL_single (\
card([$SELF:$2.$3.day:col1w],"$1 Tagesverlauf",$11,$4,$5,$8,$9,"$10",undef,"1","150,1,1,0,1,,250","0,0,0,0")|\
card([$SELF:$2.$3.last_day:bar1month-300],"$1 in $10 pro Tag",undef,$4,$5,$8,$9,"$10",undef,"1","150,1,1,0,1,0,250","0,0,0,0")|\
card([$SELF:$2.$3.last_month:bar1year-300],"$1 in $10 pro Monat",undef,$6,$7,$8,$9,"$10",undef,"0","150,1,1,0,1,0,250","0,0,0,0")|\
card([$SELF:$2.$3.last_year:bar1decade-300],"$1 in $10 pro Jahr",undef,$6,$7,$8,$9,"$10",undef,"0","150,1,1,0,1,0,250","0,0,0,0")\
)\
## Template für die Darstellung von zwei Werten\
DEF TPL_double (\
card([[$SELF:$3.$4.day:col1w],[$SELF:$6.$7.day:col1w]],"$1 Tagesverlauf in $14",undef,$8,$9,$12,$13,["$2","$5"],undef,"1","130,1,1,0,1,,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_day:bar2month-300],[$SELF:$6.$7.last_day:bar1month-300]],"$1 in $14 pro Tag",undef,$8,$9,$12,$13,["$2","$5"],undef,"1","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_month:bar2year-300],[$SELF:$6.$7.last_month:bar1year-300]],"$1 in $14 pro Monat",undef,$10,$11,$12,$13,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")|\
card([[$SELF:$3.$4.last_year:bar2decade-300],[$SELF:$6.$7.last_month:bar1year-300]],"$1 in $14 pro Jahr",undef,$10,$11,$12,$13,["$2","$5"],undef,"0","130,1,1,0,1,0,200","0,0,0,0,2")\
)\
## card([$SELF:di_counter.EgZaehler.day:100col1w],"Eigenverbrauch in kWh pro Tag","solar_icon",0,20,90,0,"kWh",undef,"1","150,,1,0,1,,250","0,0,0,0")|\
## card([$SELF:di_counter.EgZaehler.month:100col365d],"Eigenverbrauch in kWh pro Monat","solar_icon",0,200,90,0,"kWh",undef,"0","150,,1,0,1,,250","0,0,0,0")\
TPL_single (Bezug,di_counter,Zaehler180,0,20,0,800,90,0,kWh,"measure_power_meter\@Darkorange")\
TPL_single (Ertrag,SolaxModbus,wr_cum,0,80,0,1200,0,90,kWh,"measure_photovoltaic_inst\@LightGreen")\
TPL_single (Eigenverbrauch,di_counter,EgZaehler,0,10,0,400,0,90,kWh,"svgs/solid/home")\
TPL_single (Einspeisung,Smartmeter,Zaehler280,0,80,0,1200,0,90,kWh,"measure_power_meter\@lightGreen")\
TPL_single (Regen,SD_WS_207_D34B,rain_total,0,20,0,200,180,230,l/m²,"weather_rain_gauge\@LightBlue")

setstate di_counter initialized
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SD_WS_207_D34B.rain_total.last_day_1_month_values 21,24314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SD_WS_207_D34B.rain_total.last_month_1_year_values 2,2026,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SD_WS_207_D34B.rain_total.last_year_1_decade_values 6,202,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_Smartmeter.Zaehler280.last_day_1_month_values 21,24314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_Smartmeter.Zaehler280.last_month_1_year_values 2,2026,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_Smartmeter.Zaehler280.last_year_1_decade_values 6,202,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SolaxModbus.wr_cum.last_day_1_month_values 21,24314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SolaxModbus.wr_cum.last_month_1_year_values 2,2026,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_SolaxModbus.wr_cum.last_year_1_decade_values 6,202,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.EgZaehler.last_day_1_month_values 21,24314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.EgZaehler.last_month_1_year_values 2,2026,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.EgZaehler.last_year_1_decade_values 6,202,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.Zaehler180.last_day_1_month_values 21,24314,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.Zaehler180.last_month_1_year_values 2,2026,,,,,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .bar_di_counter_di_counter.Zaehler180.last_year_1_decade_values 6,202,,,,,,,,,,,,,,,,,,,,
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler180n.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774021005,,1774030351,1774035796,1774044302,1774049810,1774055151,1774059984,,,,,,1774098993,1774103558,1774108855,,,,1774136776,,,,,,,,,1774189595,,1774201922
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler180n.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,,0,0,0,0,0,0,,,,,,0,0,0,,,,0,,,,,,,,,0,,0
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler180n.month_8760_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774204422
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler180n.month_8760_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler280.month_8760_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774204422
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_Smartmeter.Zaehler280.month_8760_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_di_counter.EgZaehler.month_8760_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774204422
setstate di_counter 2026-03-22 21:33:55 .col_100_di_counter_di_counter.EgZaehler.month_8760_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,103.5
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_SD_WS_207_D34B.rain_total.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774205655,1774206277
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_SD_WS_207_D34B.rain_total.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3024.8,3024.8
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_Smartmeter.Zaehler280.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774205655,1774206277
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_Smartmeter.Zaehler280.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_SolaxModbus.wr_cum.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774205655,1774206277
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_SolaxModbus.wr_cum.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_di_counter.EgZaehler.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774205655,1774206277
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_di_counter.EgZaehler.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,40.9,40.9
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_di_counter.Zaehler180.day_168_times ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1774205655,1774206277
setstate di_counter 2026-03-22 21:33:55 .col_72_di_counter_di_counter.Zaehler180.day_168_values ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0,0
setstate di_counter 2026-03-22 19:54:15 0 counter: SolaxModbus.wr_cum.last_hour
setstate di_counter 2026-03-22 21:59:28 0 last_hour SolaxModbus wr_cum log.counter.SolaxModbus.wr_cum ./log/counter.SolaxModbus.wr_cum.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 1 counter: Smartmeter.Zaehler280.last_hour
setstate di_counter 2026-03-22 21:49:45 1 last_hour Smartmeter Zaehler280 log.counter.Smartmeter.Zaehler280 ./log/counter.Smartmeter.Zaehler280.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 2 counter: Smartmeter.Zaehler180n.last_hour
setstate di_counter 2026-03-22 21:49:45 2 last_hour Smartmeter Zaehler180n log.counter.Smartmeter.Zaehler180n ./log/counter.Smartmeter.Zaehler180n.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 3 counter: di_counter.EgZaehler.last_hour
setstate di_counter 2026-03-22 21:49:45 3 last_hour di_counter EgZaehler log.counter.di_counter.EgZaehler ./log/counter.di_counter.EgZaehler.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 4 counter: di_counter.Zaehler180.last_hour
setstate di_counter 2026-03-22 21:49:45 4 last_hour di_counter Zaehler180 log.counter.di_counter.Zaehler180 ./log/counter.di_counter.Zaehler180.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 5 counter: SD_WS_207_D34B.rain_total.last_hour
setstate di_counter 2026-03-22 21:49:45 5 last_hour SD_WS_207_D34B rain_total log.counter.SD_WS_207_D34B.rain_total ./log/counter.SD_WS_207_D34B.rain_total.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:52:38 6 counter: Smartmeter.Zaehler180.last_hour
setstate di_counter 2026-03-22 21:49:45 6 last_hour Smartmeter Zaehler180 log.counter.Smartmeter.Zaehler180 ./log/counter.Smartmeter.Zaehler180.log - 2000 3000 4:last_hour
setstate di_counter 2026-03-22 19:08:03 Bilanz 7.77
setstate di_counter 2026-03-22 21:56:18 EgVerbrauch 0
setstate di_counter 2026-03-22 21:56:18 EgZ 0.000
setstate di_counter 2026-03-22 19:08:03 EgZaehler 103.5
setstate di_counter 2026-03-22 00:00:07 EgzLastDay 62.6
setstate di_counter 2026-03-22 19:08:03 Eigenverbrauch_Tag 40.9
setstate di_counter 2026-03-22 19:08:03 Einspeisung 0.0
setstate di_counter 2026-03-22 19:08:03 Ertrag 40.9
setstate di_counter 2026-03-22 19:08:03 EtZaehler 103.5
setstate di_counter 2026-03-22 00:00:07 EtzLastDay 62.6
setstate di_counter 2026-03-22 21:42:14 SD_WS_207_D34B.rain_total.day 3024.8
setstate di_counter 2026-03-22 00:01:00 SD_WS_207_D34B.rain_total.day_counter 0
setstate di_counter 2026-03-22 21:42:14 SD_WS_207_D34B.rain_total.last_counter 3024.8
setstate di_counter 2026-03-22 00:01:00 SD_WS_207_D34B.rain_total.last_day 0
setstate di_counter 2026-03-20 16:36:45 SD_WS_207_D34B.rain_total.last_month 0
setstate di_counter 2026-03-20 16:36:45 SD_WS_207_D34B.rain_total.last_year 0
setstate di_counter 2026-03-22 21:42:14 SD_WS_207_D34B.rain_total.month 3024.8
setstate di_counter 2026-03-20 16:36:45 SD_WS_207_D34B.rain_total.month_counter 0
setstate di_counter 2026-03-22 21:42:14 SD_WS_207_D34B.rain_total.year 3024.8
setstate di_counter 2026-03-20 16:36:45 SD_WS_207_D34B.rain_total.year_counter 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.day 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.day_counter 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.last_counter 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.last_day 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.last_month 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.last_year 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.month 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.month_counter 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.year 0
setstate di_counter 2026-03-22 19:18:06 Smartmeter.Zaehler180.year_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler180n.day 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler180n.day_counter 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler180n.last_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler180n.last_day 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler180n.last_month 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler180n.last_year 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler180n.month 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler180n.month_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler180n.year 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler180n.year_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler280.day 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler280.day_counter 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler280.last_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler280.last_day 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler280.last_month 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler280.last_year 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler280.month 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler280.month_counter 0
setstate di_counter 2026-03-22 00:01:00 Smartmeter.Zaehler280.year 0
setstate di_counter 2026-03-20 16:36:45 Smartmeter.Zaehler280.year_counter 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.day 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.day_counter 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.last_counter 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.last_day 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.last_month 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.last_year 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.month 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.month_counter 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.year 0
setstate di_counter 2026-03-22 19:18:06 SolaxModbus.wr_cum.year_counter 0
setstate di_counter 2026-03-22 21:56:18 Zaehler180
setstate di_counter 2026-03-22 21:56:18 block_day_count_di_counter_Zaehler180 executed
setstate di_counter 2026-03-22 21:59:28 block_get_data condition c01: Can't use string ("") as a HASH ref while "strict refs" in use at ./FHEM/98_DOIF.pm line 1552.\

setstate di_counter 2026-03-22 21:59:11 block_init executed
setstate di_counter 2026-03-22 21:56:18 block_tgz executed
setstate di_counter 2026-03-22 19:08:03 di_counter.EgZaehler.day 40.9
setstate di_counter 2026-03-22 00:01:00 di_counter.EgZaehler.day_counter 62.6
setstate di_counter 2026-03-22 19:08:03 di_counter.EgZaehler.last_counter 103.5
setstate di_counter 2026-03-22 00:01:00 di_counter.EgZaehler.last_day 0
setstate di_counter 2026-03-20 16:36:45 di_counter.EgZaehler.last_month 0
setstate di_counter 2026-03-20 16:36:45 di_counter.EgZaehler.last_year 0
setstate di_counter 2026-03-22 19:08:03 di_counter.EgZaehler.month 103.5
setstate di_counter 2026-03-20 16:36:45 di_counter.EgZaehler.month_counter 0
setstate di_counter 2026-03-22 19:08:03 di_counter.EgZaehler.year 103.5
setstate di_counter 2026-03-20 16:36:45 di_counter.EgZaehler.year_counter 0
setstate di_counter 2026-03-22 19:08:03 di_counter.EtZaehler.day 40.9
setstate di_counter 2026-03-22 00:01:00 di_counter.EtZaehler.day_counter 62.6
setstate di_counter 2026-03-22 19:08:03 di_counter.EtZaehler.last_counter 103.5
setstate di_counter 2026-03-22 00:01:00 di_counter.EtZaehler.last_day 0
setstate di_counter 2026-03-20 16:36:45 di_counter.EtZaehler.last_month 0
setstate di_counter 2026-03-20 16:36:45 di_counter.EtZaehler.last_year 0
setstate di_counter 2026-03-22 19:08:03 di_counter.EtZaehler.month 103.5
setstate di_counter 2026-03-20 16:36:45 di_counter.EtZaehler.month_counter 0
setstate di_counter 2026-03-22 19:08:03 di_counter.EtZaehler.year 103.5
setstate di_counter 2026-03-20 16:36:45 di_counter.EtZaehler.year_counter 0
setstate di_counter 2026-03-22 21:56:18 di_counter.Zaehler180.day 0
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.day_counter 0
setstate di_counter 2026-03-22 21:56:18 di_counter.Zaehler180.last_counter
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.last_day 0
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.last_month 0
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.last_year 0
setstate di_counter 2026-03-22 21:56:18 di_counter.Zaehler180.month 0
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.month_counter 0
setstate di_counter 2026-03-22 21:56:18 di_counter.Zaehler180.year 0
setstate di_counter 2026-03-22 19:18:06 di_counter.Zaehler180.year_counter 0
setstate di_counter 2026-03-22 21:56:18 e_di_counter_EgZ 0.000
setstate di_counter 2026-03-22 21:56:18 e_di_counter_Zaehler180
setstate di_counter 2026-03-22 21:56:18 mode enabled
setstate di_counter 2026-03-22 21:56:18 state initialized
setstate di_counter 2026-03-22 21:56:18 timer_01_c02 23.03.2026 00:01:00

#7
Solaranlagen / Aw: 76_SolarForecast - Informa...
Letzter Beitrag von denis.robel - 22 März 2026, 22:39:07
ZitatWeglassen geht nicht weil Pflichtangabe.
Bei dir ist diese Richtung immer 0 weil die nichts vom Hausnetz in die Batterie speist. ac2dc=0:W wird vermutlich funktionieren, ist aber unschön weil der Wert daraus undef ist.
Ich würde dir vorschlagen in zendure_bridge_b0b21c980b18 ein Reading 'SF_ac2dc' mit dem festen Wert '0' anzulegen und dieses Reading in der Definition anzugeben. Dann liest das Modul immer definiert 0 W.
Anzugeben dann so:

attr SolarForecast_dach setupInverterDev02 zendure_bridge_b0b21c980b18\
  strings=none\
  dc2ac=output_home_power:W\
  ac2dc=SF_ac2dc:W\
  capacity=1200\
  asynchron=0

Edit: Ein kleiner Hinweis zum userReadings. Du hast keinen definierten Trigger angegeben. D.h. das userReading berechnet bei jedem Event des Device MQTT2_shellypro3em_34987a465e38 neu. Wenn du das öfter in deinem System machst, geht das ganz schön auf die Rechnerleistung/Performance. Besser ist es ein bestimmtes Reading des Device als Trigger zu benutzen. Und dann im Attr angeben z.B. so:

attr MQTT2_shellypro3em_34987a465e38 userReadings gcon:TriggerReading.* { ReadingsVal($name,"total_act_power",0) > 0 ? ReadingsVal($name,"total_act_power",0) : 0 },\
gfeedin:TriggerReading.* { ReadingsVal($name,"total_act_power",0) < 0 ? abs(ReadingsVal($name,"total_act_power",0)) : 0 }

LG,
Heiko

ok hab ich alles angepasst, auch das triggerreading beim Shelly.

Danke für die hilfreichen Hinweise.
#8
SVG / Plots / logProxy / fixedrange mit Minuten
Letzter Beitrag von andies - 22 März 2026, 22:36:23
Ich habe mir einen Sensor für meinen Kaffeeröster gebaut und werte die Daten mit FHEM aus. Für die Grafik benötige ich einen Zeitraum von ca 10-20 Minuten. Sehe ich das richtig, das es dafür kein Attribut derzeit gibt und auch keine ,,schnelle" Lösung? Sonst würde ich das mal versuchen. Hat jemand noch einen Tipp, was ich zusätzlich beachten sollte? (Ich würde mich an den Quelltext setzen und einfach bei ,,hours/days" schauen, wie ich das anpasse.)
#9
Solaranlagen / Aw: 76_SolarForecast - Informa...
Letzter Beitrag von DS_Starter - 22 März 2026, 22:11:55
Hallo Denis,

erstmal Gratulation zur erfolgreichen Umsetzung.  :)

Zitatmuss ich ac2dc=0:W so definieren, oder kann ich das auch weglassen?
Weglassen geht nicht weil Pflichtangabe.
Bei dir ist diese Richtung immer 0 weil du nichts vom Hausnetz in die Batterie speist. ac2dc=0:W wird vermutlich funktionieren, ist aber unschön weil der Wert daraus undef ist.
Ich würde dir vorschlagen in zendure_bridge_b0b21c980b18 ein Reading 'SF_ac2dc' mit dem festen Wert '0' anzulegen und dieses Reading in der Definition anzugeben. Dann liest das Modul immer definiert 0 W.
Anzugeben dann so:

attr SolarForecast_dach setupInverterDev02 zendure_bridge_b0b21c980b18\
  strings=none\
  dc2ac=output_home_power:W\
  ac2dc=SF_ac2dc:W\
  capacity=1200\
  asynchron=0

Edit: Ein kleiner Hinweis zum userReadings. Du hast keinen definierten Trigger angegeben. D.h. das userReading berechnet bei jedem Event des Device MQTT2_shellypro3em_34987a465e38 neu. Wenn du das öfter in deinem System machst, geht das ganz schön auf die Rechnerleistung/Performance. Besser ist es ein bestimmtes Reading des Device als Trigger zu benutzen. Und dann im Attr angeben z.B. so:

attr MQTT2_shellypro3em_34987a465e38 userReadings gcon:TriggerReading.* { ReadingsVal($name,"total_act_power",0) > 0 ? ReadingsVal($name,"total_act_power",0) : 0 },\
gfeedin:TriggerReading.* { ReadingsVal($name,"total_act_power",0) < 0 ? abs(ReadingsVal($name,"total_act_power",0)) : 0 }

LG,
Heiko
#10
Anfängerfragen / Aw: Zugriff mit tailscale
Letzter Beitrag von Bracew - 22 März 2026, 22:08:07
Zitat von: satprofi am 22 März 2026, 19:04:51hast du auf allen devices tailscale laufen, oder nur auf fritz ?
Ich verstehe die Frage nicht.

Tailscale läuft normalerweise nicht auf Fritz-Boxen. Der Standardweg ist, du installierst Tailscale auf einem Gerät, das ohnehin 24/7 in deinem Heimnetzwerk läuft (z. B. ein Raspberry Pi oder ein NAS). Ergebnis: Du kannst von unterwegs auf alle Geräte hinter der FRITZ!Box zugreifen, als wärst du zu Hause (VPN).

Über dieses VPN via Tailscale kannst Du unter anderem auch auf FHEM in deinem Heimnetzwerk zugreifen. Jedoch ist bei den meisten FHEM so eingestellt, dass es nur mit einer IPv4 aus dem regulären Heimnetz z. B. 192.178.1.x zu erreichen ist und nicht mit einer Tailscale IPv4 z. B. 100.100.100.100, es sei denn Du gibst die Tailscale IPv4 in FHEM zusätzlich frei mit u.a. "attr WEB allowfrom 192.178.1.*|100.100.100.100"

Dafür musst Du nichts in Tailscale eintragen, sondern in der FHEM Konfiguration.

Also, wenn Dein VPN via Tailscale von unterwegs in Dein Heimnetz unabhängig von FHEM funktioniert, ist Tailscale fertig konfiguriert. Dann musst Du nur noch in FHEM den Zugriff via Tailscale erlauben.