2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-28 17:12:32 +00:00

70_PylonLowVoltage: internal code changes

git-svn-id: https://svn.fhem.de/fhem/trunk@29094 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2024-08-23 19:47:55 +00:00
parent d26d64f82c
commit 52326d81c4
3 changed files with 440 additions and 326 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it # Do not insert empty lines here, update check depends on it
- change: 70_PylonLowVoltage: internal code changes
- feature: 70_PylonLowVoltage: extend battery addresses up to 16 - feature: 70_PylonLowVoltage: extend battery addresses up to 16
- change: 76_SolarForecast: attr ctrlWeatherDevX to setupWeatherDevX, - change: 76_SolarForecast: attr ctrlWeatherDevX to setupWeatherDevX,
- bufgix: 76_SMAInverter: fix PW Lengs Bug - bufgix: 76_SMAInverter: fix PW Lengs Bug

View File

@ -120,6 +120,7 @@ BEGIN {
# Versions History intern (Versions history by Heiko Maaz) # Versions History intern (Versions history by Heiko Maaz)
my %vNotesIntern = ( my %vNotesIntern = (
"0.4.0" => "23.08.2024 Log output for timeout changed, automatic calculation of checksum ",
"0.3.0" => "22.08.2024 extend battery addresses up to 16 ", "0.3.0" => "22.08.2024 extend battery addresses up to 16 ",
"0.2.6" => "25.05.2024 replace Smartmatch Forum:#137776 ", "0.2.6" => "25.05.2024 replace Smartmatch Forum:#137776 ",
"0.2.5" => "02.04.2024 _callAnalogValue / _callAlarmInfo: integrate a Cell and Temperature Position counter ". "0.2.5" => "02.04.2024 _callAnalogValue / _callAlarmInfo: integrate a Cell and Temperature Position counter ".
@ -153,6 +154,8 @@ my $definterval = 30; # default A
my $defto = 0.5; # default connection Timeout zum RS485 Gateway my $defto = 0.5; # default connection Timeout zum RS485 Gateway
my @blackl = qw(state nextCycletime); # Ausnahmeliste deleteReadingspec my @blackl = qw(state nextCycletime); # Ausnahmeliste deleteReadingspec
my $age1def = 60; # default Zyklus Abrufklasse statische Werte (s) my $age1def = 60; # default Zyklus Abrufklasse statische Werte (s)
my $pfx = "~"; # KommandoPräfix
my $sfx = "\x{0d}"; # Kommandosuffix
# Steuerhashes # Steuerhashes
############### ###############
@ -217,23 +220,24 @@ my %halm = ( #
# ~ 20 11 46 93 E0 02 11 # ~ 20 11 46 93 E0 02 11
# 7E 32 30 31 31 34 36 39 33 45 30 30 32 31 31 = 02D3H -> bitweise invert = 1111 1101 0010 1100 -> +1 = 1111 1101 0010 1101 -> FD2DH # 7E 32 30 31 31 34 36 39 33 45 30 30 32 31 31 = 02D3H -> bitweise invert = 1111 1101 0010 1100 -> +1 = 1111 1101 0010 1101 -> FD2DH
# #
my %hrsnb = ( # Codierung Abruf serialNumber, mlen = Mindestlänge Antwortstring my %hrsnb = ( # Codierung Abruf serialNumber, mlen = Mindestlänge Antwortstring
1 => { cmd => "~20024693E00202FD2D\x{0d}", mlen => 52 }, 1 => { cmd => "20024693E00202", mlen => 52 },
2 => { cmd => "~20034693E00203FD2B\x{0d}", mlen => 52 }, 2 => { cmd => "20034693E00203", mlen => 52 },
3 => { cmd => "~20044693E00204FD29\x{0d}", mlen => 52 }, 3 => { cmd => "20044693E00204", mlen => 52 },
4 => { cmd => "~20054693E00205FD27\x{0d}", mlen => 52 }, 4 => { cmd => "20054693E00205", mlen => 52 },
5 => { cmd => "~20064693E00206FD25\x{0d}", mlen => 52 }, 5 => { cmd => "20064693E00206", mlen => 52 },
6 => { cmd => "~20074693E00207FD23\x{0d}", mlen => 52 }, 6 => { cmd => "20074693E00207", mlen => 52 },
7 => { cmd => "~20084693E00208FD21\x{0d}", mlen => 52 }, 7 => { cmd => "20084693E00208", mlen => 52 },
8 => { cmd => "~20094693E00209FD1F\x{0d}", mlen => 52 }, 8 => { cmd => "20094693E00209", mlen => 52 },
9 => { cmd => "~200A4693E0020AFD0F\x{0d}", mlen => 52 }, 9 => { cmd => "200A4693E0020A", mlen => 52 },
10 => { cmd => "~200B4693E0020BFD0D\x{0d}", mlen => 52 }, 10 => { cmd => "200B4693E0020B", mlen => 52 },
11 => { cmd => "~200C4693E0020CFD0B\x{0d}", mlen => 52 }, 11 => { cmd => "200C4693E0020C", mlen => 52 },
12 => { cmd => "~200D4693E0020DFD09\x{0d}", mlen => 52 }, 12 => { cmd => "200D4693E0020D", mlen => 52 },
13 => { cmd => "~200E4693E0020EFD07\x{0d}", mlen => 52 }, 13 => { cmd => "200E4693E0020E", mlen => 52 },
14 => { cmd => "~200F4693E0020FFD05\x{0d}", mlen => 52 }, 14 => { cmd => "200F4693E0020F", mlen => 52 },
15 => { cmd => "~20104693E00210FD2F\x{0d}", mlen => 52 }, 15 => { cmd => "20104693E00210", mlen => 52 },
16 => { cmd => "~20114693E00211FD2D\x{0d}", mlen => 52 }, 16 => { cmd => "20114693E00211", mlen => 52 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -245,30 +249,26 @@ my %hrsnb = ( # Codierung
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+35+31+30+30+30+30 = 0263H -> modulo 65536 = 0263H -> bitweise invert = 1111 1101 1001 1100 -> +1 = 1111 1101 1001 1101 = FD9DH # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+35+31+30+30+30+30 = 0263H -> modulo 65536 = 0263H -> bitweise invert = 1111 1101 1001 1100 -> +1 = 1111 1101 1001 1101 = FD9DH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 51 00 00 empty FD 9D
# 7E 32 30 30 41 34 36 35 31 30 30 30 30 - -
# ~ 20 10 46 51 00 00 empty # ~ 20 10 46 51 00 00 empty
# 7E 32 20 31 30 34 36 35 31 30 30 30 30 - - FD BD = 0243H -> bitweise invert = 1111 1101 1011 1100 -> +1 = 1111 1101 1011 1101 = FDBDH # 7E 32 20 31 30 34 36 35 31 30 30 30 30 - - FD BD = 0243H -> bitweise invert = 1111 1101 1011 1100 -> +1 = 1111 1101 1011 1101 = FDBDH
# ~ 20 11 46 51 00 00 empty
# 7E 32 20 31 31 34 36 35 31 30 30 30 30 - - FD BC
# #
my %hrmfi = ( # Codierung Abruf manufacturerInfo, mlen = Mindestlänge Antwortstring my %hrmfi = ( # Codierung Abruf manufacturerInfo, mlen = Mindestlänge Antwortstring
1 => { cmd => "~200246510000FDAC\x{0d}", mlen => 82 }, 1 => { cmd => "200246510000", mlen => 82 },
2 => { cmd => "~200346510000FDAB\x{0d}", mlen => 82 }, 2 => { cmd => "200346510000", mlen => 82 },
3 => { cmd => "~200446510000FDAA\x{0d}", mlen => 82 }, 3 => { cmd => "200446510000", mlen => 82 },
4 => { cmd => "~200546510000FDA9\x{0d}", mlen => 82 }, 4 => { cmd => "200546510000", mlen => 82 },
5 => { cmd => "~200646510000FDA8\x{0d}", mlen => 82 }, 5 => { cmd => "200646510000", mlen => 82 },
6 => { cmd => "~200746510000FDA7\x{0d}", mlen => 82 }, 6 => { cmd => "200746510000", mlen => 82 },
7 => { cmd => "~200846510000FDA6\x{0d}", mlen => 82 }, 7 => { cmd => "200846510000", mlen => 82 },
8 => { cmd => "~200946510000FDA5\x{0d}", mlen => 82 }, 8 => { cmd => "200946510000", mlen => 82 },
9 => { cmd => "~200A46510000FD9D\x{0d}", mlen => 82 }, 9 => { cmd => "200A46510000", mlen => 82 },
10 => { cmd => "~200B46510000FD9C\x{0d}", mlen => 82 }, 10 => { cmd => "200B46510000", mlen => 82 },
11 => { cmd => "~200C46510000FD9B\x{0d}", mlen => 82 }, 11 => { cmd => "200C46510000", mlen => 82 },
12 => { cmd => "~200D46510000FD9A\x{0d}", mlen => 82 }, 12 => { cmd => "200D46510000", mlen => 82 },
13 => { cmd => "~200E46510000FD8F\x{0d}", mlen => 82 }, 13 => { cmd => "200E46510000", mlen => 82 },
14 => { cmd => "~200F46510000FD8E\x{0d}", mlen => 82 }, 14 => { cmd => "200F46510000", mlen => 82 },
15 => { cmd => "~201046510000FDBD\x{0d}", mlen => 82 }, 15 => { cmd => "201046510000", mlen => 82 },
16 => { cmd => "~201146510000FDBC\x{0d}", mlen => 82 }, 16 => { cmd => "201146510000", mlen => 82 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -280,86 +280,77 @@ my %hrmfi = ( # Codierung
# CHKSUM (als HEX! addieren): 30+30+30+41+34+36+34+46+30+30+30+30 = 0275H -> modulo 65536 = 0275H -> bitweise invert = 1111 1101 1000 1010 -> +1 = 1111 1101 1000 1011 -> FD8BH # CHKSUM (als HEX! addieren): 30+30+30+41+34+36+34+46+30+30+30+30 = 0275H -> modulo 65536 = 0275H -> bitweise invert = 1111 1101 1000 1010 -> +1 = 1111 1101 1000 1011 -> FD8BH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 00 0A 46 4F 00 00 empty FD 8B # ~ 00 0A 46 4F 00 00 empty
# 7E 30 30 30 41 34 36 34 46 30 30 30 30 - -
# ~ 00 10 46 4F 00 00 empty
# 7E 30 30 31 30 34 36 34 46 30 30 30 30 - - FD AB 1111 1101 1010 1011
# ~ 00 11 46 4F 00 00 empty
# 7E 30 30 31 31 34 36 34 46 30 30 30 30 - - FD 9A 1111 1101 1001 1001
# #
my %hrprt = ( # Codierung Abruf protocolVersion, mlen = Mindestlänge Antwortstring my %hrprt = ( # Codierung Abruf protocolVersion, mlen = Mindestlänge Antwortstring
1 => { cmd => "~0002464F0000FD9A\x{0d}", mlen => 18 }, 1 => { cmd => "0002464F0000", mlen => 18 },
2 => { cmd => "~0003464F0000FD99\x{0d}", mlen => 18 }, 2 => { cmd => "0003464F0000", mlen => 18 },
3 => { cmd => "~0004464F0000FD98\x{0d}", mlen => 18 }, 3 => { cmd => "0004464F0000", mlen => 18 },
4 => { cmd => "~0005464F0000FD97\x{0d}", mlen => 18 }, 4 => { cmd => "0005464F0000", mlen => 18 },
5 => { cmd => "~0006464F0000FD96\x{0d}", mlen => 18 }, 5 => { cmd => "0006464F0000", mlen => 18 },
6 => { cmd => "~0007464F0000FD95\x{0d}", mlen => 18 }, 6 => { cmd => "0007464F0000", mlen => 18 },
7 => { cmd => "~0008464F0000FD94\x{0d}", mlen => 18 }, 7 => { cmd => "0008464F0000", mlen => 18 },
8 => { cmd => "~0009464F0000FD93\x{0d}", mlen => 18 }, 8 => { cmd => "0009464F0000", mlen => 18 },
9 => { cmd => "~000A464F0000FD8B\x{0d}", mlen => 18 }, 9 => { cmd => "000A464F0000", mlen => 18 },
10 => { cmd => "~000B464F0000FD8A\x{0d}", mlen => 18 }, 10 => { cmd => "000B464F0000", mlen => 18 },
11 => { cmd => "~000C464F0000FD89\x{0d}", mlen => 18 }, 11 => { cmd => "000C464F0000", mlen => 18 },
12 => { cmd => "~000D464F0000FD88\x{0d}", mlen => 18 }, 12 => { cmd => "000D464F0000", mlen => 18 },
13 => { cmd => "~000E464F0000FD87\x{0d}", mlen => 18 }, 13 => { cmd => "000E464F0000", mlen => 18 },
14 => { cmd => "~000F464F0000FD86\x{0d}", mlen => 18 }, 14 => { cmd => "000F464F0000", mlen => 18 },
15 => { cmd => "~0010464F0000FDAB\x{0d}", mlen => 18 }, 15 => { cmd => "0010464F0000", mlen => 18 },
16 => { cmd => "~0011464F0000FD9A\x{0d}", mlen => 18 }, 16 => { cmd => "0011464F0000", mlen => 18 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+36+45+30+30+32+30+41 = 02F4H -> modulo 65536 = 02F4H -> bitweise invert = 1111 1101 0000 1011 -> +1 1111 1101 0000 1100 = FD0CH # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+36+45+30+30+32+30+41 = 02F4H -> modulo 65536 = 02F4H -> bitweise invert = 1111 1101 0000 1011 -> +1 1111 1101 0000 1100 = FD0CH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 96 E0 02 0A FD 0C # ~ 20 11 46 96 E0 02 11
# 7E 32 30 30 41 34 36 39 36 45 30 30 32 30 41
# ~ 20 11 46 96 E0 02 11 FD 2A 1111 1101 0010 1001
# 7E 32 30 31 31 34 36 39 36 45 30 30 32 31 31 # 7E 32 30 31 31 34 36 39 36 45 30 30 32 31 31
# #
my %hrswv = ( # Codierung Abruf softwareVersion my %hrswv = ( # Codierung Abruf softwareVersion
1 => { cmd => "~20024696E00202FD2A\x{0d}", mlen => 30 }, 1 => { cmd => "20024696E00202", mlen => 30 },
2 => { cmd => "~20034696E00203FD28\x{0d}", mlen => 30 }, 2 => { cmd => "20034696E00203", mlen => 30 },
3 => { cmd => "~20044696E00204FD26\x{0d}", mlen => 30 }, 3 => { cmd => "20044696E00204", mlen => 30 },
4 => { cmd => "~20054696E00205FD24\x{0d}", mlen => 30 }, 4 => { cmd => "20054696E00205", mlen => 30 },
5 => { cmd => "~20064696E00206FD22\x{0d}", mlen => 30 }, 5 => { cmd => "20064696E00206", mlen => 30 },
6 => { cmd => "~20074696E00207FD20\x{0d}", mlen => 30 }, 6 => { cmd => "20074696E00207", mlen => 30 },
7 => { cmd => "~20084696E00208FD1E\x{0d}", mlen => 30 }, 7 => { cmd => "20084696E00208", mlen => 30 },
8 => { cmd => "~20094696E00209FD1C\x{0d}", mlen => 30 }, 8 => { cmd => "20094696E00209", mlen => 30 },
9 => { cmd => "~200A4696E0020AFD0C\x{0d}", mlen => 30 }, 9 => { cmd => "200A4696E0020A", mlen => 30 },
10 => { cmd => "~200B4696E0020BFD0A\x{0d}", mlen => 30 }, 10 => { cmd => "200B4696E0020B", mlen => 30 },
11 => { cmd => "~200C4696E0020CFD08\x{0d}", mlen => 30 }, 11 => { cmd => "200C4696E0020C", mlen => 30 },
12 => { cmd => "~200D4696E0020DFD06\x{0d}", mlen => 30 }, 12 => { cmd => "200D4696E0020D", mlen => 30 },
13 => { cmd => "~200E4696E0020EFD04\x{0d}", mlen => 30 }, 13 => { cmd => "200E4696E0020E", mlen => 30 },
14 => { cmd => "~200F4696E0020FFD02\x{0d}", mlen => 30 }, 14 => { cmd => "200F4696E0020F", mlen => 30 },
15 => { cmd => "~20104696E00210FD2C\x{0d}", mlen => 30 }, 15 => { cmd => "20104696E00210", mlen => 30 },
16 => { cmd => "~20114696E00211FD2A\x{0d}", mlen => 30 }, 16 => { cmd => "20114696E00211", mlen => 30 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+34+45+30+30+32+30+41 = 02EDH -> modulo 65536 = 02EDH -> bitweise invert = 1111 1101 0001 0010 -> +1 1111 1101 0001 0011 = FD13H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+34+45+30+30+32+30+41 = 02EDH -> modulo 65536 = 02EDH -> bitweise invert = 1111 1101 0001 0010 -> +1 1111 1101 0001 0011 = FD13H
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 44 E0 02 0A FD 13
# 7E 32 30 30 41 34 36 34 34 45 30 30 32 30 41
# ~ 20 10 46 44 E0 02 10 FD 33 # ~ 20 10 46 44 E0 02 10 FD 33
# 7E 32 30 31 30 34 36 34 34 45 30 30 32 31 30 1111 1101 0011 0010 # 7E 32 30 31 30 34 36 34 34 45 30 30 32 31 30 1111 1101 0011 0010
# #
my %hralm = ( # Codierung Abruf alarmInfo my %hralm = ( # Codierung Abruf alarmInfo
1 => { cmd => "~20024644E00202FD31\x{0d}", mlen => 82 }, 1 => { cmd => "20024644E00202", mlen => 82 },
2 => { cmd => "~20034644E00203FD2F\x{0d}", mlen => 82 }, 2 => { cmd => "20034644E00203", mlen => 82 },
3 => { cmd => "~20044644E00204FD2D\x{0d}", mlen => 82 }, 3 => { cmd => "20044644E00204", mlen => 82 },
4 => { cmd => "~20054644E00205FD2B\x{0d}", mlen => 82 }, 4 => { cmd => "20054644E00205", mlen => 82 },
5 => { cmd => "~20064644E00206FD29\x{0d}", mlen => 82 }, 5 => { cmd => "20064644E00206", mlen => 82 },
6 => { cmd => "~20074644E00207FD27\x{0d}", mlen => 82 }, 6 => { cmd => "20074644E00207", mlen => 82 },
7 => { cmd => "~20084644E00208FD25\x{0d}", mlen => 82 }, 7 => { cmd => "20084644E00208", mlen => 82 },
8 => { cmd => "~20094644E00209FD23\x{0d}", mlen => 82 }, 8 => { cmd => "20094644E00209", mlen => 82 },
9 => { cmd => "~200A4644E0020AFD13\x{0d}", mlen => 82 }, 9 => { cmd => "200A4644E0020A", mlen => 82 },
10 => { cmd => "~200B4644E0020BFD11\x{0d}", mlen => 82 }, 10 => { cmd => "200B4644E0020B", mlen => 82 },
11 => { cmd => "~200C4644E0020CFD0F\x{0d}", mlen => 82 }, 11 => { cmd => "200C4644E0020C", mlen => 82 },
12 => { cmd => "~200D4644E0020DFD0D\x{0d}", mlen => 82 }, 12 => { cmd => "200D4644E0020D", mlen => 82 },
13 => { cmd => "~200E4644E0020EFD0B\x{0d}", mlen => 82 }, 13 => { cmd => "200E4644E0020E", mlen => 82 },
14 => { cmd => "~200F4644E0020FFCFE\x{0d}", mlen => 82 }, 14 => { cmd => "200F4644E0020F", mlen => 82 },
15 => { cmd => "~20104644E00210FD33\x{0d}", mlen => 82 }, 15 => { cmd => "20104644E00210", mlen => 82 },
16 => { cmd => "~20114644E00211FD31\x{0d}", mlen => 82 }, 16 => { cmd => "20114644E00211", mlen => 82 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+37+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+37+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H
@ -372,22 +363,22 @@ my %hralm = ( # Codierung
# #
my %hrspm = ( # Codierung Abruf Systemparameter my %hrspm = ( # Codierung Abruf Systemparameter
1 => { cmd => "~20024647E00202FD2E\x{0d}", mlen => 68 }, 1 => { cmd => "20024647E00202", mlen => 68 },
2 => { cmd => "~20034647E00203FD2C\x{0d}", mlen => 68 }, 2 => { cmd => "20034647E00203", mlen => 68 },
3 => { cmd => "~20044647E00204FD2A\x{0d}", mlen => 68 }, 3 => { cmd => "20044647E00204", mlen => 68 },
4 => { cmd => "~20054647E00205FD28\x{0d}", mlen => 68 }, 4 => { cmd => "20054647E00205", mlen => 68 },
5 => { cmd => "~20064647E00206FD26\x{0d}", mlen => 68 }, 5 => { cmd => "20064647E00206", mlen => 68 },
6 => { cmd => "~20074647E00207FD24\x{0d}", mlen => 68 }, 6 => { cmd => "20074647E00207", mlen => 68 },
7 => { cmd => "~20084647E00208FD22\x{0d}", mlen => 68 }, 7 => { cmd => "20084647E00208", mlen => 68 },
8 => { cmd => "~20094647E00209FD20\x{0d}", mlen => 68 }, 8 => { cmd => "20094647E00209", mlen => 68 },
9 => { cmd => "~200A4647E0020AFD10\x{0d}", mlen => 68 }, 9 => { cmd => "200A4647E0020A", mlen => 68 },
10 => { cmd => "~200B4647E0020BFD0E\x{0d}", mlen => 68 }, 10 => { cmd => "200B4647E0020B", mlen => 68 },
11 => { cmd => "~200C4647E0020CFD0C\x{0d}", mlen => 68 }, 11 => { cmd => "200C4647E0020C", mlen => 68 },
12 => { cmd => "~200D4647E0020DFD0A\x{0d}", mlen => 68 }, 12 => { cmd => "200D4647E0020D", mlen => 68 },
13 => { cmd => "~200E4647E0020EFD08\x{0d}", mlen => 68 }, 13 => { cmd => "200E4647E0020E", mlen => 68 },
14 => { cmd => "~200F4647E0020FFD06\x{0d}", mlen => 68 }, 14 => { cmd => "200F4647E0020F", mlen => 68 },
15 => { cmd => "~20104647E00210FD30\x{0d}", mlen => 68 }, 15 => { cmd => "20104647E00210", mlen => 68 },
16 => { cmd => "~20114647E00211FD2E\x{0d}", mlen => 68 }, 16 => { cmd => "20114647E00211", mlen => 68 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+32+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+32+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H
@ -398,22 +389,22 @@ my %hrspm = ( # Codierung
# #
my %hrcmi = ( # Codierung Abruf chargeManagmentInfo my %hrcmi = ( # Codierung Abruf chargeManagmentInfo
1 => { cmd => "~20024692E00202FD2E\x{0d}", mlen => 38 }, 1 => { cmd => "20024692E00202", mlen => 38 },
2 => { cmd => "~20034692E00203FD2C\x{0d}", mlen => 38 }, 2 => { cmd => "20034692E00203", mlen => 38 },
3 => { cmd => "~20044692E00204FD2A\x{0d}", mlen => 38 }, 3 => { cmd => "20044692E00204", mlen => 38 },
4 => { cmd => "~20054692E00205FD28\x{0d}", mlen => 38 }, 4 => { cmd => "20054692E00205", mlen => 38 },
5 => { cmd => "~20064692E00206FD26\x{0d}", mlen => 38 }, 5 => { cmd => "20064692E00206", mlen => 38 },
6 => { cmd => "~20074692E00207FD24\x{0d}", mlen => 38 }, 6 => { cmd => "20074692E00207", mlen => 38 },
7 => { cmd => "~20084692E00208FD22\x{0d}", mlen => 38 }, 7 => { cmd => "20084692E00208", mlen => 38 },
8 => { cmd => "~20094692E00209FD20\x{0d}", mlen => 38 }, 8 => { cmd => "20094692E00209", mlen => 38 },
9 => { cmd => "~200A4692E0020AFD10\x{0d}", mlen => 38 }, 9 => { cmd => "200A4692E0020A", mlen => 38 },
10 => { cmd => "~200B4692E0020BFD0E\x{0d}", mlen => 38 }, 10 => { cmd => "200B4692E0020B", mlen => 38 },
11 => { cmd => "~200C4692E0020CFD0C\x{0d}", mlen => 38 }, 11 => { cmd => "200C4692E0020C", mlen => 38 },
12 => { cmd => "~200D4692E0020DFD0A\x{0d}", mlen => 38 }, 12 => { cmd => "200D4692E0020D", mlen => 38 },
13 => { cmd => "~200E4692E0020EFD08\x{0d}", mlen => 38 }, 13 => { cmd => "200E4692E0020E", mlen => 38 },
14 => { cmd => "~200F4692E0020FFD06\x{0d}", mlen => 38 }, 14 => { cmd => "200F4692E0020F", mlen => 38 },
15 => { cmd => "~20104692E00210FD30\x{0d}", mlen => 38 }, 15 => { cmd => "20104692E00210", mlen => 38 },
16 => { cmd => "~20114692E00211FD2E\x{0d}", mlen => 38 }, 16 => { cmd => "20114692E00211", mlen => 38 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -425,31 +416,28 @@ my %hrcmi = ( # Codierung
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+32+45+30+30+32+30+41 = 02EBH -> modulo 65536 = 02EBH -> bitweise invert = 1111 1101 0001 0100 -> +1 1111 1101 0001 0101 = FD15H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+32+45+30+30+32+30+41 = 02EBH -> modulo 65536 = 02EBH -> bitweise invert = 1111 1101 0001 0100 -> +1 1111 1101 0001 0101 = FD15H
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 42 E0 02 0A FD 15
# 7E 32 30 30 41 34 36 34 32 45 30 30 32 30 41
# ~ 20 10 46 42 E0 02 10 FD 35 1111 1101 0011 0100 # ~ 20 10 46 42 E0 02 10 FD 35 1111 1101 0011 0100
# 7E 32 30 31 30 34 36 34 32 45 30 30 32 31 30 # 7E 32 30 31 30 34 36 34 32 45 30 30 32 31 30
# #
my %hrcmn = ( # Codierung Abruf analogValue my %hrcmn = ( # Codierung Abruf analogValue
1 => { cmd => "~20024642E00202FD33\x{0d}", mlen => 128 }, 1 => { cmd => "20024642E00202", mlen => 128 },
2 => { cmd => "~20034642E00203FD31\x{0d}", mlen => 128 }, 2 => { cmd => "20034642E00203", mlen => 128 },
3 => { cmd => "~20044642E00204FD2F\x{0d}", mlen => 128 }, 3 => { cmd => "20044642E00204", mlen => 128 },
4 => { cmd => "~20054642E00205FD2D\x{0d}", mlen => 128 }, 4 => { cmd => "20054642E00205", mlen => 128 },
5 => { cmd => "~20064642E00206FD2B\x{0d}", mlen => 128 }, 5 => { cmd => "20064642E00206", mlen => 128 },
6 => { cmd => "~20074642E00207FD29\x{0d}", mlen => 128 }, 6 => { cmd => "20074642E00207", mlen => 128 },
7 => { cmd => "~20084642E00208FD27\x{0d}", mlen => 128 }, 7 => { cmd => "20084642E00208", mlen => 128 },
8 => { cmd => "~20094642E00209FD25\x{0d}", mlen => 128 }, 8 => { cmd => "20094642E00209", mlen => 128 },
9 => { cmd => "~200A4642E0020AFD15\x{0d}", mlen => 128 }, 9 => { cmd => "200A4642E0020A", mlen => 128 },
10 => { cmd => "~200B4642E0020BFD13\x{0d}", mlen => 128 }, 10 => { cmd => "200B4642E0020B", mlen => 128 },
11 => { cmd => "~200C4642E0020CFD11\x{0d}", mlen => 128 }, 11 => { cmd => "200C4642E0020C", mlen => 128 },
12 => { cmd => "~200D4642E0020DFD0F\x{0d}", mlen => 128 }, 12 => { cmd => "200D4642E0020D", mlen => 128 },
13 => { cmd => "~200E4642E0020EFD0D\x{0d}", mlen => 128 }, 13 => { cmd => "200E4642E0020E", mlen => 128 },
14 => { cmd => "~200F4642E0020FFD0B\x{0d}", mlen => 128 }, 14 => { cmd => "200F4642E0020F", mlen => 128 },
15 => { cmd => "~20104642E0020EFD35\x{0d}", mlen => 128 }, 15 => { cmd => "20104642E0020E", mlen => 128 },
16 => { cmd => "~20114642E0020FFD33\x{0d}", mlen => 128 }, 16 => { cmd => "20114642E0020F", mlen => 128 },
); );
############################################################### ###############################################################
# PylonLowVoltage Initialize # PylonLowVoltage Initialize
############################################################### ###############################################################
@ -641,7 +629,7 @@ sub manageUpdate {
if ($timeout < 1.0) { if ($timeout < 1.0) {
BlockingKill ($hash->{HELPER}{BKRUNNING}) if(defined $hash->{HELPER}{BKRUNNING}); BlockingKill ($hash->{HELPER}{BKRUNNING}) if(defined $hash->{HELPER}{BKRUNNING});
Log3 ($name, 4, qq{$name - Cycle started in main process}); Log3 ($name, 4, qq{$name - Cycle started in main process with battery read timeout: >$timeout<});
startUpdate ({name => $name, timeout => $timeout, readings => $readings, age1 => $age1}); startUpdate ({name => $name, timeout => $timeout, readings => $readings, age1 => $age1});
} }
else { else {
@ -667,7 +655,7 @@ sub manageUpdate {
if (defined $hash->{HELPER}{BKRUNNING}) { if (defined $hash->{HELPER}{BKRUNNING}) {
$hash->{HELPER}{BKRUNNING}{loglevel} = 3; # Forum https://forum.fhem.de/index.php/topic,77057.msg689918.html#msg689918 $hash->{HELPER}{BKRUNNING}{loglevel} = 3; # Forum https://forum.fhem.de/index.php/topic,77057.msg689918.html#msg689918
Log3 ($name, 4, qq{$name - Cycle BlockingCall PID "$hash->{HELPER}{BKRUNNING}{pid}" with timeout "$blto" started}); Log3 ($name, 4, qq{$name - Cycle BlockingCall PID "$hash->{HELPER}{BKRUNNING}{pid}" started with battery read timeout: >$timeout<, blocking timeout >$blto<});
} }
} }
@ -879,10 +867,10 @@ sub _callSerialNumber {
my $hash = shift; my $hash = shift;
my $socket = shift; my $socket = shift;
my $readings = shift; # Referenz auf das Hash der zu erstellenden Readings my $readings = shift; # Referenz auf das Hash der zu erstellenden Readings
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrsnb{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrsnb{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'serialNumber' cmdtxt => 'serialNumber'
} }
); );
@ -918,7 +906,7 @@ sub _callManufacturerInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrmfi{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrmfi{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'manufacturerInfo' cmdtxt => 'manufacturerInfo'
} }
); );
@ -960,7 +948,7 @@ sub _callProtocolVersion {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrprt{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrprt{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'protocolVersion' cmdtxt => 'protocolVersion'
} }
); );
@ -995,7 +983,7 @@ sub _callSoftwareVersion {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrswv{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrswv{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'softwareVersion' cmdtxt => 'softwareVersion'
} }
); );
@ -1031,7 +1019,7 @@ sub _callSystemParameters {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrspm{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrspm{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'systemParameters' cmdtxt => 'systemParameters'
} }
); );
@ -1081,7 +1069,7 @@ sub _callAnalogValue {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrcmn{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrcmn{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'analogValue' cmdtxt => 'analogValue'
} }
); );
@ -1201,7 +1189,7 @@ sub _callAlarmInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hralm{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hralm{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'alarmInfo' cmdtxt => 'alarmInfo'
} }
); );
@ -1304,7 +1292,7 @@ sub _callChargeManagmentInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrcmi{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrcmi{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'chargeManagmentInfo' cmdtxt => 'chargeManagmentInfo'
} }
); );
@ -1501,6 +1489,51 @@ sub pseudoHexToText {
return $text; return $text;
} }
###############################################################
# Kommandostring zusammenstellen
# Teilstring aus Kommandohash wird übergeben
###############################################################
sub getCmdString {
my $cstr = shift; # Komamndoteilstring
my $cmd = $pfx.$cstr;
$cmd .= _doChecksum ($cstr);
$cmd .= $sfx;
return $cmd;
}
###############################################################
# wandelt eine Zeichenkette aus HEX-Zahlen in eine
# hexadecimal-ASCII Zeichenkette um und berechnet daraus die
# Checksumme (=Returnwert)
###############################################################
sub _doChecksum {
my $hstring = shift // return;
my $dezsum = 0;
my @asciivals = split //, $hstring;
for my $v (@asciivals) { # jedes einzelne Zeichen der HEX-Kette wird als ASCII Wert interpretiert
my $hex = unpack "H*", $v; # in einen HEX-Wert umgewandelt
$dezsum += hex $hex; # und die Dezimalsumme gebildet
}
my $bin = sprintf '%016b', $dezsum;
$bin =~ s/1/x/g; # invertieren
$bin =~ s/0/1/g;
$bin =~ s/x/0/g;
$dezsum = oct("0b$bin");
$dezsum++;
$bin = sprintf '%016b', $dezsum;
my $chksum = sprintf '%X', oct("0b$bin");
return $chksum;
}
############################################################### ###############################################################
# Fehlerausstieg # Fehlerausstieg
############################################################### ###############################################################

View File

@ -67,8 +67,6 @@ eval "use Storable qw(freeze thaw);1;" or my $storabs = 'Storable';
use FHEM::SynoModules::SMUtils qw(moduleVersion); # Hilfsroutinen Modul use FHEM::SynoModules::SMUtils qw(moduleVersion); # Hilfsroutinen Modul
#use Data::Dumper; #use Data::Dumper;
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
# Run before module compilation # Run before module compilation
BEGIN { BEGIN {
# Import from main:: # Import from main::
@ -122,8 +120,11 @@ BEGIN {
# Versions History intern (Versions history by Heiko Maaz) # Versions History intern (Versions history by Heiko Maaz)
my %vNotesIntern = ( my %vNotesIntern = (
"0.4.0" => "23.08.2024 Log output for timeout changed, automatic calculation of checksum ",
"0.3.0" => "22.08.2024 extend battery addresses up to 16 ",
"0.2.6" => "25.05.2024 replace Smartmatch Forum:#137776 ",
"0.2.5" => "02.04.2024 _callAnalogValue / _callAlarmInfo: integrate a Cell and Temperature Position counter ". "0.2.5" => "02.04.2024 _callAnalogValue / _callAlarmInfo: integrate a Cell and Temperature Position counter ".
"more specific Alarm readings ", "add specific Alarm readings ",
"0.2.4" => "29.03.2024 avoid possible Illegal division by zero at line 1438 ", "0.2.4" => "29.03.2024 avoid possible Illegal division by zero at line 1438 ",
"0.2.3" => "19.03.2024 edit commandref ", "0.2.3" => "19.03.2024 edit commandref ",
"0.2.2" => "20.02.2024 correct commandref ", "0.2.2" => "20.02.2024 correct commandref ",
@ -153,6 +154,8 @@ my $definterval = 30; # default A
my $defto = 0.5; # default connection Timeout zum RS485 Gateway my $defto = 0.5; # default connection Timeout zum RS485 Gateway
my @blackl = qw(state nextCycletime); # Ausnahmeliste deleteReadingspec my @blackl = qw(state nextCycletime); # Ausnahmeliste deleteReadingspec
my $age1def = 60; # default Zyklus Abrufklasse statische Werte (s) my $age1def = 60; # default Zyklus Abrufklasse statische Werte (s)
my $pfx = "~"; # KommandoPräfix
my $sfx = "\x{0d}"; # Kommandosuffix
# Steuerhashes # Steuerhashes
############### ###############
@ -184,6 +187,13 @@ my %fns2 = ( #
3 => { fn => \&_callChargeManagmentInfo }, # chargeManagmentInfo 3 => { fn => \&_callChargeManagmentInfo }, # chargeManagmentInfo
); );
my %halm = ( # Codierung Alarme
'00' => { alm => 'normal' },
'01' => { alm => 'below lower limit' },
'02' => { alm => 'above higher limit'},
'F0' => { alm => 'other error' },
);
################################################################################################################################################################## ##################################################################################################################################################################
# The Basic data format SOI (7EH, ASCII '~') and EOI (CR -> 0DH) are explained and transferred in hexadecimal, # The Basic data format SOI (7EH, ASCII '~') and EOI (CR -> 0DH) are explained and transferred in hexadecimal,
# the other items are explained in hexadecimal and transferred by hexadecimal-ASCII, each byte contains two # the other items are explained in hexadecimal and transferred by hexadecimal-ASCII, each byte contains two
@ -204,24 +214,30 @@ my %fns2 = ( #
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 93 E0 02 0A FD 0F # ~ 20 0A 46 93 E0 02 0A FD 0F
# 7E 32 30 30 41 34 36 39 33 45 30 30 32 30 41 # 7E 32 30 30 41 34 36 39 33 45 30 30 32 30 41
# ~ 20 10 46 93 E0 02 10
# 7E 32 30 31 30 34 36 39 33 45 30 30 32 31 30 = 02D1H -> bitweise invert = 1111 1101 0010 1110 -> +1 = 1111 1101 0010 1111 -> FD2FH
# ~ 20 11 46 93 E0 02 11
# 7E 32 30 31 31 34 36 39 33 45 30 30 32 31 31 = 02D3H -> bitweise invert = 1111 1101 0010 1100 -> +1 = 1111 1101 0010 1101 -> FD2DH
# #
my %hrsnb = ( # Codierung Abruf serialNumber, mlen = Mindestlänge Antwortstring my %hrsnb = ( # Codierung Abruf serialNumber, mlen = Mindestlänge Antwortstring
1 => { cmd => "~20024693E00202FD2D\x{0d}", mlen => 52 }, 1 => { cmd => "20024693E00202", mlen => 52 },
2 => { cmd => "~20034693E00203FD2B\x{0d}", mlen => 52 }, 2 => { cmd => "20034693E00203", mlen => 52 },
3 => { cmd => "~20044693E00204FD29\x{0d}", mlen => 52 }, 3 => { cmd => "20044693E00204", mlen => 52 },
4 => { cmd => "~20054693E00205FD27\x{0d}", mlen => 52 }, 4 => { cmd => "20054693E00205", mlen => 52 },
5 => { cmd => "~20064693E00206FD25\x{0d}", mlen => 52 }, 5 => { cmd => "20064693E00206", mlen => 52 },
6 => { cmd => "~20074693E00207FD23\x{0d}", mlen => 52 }, 6 => { cmd => "20074693E00207", mlen => 52 },
7 => { cmd => "~20084693E00208FD21\x{0d}", mlen => 52 }, 7 => { cmd => "20084693E00208", mlen => 52 },
8 => { cmd => "~20094693E00209FD1F\x{0d}", mlen => 52 }, 8 => { cmd => "20094693E00209", mlen => 52 },
9 => { cmd => "~200A4693E0020AFD0F\x{0d}", mlen => 52 }, 9 => { cmd => "200A4693E0020A", mlen => 52 },
10 => { cmd => "~200B4693E0020BFD0D\x{0d}", mlen => 52 }, 10 => { cmd => "200B4693E0020B", mlen => 52 },
11 => { cmd => "~200C4693E0020CFD0B\x{0d}", mlen => 52 }, 11 => { cmd => "200C4693E0020C", mlen => 52 },
12 => { cmd => "~200D4693E0020DFD09\x{0d}", mlen => 52 }, 12 => { cmd => "200D4693E0020D", mlen => 52 },
13 => { cmd => "~200E4693E0020EFD07\x{0d}", mlen => 52 }, 13 => { cmd => "200E4693E0020E", mlen => 52 },
14 => { cmd => "~200F4693E0020FFD05\x{0d}", mlen => 52 }, 14 => { cmd => "200F4693E0020F", mlen => 52 },
15 => { cmd => "20104693E00210", mlen => 52 },
16 => { cmd => "20114693E00211", mlen => 52 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -233,24 +249,26 @@ my %hrsnb = ( # Codierung
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+35+31+30+30+30+30 = 0263H -> modulo 65536 = 0263H -> bitweise invert = 1111 1101 1001 1100 -> +1 = 1111 1101 1001 1101 = FD9DH # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+35+31+30+30+30+30 = 0263H -> modulo 65536 = 0263H -> bitweise invert = 1111 1101 1001 1100 -> +1 = 1111 1101 1001 1101 = FD9DH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 51 00 00 empty FD 9D # ~ 20 10 46 51 00 00 empty
# 7E 32 30 30 41 34 36 35 31 30 30 30 30 - - # 7E 32 20 31 30 34 36 35 31 30 30 30 30 - - FD BD = 0243H -> bitweise invert = 1111 1101 1011 1100 -> +1 = 1111 1101 1011 1101 = FDBDH
# #
my %hrmfi = ( # Codierung Abruf manufacturerInfo, mlen = Mindestlänge Antwortstring my %hrmfi = ( # Codierung Abruf manufacturerInfo, mlen = Mindestlänge Antwortstring
1 => { cmd => "~200246510000FDAC\x{0d}", mlen => 82 }, 1 => { cmd => "200246510000", mlen => 82 },
2 => { cmd => "~200346510000FDAB\x{0d}", mlen => 82 }, 2 => { cmd => "200346510000", mlen => 82 },
3 => { cmd => "~200446510000FDAA\x{0d}", mlen => 82 }, 3 => { cmd => "200446510000", mlen => 82 },
4 => { cmd => "~200546510000FDA9\x{0d}", mlen => 82 }, 4 => { cmd => "200546510000", mlen => 82 },
5 => { cmd => "~200646510000FDA8\x{0d}", mlen => 82 }, 5 => { cmd => "200646510000", mlen => 82 },
6 => { cmd => "~200746510000FDA7\x{0d}", mlen => 82 }, 6 => { cmd => "200746510000", mlen => 82 },
7 => { cmd => "~200846510000FDA6\x{0d}", mlen => 82 }, 7 => { cmd => "200846510000", mlen => 82 },
8 => { cmd => "~200946510000FDA5\x{0d}", mlen => 82 }, 8 => { cmd => "200946510000", mlen => 82 },
9 => { cmd => "~200A46510000FD9D\x{0d}", mlen => 82 }, 9 => { cmd => "200A46510000", mlen => 82 },
10 => { cmd => "~200B46510000FD9C\x{0d}", mlen => 82 }, 10 => { cmd => "200B46510000", mlen => 82 },
11 => { cmd => "~200C46510000FD9B\x{0d}", mlen => 82 }, 11 => { cmd => "200C46510000", mlen => 82 },
12 => { cmd => "~200D46510000FD9A\x{0d}", mlen => 82 }, 12 => { cmd => "200D46510000", mlen => 82 },
13 => { cmd => "~200E46510000FD8F\x{0d}", mlen => 82 }, 13 => { cmd => "200E46510000", mlen => 82 },
14 => { cmd => "~200F46510000FD8E\x{0d}", mlen => 82 }, 14 => { cmd => "200F46510000", mlen => 82 },
15 => { cmd => "201046510000", mlen => 82 },
16 => { cmd => "201146510000", mlen => 82 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -262,72 +280,77 @@ my %hrmfi = ( # Codierung
# CHKSUM (als HEX! addieren): 30+30+30+41+34+36+34+46+30+30+30+30 = 0275H -> modulo 65536 = 0275H -> bitweise invert = 1111 1101 1000 1010 -> +1 = 1111 1101 1000 1011 -> FD8BH # CHKSUM (als HEX! addieren): 30+30+30+41+34+36+34+46+30+30+30+30 = 0275H -> modulo 65536 = 0275H -> bitweise invert = 1111 1101 1000 1010 -> +1 = 1111 1101 1000 1011 -> FD8BH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 00 0A 46 4F 00 00 empty FD 8B # ~ 00 0A 46 4F 00 00 empty
# 7E 30 30 30 41 34 36 34 46 30 30 30 30 - -
# #
my %hrprt = ( # Codierung Abruf protocolVersion, mlen = Mindestlänge Antwortstring my %hrprt = ( # Codierung Abruf protocolVersion, mlen = Mindestlänge Antwortstring
1 => { cmd => "~0002464F0000FD9A\x{0d}", mlen => 18 }, 1 => { cmd => "0002464F0000", mlen => 18 },
2 => { cmd => "~0003464F0000FD99\x{0d}", mlen => 18 }, 2 => { cmd => "0003464F0000", mlen => 18 },
3 => { cmd => "~0004464F0000FD98\x{0d}", mlen => 18 }, 3 => { cmd => "0004464F0000", mlen => 18 },
4 => { cmd => "~0005464F0000FD97\x{0d}", mlen => 18 }, 4 => { cmd => "0005464F0000", mlen => 18 },
5 => { cmd => "~0006464F0000FD96\x{0d}", mlen => 18 }, 5 => { cmd => "0006464F0000", mlen => 18 },
6 => { cmd => "~0007464F0000FD95\x{0d}", mlen => 18 }, 6 => { cmd => "0007464F0000", mlen => 18 },
7 => { cmd => "~0008464F0000FD94\x{0d}", mlen => 18 }, 7 => { cmd => "0008464F0000", mlen => 18 },
8 => { cmd => "~0009464F0000FD93\x{0d}", mlen => 18 }, 8 => { cmd => "0009464F0000", mlen => 18 },
9 => { cmd => "~000A464F0000FD8B\x{0d}", mlen => 18 }, 9 => { cmd => "000A464F0000", mlen => 18 },
10 => { cmd => "~000B464F0000FD8A\x{0d}", mlen => 18 }, 10 => { cmd => "000B464F0000", mlen => 18 },
11 => { cmd => "~000C464F0000FD89\x{0d}", mlen => 18 }, 11 => { cmd => "000C464F0000", mlen => 18 },
12 => { cmd => "~000D464F0000FD88\x{0d}", mlen => 18 }, 12 => { cmd => "000D464F0000", mlen => 18 },
13 => { cmd => "~000E464F0000FD87\x{0d}", mlen => 18 }, 13 => { cmd => "000E464F0000", mlen => 18 },
14 => { cmd => "~000F464F0000FD86\x{0d}", mlen => 18 }, 14 => { cmd => "000F464F0000", mlen => 18 },
15 => { cmd => "0010464F0000", mlen => 18 },
16 => { cmd => "0011464F0000", mlen => 18 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+36+45+30+30+32+30+41 = 02F4H -> modulo 65536 = 02F4H -> bitweise invert = 1111 1101 0000 1011 -> +1 1111 1101 0000 1100 = FD0CH # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+36+45+30+30+32+30+41 = 02F4H -> modulo 65536 = 02F4H -> bitweise invert = 1111 1101 0000 1011 -> +1 1111 1101 0000 1100 = FD0CH
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 96 E0 02 0A FD 0C # ~ 20 11 46 96 E0 02 11
# 7E 32 30 30 41 34 36 39 36 45 30 30 32 30 41 # 7E 32 30 31 31 34 36 39 36 45 30 30 32 31 31
# #
my %hrswv = ( # Codierung Abruf softwareVersion my %hrswv = ( # Codierung Abruf softwareVersion
1 => { cmd => "~20024696E00202FD2A\x{0d}", mlen => 30 }, 1 => { cmd => "20024696E00202", mlen => 30 },
2 => { cmd => "~20034696E00203FD28\x{0d}", mlen => 30 }, 2 => { cmd => "20034696E00203", mlen => 30 },
3 => { cmd => "~20044696E00204FD26\x{0d}", mlen => 30 }, 3 => { cmd => "20044696E00204", mlen => 30 },
4 => { cmd => "~20054696E00205FD24\x{0d}", mlen => 30 }, 4 => { cmd => "20054696E00205", mlen => 30 },
5 => { cmd => "~20064696E00206FD22\x{0d}", mlen => 30 }, 5 => { cmd => "20064696E00206", mlen => 30 },
6 => { cmd => "~20074696E00207FD20\x{0d}", mlen => 30 }, 6 => { cmd => "20074696E00207", mlen => 30 },
7 => { cmd => "~20084696E00208FD1E\x{0d}", mlen => 30 }, 7 => { cmd => "20084696E00208", mlen => 30 },
8 => { cmd => "~20094696E00209FD1C\x{0d}", mlen => 30 }, 8 => { cmd => "20094696E00209", mlen => 30 },
9 => { cmd => "~200A4696E0020AFD0C\x{0d}", mlen => 30 }, 9 => { cmd => "200A4696E0020A", mlen => 30 },
10 => { cmd => "~200B4696E0020BFD0A\x{0d}", mlen => 30 }, 10 => { cmd => "200B4696E0020B", mlen => 30 },
11 => { cmd => "~200C4696E0020CFD08\x{0d}", mlen => 30 }, 11 => { cmd => "200C4696E0020C", mlen => 30 },
12 => { cmd => "~200D4696E0020DFD06\x{0d}", mlen => 30 }, 12 => { cmd => "200D4696E0020D", mlen => 30 },
13 => { cmd => "~200E4696E0020EFD04\x{0d}", mlen => 30 }, 13 => { cmd => "200E4696E0020E", mlen => 30 },
14 => { cmd => "~200F4696E0020FFD02\x{0d}", mlen => 30 }, 14 => { cmd => "200F4696E0020F", mlen => 30 },
15 => { cmd => "20104696E00210", mlen => 30 },
16 => { cmd => "20114696E00211", mlen => 30 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+34+45+30+30+32+30+41 = 02EDH -> modulo 65536 = 02EDH -> bitweise invert = 1111 1101 0001 0010 -> +1 1111 1101 0001 0011 = FD13H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+34+45+30+30+32+30+41 = 02EDH -> modulo 65536 = 02EDH -> bitweise invert = 1111 1101 0001 0010 -> +1 1111 1101 0001 0011 = FD13H
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 44 E0 02 0A FD 13 # ~ 20 10 46 44 E0 02 10 FD 33
# 7E 32 30 30 41 34 36 34 34 45 30 30 32 30 41 # 7E 32 30 31 30 34 36 34 34 45 30 30 32 31 30 1111 1101 0011 0010
# #
my %hralm = ( # Codierung Abruf alarmInfo my %hralm = ( # Codierung Abruf alarmInfo
1 => { cmd => "~20024644E00202FD31\x{0d}", mlen => 82 }, 1 => { cmd => "20024644E00202", mlen => 82 },
2 => { cmd => "~20034644E00203FD2F\x{0d}", mlen => 82 }, 2 => { cmd => "20034644E00203", mlen => 82 },
3 => { cmd => "~20044644E00204FD2D\x{0d}", mlen => 82 }, 3 => { cmd => "20044644E00204", mlen => 82 },
4 => { cmd => "~20054644E00205FD2B\x{0d}", mlen => 82 }, 4 => { cmd => "20054644E00205", mlen => 82 },
5 => { cmd => "~20064644E00206FD29\x{0d}", mlen => 82 }, 5 => { cmd => "20064644E00206", mlen => 82 },
6 => { cmd => "~20074644E00207FD27\x{0d}", mlen => 82 }, 6 => { cmd => "20074644E00207", mlen => 82 },
7 => { cmd => "~20084644E00208FD25\x{0d}", mlen => 82 }, 7 => { cmd => "20084644E00208", mlen => 82 },
8 => { cmd => "~20094644E00209FD23\x{0d}", mlen => 82 }, 8 => { cmd => "20094644E00209", mlen => 82 },
9 => { cmd => "~200A4644E0020AFD13\x{0d}", mlen => 82 }, 9 => { cmd => "200A4644E0020A", mlen => 82 },
10 => { cmd => "~200B4644E0020BFD11\x{0d}", mlen => 82 }, 10 => { cmd => "200B4644E0020B", mlen => 82 },
11 => { cmd => "~200C4644E0020CFD0F\x{0d}", mlen => 82 }, 11 => { cmd => "200C4644E0020C", mlen => 82 },
12 => { cmd => "~200D4644E0020DFD0D\x{0d}", mlen => 82 }, 12 => { cmd => "200D4644E0020D", mlen => 82 },
13 => { cmd => "~200E4644E0020EFD0B\x{0d}", mlen => 82 }, 13 => { cmd => "200E4644E0020E", mlen => 82 },
14 => { cmd => "~200F4644E0020FFCFE\x{0d}", mlen => 82 }, 14 => { cmd => "200F4644E0020F", mlen => 82 },
15 => { cmd => "20104644E00210", mlen => 82 },
16 => { cmd => "20114644E00211", mlen => 82 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+37+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+37+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H
@ -335,23 +358,27 @@ my %hralm = ( # Codierung
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 47 E0 02 0A FD 10 # ~ 20 0A 46 47 E0 02 0A FD 10
# 7E 32 30 30 41 34 36 34 37 45 30 30 32 30 41 # 7E 32 30 30 41 34 36 34 37 45 30 30 32 30 41
# ~ 20 10 46 47 E0 02 10 FD 30
# 7E 32 30 31 30 34 36 34 37 45 30 30 32 31 30 1111 1101 0010 1111
# #
my %hrspm = ( # Codierung Abruf Systemparameter my %hrspm = ( # Codierung Abruf Systemparameter
1 => { cmd => "~20024647E00202FD2E\x{0d}", mlen => 68 }, 1 => { cmd => "20024647E00202", mlen => 68 },
2 => { cmd => "~20034647E00203FD2C\x{0d}", mlen => 68 }, 2 => { cmd => "20034647E00203", mlen => 68 },
3 => { cmd => "~20044647E00204FD2A\x{0d}", mlen => 68 }, 3 => { cmd => "20044647E00204", mlen => 68 },
4 => { cmd => "~20054647E00205FD28\x{0d}", mlen => 68 }, 4 => { cmd => "20054647E00205", mlen => 68 },
5 => { cmd => "~20064647E00206FD26\x{0d}", mlen => 68 }, 5 => { cmd => "20064647E00206", mlen => 68 },
6 => { cmd => "~20074647E00207FD24\x{0d}", mlen => 68 }, 6 => { cmd => "20074647E00207", mlen => 68 },
7 => { cmd => "~20084647E00208FD22\x{0d}", mlen => 68 }, 7 => { cmd => "20084647E00208", mlen => 68 },
8 => { cmd => "~20094647E00209FD20\x{0d}", mlen => 68 }, 8 => { cmd => "20094647E00209", mlen => 68 },
9 => { cmd => "~200A4647E0020AFD10\x{0d}", mlen => 68 }, 9 => { cmd => "200A4647E0020A", mlen => 68 },
10 => { cmd => "~200B4647E0020BFD0E\x{0d}", mlen => 68 }, 10 => { cmd => "200B4647E0020B", mlen => 68 },
11 => { cmd => "~200C4647E0020CFD0C\x{0d}", mlen => 68 }, 11 => { cmd => "200C4647E0020C", mlen => 68 },
12 => { cmd => "~200D4647E0020DFD0A\x{0d}", mlen => 68 }, 12 => { cmd => "200D4647E0020D", mlen => 68 },
13 => { cmd => "~200E4647E0020EFD08\x{0d}", mlen => 68 }, 13 => { cmd => "200E4647E0020E", mlen => 68 },
14 => { cmd => "~200F4647E0020FFD06\x{0d}", mlen => 68 }, 14 => { cmd => "200F4647E0020F", mlen => 68 },
15 => { cmd => "20104647E00210", mlen => 68 },
16 => { cmd => "20114647E00211", mlen => 68 },
); );
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+32+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+39+32+45+30+30+32+30+41 = 02F0H -> modulo 65536 = 02F0H -> bitweise invert = 1111 1101 0000 1111 -> +1 1111 1101 0001 0000 = FD10H
@ -362,20 +389,22 @@ my %hrspm = ( # Codierung
# #
my %hrcmi = ( # Codierung Abruf chargeManagmentInfo my %hrcmi = ( # Codierung Abruf chargeManagmentInfo
1 => { cmd => "~20024692E00202FD2E\x{0d}", mlen => 38 }, 1 => { cmd => "20024692E00202", mlen => 38 },
2 => { cmd => "~20034692E00203FD2C\x{0d}", mlen => 38 }, 2 => { cmd => "20034692E00203", mlen => 38 },
3 => { cmd => "~20044692E00204FD2A\x{0d}", mlen => 38 }, 3 => { cmd => "20044692E00204", mlen => 38 },
4 => { cmd => "~20054692E00205FD28\x{0d}", mlen => 38 }, 4 => { cmd => "20054692E00205", mlen => 38 },
5 => { cmd => "~20064692E00206FD26\x{0d}", mlen => 38 }, 5 => { cmd => "20064692E00206", mlen => 38 },
6 => { cmd => "~20074692E00207FD24\x{0d}", mlen => 38 }, 6 => { cmd => "20074692E00207", mlen => 38 },
7 => { cmd => "~20084692E00208FD22\x{0d}", mlen => 38 }, 7 => { cmd => "20084692E00208", mlen => 38 },
8 => { cmd => "~20094692E00209FD20\x{0d}", mlen => 38 }, 8 => { cmd => "20094692E00209", mlen => 38 },
9 => { cmd => "~200A4692E0020AFD10\x{0d}", mlen => 38 }, 9 => { cmd => "200A4692E0020A", mlen => 38 },
10 => { cmd => "~200B4692E0020BFD0E\x{0d}", mlen => 38 }, 10 => { cmd => "200B4692E0020B", mlen => 38 },
11 => { cmd => "~200C4692E0020CFD0C\x{0d}", mlen => 38 }, 11 => { cmd => "200C4692E0020C", mlen => 38 },
12 => { cmd => "~200D4692E0020DFD0A\x{0d}", mlen => 38 }, 12 => { cmd => "200D4692E0020D", mlen => 38 },
13 => { cmd => "~200E4692E0020EFD08\x{0d}", mlen => 38 }, 13 => { cmd => "200E4692E0020E", mlen => 38 },
14 => { cmd => "~200F4692E0020FFD06\x{0d}", mlen => 38 }, 14 => { cmd => "200F4692E0020F", mlen => 38 },
15 => { cmd => "20104692E00210", mlen => 38 },
16 => { cmd => "20114692E00211", mlen => 38 },
); );
# ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02 # ADR: n=Batterienummer (2-x), m=Group Nr. (0-8), ADR = 0x0n + (0x10 * m) -> f. Batterie 1 = 0x02 + (0x10 * 0) = 0x02
@ -387,27 +416,28 @@ my %hrcmi = ( # Codierung
# CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+32+45+30+30+32+30+41 = 02EBH -> modulo 65536 = 02EBH -> bitweise invert = 1111 1101 0001 0100 -> +1 1111 1101 0001 0101 = FD15H # CHKSUM (als HEX! addieren): 32+30+30+41+34+36+34+32+45+30+30+32+30+41 = 02EBH -> modulo 65536 = 02EBH -> bitweise invert = 1111 1101 0001 0100 -> +1 1111 1101 0001 0101 = FD15H
# #
# SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM # SOI VER ADR CID1 CID2 LENGTH INFO CHKSUM
# ~ 20 0A 46 42 E0 02 0A FD 15 # ~ 20 10 46 42 E0 02 10 FD 35 1111 1101 0011 0100
# 7E 32 30 30 41 34 36 34 32 45 30 30 32 30 41 # 7E 32 30 31 30 34 36 34 32 45 30 30 32 31 30
# #
my %hrcmn = ( # Codierung Abruf analogValue my %hrcmn = ( # Codierung Abruf analogValue
1 => { cmd => "~20024642E00202FD33\x{0d}", mlen => 128 }, 1 => { cmd => "20024642E00202", mlen => 128 },
2 => { cmd => "~20034642E00203FD31\x{0d}", mlen => 128 }, 2 => { cmd => "20034642E00203", mlen => 128 },
3 => { cmd => "~20044642E00204FD2F\x{0d}", mlen => 128 }, 3 => { cmd => "20044642E00204", mlen => 128 },
4 => { cmd => "~20054642E00205FD2D\x{0d}", mlen => 128 }, 4 => { cmd => "20054642E00205", mlen => 128 },
5 => { cmd => "~20064642E00206FD2B\x{0d}", mlen => 128 }, 5 => { cmd => "20064642E00206", mlen => 128 },
6 => { cmd => "~20074642E00207FD29\x{0d}", mlen => 128 }, 6 => { cmd => "20074642E00207", mlen => 128 },
7 => { cmd => "~20084642E00208FD27\x{0d}", mlen => 128 }, 7 => { cmd => "20084642E00208", mlen => 128 },
8 => { cmd => "~20094642E00209FD25\x{0d}", mlen => 128 }, 8 => { cmd => "20094642E00209", mlen => 128 },
9 => { cmd => "~200A4642E0020AFD15\x{0d}", mlen => 128 }, 9 => { cmd => "200A4642E0020A", mlen => 128 },
10 => { cmd => "~200B4642E0020BFD13\x{0d}", mlen => 128 }, 10 => { cmd => "200B4642E0020B", mlen => 128 },
11 => { cmd => "~200C4642E0020CFD11\x{0d}", mlen => 128 }, 11 => { cmd => "200C4642E0020C", mlen => 128 },
12 => { cmd => "~200D4642E0020DFD0F\x{0d}", mlen => 128 }, 12 => { cmd => "200D4642E0020D", mlen => 128 },
13 => { cmd => "~200E4642E0020EFD0D\x{0d}", mlen => 128 }, 13 => { cmd => "200E4642E0020E", mlen => 128 },
14 => { cmd => "~200F4642E0020FFD0B\x{0d}", mlen => 128 }, 14 => { cmd => "200F4642E0020F", mlen => 128 },
15 => { cmd => "20104642E0020E", mlen => 128 },
16 => { cmd => "20114642E0020F", mlen => 128 },
); );
############################################################### ###############################################################
# PylonLowVoltage Initialize # PylonLowVoltage Initialize
############################################################### ###############################################################
@ -460,8 +490,8 @@ sub Define {
($hash->{HOST}, $hash->{PORT}) = split ":", $args[2]; ($hash->{HOST}, $hash->{PORT}) = split ":", $args[2];
$hash->{BATADDRESS} = $args[3] // 1; $hash->{BATADDRESS} = $args[3] // 1;
if ($hash->{BATADDRESS} !~ /^([1-9]{1}|1[0-4])$/xs) { if ($hash->{BATADDRESS} !~ /^([1-9]{1}|1[0-6])$/xs) {
return "Define: bataddress must be a value between 1 and 14"; return "Define: bataddress must be a value between 1 and 16";
} }
my $params = { my $params = {
@ -599,7 +629,7 @@ sub manageUpdate {
if ($timeout < 1.0) { if ($timeout < 1.0) {
BlockingKill ($hash->{HELPER}{BKRUNNING}) if(defined $hash->{HELPER}{BKRUNNING}); BlockingKill ($hash->{HELPER}{BKRUNNING}) if(defined $hash->{HELPER}{BKRUNNING});
Log3 ($name, 4, qq{$name - Cycle started in main process}); Log3 ($name, 4, qq{$name - Cycle started in main process with battery read timeout: >$timeout<});
startUpdate ({name => $name, timeout => $timeout, readings => $readings, age1 => $age1}); startUpdate ({name => $name, timeout => $timeout, readings => $readings, age1 => $age1});
} }
else { else {
@ -625,7 +655,7 @@ sub manageUpdate {
if (defined $hash->{HELPER}{BKRUNNING}) { if (defined $hash->{HELPER}{BKRUNNING}) {
$hash->{HELPER}{BKRUNNING}{loglevel} = 3; # Forum https://forum.fhem.de/index.php/topic,77057.msg689918.html#msg689918 $hash->{HELPER}{BKRUNNING}{loglevel} = 3; # Forum https://forum.fhem.de/index.php/topic,77057.msg689918.html#msg689918
Log3 ($name, 4, qq{$name - Cycle BlockingCall PID "$hash->{HELPER}{BKRUNNING}{pid}" with timeout "$blto" started}); Log3 ($name, 4, qq{$name - Cycle BlockingCall PID "$hash->{HELPER}{BKRUNNING}{pid}" started with battery read timeout: >$timeout<, blocking timeout >$blto<});
} }
} }
@ -837,10 +867,10 @@ sub _callSerialNumber {
my $hash = shift; my $hash = shift;
my $socket = shift; my $socket = shift;
my $readings = shift; # Referenz auf das Hash der zu erstellenden Readings my $readings = shift; # Referenz auf das Hash der zu erstellenden Readings
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrsnb{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrsnb{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'serialNumber' cmdtxt => 'serialNumber'
} }
); );
@ -876,7 +906,7 @@ sub _callManufacturerInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrmfi{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrmfi{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'manufacturerInfo' cmdtxt => 'manufacturerInfo'
} }
); );
@ -918,7 +948,7 @@ sub _callProtocolVersion {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrprt{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrprt{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'protocolVersion' cmdtxt => 'protocolVersion'
} }
); );
@ -953,7 +983,7 @@ sub _callSoftwareVersion {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrswv{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrswv{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'softwareVersion' cmdtxt => 'softwareVersion'
} }
); );
@ -989,7 +1019,7 @@ sub _callSystemParameters {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrspm{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrspm{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'systemParameters' cmdtxt => 'systemParameters'
} }
); );
@ -1039,7 +1069,7 @@ sub _callAnalogValue {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrcmn{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrcmn{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'analogValue' cmdtxt => 'analogValue'
} }
); );
@ -1088,7 +1118,7 @@ sub _callAnalogValue {
$bpos += 4; $bpos += 4;
for my $t (6..$readings->{numberTempPos}) { for my $t (6..$readings->{numberTempPos}) {
$t = 'TempPos_'.sprintf "%02d", $t; $t = 'Pos_'.sprintf "%02d", $t;
$readings->{'cellTemperature_'.$t} = (hex (substr($res, $bpos, 4)) - 2731) / 10; # mehr als 5 Temperaturpositionen (z.B. US5000) $readings->{'cellTemperature_'.$t} = (hex (substr($res, $bpos, 4)) - 2731) / 10; # mehr als 5 Temperaturpositionen (z.B. US5000)
$bpos += 4; # Position bei 5 Temp.Angaben (bei 6 Temperaturen) $bpos += 4; # Position bei 5 Temp.Angaben (bei 6 Temperaturen)
} }
@ -1159,7 +1189,7 @@ sub _callAlarmInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hralm{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hralm{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'alarmInfo' cmdtxt => 'alarmInfo'
} }
); );
@ -1179,16 +1209,17 @@ sub _callAlarmInfo {
__resultLog ($hash, $res); __resultLog ($hash, $res);
my $alm; my ($alm, $aval);
my $bpos = 17; # Startposition my $bpos = 17; # Startposition
$readings->{packCellcount} = hex (substr($res, $bpos, 2)); # Pos. 17 $readings->{packCellcount} = hex (substr($res, $bpos, 2)); # Pos. 17
$bpos += 2; $bpos += 2;
for my $cnt (1..$readings->{packCellcount}) { # Start Pos. 19 for my $cnt (1..$readings->{packCellcount}) { # Start Pos. 19
$cnt = sprintf "%02d", $cnt; $cnt = sprintf "%02d", $cnt;
$readings->{'almCellVoltage_'.$cnt} = substr ($res, $bpos, 2); $aval = substr ($res, $bpos, 2);
$alm = 1 if(int $readings->{'almCellVoltage_'.$cnt}); $readings->{'almCellVoltage_'.$cnt} = $halm{$aval}{alm};
$alm = 1 if(int $aval);
$bpos += 2; $bpos += 2;
} }
@ -1196,42 +1227,42 @@ sub _callAlarmInfo {
$bpos += 2; $bpos += 2;
for my $nt (1..$ntp) { # Start Pos. 51 bei 15 Zellen for my $nt (1..$ntp) { # Start Pos. 51 bei 15 Zellen
$nt = sprintf "%02d", $nt; $nt = sprintf "%02d", $nt;
$readings->{'almTemperature_'.$nt} = substr ($res, $bpos, 2); $aval = substr ($res, $bpos, 2);
$alm = 1 if(int $readings->{'almTemperature_'.$nt}); $readings->{'almTemperature_'.$nt} = $halm{$aval}{alm};
$alm = 1 if(int $aval);
$bpos += 2; $bpos += 2;
} }
my $chcurralm = substr ($res, $bpos, 2); # Pos. 61 b. 15 Zellen u. 5 Temp.positionen $aval = substr ($res, $bpos, 2); # Pos. 61 b. 15 Zellen u. 5 Temp.positionen
$alm = 1 if(int $chcurralm); $readings->{almChargeCurrent} = $halm{$aval}{alm};
$alm = 1 if(int $aval);
$bpos += 2; $bpos += 2;
my $modvoltalm = substr ($res, $bpos, 2); # Pos. 63 b. 15 Zellen u. 5 Temp.positionen $aval = substr ($res, $bpos, 2); # Pos. 63 b. 15 Zellen u. 5 Temp.positionen
$alm = 1 if(int $modvoltalm); $readings->{almModuleVoltage} = $halm{$aval}{alm};
$alm = 1 if(int $aval);
$bpos += 2; $bpos += 2;
my $dchcurralm = substr ($res, $bpos, 2); # Pos. 65 b. 15 Zellen u. 5 Temp.positionen $aval = substr ($res, $bpos, 2); # Pos. 65 b. 15 Zellen u. 5 Temp.positionen
$alm = 1 if(int $dchcurralm); $readings->{almDischargeCurrent} = $halm{$aval}{alm};
$alm = 1 if(int $aval);
$bpos += 2; $bpos += 2;
my $stat1alm = substr ($res, $bpos, 2); # Pos. 67 b. 15 Zellen u. 5 Temp.positionen my $stat1alm = substr ($res, $bpos, 2); # Pos. 67 b. 15 Zellen u. 5 Temp.positionen
$bpos += 2; $bpos += 2;
my $stat2alm = substr ($res, $bpos, 2); # Pos. 69 b. 15 Zellen u. 5 Temp.positionen my $stat2alm = substr ($res, $bpos, 2); # Pos. 69 b. 15 Zellen u. 5 Temp.positionen
$bpos += 2; $bpos += 2;
my $stat3alm = substr ($res, $bpos, 2); # Pos. 71 b. 15 Zellen u. 5 Temp.positionen my $stat3alm = substr ($res, $bpos, 2); # Pos. 71 b. 15 Zellen u. 5 Temp.positionen
$bpos += 2; $bpos += 2;
my $stat4alm = substr ($res, $bpos, 2); # Pos. 73 b. 15 Zellen u. 5 Temp.positionen my $stat4alm = substr ($res, $bpos, 2); # Pos. 73 b. 15 Zellen u. 5 Temp.positionen
$bpos += 2; $bpos += 2;
my $stat5alm = substr ($res, $bpos, 2); # Pos. 75 b. 15 Zellen u. 5 Temp.positionen my $stat5alm = substr ($res, $bpos, 2); # Pos. 75 b. 15 Zellen u. 5 Temp.positionen
$readings->{almChargeCurrent} = $chcurralm;
$readings->{almModuleVoltage} = $modvoltalm;
$readings->{almDischargeCurrent} = $dchcurralm;
if (!$alm) { if (!$alm) {
$readings->{packAlarmInfo} = "ok"; $readings->{packAlarmInfo} = "ok";
} }
@ -1261,7 +1292,7 @@ sub _callChargeManagmentInfo {
my $res = Request ({ hash => $hash, my $res = Request ({ hash => $hash,
socket => $socket, socket => $socket,
cmd => $hrcmi{$hash->{BATADDRESS}}{cmd}, cmd => getCmdString ($hrcmi{$hash->{BATADDRESS}}{cmd}),
cmdtxt => 'chargeManagmentInfo' cmdtxt => 'chargeManagmentInfo'
} }
); );
@ -1458,6 +1489,51 @@ sub pseudoHexToText {
return $text; return $text;
} }
###############################################################
# Kommandostring zusammenstellen
# Teilstring aus Kommandohash wird übergeben
###############################################################
sub getCmdString {
my $cstr = shift; # Komamndoteilstring
my $cmd = $pfx.$cstr;
$cmd .= _doChecksum ($cstr);
$cmd .= $sfx;
return $cmd;
}
###############################################################
# wandelt eine Zeichenkette aus HEX-Zahlen in eine
# hexadecimal-ASCII Zeichenkette um und berechnet daraus die
# Checksumme (=Returnwert)
###############################################################
sub _doChecksum {
my $hstring = shift // return;
my $dezsum = 0;
my @asciivals = split //, $hstring;
for my $v (@asciivals) { # jedes einzelne Zeichen der HEX-Kette wird als ASCII Wert interpretiert
my $hex = unpack "H*", $v; # in einen HEX-Wert umgewandelt
$dezsum += hex $hex; # und die Dezimalsumme gebildet
}
my $bin = sprintf '%016b', $dezsum;
$bin =~ s/1/x/g; # invertieren
$bin =~ s/0/1/g;
$bin =~ s/x/0/g;
$dezsum = oct("0b$bin");
$dezsum++;
$bin = sprintf '%016b', $dezsum;
my $chksum = sprintf '%X', oct("0b$bin");
return $chksum;
}
############################################################### ###############################################################
# Fehlerausstieg # Fehlerausstieg
############################################################### ###############################################################
@ -1532,10 +1608,10 @@ sub createReadings {
for my $rdg (keys %{$readings}) { for my $rdg (keys %{$readings}) {
next if(!defined $readings->{$rdg}); next if(!defined $readings->{$rdg});
readingsBulkUpdate ($hash, $rdg, $readings->{$rdg}) if($success || $rdg ~~ @blackl); readingsBulkUpdate ($hash, $rdg, $readings->{$rdg}) if($success || grep /^$rdg$/, @blackl);
} }
readingsEndUpdate ($hash, 1); readingsEndUpdate ($hash, 1);
return; return;
} }
@ -1552,7 +1628,7 @@ sub deleteReadingspec {
my $readingspec = '^'.$spec.'$'; my $readingspec = '^'.$spec.'$';
for my $reading ( grep { /$readingspec/x } keys %{$hash->{READINGS}} ) { for my $reading ( grep { /$readingspec/x } keys %{$hash->{READINGS}} ) {
next if($reading ~~ @blackl); next if(grep /^$reading$/, @blackl);
readingsDelete ($hash, $reading); readingsDelete ($hash, $reading);
} }
@ -1583,6 +1659,7 @@ return;
<li> US2000 Plus </li> <li> US2000 Plus </li>
<li> US3000 </li> <li> US3000 </li>
<li> US3000C </li> <li> US3000C </li>
<li> US5000 </li>
</ul> </ul>
The following devices have been successfully used as RS485 Ethernet gateways to date: <br> The following devices have been successfully used as RS485 Ethernet gateways to date: <br>
@ -1650,7 +1727,7 @@ return;
<b>Limitations</b> <b>Limitations</b>
<br> <br>
The module currently supports a maximum of 14 batteries (master + 13 slaves) in one group. The module currently supports a maximum of 16 batteries (1 master + 15 slaves) in one group.
<br><br> <br><br>
<a id="PylonLowVoltage-define"></a> <a id="PylonLowVoltage-define"></a>
@ -1739,6 +1816,7 @@ return;
<li><b>cellTemperature_0508</b><br> Temperature (°C) of cell packs 5 to 8 </li> <li><b>cellTemperature_0508</b><br> Temperature (°C) of cell packs 5 to 8 </li>
<li><b>cellTemperature_0912</b><br> Temperature (°C) of the cell packs 9 to 12 </li> <li><b>cellTemperature_0912</b><br> Temperature (°C) of the cell packs 9 to 12 </li>
<li><b>cellTemperature_1315</b><br> Temperature (°C) of the cell packs 13 to 15 </li> <li><b>cellTemperature_1315</b><br> Temperature (°C) of the cell packs 13 to 15 </li>
<li><b>cellTemperature_Pos_XX</b><br> Temperature (°C) of position XX (not further specified) </li>
<li><b>cellVoltage_XX</b><br> Cell voltage (V) of the cell pack XX. In the battery module "packCellcount" <li><b>cellVoltage_XX</b><br> Cell voltage (V) of the cell pack XX. In the battery module "packCellcount"
cell packs are connected in series. Each cell pack consists of single cells cell packs are connected in series. Each cell pack consists of single cells
connected in parallel. </li> connected in parallel. </li>
@ -1806,6 +1884,7 @@ return;
<li> US2000 Plus </li> <li> US2000 Plus </li>
<li> US3000 </li> <li> US3000 </li>
<li> US3000C </li> <li> US3000C </li>
<li> US5000 </li>
</ul> </ul>
Als RS485-Ethernet-Gateways wurden bisher folgende Geräte erfolgreich eingesetzt: <br> Als RS485-Ethernet-Gateways wurden bisher folgende Geräte erfolgreich eingesetzt: <br>
@ -1873,7 +1952,7 @@ return;
<b>Einschränkungen</b> <b>Einschränkungen</b>
<br> <br>
Das Modul unterstützt zur Zeit maximal 14 Batterien (Master + 13 Slaves) in einer Gruppe. Das Modul unterstützt zur Zeit maximal 16 Batterien (1 Master + 15 Slaves) in einer Gruppe.
<br><br> <br><br>
<a id="PylonLowVoltage-define"></a> <a id="PylonLowVoltage-define"></a>
@ -1963,6 +2042,7 @@ return;
<li><b>cellTemperature_0508</b><br> Temperatur (°C) der Zellenpacks 5 bis 8 </li> <li><b>cellTemperature_0508</b><br> Temperatur (°C) der Zellenpacks 5 bis 8 </li>
<li><b>cellTemperature_0912</b><br> Temperatur (°C) der Zellenpacks 9 bis 12 </li> <li><b>cellTemperature_0912</b><br> Temperatur (°C) der Zellenpacks 9 bis 12 </li>
<li><b>cellTemperature_1315</b><br> Temperatur (°C) der Zellenpacks 13 bis 15 </li> <li><b>cellTemperature_1315</b><br> Temperatur (°C) der Zellenpacks 13 bis 15 </li>
<li><b>cellTemperature_Pos_XX</b><br> Temperatur (°C) der Position XX (nicht näher spezifiziert) </li>
<li><b>cellVoltage_XX</b><br> Zellenspannung (V) des Zellenpacks XX. In dem Batteriemodul sind "packCellcount" <li><b>cellVoltage_XX</b><br> Zellenspannung (V) des Zellenpacks XX. In dem Batteriemodul sind "packCellcount"
Zellenpacks in Serie geschaltet verbaut. Jedes Zellenpack besteht aus parallel Zellenpacks in Serie geschaltet verbaut. Jedes Zellenpack besteht aus parallel
geschalten Einzelzellen. </li> geschalten Einzelzellen. </li>