diff --git a/fhem/FHEM/76_SMAInverter.pm b/fhem/FHEM/76_SMAInverter.pm index 3893bd7aa..a043b9535 100644 --- a/fhem/FHEM/76_SMAInverter.pm +++ b/fhem/FHEM/76_SMAInverter.pm @@ -32,6 +32,11 @@ eval "use FHEM::Meta;1" or my $modMetaAbsent = 1; # Versions History by DS_Starter our %SMAInverter_vNotesIntern = ( + "2.20.2" => "12.01.2023 new read SPOT_EPVTOTAL / SPOT_EPVTODAY (Hybrid Inverter)", + "2.20.1" => "09.01.2023 fix BAT_UNLOADTODAY calculate", + "2.20.0" => "08.01.2023 crypt Password", + "2.19.1" => "07.01.2023 new read BAT_UNLOADTODAY / BAT_UNLOADTOTAL, included by 300P,", + "2.19.0" => "04.01.2023 new read BAT_CAPACITY, included by 300P,", "2.18.3" => "11.10.2022 fix new ETOTAL/LOADTOTAL bug 2.0 ;)", "2.18.2" => "09.10.2022 fix new ETOTAL/LOADTOTAL bug", "2.18.1" => "03.10.2022 new SE Inverters fix BAT-Data, fix ETODAY bug", @@ -138,6 +143,9 @@ our %SMAInverter_vNotesIntern = ( # $inv_STATUS # Inverter Status # $inv_BAT_LOADTODAY # Today Batteryload # $inv_BAT_LOADTOTAL # Total Batteryload +# $inv_BAT_CAPACITY # Battery Capacity (Percent) #TTT +# $inv_BAT_UNLOADTODAY # Today Batteryunload +# $inv_BAT_UNLOADTOTAL # Total Batteryunload # Aufbau Wechselrichter Type-Hash # https://github.com/SBFspot/SBFspot/blob/master/SBFspot/TagListDE-DE.txt @@ -373,7 +381,8 @@ sub SMAInverter_Define($$) { my ($IP,$Host,$Caps); my $Pass = $a[2]; # to do: check 1-12 Chars - + my $password = SMAInverter_SMAencrypt($Pass); + # extract IP or Hostname from $a[3] if (!defined $Host) { if ( $a[3] =~ /^([A-Za-z0-9_.])/ ) { @@ -385,7 +394,8 @@ sub SMAInverter_Define($$) { return "Argument:{$a[3]} not accepted as Host or IP. Read device specific help file."; } - $hash->{PASS} = $Pass; + $hash->{DEF} = "$password $Host"; + $hash->{PASS} = $password; $hash->{HOST} = $Host; InternalTimer(gettimeofday()+5, "SMAInverter_GetData", $hash, 0); # Start Hauptroutine @@ -492,6 +502,50 @@ sub SMAInverter_Attr(@) { return; } +########################################################################## +# Encrypt Passwort/Username übernommen aus 76_SMAEVCharger.pm author: Jürgen Allmich +########################################################################## + +sub SMAInverter_SMAencrypt($) +{ + my ($decoded) = @_; + my $key = getUniqueId(); + my $encoded; + + return $decoded if( $decoded =~ /crypt:/ ); + + for my $char (split //, $decoded) { + my $encode = chop($key); + $encoded .= sprintf("%.2x",ord($char)^ord($encode)); + $key = $encode.$key; + } + + return 'crypt:'.$encoded; +} + +########################################################################## +# Decrypt Passwort/Username übernommen aus 76_SMAEVCharger.pm author: Jürgen Allmich +########################################################################## + +sub SMAInverter_SMAdecrypt($) +{ + my ($encoded) = @_; + my $key = getUniqueId(); + my $decoded; + + return $encoded if( $encoded !~ /crypt:/ ); + + $encoded = $1 if( $encoded =~ /crypt:(.*)/ ); + + for my $char (map { pack('C', hex($_)) } ($encoded =~ /(..)/g)) { + my $decode = chop($key); + $decoded .= chr(ord($char)^ord($decode)); + $key = $decode.$key; + } + + return $decoded; +} + ############################################################### # Hauptschleife Datenabruf ############################################################### @@ -541,6 +595,7 @@ sub SMAInverter_getstatusDoParse($) { my $interval = AttrVal($name, "interval", 60); my $sc = AttrVal($name, "SBFSpotComp", 0); my ($sup_EnergyProduction, + $sup_PVEnergyProduction, $sup_SpotDCPower, $sup_SpotACPower, $sup_MaxACPower, @@ -555,6 +610,7 @@ sub SMAInverter_getstatusDoParse($) { $sup_BatteryInfo_TEMP, $sup_BatteryInfo_UDC, $sup_BatteryInfo_IDC, + $sup_BatteryInfo_Capacity, $sup_BatteryInfo_Capac, $sup_SpotGridFrequency, $sup_TypeLabel, @@ -562,10 +618,12 @@ sub SMAInverter_getstatusDoParse($) { $sup_InverterTemperature, $sup_GridRelayStatus, $sup_SpotBatteryLoad, + $sup_SpotBatteryUnload, $sup_DeviceStatus); my ($inv_TYPE, $inv_CLASS, $inv_SPOT_ETODAY, $inv_SPOT_ETOTAL, + $inv_SPOT_EPVTODAY, $inv_SPOT_EPVTOTAL, $inv_susyid, $inv_serial, $inv_SPOT_PDC1, $inv_SPOT_PDC2, @@ -582,7 +640,7 @@ sub SMAInverter_getstatusDoParse($) { $inv_BAT_IDC, $inv_BAT_IDC_A, $inv_BAT_IDC_B, $inv_BAT_IDC_C, $inv_BAT_CYCLES, $inv_BAT_CYCLES_A, $inv_BAT_CYCLES_B, $inv_BAT_CYCLES_C, $inv_BAT_TEMP, $inv_BAT_TEMP_A, $inv_BAT_TEMP_B, $inv_BAT_TEMP_C, - $inv_BAT_LOADTODAY, $inv_BAT_LOADTOTAL, + $inv_BAT_LOADTODAY, $inv_BAT_LOADTOTAL, $inv_BAT_CAPACITY,$inv_BAT_UNLOADTODAY,$inv_BAT_UNLOADTOTAL, $inv_SPOT_FREQ, $inv_SPOT_OPERTM, $inv_SPOT_FEEDTM, $inv_TEMP, $inv_GRIDRELAY, $inv_STATUS,); my @row_array; @@ -592,6 +650,8 @@ sub SMAInverter_getstatusDoParse($) { # Background-Startzeit $bst = [gettimeofday]; + + $inv_CLASS = ReadingsVal($name,"INV_CLASS",""); Log3 ($name, 4, "$name -> Start BlockingCall SMAInverter_getstatusDoParse"); @@ -621,15 +681,30 @@ sub SMAInverter_getstatusDoParse($) { $val = ReadingsNum($name, "SPOT_ETOTAL", 0) if (exists $defs{$name}{READINGS}{SPOT_ETOTAL}); BlockingInformParent("SMAInverter_setReadingFromBlocking", [$name, ".etotal_yesterday", $val], 0); } + + # EPVTOTAL speichern für EPVTODAY-Berechnung wenn WR EPVTODAY nicht liefert + if ($dt_now <= $oper_start_d && ($inv_CLASS eq "Hybrid Inverters" || $inv_CLASS eq "Hybrid-Wechselrichter")) { + my $val = 0; + $val = ReadingsNum($name, "epvtotal", 0)*1000 if (exists $defs{$name}{READINGS}{epvtotal}); + $val = ReadingsNum($name, "SPOT_EPVTOTAL", 0) if (exists $defs{$name}{READINGS}{SPOT_EPVTOTAL}); + BlockingInformParent("SMAInverter_setReadingFromBlocking", [$name, ".epvtotal_yesterday", $val], 0); + } # BATTERYLOAD_TOTAL speichern für BAT_LOADTODAY-Berechnung wenn WR BAT_LOADTODAY nicht liefert - if ($dt_now <= $oper_start_d) { # V2.14.1, Forum: https://forum.fhem.de/index.php/topic,56080.msg1134664.html#msg1134664 + if ($dt_now <= $oper_start_d) { my $val = 0; $val = ReadingsNum($name, "bat_loadtotal", 0)*1000 if (exists $defs{$name}{READINGS}{bat_loadtotal}); $val = ReadingsNum($name, "BAT_LOADTOTAL", 0) if (exists $defs{$name}{READINGS}{BAT_LOADTOTAL}); BlockingInformParent("SMAInverter_setReadingFromBlocking", [$name, ".bat_loadtotal_yesterday", $val], 0); } + # BATTERYUNLOAD_TOTAL speichern für BAT_UNLOADTODAY-Berechnung wenn WR BAT_UNLOADTODAY nicht liefert + if ($dt_now <= $oper_start_d) { # V2.14.1, Forum: https://forum.fhem.de/index.php/topic,56080.msg1134664.html#msg1134664 + my $val = 0; + $val = ReadingsNum($name, "bat_unloadtotal", 0)*1000 if (exists $defs{$name}{READINGS}{bat_unloadtotal}); + $val = ReadingsNum($name, "BAT_UNLOADTOTAL", 0) if (exists $defs{$name}{READINGS}{BAT_UNLOADTOTAL}); + BlockingInformParent("SMAInverter_setReadingFromBlocking", [$name, ".bat_unloadtotal_yesterday", $val], 0); + } if (($oper_start <= $dt_now && $dt_now <= $oper_stop) || AttrVal($name,"suppressSleep",0)) { # normal operation or suppressed sleepmode @@ -647,6 +722,8 @@ sub SMAInverter_getstatusDoParse($) { "sup_SpotACTotalPower", # Check SpotACTotalPower "sup_ChargeStatus" # Check BatteryChargeStatus ); + + push(@commands, "sup_PVEnergyProduction") if($inv_CLASS eq "Hybrid Inverters" || $inv_CLASS eq "Hybrid-Wechselrichter"); # Check PV-EnergyProduction (Hybrid Inverter) if($detail_level > 0) { # Detail Level 1 or 2 >> get voltage and current levels @@ -669,6 +746,7 @@ sub SMAInverter_getstatusDoParse($) { } push(@commands, "sup_SpotBatteryLoad"); # Check Batteryload + push(@commands, "sup_SpotBatteryUnload"); # Check BatteryUnload } if($detail_level > 1) { @@ -680,6 +758,7 @@ sub SMAInverter_getstatusDoParse($) { push(@commands, "sup_MaxACPower2"); # Check MaxACPower2 ? push(@commands, "sup_GridRelayStatus"); # Check GridRelayStatus push(@commands, "sup_DeviceStatus"); # Check DeviceStatus + push(@commands, "sup_BatteryInfo_Capacity"); # Check DeviceCapacity - Battery if (ReadingsVal($name,"INV_TYPE","") =~ /SBS(6\.0|5\.0|3\.7)/xs || ReadingsVal($name,"device_type","") =~ /SBS(6\.0|5\.0|3\.7)/xs) { @@ -700,6 +779,9 @@ sub SMAInverter_getstatusDoParse($) { } elsif ($i eq "sup_EnergyProduction") { ($sup_EnergyProduction,$inv_SPOT_ETODAY,$inv_SPOT_ETOTAL,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x54000200, 0x00260100, 0x002622FF); + } + elsif ($i eq "sup_PVEnergyProduction") { + ($sup_PVEnergyProduction,$inv_SPOT_EPVTODAY,$inv_SPOT_EPVTOTAL,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x54000200, 0x0046c300, 0x0046c3FF); } elsif ($i eq "sup_SpotDCPower") { ($sup_SpotDCPower,$inv_SPOT_PDC1,$inv_SPOT_PDC2,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x53800200, 0x00251E00, 0x00251EFF); @@ -734,7 +816,11 @@ sub SMAInverter_getstatusDoParse($) { elsif ($i eq "sup_BatteryInfo_IDC") { Log3 $name, 5, "$name -> sup_BatteryInfo_IDC"; ($sup_BatteryInfo_IDC,$inv_BAT_IDC,$inv_BAT_IDC_A,$inv_BAT_IDC_B,$inv_BAT_IDC_C,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x51000200, 0x00495D00, 0x00495D10); - } + } + elsif ($i eq "sup_BatteryInfo_Capacity") { + Log3 $name, 5, "$name -> sup_BatteryInfo_Capacity"; + ($sup_BatteryInfo_Capacity,$inv_BAT_CAPACITY,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x51000200, 0x00696E00, 0x00696E10); + } elsif ($i eq "sup_BatteryInfo_Capac") { Log3 $name, 5, "$name -> sup_BatteryInfo_Capac"; #($sup_BatteryInfo_IDC,$inv_BAT_IDC,$inv_BAT_IDC_A,$inv_BAT_IDC_B,$inv_BAT_IDC_C,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x51000200, 0x00496800, 0x004968FF); @@ -771,6 +857,9 @@ sub SMAInverter_getstatusDoParse($) { elsif ($i eq "sup_SpotBatteryLoad") { ($sup_SpotBatteryLoad,$inv_BAT_LOADTODAY,$inv_BAT_LOADTOTAL,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x54000200, 0x00496700, 0x004967FF); } + elsif ($i eq "sup_SpotBatteryUnload") { + ($sup_SpotBatteryUnload,$inv_BAT_UNLOADTODAY,$inv_BAT_UNLOADTOTAL,$inv_susyid,$inv_serial) = SMAInverter_SMAcommand($hash, $hash->{HOST}, 0x54000200, 0x00496800, 0x004968FF); + } } # nothing more to do, just log out @@ -850,6 +939,10 @@ sub SMAInverter_getstatusDoParse($) { if($sup_EnergyProduction) { push(@row_array, "etotal ".($inv_SPOT_ETOTAL/1000)."\n") if ($inv_SPOT_ETOTAL ne "-"); push(@row_array, "etoday ".($inv_SPOT_ETODAY/1000)."\n") if ($inv_SPOT_ETODAY ne "-"); + } + if($sup_PVEnergyProduction) { + push(@row_array, "epvtotal ".($inv_SPOT_EPVTOTAL/1000)."\n") if ($inv_SPOT_EPVTOTAL ne "-"); + push(@row_array, "epvtoday ".($inv_SPOT_EPVTODAY/1000)."\n") if ($inv_SPOT_EPVTODAY ne "-"); } if($sup_SpotDCPower) { push(@row_array, "string_1_pdc ".sprintf("%.3f",$inv_SPOT_PDC1/1000)."\n"); @@ -869,7 +962,10 @@ sub SMAInverter_getstatusDoParse($) { push(@row_array, "state ".sprintf("%.3f",$inv_SPOT_PACTOT/1000)."\n"); } if($sup_ChargeStatus) { - push(@row_array, "chargestatus ".$inv_ChargeStatus."\n"); + push(@row_array, "chargestatus ".$inv_ChargeStatus."\n"); #TTT + } + if($sup_BatteryInfo_Capacity) { + push(@row_array, "bat_capacity ".$inv_BAT_CAPACITY."\n"); #TTT } if($inv_CLASS && $inv_CLASS eq 8007 && defined($inv_SPOT_PACTOT)) { # V2.10.1 28.04.2019 @@ -929,6 +1025,10 @@ sub SMAInverter_getstatusDoParse($) { push(@row_array, "bat_loadtotal ".($inv_BAT_LOADTOTAL/1000)."\n") if ($inv_BAT_LOADTOTAL ne "-"); push(@row_array, "bat_loadtoday ".($inv_BAT_LOADTODAY/1000)."\n") if ($inv_BAT_LOADTODAY ne "-"); } + if($sup_SpotBatteryUnload) { + push(@row_array, "bat_unloadtotal ".($inv_BAT_UNLOADTOTAL/1000)."\n") if ($inv_BAT_UNLOADTOTAL ne "-"); + push(@row_array, "bat_unloadtoday ".($inv_BAT_UNLOADTODAY/1000)."\n") if ($inv_BAT_UNLOADTODAY ne "-"); + } } if($detail_level > 1) { @@ -983,6 +1083,10 @@ sub SMAInverter_getstatusDoParse($) { if($sup_EnergyProduction) { push(@row_array, "SPOT_ETOTAL ".$inv_SPOT_ETOTAL."\n") if ($inv_SPOT_ETOTAL ne "-"); push(@row_array, "SPOT_ETODAY ".$inv_SPOT_ETODAY."\n") if ($inv_SPOT_ETODAY ne "-"); + } + if($sup_PVEnergyProduction) { + push(@row_array, "SPOT_EPVTOTAL ".$inv_SPOT_EPVTOTAL."\n") if ($inv_SPOT_EPVTOTAL ne "-"); + push(@row_array, "SPOT_EPVTODAY ".$inv_SPOT_EPVTODAY."\n") if ($inv_SPOT_EPVTODAY ne "-"); } if($sup_SpotDCPower) { push(@row_array, "SPOT_PDC1 ".$inv_SPOT_PDC1."\n"); @@ -1060,6 +1164,13 @@ sub SMAInverter_getstatusDoParse($) { push(@row_array, "BAT_LOADTOTAL ".$inv_BAT_LOADTOTAL."\n") if ($inv_BAT_LOADTOTAL ne "-"); push(@row_array, "BAT_LOADTODAY ".$inv_BAT_LOADTODAY."\n") if ($inv_BAT_LOADTODAY ne "-"); } + if($sup_BatteryInfo_Capacity) { + push(@row_array, "BAT_CAPACITY ".$inv_BAT_CAPACITY."\n") if ($inv_BAT_CAPACITY ne "-"); #TTT + } + if($sup_SpotBatteryUnload) { + push(@row_array, "BAT_UNLOADTOTAL ".$inv_BAT_UNLOADTOTAL."\n") if ($inv_BAT_UNLOADTOTAL ne "-"); + push(@row_array, "BAT_UNLOADTODAY ".$inv_BAT_UNLOADTODAY."\n") if ($inv_BAT_UNLOADTODAY ne "-"); + } } if($detail_level > 1) { @@ -1228,6 +1339,7 @@ sub SMAInverter_SMAcommand($$$$$) { my $esignature = "0010606509A0"; my ($inv_TYPE, $inv_CLASS, $inv_SPOT_ETODAY, $inv_SPOT_ETOTAL, + $inv_SPOT_EPVTODAY, $inv_SPOT_EPVTOTAL, $inv_susyid, $inv_serial, $inv_SPOT_PDC1, $inv_SPOT_PDC2, @@ -1244,7 +1356,7 @@ sub SMAInverter_SMAcommand($$$$$) { $inv_BAT_IDC, $inv_BAT_IDC_A, $inv_BAT_IDC_B, $inv_BAT_IDC_C, $inv_BAT_CYCLES, $inv_BAT_CYCLES_A, $inv_BAT_CYCLES_B, $inv_BAT_CYCLES_C, $inv_BAT_TEMP, $inv_BAT_TEMP_A, $inv_BAT_TEMP_B, $inv_BAT_TEMP_C, - $inv_BAT_LOADTODAY, $inv_BAT_LOADTOTAL, + $inv_BAT_LOADTODAY, $inv_BAT_LOADTOTAL, $inv_BAT_CAPACITY,$inv_BAT_UNLOADTODAY,$inv_BAT_UNLOADTOTAL, $inv_SPOT_FREQ, $inv_SPOT_OPERTM, $inv_SPOT_FEEDTM, $inv_TEMP, $inv_GRIDRELAY, $inv_STATUS); my $mysusyid = $hash->{HELPER}{MYSUSYID}; my $myserialnumber = $hash->{HELPER}{MYSERIALNUMBER}; @@ -1382,6 +1494,43 @@ sub SMAInverter_SMAcommand($$$$$) { Log3 $name, 5, "$name - Data SPOT_ETOTAL=$inv_SPOT_ETOTAL and SPOT_ETODAY=$inv_SPOT_ETODAY"; return (1,$inv_SPOT_ETODAY,$inv_SPOT_ETOTAL,$inv_susyid,$inv_serial); } + #PV Ertrag + if($data_ID eq 0x46C3) { + if (length($data) >= 66) { + $inv_SPOT_EPVTOTAL = unpack("V*", substr($data, 62, 4)); + + if(($inv_SPOT_EPVTOTAL eq -2147483648) || ($inv_SPOT_EPVTOTAL eq 0xFFFFFFFF) || $inv_SPOT_EPVTOTAL <= 0) {$inv_SPOT_EPVTOTAL = "-"; } + } + else { + Log3 ($name, 3, "$name - WARNING - EPVTOTAL wasn't deliverd ... set it to \"0\" !"); + $inv_SPOT_EPVTOTAL = "-"; + } + + $inv_SPOT_EPVTODAY = "-"; + if (length($data) >= 82) { + $inv_SPOT_EPVTODAY = unpack("V*", substr ($data, 78, 4)); + + if(($inv_SPOT_EPVTODAY eq -2147483648) || ($inv_SPOT_EPVTODAY eq 0xFFFFFFFF) || $inv_SPOT_EPVTODAY <= 0) {$inv_SPOT_EPVTODAY = "-"; } + } + + if($inv_SPOT_EPVTODAY eq "-" && $inv_SPOT_EPVTOTAL ne "-") { + # EPVTODAY wurde vom WR nicht geliefert, es wird versucht ihn zu berechnen + Log3 ($name, 3, "$name - EPVTODAY wasn't delivered from inverter, try to calculate it ..."); + my $etotold = ReadingsNum($name, ".epvtotal_yesterday", 0); + + if($etotold && $inv_SPOT_EPVTOTAL > $etotold) { + $inv_SPOT_EPVTODAY = $inv_SPOT_EPVTOTAL - $etotold; + Log3 ($name, 3, "$name - EPVTODAY calculated successfully !"); + } + else { + Log3 ($name, 3, "$name - WARNING - unable to calculate EPVTODAY ... set it to \"0\" !"); + $inv_SPOT_EPVTODAY = "-"; + } + } + + Log3 $name, 5, "$name - Data SPOT_EPVTOTAL=$inv_SPOT_EPVTOTAL and SPOT_EPVTODAY=$inv_SPOT_EPVTODAY"; + return (1,$inv_SPOT_EPVTODAY,$inv_SPOT_EPVTOTAL,$inv_susyid,$inv_serial); + } if($data_ID eq 0x4967) { if (length($data) >= 66) { @@ -1419,6 +1568,43 @@ sub SMAInverter_SMAcommand($$$$$) { Log3 $name, 5, "$name - Data BAT_LOADTOTAL=$inv_BAT_LOADTOTAL and BAT_LOADTODAY=$inv_BAT_LOADTODAY"; return (1,$inv_BAT_LOADTODAY,$inv_BAT_LOADTOTAL,$inv_susyid,$inv_serial); } + + if($data_ID eq 0x4968) { + if (length($data) >= 66) { + $inv_BAT_UNLOADTOTAL = unpack("V*", substr($data, 62, 4)); + + if(($inv_BAT_UNLOADTOTAL eq -2147483648) || ($inv_BAT_UNLOADTOTAL eq 0xFFFFFFFF) || $inv_BAT_UNLOADTOTAL <= 0) {$inv_BAT_UNLOADTOTAL = "-"; } + } + else { + Log3 $name, 3, "$name - WARNING - BATTERYUNLOAD_TOTAL wasn't deliverd ... set it to \"0\" !"; + $inv_BAT_UNLOADTOTAL = "-"; + } + + $inv_BAT_UNLOADTODAY = "-"; + if (length($data) >= 82) { + $inv_BAT_UNLOADTODAY = unpack("V*", substr ($data, 78, 4)); + + if(($inv_BAT_UNLOADTODAY eq -2147483648) || ($inv_BAT_UNLOADTODAY eq 0xFFFFFFFF) || $inv_BAT_UNLOADTODAY <= 0) {$inv_BAT_UNLOADTODAY = "-"; } + } + + if($inv_BAT_UNLOADTODAY eq "-" && $inv_BAT_UNLOADTOTAL ne "-") { + # BATTERYUNLOAD_TODAY wurde vom WR nicht geliefert, es wird versucht ihn zu berechnen + Log3 $name, 3, "$name - BATTERYUNLOAD_TODAY wasn't delivered from inverter, try to calculate it ..."; + my $bultotold = ReadingsNum($name, ".bat_unloadtotal_yesterday", 0); + + if($bultotold && $inv_BAT_UNLOADTOTAL > $bultotold) { + $inv_BAT_UNLOADTODAY = $inv_BAT_UNLOADTOTAL - $bultotold; + Log3 $name, 3, "$name - BATTERYUNLOAD_TODAY calculated successfully !"; + } + else { + Log3 $name, 3, "$name - WARNING - unable to calculate BATTERYUNLOAD_TODAY ... set it to \"0\" !"; + $inv_BAT_UNLOADTODAY = "-"; + } + } + + Log3 $name, 3, "$name - Data BAT_UNLOADTOTAL=$inv_BAT_UNLOADTOTAL and BAT_UNLOADTODAY=$inv_BAT_UNLOADTODAY"; + return (1,$inv_BAT_UNLOADTODAY,$inv_BAT_UNLOADTOTAL,$inv_susyid,$inv_serial); + } if($data_ID eq 0x251E) { $inv_SPOT_PDC1 = unpack("V*", substr $data, 62, 4); @@ -1468,6 +1654,11 @@ sub SMAInverter_SMAcommand($$$$$) { return (1,$inv_ChargeStatus,$inv_susyid,$inv_serial); } + if($data_ID eq 0x696E) { + $inv_BAT_CAPACITY = unpack("V*", substr $data, 62, 4); + Log3 $name, 5, "$name - Found Data Battery Capacity =$inv_BAT_CAPACITY"; #TTT + return (1,$inv_BAT_CAPACITY,$inv_susyid,$inv_serial); + } if($data_ID eq 0x451F) { $inv_SPOT_UDC1 = unpack("l*", substr $data, 62, 4); # catch shorter responses in case not second string supported @@ -1749,6 +1940,7 @@ sub SMAInverter_SMAlogon($$$) { my $target_serial = AttrVal($name, "target-serial", $default_target_serial); #Encode the password + $pass = SMAInverter_SMAdecrypt( $pass ); my $encpasswd = "888888888888888888888888"; # template for password for my $index (0..length $pass ) # encode password { @@ -2242,9 +2434,11 @@ The retrieval of the inverter will be executed non-blocking. You can adjust the
  • BAT_UDC [A,B,C] / bat_udc [A,B,C] : Battery Voltage [A,B,C]
  • BAT_PDC / bat_pdc : Battery power (only Hybrid-Inverter)
  • ChargeStatus / chargestatus : Battery Charge status
  • +
  • BAT_CAPACITY / bat_capacity : Battery (remaining) Capacity (SOH)
  • BAT_LOADTODAY : Battery Load Today
  • BAT_LOADTOTAL : Battery Load Total
  • -
  • ChargeStatus / chargestatus : Battery Charge status
  • +
  • BAT_UNLOADTODAY : Battery Unload Today
  • +
  • BAT_UNLOADTOTAL : Battery Unload Total
  • CLASS / device_class : Inverter Class
  • PACMAX1 / pac_max_phase_1 : Nominal power in Ok Mode
  • PACMAX1_2 / pac_max_phase_1_2 : Maximum active power device (Some inverters like SB3300/SB1200)
  • @@ -2253,6 +2447,8 @@ The retrieval of the inverter will be executed non-blocking. You can adjust the
  • Serialnumber / serial_number : Inverter Serialnumber
  • SPOT_ETODAY / etoday : Today yield
  • SPOT_ETOTAL / etotal : Total yield
  • +
  • SPOT_EPVTODAY / epvtoday : Today PV yield
  • +
  • SPOT_EPVTOTAL / epvtotal : Total PV yield
  • SPOT_FEEDTM / feed-in_time : Feed-in time
  • SPOT_FREQ / grid_freq : Grid Frequency
  • SPOT_CosPhi / coshhi : displacement factor
  • @@ -2482,8 +2678,11 @@ Die Abfrage des Wechselrichters wird non-blocking ausgeführt. Der Timeoutwert f
  • BAT_UDC [A,B,C] / bat_udc [A,B,C] : Akku Spannung [A,B,C]
  • BAT_PDC / bat_pdc : Akku Leistung (bei Hybridwechselrichtern)
  • ChargeStatus / chargestatus : Akku Ladestand
  • +
  • BAT_CAPACITY / bat_capacity : Battery (verbleibende) Kapazität (SOH)
  • BAT_LOADTODAY : Battery Load Today
  • BAT_LOADTOTAL : Battery Load Total
  • +
  • BAT_UNLOADTODAY : Battery Unload Today
  • +
  • BAT_UNLOADTOTAL : Battery Unload Total
  • CLASS / device_class : Wechselrichter Klasse
  • PACMAX1 / pac_max_phase_1 : Nominelle Leistung in Ok Mode
  • PACMAX1_2 / pac_max_phase_1_2 : Maximale Leistung (für einige Wechselrichtertypen)
  • @@ -2491,6 +2690,8 @@ Die Abfrage des Wechselrichters wird non-blocking ausgeführt. Der Timeoutwert f
  • PACMAX3 / pac_max_phase_3 : Nominelle Leistung in Fault Mode
  • Serialnumber / serial_number : Wechselrichter Seriennummer
  • SPOT_ETODAY / etoday : Energie heute
  • +
  • SPOT_EPVTOTAL / epvtotal : PV Energie Insgesamt
  • +
  • SPOT_EPVTODAY / epvtoday : PV Energie heute
  • SPOT_ETOTAL / etotal : Energie Insgesamt
  • SPOT_FEEDTM / feed-in_time : Einspeise-Stunden
  • SPOT_FREQ / grid_freq : Netz Frequenz