[gelöst]: Fehler bei der ICON-Darstellung eines "uiStates" im Perl-DOIF

Begonnen von WW, 05 Februar 2024, 21:24:49

Vorheriges Thema - Nächstes Thema

WW

hallo zusammen,

ich visualisiere meinen Wechselrichter über ein Perl-DOIF:

define doifWechselrichter DOIF doifWechselrichter_Korrektur { \
    if ([$SELF:freigabeVerbrauchsErhoehung]) {\
        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 170) and (lc([?Test01ZbBwShp15:state]) eq "off")) { \
            return;;\
            }        \
        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 240) and (lc([?Test01ZbBwShp15:state]) eq "on")) { \
            fhem_set("Test01ZbBwShp15 off");;  \
            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet, da unzureichend und Freigabe vorhanden";;\
            return;;\
            }        \
        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 240) and (lc([?Test01ZbBwShp15:state]) eq "off")) { \
            fhem_set("Test01ZbBwShp15 on");;  \
            Log 1, "doifWechselrichter_Korrektur: Korrekturlast eingeschaltet und Freigabe vorhanden";;\
            return;;\
            }        \
        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] > 340) and (lc([?Test01ZbBwShp15:state]) eq "on")) { \
            fhem_set("Test01ZbBwShp15 off");;  \
            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet und Freigabe vorhanden";;\
            return;;\
            }\
        }\
    else {\
        if (lc([?Test01ZbBwShp15:state]) eq "on") { \
            fhem_set("Test01ZbBwShp15 off");;  \
            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet, keine Freigabe!";;\
            return;;\
            }\
        }\
    }    \
\
doifWechselrichter_Midnight { [00:00:02];;\
    my $val2 = [?myWechselrichter:Total_Battery_Charge2];;\
    my $val  = [?myWechselrichter:Total_Battery_Charge];;\
    my $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_Battery_Charge2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_Battery_Charge2 $val") if ($diff > 2);;\
    \
    $val2 = [?myWechselrichter:Total_Battery_DisCharge2];;\
    $val  = [?myWechselrichter:Total_Battery_DisCharge];;\
    $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_Battery_DisCharge2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_Battery_DisCharge2 $val") if ($diff > 2);;\
    \
    $val2 = [?myWechselrichter:Total_Energy_Purchase2];;\
    $val  = [?myWechselrichter:Total_Energy_Purchase];;\
    $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_Energy_Purchase2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_Energy_Purchase2 $val") if ($diff > 2);;\
    \
    $val2 = [?myWechselrichter:Total_Energy_Selling2];;\
    $val  = [?myWechselrichter:Total_Energy_Selling];;\
    $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_Energy_Selling2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_Energy_Selling2 $val") if ($diff > 2);;\
    \
    $val2 = [?myWechselrichter:Total_Load_Consumption2];;\
    $val  = [?myWechselrichter:Total_Load_Consumption];;\
    $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_Load_Consumption2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_Load_Consumption2 $val") if ($diff > 2);;\
    \
    $val2 = [?myWechselrichter:Total_PV_Generation2];;\
    $val  = [?myWechselrichter:Total_PV_Generation];;\
    $diff = $val2 - $val;;\
    fhem("setreading myWechselrichter Total_PV_Generation2 $val") if ($val2 < $val);;\
    fhem("setreading myWechselrichter Total_PV_Generation2 $val") if ($diff > 2);;\
    }\
\
doifWechselrichter_ReadData {\
    ##[+:5];;     ## Alle X-Minuten ab einer vollen Stunde\
    my $text = InternalVal("myWechselrichter",".getList","");;\
    #Log 1, $text;;\
    $text =~ s/:noArg//g;;\
    #Log 1, $text;;\
    my @var  = sort(split(' ',$text));;\
    $text = 0;;\
    my $i = 0;;\
    \
    foreach my $var (@var) {\
        $i += 2;;\
        fhem("sleep $i quiet;; get myWechselrichter $var;;");;\
        }\
    }\
    \
doifWechselrichter_ReadPower {\
    ##[+00:00:30];;     ## Alle 30 Sekunden ab einer vollen Stunde\
    ##fhem("sleep 0.5 quiet;; get myWechselrichter PV_PowerGesamt;;");;\
    }\

attr doifWechselrichter DOIF_Readings batteryIcon: {\
    return "measure_battery_100\@green" if ([myWechselrichter:Bat1_SOC] > 95);;\
    return "measure_battery_100\@orange" if ([myWechselrichter:Bat1_SOC] > 87);;\
    return "measure_battery_75\@green"  if ([myWechselrichter:Bat1_SOC] > 75);;\
    return "measure_battery_75\@orange"  if ([myWechselrichter:Bat1_SOC] > 62);;\
    return "measure_battery_50\@green" if ([myWechselrichter:Bat1_SOC] > 50);;\
    return "measure_battery_50\@orange" if ([myWechselrichter:Bat1_SOC] > 37);;\
    return "measure_battery_25\@green" if ([myWechselrichter:Bat1_SOC] > 25);;\
    return "measure_battery_25\@orange" if ([myWechselrichter:Bat1_SOC] > 20);;\
    return "measure_battery_0\@red";;\
},\
\
freigabeVerbrauchsErhoehung: {\
    return 0 if ([myWechselrichter:PV_PowerGesamt] > 0);;\
    my $EntladungsLimit = 100 - [myWechselrichter:Bat1_Depth_of_Discharge];;\
    my $EntladungJeStunde = 4.5;;\
    my $EndladeEndeStunde = 9;; \
\
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);;\
    my $AktStunde = $hour + $min / 60;;\
    $EndladeEndeStunde += 24 if ($AktStunde > $EndladeEndeStunde);;\
    my $RestStunden = ([myWechselrichter:Bat1_SOC] - $EntladungsLimit) / $EntladungJeStunde;;\
    my $leer = $AktStunde + $RestStunden;;\
    my $x0 = ($leer > 24)?$leer-24:$leer;;\
    Log 1, "freigabeVerbrauchsErhoehung: Batterie leer in ". sprintf("%.2f",$RestStunden). " Stunden um ".sprintf("%.2f",$x0)." Uhr (Batterie: ".[?myWechselrichter:Bat1_SOC]." %, ".$EndladeEndeStunde.")";;\
    \
    return 0 if ($leer < $EndladeEndeStunde);;\
    return 1;;\
}\
\

attr doifWechselrichter DbLogExclude .*
attr doifWechselrichter alias Wechselrichter (Visualisierung)
attr doifWechselrichter group .KG: Vorratskeller (Wechselrichter)
attr doifWechselrichter icon inverter
attr doifWechselrichter room Strom
attr doifWechselrichter sortby 700
attr doifWechselrichter uiState {\
sub bat_icon {\
    my($val)=@_;;\
    my $icon;;\
\
    $icon =    "measure_battery_0\@red";;\
    $icon =    "measure_battery_25\@orange"  if ($val > 20);;\
    $icon =    "measure_battery_25\@green"   if ($val > 25);;\
    $icon =    "measure_battery_50\@orange"  if ($val > 37);;\
    $icon =    "measure_battery_50\@green"   if ($val > 50);;\
    $icon =    "measure_battery_75\@orange"  if ($val > 62);;\
    $icon =    "measure_battery_75\@green"   if ($val > 75);;\
    $icon =    "measure_battery_100\@orange" if ($val > 87);;\
\
    my $output="(" . $val . " %)" . PUP("doifPylontech",$icon);;\
    return($output);;\
    }\
 }\\
\
\
\
"WR-Status: ".[myWechselrichter:SysState]." (".[$SELF:freigabeVerbrauchsErhoehung].")"|\
##PUP("doifPylontech",([$SELF:batteryIcon]))\
bat_icon([myWechselrichter:Bat1_SOC])
attr doifWechselrichter uiTable { ## Perlblock für globale Tabellendefinitionen\
  $ATTRIBUTESFIRST=1;;\
  \
  ##$TABLE="border: 3px solid black";;\
\
  $TD{0..8,10..14,20..23,25..28,30..33,40..42,50..56}{0} = "style='border-left-style:solid;; border-left-width:3px;;'";;\
  $TD{0..8}{7} = "style='border-right-style:solid;; border-right-width:3px;;'";;\
  $TD{10..14,20..23,25..28,30..33,40..42,50..56}{5} = "width =120px;; style='border-right-style:solid;; border-right-width:3px;;'";;\
  $TD{10..59}{2..4} = "width = 120px;;"\
  $TD{52..56}{0} = "align='right';; style='border-left-style:solid;; border-left-width:3px;;'";;\
 \
  $TC{0}="align='left'" \
  $TC{1..2}="align='right'" \
  $TC{3..6}="align='right'" \
  $TC{7}="align='right'" \
\
  $TR{0,20,25,30,40,50} = "style='font-weight:bold;; border-width: 3px;; border-bottom-style:solid;; border-top-style:solid;;'"\
  $TR{10} = "style='font-weight:bold;; border-width: 3px;; border-top-style:solid;;'"\
  $TR{11} = "style='font-weight:bold;; border-width: 3px;; border-bottom-style:solid;;'"\
  $TR{51} = "style='border-width: 1px;; border-bottom-style:solid;;'"\
  $TR{2,4,5,7} = "style='border-width: 1px;; border-bottom-style:solid;;'"\
  $TR{9,16,24,29,34,43} = "height=40px;; style='font-weight:bold;; border-width: 3px;; border-top-style:solid;;'"\
  $TR{last} = "style='border-width: 3px;; border-bottom-style:solid;;'"\
  \
\
}\
\
## Zeile 0\
"Energiewerte"|"heute"|"gestern"|"letzte Woche"|"akt. Monat"|"letzter Monat"|"akt. Jahr"|"Einh."\
\
## Zeile 1\
"ENNI: Strombezug"|\
[myCounter:Strom_day:d3]|\
[myCounter:Strom_last_day:d3]|\
[myCounter:Strom_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_day:d3]+[myCounter:Strom_month:d3])|\
[myCounter:Strom_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_day:d3]+[myCounter:Strom_year:d3])|\
"kWh"\
\
## Zeile 2\
"ENNI: Stromeinspeisung (seit 17.4.23)"|\
[myCounter:StromEinspeisung_day:d3]|\
[myCounter:StromEinspeisung_last_day:d3]|\
[myCounter:StromEinspeisung_last_week:d3]|\
sprintf("%.3f",[myCounter:StromEinspeisung_day:d3]+[myCounter:StromEinspeisung_month:d3])|\
[myCounter:StromEinspeisung_last_month:d3]|\
sprintf("%.3f",[myCounter:StromEinspeisung_day:d3]+[myCounter:StromEinspeisung_year:d3])|\
"kWh"\
\
## Zeile 3\
"WR: Strombezug (seit 3.4.23)"|\
[myCounter:Strom_PvTotalEnergyPurchase_day:d3]|\
[myCounter:Strom_PvTotalEnergyPurchase_last_day:d3]|\
[myCounter:Strom_PvTotalEnergyPurchase_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalEnergyPurchase_day:d3]+[myCounter:Strom_PvTotalEnergyPurchase_month:d3])|\
[myCounter:Strom_PvTotalEnergyPurchase_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalEnergyPurchase_day:d3]+[myCounter:Strom_PvTotalEnergyPurchase_year:d3])|\
"kWh"\
\
## Zeile 4\
"WR: Stromeinspeisung (seit 3.4.23)"|\
[myCounter:Strom_PvTotalEnergySelling_day:d3]|\
[myCounter:Strom_PvTotalEnergySelling_last_day:d3]|\
[myCounter:Strom_PvTotalEnergySelling_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalEnergySelling_day:d3]+[myCounter:Strom_PvTotalEnergySelling_month:d3])|\
[myCounter:Strom_PvTotalEnergySelling_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalEnergySelling_day:d3]+[myCounter:Strom_PvTotalEnergySelling_year:d3])|\
"kWh"\
\
## Zeile 5\
"PV-Stromerzeugung"|\
[myCounter:Strom_PvErzeugung_day:d3]|\
[myCounter:Strom_PvErzeugung_last_day:d3]|\
[myCounter:Strom_PvErzeugung_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvErzeugung_day:d3]+[myCounter:Strom_PvErzeugung_month:d3])|\
[myCounter:Strom_PvErzeugung_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvErzeugung_day:d3]+[myCounter:Strom_PvErzeugung_year:d3])|\
"kWh"\
\
## Zeile 6\
"Batterieladung"|\
[myCounter:Strom_PvBatteryCharge_day:d3]|\
[myCounter:Strom_PvBatteryCharge_last_day:d3]|\
[myCounter:Strom_PvBatteryCharge_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvBatteryCharge_day:d3]+[myCounter:Strom_PvBatteryCharge_month:d3])|\
[myCounter:Strom_PvBatteryCharge_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvBatteryCharge_day:d3]+[myCounter:Strom_PvBatteryCharge_year:d3])|\
"kWh"\
\
## Zeile 7\
"Batterieentladung"|\
[myCounter:Strom_PvBatteryDischarge_day:d3]|\
[myCounter:Strom_PvBatteryDischarge_last_day:d3]|\
[myCounter:Strom_PvBatteryDischarge_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvBatteryDischarge_day:d3]+[myCounter:Strom_PvBatteryDischarge_month:d3])|\
[myCounter:Strom_PvBatteryDischarge_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvBatteryDischarge_day:d3]+[myCounter:Strom_PvBatteryDischarge_year:d3])|\
"kWh"\
\
## Zeile 8\
"Hausverbrauch (seit 3.4.23)"|\
[myCounter:Strom_PvTotalLoadConsumption_day:d3]|\
[myCounter:Strom_PvTotalLoadConsumption_last_day:d3]|\
[myCounter:Strom_PvTotalLoadConsumption_last_week:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalLoadConsumption_day:d3]+[myCounter:Strom_PvTotalLoadConsumption_month:d3])|\
[myCounter:Strom_PvTotalLoadConsumption_last_month:d3]|\
sprintf("%.3f",[myCounter:Strom_PvTotalLoadConsumption_day:d3]+[myCounter:Strom_PvTotalLoadConsumption_year:d3])|\
"kWh"\
\
\
\
## Zeile 9 (Reserve)\
""<\
\
## Zeile 10\
"ENNI-Stromzähler (".ReadingsTimestamp("KgFlurStromzaehlerSml066","SML_power",'').")"|\
"Bezug:"|\
[KgFlurStromzaehlerSml066:SML_total_consumption:d4]. " kWh"|\
##[KgFlurStromzaehlerSml:SML_frequency:d1]. " Hz"|\
""|\
[KgFlurStromzaehlerSml066:SML_power:d0]. " W"|\
""\
\
## Zeile 11\
"(< 0: Einspeisung)"|\
"Einsp.:"|\
[KgFlurStromzaehlerSml066:SML_total_to_grid:d4]. " kWh"|\
""|\
""|\
""\
\
## Zeile 12\
##""|"L1"|\
##[KgFlurStromzaehlerSml:SML_voltage_L1:d1]. " V"|\
##[KgFlurStromzaehlerSml:SML_current_L1:d2]. " A"|\
##[KgFlurStromzaehlerSml:SML_angle_L1:d1]. " °"|\
""\
\
## Zeile 13\
##""|"L2"|\
##[KgFlurStromzaehlerSml:SML_voltage_L2:d1]. " V"|\
##[KgFlurStromzaehlerSml:SML_current_L2:d2]. " A"|\
##[KgFlurStromzaehlerSml:SML_angle_L2:d1]. " °"|\
""\
\
## Zeile 14\
##""|"L3"|\
##[KgFlurStromzaehlerSml:SML_voltage_L3:d1]. " V"|\
##[KgFlurStromzaehlerSml:SML_current_L3:d2]. " A"|\
##[KgFlurStromzaehlerSml:SML_angle_L3:d1]. " °"|\
""\
\
## Zeile 15 - 19 (Reserve)\
""\
""\
""\
""\
""<\
\
## Zeile 20\
"WR-Netz-Stromzähler (".ReadingsTimestamp("myWechselrichter","PCC_TotalActivePower",'').")"|\
""|\
""|\
""|\
[myWechselrichter:PCC_TotalActivePower:d2]*1000. " W"|\
""\
\
## Zeile 21\
"(> 0: Einspeisung)"|"L1"|\
[myWechselrichter:Grid_L1_Voltage:d1]. " V"|\
[myWechselrichter:PCC_L1_Current:d2]. " A"|\
[myWechselrichter:PCC_L1_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:PCC_L1_PF:d2]\
\
## Zeile 22\
""|"L2"|\
[myWechselrichter:Grid_L2_Voltage:d1]. " V"|\
[myWechselrichter:PCC_L2_Current:d2]. " A"|\
[myWechselrichter:PCC_L2_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:PCC_L2_PF:d2]\
\
## Zeile 23\
""|"L3"|\
[myWechselrichter:Grid_L3_Voltage:d1]. " V"|\
[myWechselrichter:PCC_L3_Current:d2]. " A"|\
[myWechselrichter:PCC_L3_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:PCC_L3_PF:d2]\
\
\
\
## Zeile 24 (Reserve)\
""\
\
## Zeile 25\
"Hausverbrauch (".ReadingsTimestamp("myCounter","Strom_PvTotalLoadConsumption_power",'').")"|\
\
""|\
[myCounter:Strom_PvTotalLoadConsumption_power:d2]*1000." W(5min)"|\
sprintf("%d W",[myWechselrichter:Grid_PowerOutputTotal:d3]*1000-[myWechselrichter:PCC_TotalActivePower:d2]*1000)|\
[KgFlurStromzaehlerSml066:SDM72D_power_total:d0]." W"|\
""\
\
## Zeile 26\
""|"L1"|\
[KgFlurStromzaehlerSml066:SDM72D_voltage_L1:d1]. " V"|\
[KgFlurStromzaehlerSml066:SDM72D_current_L1:d2]. " A"|\
[KgFlurStromzaehlerSml066:SDM72D_power_L1:d0]. " W"|\
"PF: ".[KgFlurStromzaehlerSml066:SDM72D_pf_L1:d2]\
\
## Zeile 27\
""|"L2"|\
[KgFlurStromzaehlerSml066:SDM72D_voltage_L2:d1]. " V"|\
[KgFlurStromzaehlerSml066:SDM72D_current_L2:d2]. " A"|\
[KgFlurStromzaehlerSml066:SDM72D_power_L2:d0]. " W"|\
"PF: ".[KgFlurStromzaehlerSml066:SDM72D_pf_L2:d2]\
\
## Zeile 28\
""|"L3"|\
[KgFlurStromzaehlerSml066:SDM72D_voltage_L3:d1]. " V"|\
[KgFlurStromzaehlerSml066:SDM72D_current_L3:d2]. " A"|\
[KgFlurStromzaehlerSml066:SDM72D_power_L3:d0]. " W"|\
"PF: ".[KgFlurStromzaehlerSml066:SDM72D_pf_L3:d2]\
\
\
\
## Zeile 29 (Reserve)\
""<\
\
## Zeile 30\
"WR-Inverter-Ausgang (".ReadingsTimestamp("myWechselrichter","Grid_PowerOutputTotal",'').")"|\
""|\
""|\
""|\
[myWechselrichter:Grid_PowerOutputTotal:d3]*1000. " W"|\
""\
\
## Zeile 31\
"(> 0: WR-Ausgabe)"|"L1"|\
[myWechselrichter:Grid_L1_Voltage:d1]. " V"|\
[myWechselrichter:Grid_L1_Current:d2]. " A"|\
[myWechselrichter:Grid_L1_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:Grid_L1_PF:d2]\
\
## Zeile 32\
""|"L2"|\
[myWechselrichter:Grid_L2_Voltage:d1]. " V"|\
[myWechselrichter:Grid_L2_Current:d2]. " A"|\
[myWechselrichter:Grid_L2_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:Grid_L2_PF:d2]\
\
## Zeile 33\
""|"L3"|\
[myWechselrichter:Grid_L3_Voltage:d1]. " V"|\
[myWechselrichter:Grid_L3_Current:d2]. " A"|\
[myWechselrichter:Grid_L3_Power:d3]*1000. " W"|\
"PF: ".[myWechselrichter:Grid_L3_PF:d2]\
\
\
## Zeile 34 - 39 (Reserve)\
""\
""\
""\
""\
""\
""<\
\
## Zeile 40\
"PV-Erzeugung (".ReadingsTimestamp("myWechselrichter","PV_PowerGesamt",'').")"|\
""|\
""|\
""|\
[myWechselrichter:PV_PowerGesamt:d3]*1000. " W"|\
""\
\
## Zeile 41\
""|"String 1"|\
[myWechselrichter:PV1_Voltage:d1]. " V"|\
[myWechselrichter:PV1_Current:d2]. " A"|\
[myWechselrichter:PV1_Power:d3]*1000. " W"|\
sprintf("%.1f %%",[myWechselrichter:PV1_Power:d3]*100/(8*0.375))\
\
## Zeile 42\
""|"String 2"|\
[myWechselrichter:PV2_Voltage:d1]. " V"|\
[myWechselrichter:PV2_Current:d2]. " A"|\
[myWechselrichter:PV2_Power:d3]*1000. " W"|\
sprintf("%.1f %%",[myWechselrichter:PV2_Power:d3]*100/(14*0.375))\
\
\
## Zeile 43 - 49 (Reserve)\
""\
""\
""\
""\
""\
""\
""<\
\
## Zeile 50\
"Batteriespeicher (".ReadingsTimestamp("myWechselrichter","Bat1_Power",'').")"|\
[myWechselrichter:Bat1_SOC]." %"|\
[myWechselrichter:Bat1_Temperatur]." °C"|\
[myWechselrichter:Bat1_ChargeCycle]." Zyklen"|\
[myWechselrichter:Bat1_Power:d3]*1000. " W"|\
""\
\
## Zeile 51\
"(> 0: Laden), max. Entladung bis ".100-[myWechselrichter:Bat1_Depth_of_Discharge]. " %"|"Batterie 1"|\
[myWechselrichter:Bat1_Voltage:d1]. " V"|\
[myWechselrichter:Bat1_Current:d2]. " A"|\
[myWechselrichter:Bat1_Power:d3]*1000. " W"|\
""\
\
## Zeile 52\
"Unit 0 (". [myPylontech:uBTlow_0:d1]. " - ". [myPylontech:uBThigh_0:d1]. " °C)"|\
[myPylontech:uCoulombAH_0:d0]. " %"|\
[myPylontech:uVolt_0:d3]. " V"|\
[myPylontech:uCurr_0:d3]. " A"|""|\
[myPylontech:uBVlow_0:d3]. " - ". [myPylontech:uBVhigh_0:d3]. " V  "\
\
\
## Zeile 53\
"Unit 1 (". [myPylontech:uBTlow_1:d1]. " - ". [myPylontech:uBThigh_1:d1]. " °C)"|\
[myPylontech:uCoulombAH_1:d0]. " %"|\
[myPylontech:uVolt_1:d3]. " V"|\
[myPylontech:uCurr_1:d3]. " A"|""|\
[myPylontech:uBVlow_1:d3]. " - ". [myPylontech:uBVhigh_1:d3]. " V  "\
\
\
## Zeile 54\
"Unit 2 (". [myPylontech:uBTlow_2:d1]. " - ". [myPylontech:uBThigh_2:d1]. " °C)"|\
[myPylontech:uCoulombAH_2:d0]. " %"|\
[myPylontech:uVolt_2:d3]. " V"|\
[myPylontech:uCurr_2:d3]. " A"|""|\
[myPylontech:uBVlow_2:d3]. " - ". [myPylontech:uBVhigh_2:d3]. " V  " \
\
\
## Zeile 55\
"Unit 3 (". [myPylontech:uBTlow_3:d1]. " - ". [myPylontech:uBThigh_3:d1]. " °C)"|\
[myPylontech:uCoulombAH_3:d0]. " %"|\
[myPylontech:uVolt_3:d3]. " V"|\
[myPylontech:uCurr_3:d3]. " A"|""|\
[myPylontech:uBVlow_3:d3]. " - ". [myPylontech:uBVhigh_3:d3]. " V  "\
\
## Zeile 56\
"Unit 4 (". [myPylontech:uBTlow_4:d1]. " - ". [myPylontech:uBThigh_4:d1]. " °C)"|\
[myPylontech:uCoulombAH_4:d0]. " %"|\
[myPylontech:uVolt_4:d3]. " V"|\
[myPylontech:uCurr_4:d3]. " A"|""|\
[myPylontech:uBVlow_4:d3]. " - ". [myPylontech:uBVhigh_4:d3]. " V  "\
\

#   .AttrList  disable:0,1 loglevel:0,1,2,3,4,5,6 notexist checkReadingEvent:0,1 addStateEvent:1,0 weekdays setList:textField-long readingList DOIF_Readings:textField-long event_Readings:textField-long uiState:textField-long uiTable:textField-long event-aggregator event-min-interval event-on-change-reading event-on-update-reading oldreadings stateFormat:textField-long timestamp-on-change-reading
#   .FhemMetaInternals 1
#   DEF        doifWechselrichter_Korrektur {
#    if ([$SELF:freigabeVerbrauchsErhoehung]) {
#        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 170) and (lc([?Test01ZbBwShp15:state]) eq "off")) {
#            return;
#            }       
#        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 240) and (lc([?Test01ZbBwShp15:state]) eq "on")) {
#            fhem_set("Test01ZbBwShp15 off"); 
#            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet, da unzureichend und Freigabe vorhanden";
#            return;
#            }       
#        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] < 240) and (lc([?Test01ZbBwShp15:state]) eq "off")) {
#            fhem_set("Test01ZbBwShp15 on"); 
#            Log 1, "doifWechselrichter_Korrektur: Korrekturlast eingeschaltet und Freigabe vorhanden";
#            return;
#            }       
#        if (([KgFlurStromzaehlerSml066:SDM72D_power_total:d0] > 340) and (lc([?Test01ZbBwShp15:state]) eq "on")) {
#            fhem_set("Test01ZbBwShp15 off"); 
#            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet und Freigabe vorhanden";
#            return;
#            }
#        }
#    else {
#        if (lc([?Test01ZbBwShp15:state]) eq "on") {
#            fhem_set("Test01ZbBwShp15 off"); 
#            Log 1, "doifWechselrichter_Korrektur: Korrekturlast ausgeschaltet, keine Freigabe!";
#            return;
#            }
#        }
#    }   
#
#doifWechselrichter_Midnight { [00:00:02];
#    my $val2 = [?myWechselrichter:Total_Battery_Charge2];
#    my $val  = [?myWechselrichter:Total_Battery_Charge];
#    my $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_Battery_Charge2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_Battery_Charge2 $val") if ($diff > 2);
#   
#    $val2 = [?myWechselrichter:Total_Battery_DisCharge2];
#    $val  = [?myWechselrichter:Total_Battery_DisCharge];
#    $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_Battery_DisCharge2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_Battery_DisCharge2 $val") if ($diff > 2);
#   
#    $val2 = [?myWechselrichter:Total_Energy_Purchase2];
#    $val  = [?myWechselrichter:Total_Energy_Purchase];
#    $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_Energy_Purchase2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_Energy_Purchase2 $val") if ($diff > 2);
#   
#    $val2 = [?myWechselrichter:Total_Energy_Selling2];
#    $val  = [?myWechselrichter:Total_Energy_Selling];
#    $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_Energy_Selling2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_Energy_Selling2 $val") if ($diff > 2);
#   
#    $val2 = [?myWechselrichter:Total_Load_Consumption2];
#    $val  = [?myWechselrichter:Total_Load_Consumption];
#    $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_Load_Consumption2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_Load_Consumption2 $val") if ($diff > 2);
#   
#    $val2 = [?myWechselrichter:Total_PV_Generation2];
#    $val  = [?myWechselrichter:Total_PV_Generation];
#    $diff = $val2 - $val;
#    fhem("setreading myWechselrichter Total_PV_Generation2 $val") if ($val2 < $val);
#    fhem("setreading myWechselrichter Total_PV_Generation2 $val") if ($diff > 2);
#    }
#
#doifWechselrichter_ReadData {
#    ##[+:5];     ## Alle X-Minuten ab einer vollen Stunde
#    my $text = InternalVal("myWechselrichter",".getList","");
#    #Log 1, $text;
#    $text =~ s/:noArg//g;
#    #Log 1, $text;
#    my @var  = sort(split(' ',$text));
#    $text = 0;
#    my $i = 0;
#   
#    foreach my $var (@var) {
#        $i += 2;
#        fhem("sleep $i quiet; get myWechselrichter $var;");
#        }
#    }
#   
#doifWechselrichter_ReadPower {
#    ##[+00:00:30];     ## Alle 30 Sekunden ab einer vollen Stunde
#    ##fhem("sleep 0.5 quiet; get myWechselrichter PV_PowerGesamt;");
#    }
#
#   FUUID      64245ce1-f33f-8792-96c5-aed5d0115eb0cfa0
#   FVERSION   98_DOIF.pm:0.277400/2023-07-10
#   MODEL      Perl
#   NAME       doifWechselrichter
#   NOTIFYDEV  myPylontech,doifWechselrichter,KgFlurStromzaehlerSml066,global,myCounter,myWechselrichter
#   NR         564
#   NTFY_ORDER 50-doifWechselrichter
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27740 2023-07-10 09:31:11
#   .attraggr:
#   .attrminint:
#   DOIF_Readings:
#     batteryIcon  {     return "measure_battery_100\@green" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 95);     return "measure_battery_100\@orange" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 87);     return "measure_battery_75\@green"  if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 75);     return "measure_battery_75\@orange"  if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 62);     return "measure_battery_50\@green" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 50);     return "measure_battery_50\@orange" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 37);     return "measure_battery_25\@green" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 25);     return "measure_battery_25\@orange" if (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') > 20);     return "measure_battery_0\@red"; }
#     freigabeVerbrauchsErhoehung  {     return 0 if (::ReadingValDoIf($hash,'myWechselrichter','PV_PowerGesamt') > 0);     my $EntladungsLimit = 100 - ::ReadingValDoIf($hash,'myWechselrichter','Bat1_Depth_of_Discharge');     my $EntladungJeStunde = 4.5;     my $EndladeEndeStunde = 9;       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);     my $AktStunde = $hour + $min / 60;     $EndladeEndeStunde += 24 if ($AktStunde > $EndladeEndeStunde);     my $RestStunden = (::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC') - $EntladungsLimit) / $EntladungJeStunde;     my $leer = $AktStunde + $RestStunden;     my $x0 = ($leer > 24)?$leer-24:$leer;     Log 1, "freigabeVerbrauchsErhoehung: Batterie leer in ". sprintf("%.2f",$RestStunden). " Stunden um ".sprintf("%.2f",$x0)." Uhr (Batterie: ".::ReadingValDoIf($hash,'myWechselrichter','Bat1_SOC')." %, ".$EndladeEndeStunde.")";          return 0 if ($leer < $EndladeEndeStunde);     return 1; } 
#   READINGS:
#     2024-02-05 21:13:16   Device          KgFlurStromzaehlerSml066
#     2024-02-05 19:40:04   batteryIcon     measure_battery_75@green
#     2024-02-05 21:13:16   block_doifWechselrichter_Korrektur executed
#     2024-02-05 00:00:02   block_doifWechselrichter_Midnight executed
#     2024-02-05 21:13:16   e_KgFlurStromzaehlerSml066_SDM72D_power_total 296.2
#     2024-02-05 16:45:04   e_doifWechselrichter_freigabeVerbrauchsErhoehung 1
#     2024-02-05 16:45:04   freigabeVerbrauchsErhoehung 1
#     2024-01-26 08:06:12   mode            enabled
#     2024-01-26 08:06:12   state           initialized
#     2024-02-05 00:00:02   timer_01_c02    06.02.2024 00:00:02
#   Regex:
#     DOIF_Readings:
#       myWechselrichter:
#         batteryIcon:
#           Bat1_SOC   ^myWechselrichter$:^Bat1_SOC:
#         freigabeVerbrauchsErhoehung:
#           Bat1_Depth_of_Discharge ^myWechselrichter$:^Bat1_Depth_of_Discharge:
#           Bat1_SOC   ^myWechselrichter$:^Bat1_SOC:
#           PV_PowerGesamt ^myWechselrichter$:^PV_PowerGesamt:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       KgFlurStromzaehlerSml066:
#         0:
#           SDM72D_power_total ^KgFlurStromzaehlerSml066$:^SDM72D_power_total:
#         1:
#         2:
#         3:
#       doifWechselrichter:
#         0:
#           freigabeVerbrauchsErhoehung ^doifWechselrichter$:^freigabeVerbrauchsErhoehung:
#         1:
#         2:
#         3:
#     uiState:
#       doifWechselrichter:
#         doifWechselrichter_uiState_c_1_0_0_3:
#           freigabeVerbrauchsErhoehung ^doifWechselrichter$:^freigabeVerbrauchsErhoehung:
#       myWechselrichter:
#         doifWechselrichter_uiState_c_1_0_0_1:
#           SysState   ^myWechselrichter$:^SysState:
#         doifWechselrichter_uiState_c_1_1_0_0:
#           Bat1_SOC   ^myWechselrichter$:^Bat1_SOC:
#     uiTable:
#      
# ... truncated to 50k, original length 107462


Interessant ist hier lediglich das Attribut "uiState":

attr doifWechselrichter uiState {\
sub bat_icon {\
    my($val)=@_;;\
    my $icon;;\
\
    $icon =    "measure_battery_0\@red";;\
    $icon =    "measure_battery_25\@orange"  if ($val > 20);;\
    $icon =    "measure_battery_25\@green"   if ($val > 25);;\
    $icon =    "measure_battery_50\@orange"  if ($val > 37);;\
    $icon =    "measure_battery_50\@green"   if ($val > 50);;\
    $icon =    "measure_battery_75\@orange"  if ($val > 62);;\
    $icon =    "measure_battery_75\@green"   if ($val > 75);;\
    $icon =    "measure_battery_100\@orange" if ($val > 87);;\
\
    my $output="(" . $val . " %)" . PUP("doifPylontech",$icon);;\
    return($output);;\
    }\
 }\\
\
\
\
"WR-Status: ".[myWechselrichter:SysState]." (".[$SELF:freigabeVerbrauchsErhoehung].")"|\
##PUP("doifPylontech",([$SELF:batteryIcon]))\
bat_icon([myWechselrichter:Bat1_SOC])

Tritt nun bei geöffneter Seite im Browser ein Wechsel des Ladezustandes der Batterie ([myWechselrichter:Bat1_SOC]) statt, so erscheint folgende Fehlermeldung:

Du darfst diesen Dateianhang nicht ansehen.

Nach Betätigung mit "OK" verschwindet das Fenster und neue Wert erscheint in der Statuszeile.

Irgendwelche Vorschläge was ich falsch mache?

MfG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Warum hast du PUP in bat_icon definieren? Du willst doch kein neues Fenster für das Icon erhalten.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 07 Februar 2024, 21:20:23Warum hast du PUP in bat_icon definieren? Du willst doch kein neues Fenster für das Icon erhalten.

Doch, genau das möchte ich. Beim Klicken auf das Icon möchte ich die uiTable des DOIFs des Batteriespeichers als Popup im Fenster des Wechselrichters aufrufen. Da funktioniert auch wie gewünscht.
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Zitat von: WW am 07 Februar 2024, 21:30:28
Zitat von: Damian am 07 Februar 2024, 21:20:23Warum hast du PUP in bat_icon definieren? Du willst doch kein neues Fenster für das Icon erhalten.

Doch, genau das möchte ich. Beim Klicken auf das Icon möchte ich die uiTable des DOIFs des Batteriespeichers als Popup im Fenster des Wechselrichters aufrufen. Da funktioniert auch wie gewünscht.

Zum Nachstellen bräuchte ich eine einfache Definition beider Devices am besten mit Dummys.

Das Problem liegt an der Schnittstellen-Definition zu JavaScript, sie arbeitet mit einfachem Hochkomma. Ich vermute, dass irgendwo noch ein Hochkomma dazwischen kommt. Damit kommt die Auswertung auf der JavaScript-Seite nicht klar.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#4
Ich bekomme mit folgender Definition keine Fehlermeldung:
Du darfst diesen Dateianhang nicht ansehen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Habe mal versucht eine minimale Version aufzusetzen. Der Einfachheit halber rufe ich die eigene uiTable auf:

defmod doifPylontech DOIF {\
[+10];;\
my $counter = get_Reading("counter",0) + 1;;\
$counter = 0 if($counter > 8);;\
set_Reading ("counter",$counter,1);;\
}
attr doifPylontech group Test
attr doifPylontech icon measure_battery_100
attr doifPylontech uiState {\
sub bat_icon {\
    my($val)=@_;;\
my $icon;;\
\
$icon = "measure_battery_0\@red"      if ($val == 0);;\
$icon = "measure_battery_25\@orange"  if ($val == 1);;\
$icon = "measure_battery_25\@green"   if ($val == 2);;\
$icon = "measure_battery_50\@orange"  if ($val == 3);;\
$icon = "measure_battery_50\@green"   if ($val == 4);;\
$icon = "measure_battery_75\@orange"  if ($val == 5);;\
$icon = "measure_battery_75\@green"   if ($val == 6);;\
$icon = "measure_battery_100\@orange" if ($val == 7);;\
$icon = "measure_battery_100\@green"  if ($val == 8);;\
\
my $output="(" . $val . " %)" . PUP("$SELF",$icon);;\
    return($output);;\
}\
 }\
\
\
""|bat_icon([$SELF:counter])
attr doifPylontech uiTable "Das ist ein Test"\


Immer wenn sich das Reading "counter" ändert, kommt die Fehlermeldung.

MfG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

Es ist zwar nicht die feine englische Art, aber über Instanzvariablen geht es:

defmod doifPylontech DOIF {\
[+10];;\
my $counter = get_Reading("counter",0) + 1;;\
$counter = 0 if($counter > 8);;\
set_Reading ("counter",$counter,1);;\
}
attr doifPylontech group Test
attr doifPylontech icon measure_battery_100
attr doifPylontech room Test
attr doifPylontech uiState {\
sub bat_icon {\
    my($val)=@_;;\
my $icon;;\
\
$icon = "measure_battery_0\@red"      if ($val == 0);;\
$icon = "measure_battery_25\@orange"  if ($val == 1);;\
$icon = "measure_battery_25\@green"   if ($val == 2);;\
$icon = "measure_battery_50\@orange"  if ($val == 3);;\
$icon = "measure_battery_50\@green"   if ($val == 4);;\
$icon = "measure_battery_75\@orange"  if ($val == 5);;\
$icon = "measure_battery_75\@green"   if ($val == 6);;\
$icon = "measure_battery_100\@orange" if ($val == 7);;\
$icon = "measure_battery_100\@green"  if ($val == 8);;\
\
\
        my $output="(" . $val . " %)";;\
        $_icon=$icon;;     \
        return($output);;\
}\
 }\
\
\
bat_icon([$SELF:counter]).PUP("$SELF",$_icon)\

attr doifPylontech uiTable "Das ist ein Test"\

Das Problem sind, wie schon vermutet, einfache Hochkommas bei PUP, die sich durch solche Konstruktion beim Aufruf von PUP ergeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

WW

Zitat von: Damian am 09 Februar 2024, 12:09:24... aber über Instanzvariablen geht es: ...

Es funktioniert jetzt. Vielen Dank für Deine Hilfe. Da wäre ich niemals alleine draufgekommen.

Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

WW

Noch eine Frage hinterher:

Besteht eigentlich mit "PUP" auch die Möglichkeit, die "uiState" statt der "uiTable" eines anderen DOIFs aufzurufen?

MfG
Willi
FHEM 6.0 im Docker-Container (OMV4 auf ASRock J3455-ITX), FHEM 6.0 auf Raspi, Fritzbox 7490, CUL433, CUL868, Jeelink868, SIGNALduino, LaCrosseGateway, SonoffZbBridge, Shelly, Sonoff, ESP8266, ESP32, ESP32-Cam, LaCrosse, Revolt, OneWire, Zigbee (Sonoff, Blitzwolf, IKEA, Lidl)

Damian

uiState ist später dazu gekommen, daher kennt PUP nur uiTable.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF