2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 01:46:08 +00:00

26_KM273.pm:V0015 Set with select menu, new ATTR AddToGetSet AddToReadings

git-svn-id: https://svn.fhem.de/fhem/trunk@14469 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
mike3436 2017-06-05 16:40:18 +00:00
parent 9559e9ab45
commit fa7d9577c3

View File

@ -73,14 +73,19 @@
# 0011 01.06.2016 mike3436 KM273_ReadElementList negative min values corrected: value interpretation has to be as signed int64, XDHW_TIME+XDHW_STOP_TEMP added to KM273_gets # 0011 01.06.2016 mike3436 KM273_ReadElementList negative min values corrected: value interpretation has to be as signed int64, XDHW_TIME+XDHW_STOP_TEMP added to KM273_gets
# 0012 02.06.2016 mike3436 KM273_ReadElementList byte nibbles in extid turned # 0012 02.06.2016 mike3436 KM273_ReadElementList byte nibbles in extid turned
# 0013 07.01.2017 mike3436 KM273_gets HOLIDAY params added for get/set, cyclic read for some alarms and requests activated in KM273_elements_default # 0013 07.01.2017 mike3436 KM273_gets HOLIDAY params added for get/set, cyclic read for some alarms and requests activated in KM273_elements_default
# 0014 22.03.2017 mike3436 KM273_getsAdd add variables for 2nd heating circuit if Attribut HeatCircit2Active is set to 1 # 0014 22.03.2017 mike3436 KM273_getsAdd add variables for 2nd heating circuit if Attribut HeatCircuit2Active is set to 1
# 0015 26.05.2017 mike3436 KM273_Get no parameter in module view
# 0015 26.05.2017 mike3436 KM273_Set allowed list or range selectable in module view
# 0015 29.05.2017 mike3436 attr AddToGetSet additional variables can be added to KM273_gets
# 0015 29.05.2017 mike3436 attr AddToReadings additional variables can be added to KM273_ReadElementList
# 0015 05.06.2017 mike3436 KM273_Notify rebuild GetSet and Readings list on Attribut changes
package main; package main;
use strict; use strict;
use warnings; use warnings;
use Time::HiRes qw( time sleep ); use Time::HiRes qw( time sleep );
my %KM273_gets = ( my %KM273_getsBase = (
'XDHW_STOP_TEMP' => '', 'XDHW_STOP_TEMP' => '',
'XDHW_TIME' => '', 'XDHW_TIME' => '',
'DHW_CALCULATED_SETPOINT_TEMP' => '', 'DHW_CALCULATED_SETPOINT_TEMP' => '',
@ -116,6 +121,7 @@ my %KM273_gets = (
'DHW_PROGRAM_2_2TUE' => '', 'DHW_PROGRAM_2_2TUE' => '',
'DHW_PROGRAM_2_3WED' => '', 'DHW_PROGRAM_2_3WED' => '',
'DHW_PROGRAM_MODE' => '', 'DHW_PROGRAM_MODE' => '',
'HEATING_SEASON_MODE' => '',
'PUMP_DHW_PROGRAM1_START_TIME' => '', 'PUMP_DHW_PROGRAM1_START_TIME' => '',
'PUMP_DHW_PROGRAM1_STOP_TIME' => '', 'PUMP_DHW_PROGRAM1_STOP_TIME' => '',
'PUMP_DHW_PROGRAM2_START_TIME' => '', 'PUMP_DHW_PROGRAM2_START_TIME' => '',
@ -133,7 +139,8 @@ my %KM273_gets = (
'HOLIDAY_STOP_YEAR' => '' 'HOLIDAY_STOP_YEAR' => ''
); );
my %KM273_getsAdd = ( my %KM273_getsAddHC2 = (
'MV_E12_EEPROM_ROOM_PROGRAM_MODE' => '',
'MV_E12_EEPROM_TIME_PROGRAM' => '', 'MV_E12_EEPROM_TIME_PROGRAM' => '',
'MV_E12_EEPROM_TIME_PROGRAM_5FRI' => '', 'MV_E12_EEPROM_TIME_PROGRAM_5FRI' => '',
'MV_E12_EEPROM_TIME_PROGRAM_5FRI_2' => '', 'MV_E12_EEPROM_TIME_PROGRAM_5FRI_2' => '',
@ -841,10 +848,10 @@ my %KM273_elements_default =
'0CDB3FE0' => { 'rtr' => '04DB3FE0' , 'idx' => 876 , 'extid' => '000CCD051004BC' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 1 , 'text' => 'HEATING_REQUEST_2' }, '0CDB3FE0' => { 'rtr' => '04DB3FE0' , 'idx' => 876 , 'extid' => '000CCD051004BC' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 1 , 'text' => 'HEATING_REQUEST_2' },
'0CDB7FE0' => { 'rtr' => '04DB7FE0' , 'idx' => 877 , 'extid' => 'E12D76FBC90331' , 'max' => 15 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_REQUEST_BLOCK_AFTER_START_TIME' }, '0CDB7FE0' => { 'rtr' => '04DB7FE0' , 'idx' => 877 , 'extid' => 'E12D76FBC90331' , 'max' => 15 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_REQUEST_BLOCK_AFTER_START_TIME' },
'0CDBBFE0' => { 'rtr' => '04DBBFE0' , 'idx' => 878 , 'extid' => 'E23409A4FD00C9' , 'max' => 600 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_REQUEST_BLOCK_TIME' }, '0CDBBFE0' => { 'rtr' => '04DBBFE0' , 'idx' => 878 , 'extid' => 'E23409A4FD00C9' , 'max' => 600 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_REQUEST_BLOCK_TIME' },
'0CDC3FE0' => { 'rtr' => '04DC3FE0' , 'idx' => 880 , 'extid' => '002280F33400F4' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_ACTIVE' }, '0CDC3FE0' => { 'rtr' => '04DC3FE0' , 'idx' => 880 , 'extid' => '002280F33400F4' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 1 , 'text' => 'HEATING_SEASON_ACTIVE' },
'0CDC7FE0' => { 'rtr' => '04DC7FE0' , 'idx' => 881 , 'extid' => 'E1E3B281D900F7' , 'max' => 35 , 'min' => 5 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_DELAYED_TEMP' }, '0CDC7FE0' => { 'rtr' => '04DC7FE0' , 'idx' => 881 , 'extid' => 'E1E3B281D900F7' , 'max' => 35 , 'min' => 5 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_DELAYED_TEMP' },
'0CDCBFE0' => { 'rtr' => '04DCBFE0' , 'idx' => 882 , 'extid' => 'E1C800448B00F5' , 'max' => 17 , 'min' => 5 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_IMMEDIATE_TEMP' }, '0CDCBFE0' => { 'rtr' => '04DCBFE0' , 'idx' => 882 , 'extid' => 'E1C800448B00F5' , 'max' => 17 , 'min' => 5 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_IMMEDIATE_TEMP' },
'0CDCFFE0' => { 'rtr' => '04DCFFE0' , 'idx' => 883 , 'extid' => 'E1882248C90440' , 'max' => 2 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_MODE' }, '0CDCFFE0' => { 'rtr' => '04DCFFE0' , 'idx' => 883 , 'extid' => 'E1882248C90440' , 'max' => 2 , 'min' => 0 , 'format' => 'dp2' , 'read' => 1 , 'text' => 'HEATING_SEASON_MODE' },
'0CDD3FE0' => { 'rtr' => '04DD3FE0' , 'idx' => 884 , 'extid' => 'E1FF34393100F6' , 'max' => 48 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_START_DELAY_TIME' }, '0CDD3FE0' => { 'rtr' => '04DD3FE0' , 'idx' => 884 , 'extid' => 'E1FF34393100F6' , 'max' => 48 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_START_DELAY_TIME' },
'0CDD7FE0' => { 'rtr' => '04DD7FE0' , 'idx' => 885 , 'extid' => 'E17EE5BF2402F1' , 'max' => 48 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_STOP_DELAY_TIME' }, '0CDD7FE0' => { 'rtr' => '04DD7FE0' , 'idx' => 885 , 'extid' => 'E17EE5BF2402F1' , 'max' => 48 , 'min' => 1 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SEASON_STOP_DELAY_TIME' },
'0CDDBFE0' => { 'rtr' => '04DDBFE0' , 'idx' => 886 , 'extid' => '0E7900A31300CA' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SETPOINT' }, '0CDDBFE0' => { 'rtr' => '04DDBFE0' , 'idx' => 886 , 'extid' => '0E7900A31300CA' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'HEATING_SETPOINT' },
@ -1379,13 +1386,13 @@ my %KM273_elements_default =
'0D993FE0' => { 'rtr' => '05993FE0' , 'idx' => 1636 , 'extid' => '8259B592700C1A' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_PID_MIN_VALUE' }, '0D993FE0' => { 'rtr' => '05993FE0' , 'idx' => 1636 , 'extid' => '8259B592700C1A' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_PID_MIN_VALUE' },
'0D99BFE0' => { 'rtr' => '0599BFE0' , 'idx' => 1638 , 'extid' => '825A0105990C1B' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_P_VALUE' }, '0D99BFE0' => { 'rtr' => '0599BFE0' , 'idx' => 1638 , 'extid' => '825A0105990C1B' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_P_VALUE' },
'0D9A3FE0' => { 'rtr' => '059A3FE0' , 'idx' => 1640 , 'extid' => '8117E506360C2D' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_ROOMSENSOR_INFLUENCE_FACTOR' }, '0D9A3FE0' => { 'rtr' => '059A3FE0' , 'idx' => 1640 , 'extid' => '8117E506360C2D' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_ROOMSENSOR_INFLUENCE_FACTOR' },
'0D9A7FE0' => { 'rtr' => '059A7FE0' , 'idx' => 1641 , 'extid' => '814A526F5B0BF5' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_ROOM_PROGRAM_MODE' }, '0D9A7FE0' => { 'rtr' => '059A7FE0' , 'idx' => 1641 , 'extid' => '814A526F5B0BF5' , 'max' => 0 , 'min' => 0 , 'format' => 'rp2' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_ROOM_PROGRAM_MODE' },
'0D9ABFE0' => { 'rtr' => '059ABFE0' , 'idx' => 1642 , 'extid' => '8635FFD7B20C03' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_ROOM_SENSOR_ACTIVE' }, '0D9ABFE0' => { 'rtr' => '059ABFE0' , 'idx' => 1642 , 'extid' => '8635FFD7B20C03' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_ROOM_SENSOR_ACTIVE' },
'0D9B3FE0' => { 'rtr' => '059B3FE0' , 'idx' => 1644 , 'extid' => '858E6674D50C38' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_T1_KORRIGERING' }, '0D9B3FE0' => { 'rtr' => '059B3FE0' , 'idx' => 1644 , 'extid' => '858E6674D50C38' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_T1_KORRIGERING' },
'0D9B7FE0' => { 'rtr' => '059B7FE0' , 'idx' => 1645 , 'extid' => '854EDF1E430C3E' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_T5_KORRIGERING' }, '0D9B7FE0' => { 'rtr' => '059B7FE0' , 'idx' => 1645 , 'extid' => '854EDF1E430C3E' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 0 , 'text' => 'MV_E12_EEPROM_T5_KORRIGERING' },
'0D9BBFE0' => { 'rtr' => '059BBFE0' , 'idx' => 1646 , 'extid' => '86D947DA820C0B' , 'max' => 0 , 'min' => 0 , 'format' => 'tem' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_T5_SETPOINT' }, '0D9BBFE0' => { 'rtr' => '059BBFE0' , 'idx' => 1646 , 'extid' => '86D947DA820C0B' , 'max' => 0 , 'min' => 0 , 'format' => 'tem' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_T5_SETPOINT' },
'0D9C3FE0' => { 'rtr' => '059C3FE0' , 'idx' => 1648 , 'extid' => '86C7DACCE10C0E' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TEMP_TIMECONTROLLED' }, '0D9C3FE0' => { 'rtr' => '059C3FE0' , 'idx' => 1648 , 'extid' => '86C7DACCE10C0E' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TEMP_TIMECONTROLLED' },
'0D9CBFE0' => { 'rtr' => '059CBFE0' , 'idx' => 1650 , 'extid' => '814713BEA40BDA' , 'max' => 0 , 'min' => 0 , 'format' => 'int' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM' }, '0D9CBFE0' => { 'rtr' => '059CBFE0' , 'idx' => 1650 , 'extid' => '814713BEA40BDA' , 'max' => 0 , 'min' => 0 , 'format' => 'rp1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM' },
'0D9CFFE0' => { 'rtr' => '059CFFE0' , 'idx' => 1651 , 'extid' => '82C52E3F910BE2' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_5FRI' }, '0D9CFFE0' => { 'rtr' => '059CFFE0' , 'idx' => 1651 , 'extid' => '82C52E3F910BE2' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_5FRI' },
'0D9D7FE0' => { 'rtr' => '059D7FE0' , 'idx' => 1653 , 'extid' => '826A1151AC0BEA' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_5FRI_2' }, '0D9D7FE0' => { 'rtr' => '059D7FE0' , 'idx' => 1653 , 'extid' => '826A1151AC0BEA' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_5FRI_2' },
'0D9DFFE0' => { 'rtr' => '059DFFE0' , 'idx' => 1655 , 'extid' => '82A87329CF0BDD' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_1MON' }, '0D9DFFE0' => { 'rtr' => '059DFFE0' , 'idx' => 1655 , 'extid' => '82A87329CF0BDD' , 'max' => 0 , 'min' => 0 , 'format' => 'sw1' , 'read' => 2 , 'text' => 'MV_E12_EEPROM_TIME_PROGRAM_1MON' },
@ -2002,12 +2009,12 @@ my %KM273_format = (
'sw1' => { factor => 1 , unit => '' }, 'sw1' => { factor => 1 , unit => '' },
'sw2' => { factor => 1 , unit => '' }, 'sw2' => { factor => 1 , unit => '' },
'rp1' => { factor => 1 , unit => '' , 'select' => [ '0:HP_Optimized', '1:Program_1', '2:Program_2', '3:Family', '4:Morning', '5:Evening', '6:Seniors' ] }, 'rp1' => { factor => 1 , unit => '' , 'select' => [ '0:HP_Optimized', '1:Program_1', '2:Program_2', '3:Family', '4:Morning', '5:Evening', '6:Seniors' ] },
'rp2' => { factor => 1 , unit => '' , 'select' => [ '0:Automatic', '1:Off', '2:Day', '3:Night' ] }, 'rp2' => { factor => 1 , unit => '' , 'select' => [ '0:Automatic', '1:Normal', '2:Exception', '3:HeatingOff' ] },
'dp1' => { factor => 1 , unit => '' , 'select' => [ '0:Always_On', '1:Program_1', '2:Program_2' ] }, 'dp1' => { factor => 1 , unit => '' , 'select' => [ '0:Always_On', '1:Program_1', '2:Program_2' ] },
'dp2' => { factor => 1 , unit => '' , 'select' => [ '0:Automatic', '1:Always_On', '2:Always_Off' ] }, 'dp2' => { factor => 1 , unit => '' , 'select' => [ '0:Automatic', '1:Always_On', '2:Always_Off' ] },
); );
my %KM273_gets = ();
my %KM273_history = (); my %KM273_history = ();
my @KM273_readingsRTR = (); my @KM273_readingsRTR = ();
my %KM273_writingsTXD = (); my %KM273_writingsTXD = ();
@ -2019,8 +2026,8 @@ my %KM273_ReadElementListElements = ();
sub KM273_ClearElementLists($) sub KM273_ClearElementLists($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME} . ": KM273_ClearElementLists"; my $name = $hash->{NAME};
Log 3, "$name"; Log3 $name, 3, "$name: KM273_ClearElementLists";
%KM273_history = (); %KM273_history = ();
@KM273_readingsRTR = (); @KM273_readingsRTR = ();
@ -2033,12 +2040,12 @@ sub KM273_ClearElementLists($)
sub KM273_ReadElementList($) sub KM273_ReadElementList($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME} . ": KM273_ReadElementList"; my $name = $hash->{NAME};
Log 3, "$name entry readCounter=$KM273_ReadElementListStatus{readCounter} readIndex=$KM273_ReadElementListStatus{readIndex}"; Log3 $name, 3, "$name: KM273_ReadElementList entry readCounter=$KM273_ReadElementListStatus{readCounter} readIndex=$KM273_ReadElementListStatus{readIndex}";
if (($KM273_ReadElementListStatus{readCounter} == 0) && ($KM273_ReadElementListStatus{KM200wait} == 0)) if (($KM273_ReadElementListStatus{readCounter} == 0) && ($KM273_ReadElementListStatus{KM200wait} == 0))
{ {
Log 3, "$name send R01FD7FE00"; Log3 $name, 3, "$name: KM273_ReadElementList send R01FD7FE00";
CAN_Write($hash,"R01FD7FE00"); CAN_Write($hash,"R01FD7FE00");
$KM273_ReadElementListStatus{KM200wait} = 20; $KM273_ReadElementListStatus{KM200wait} = 20;
} }
@ -2052,16 +2059,16 @@ sub KM273_ReadElementList($)
$KM273_ReadElementListStatus{writeIndex} = 0; $KM273_ReadElementListStatus{writeIndex} = 0;
$KM273_ReadElementListStatus{readData} = ""; $KM273_ReadElementListStatus{readData} = "";
} }
Log 3, "$name KM200active=$KM273_ReadElementListStatus{KM200active} KM200wait=$KM273_ReadElementListStatus{KM200wait} readIndex=$KM273_ReadElementListStatus{readIndex}"; Log3 $name, 3, "$name: KM273_ReadElementList KM200active=$KM273_ReadElementListStatus{KM200active} KM200wait=$KM273_ReadElementListStatus{KM200wait} readIndex=$KM273_ReadElementListStatus{readIndex}";
} }
elsif ($KM273_ReadElementListStatus{writeIndex} <= $KM273_ReadElementListStatus{readIndex}) elsif ($KM273_ReadElementListStatus{writeIndex} <= $KM273_ReadElementListStatus{readIndex})
{ {
my $sendTel = sprintf("T01FD3FE08%08x%08x",4096,$KM273_ReadElementListStatus{writeIndex}); my $sendTel = sprintf("T01FD3FE08%08x%08x",4096,$KM273_ReadElementListStatus{writeIndex});
$KM273_ReadElementListStatus{writeIndex} += 4096; $KM273_ReadElementListStatus{writeIndex} += 4096;
$KM273_ReadElementListStatus{wait} = 20; $KM273_ReadElementListStatus{wait} = 20;
Log 3, "$name send $sendTel"; Log3 $name, 3, "$name: KM273_ReadElementList send $sendTel";
CAN_Write($hash,$sendTel); CAN_Write($hash,$sendTel);
Log 3, "$name send R01FDBFE00"; Log3 $name, 3, "$name: KM273_ReadElementList send R01FDBFE00";
CAN_Write($hash,"R01FDBFE00"); CAN_Write($hash,"R01FDBFE00");
} }
elsif (--$KM273_ReadElementListStatus{wait} <= 0) elsif (--$KM273_ReadElementListStatus{wait} <= 0)
@ -2098,13 +2105,13 @@ sub KM273_ReadElementList($)
if (($KM273_ReadElementListStatus{readIndexLast} > 0) && ($KM273_ReadElementListStatus{readIndexLast} == $KM273_ReadElementListStatus{readIndex})) if (($KM273_ReadElementListStatus{readIndexLast} > 0) && ($KM273_ReadElementListStatus{readIndexLast} == $KM273_ReadElementListStatus{readIndex}))
{ {
#wenn readCounter auch beim 2. Lesen nicht erreicht wird, und gelesene Datenmenge gleich ist, dann readCounter = readIndex #wenn readCounter auch beim 2. Lesen nicht erreicht wird, und gelesene Datenmenge gleich ist, dann readCounter = readIndex
Log 3, "$name readCounter $KM273_ReadElementListStatus{readCounter} changed to $KM273_ReadElementListStatus{readIndex}"; Log3 $name, 3, "$name: KM273_ReadElementList readCounter $KM273_ReadElementListStatus{readCounter} changed to $KM273_ReadElementListStatus{readIndex}";
$KM273_ReadElementListStatus{readCounter} = $KM273_ReadElementListStatus{readIndex}; $KM273_ReadElementListStatus{readCounter} = $KM273_ReadElementListStatus{readIndex};
} }
if (($KM273_ReadElementListStatus{readCounter} > 0) && ($KM273_ReadElementListStatus{readIndex} >= $KM273_ReadElementListStatus{readCounter})) if (($KM273_ReadElementListStatus{readCounter} > 0) && ($KM273_ReadElementListStatus{readIndex} >= $KM273_ReadElementListStatus{readCounter}))
{ {
$KM273_ReadElementListStatus{done} = 1; $KM273_ReadElementListStatus{done} = 1;
Log 3, "$name done, readCounter=$KM273_ReadElementListStatus{readCounter} readIndex=$KM273_ReadElementListStatus{readIndex}"; Log3 $name, 3, "$name: KM273_ReadElementList done, readCounter=$KM273_ReadElementListStatus{readCounter} readIndex=$KM273_ReadElementListStatus{readIndex}";
%KM273_ReadElementListElements = (); %KM273_ReadElementListElements = ();
my $i1 = 0; my $i1 = 0;
@ -2122,11 +2129,11 @@ sub KM273_ReadElementList($)
my $element2 = substr($KM273_ReadElementListStatus{readData},$i1+18,$len2-1); my $element2 = substr($KM273_ReadElementListStatus{readData},$i1+18,$len2-1);
$i1 += 18+$len2; $i1 += 18+$len2;
$KM273_ReadElementListElements{$element2} = {'idx' => $idx, 'extid' => $extid, 'max' => $max2, 'min' => $min2 }; $KM273_ReadElementListElements{$element2} = {'idx' => $idx, 'extid' => $extid, 'max' => $max2, 'min' => $min2 };
Log 3, "$name done, idx=$idx extid=$extid max=$max2 min=$min2 element=$element2"; Log3 $name, 3, "$name: KM273_ReadElementList done, idx=$idx extid=$extid max=$max2 min=$min2 element=$element2";
} }
else else
{ {
Log 3, "$name error, idx=$idx extid=$extid max=$max2 min=$min2 len=$len2"; Log3 $name, 3, "$name: KM273_ReadElementList error, idx=$idx extid=$extid max=$max2 min=$min2 len=$len2";
$KM273_ReadElementListStatus{done} = 0; $KM273_ReadElementListStatus{done} = 0;
$KM273_ReadElementListStatus{KM200active} = 1; $KM273_ReadElementListStatus{KM200active} = 1;
$KM273_ReadElementListStatus{KM200wait} = 20; $KM273_ReadElementListStatus{KM200wait} = 20;
@ -2142,13 +2149,13 @@ sub KM273_ReadElementList($)
{ {
my $readCounter = ($value1 >> 24); # + 10; #+10=Test my $readCounter = ($value1 >> 24); # + 10; #+10=Test
$KM273_ReadElementListStatus{readCounter} = $readCounter; $KM273_ReadElementListStatus{readCounter} = $readCounter;
Log 3, "$name read T09FD7FE0 len=$len1 value=$value1 readCounter=$readCounter"; Log3 $name, 3, "$name: KM273_ReadElementList read T09FD7FE0 len=$len1 value=$value1 readCounter=$readCounter";
} }
elsif (hex $canId == 0x01FD3FE0) elsif (hex $canId == 0x01FD3FE0)
{ {
my $dataLen = $value1 >> 32; my $dataLen = $value1 >> 32;
my $dataStart = $value1 & 0xffffffff; my $dataStart = $value1 & 0xffffffff;
Log 3, "$name KM200 read canId=$canId len=$len1 dataStart=$dataStart dataLen=$dataLen"; Log3 $name, 3, "$name: KM273_ReadElementList KM200 read canId=$canId len=$len1 dataStart=$dataStart dataLen=$dataLen";
$KM273_ReadElementListStatus{KM200active} = 1; $KM273_ReadElementListStatus{KM200active} = 1;
$KM273_ReadElementListStatus{KM200wait} = 20; $KM273_ReadElementListStatus{KM200wait} = 20;
} }
@ -2157,7 +2164,7 @@ sub KM273_ReadElementList($)
{ {
if ((hex $canId == 0x01FD7FE0) || (hex $canId == 0x01FDBFE0)) if ((hex $canId == 0x01FD7FE0) || (hex $canId == 0x01FDBFE0))
{ {
Log 3, "$name KM200 read canId=$canId"; Log3 $name, 3, "$name: KM273_ReadElementList KM200 read canId=$canId";
$KM273_ReadElementListStatus{KM200active} = 1; $KM273_ReadElementListStatus{KM200active} = 1;
$KM273_ReadElementListStatus{KM200wait} = 20; $KM273_ReadElementListStatus{KM200wait} = 20;
} }
@ -2171,16 +2178,24 @@ sub KM273_ReadElementList($)
sub KM273_UpdateElements($) sub KM273_UpdateElements($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME} . ": KM273_UpdateElements"; my $name = $hash->{NAME};
my $name1 = $hash->{NAME}; Log3 $name, 3, "$name: KM273_UpdateElements";
Log 3, "$name";
my %AddToReadings = ();
my @AddToReadingsKey = ();
push @AddToReadingsKey, split(' ',($attr{$name}{AddToReadings})) if (defined($attr{$name}{AddToReadings}));
push @AddToReadingsKey, split(' ',($attr{$name}{AddToGetSet})) if (defined($attr{$name}{AddToGetSet}));
foreach my $elem (@AddToReadingsKey) { $AddToReadings{$elem} = '';}
%KM273_elements = ();
foreach my $element (keys %KM273_elements_default) foreach my $element (keys %KM273_elements_default)
{ {
my $text = $KM273_elements_default{$element}{text}; my $text = $KM273_elements_default{$element}{text};
my $read = $KM273_elements_default{$element}{read}; my $read = $KM273_elements_default{$element}{read};
my $elem1 = $KM273_ReadElementListElements{$text}; my $elem1 = $KM273_ReadElementListElements{$text};
if ((!defined $elem1) && (($read == 1) || (($read == 2) && defined($attr{$name1}{HeatCircuit2Active}) && ($attr{$name1}{HeatCircuit2Active} == 1)))) $read = 1 if (defined($AddToReadings{$text}));
if (defined($AddToReadings{$text})) { Log3 $name, 3, "$name: KM273_UpdateElements AddToReadings $text"; };
if ((!defined $elem1) && (($read == 1) || (($read == 2) && defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1))))
{ {
my @days = ("1MON","2TUE","3WED","4THU","5FRI","6SAT","7SUN"); my @days = ("1MON","2TUE","3WED","4THU","5FRI","6SAT","7SUN");
foreach my $day (@days) foreach my $day (@days)
@ -2190,7 +2205,7 @@ sub KM273_UpdateElements($)
{ {
my $text1 = (substr $text, 0, $pos) . (substr $text, $pos+1); my $text1 = (substr $text, 0, $pos) . (substr $text, $pos+1);
$elem1 = $KM273_ReadElementListElements{$text1}; $elem1 = $KM273_ReadElementListElements{$text1};
Log 3, "$name change $text1 to $text" if (defined $elem1); Log3 $name, 3, "$name: KM273_UpdateElements change $text1 to $text" if (defined $elem1);
last; last;
} }
@ -2206,42 +2221,66 @@ sub KM273_UpdateElements($)
} }
else else
{ {
Log 3, "$name $text not found" if ($read != 0) Log3 $name, 3, "$name: KM273_UpdateElements $text not found" if ($read != 0)
} }
} }
return undef; return undef;
} }
sub KM273_CreateElementList($)
{
#just for simulation, if reading of element list from heatpump
my ($hash) = @_;
my $name = $hash->{NAME};
Log3 $name, 3, "$name: KM273_CreateElementList";
%KM273_ReadElementListElements = ();
foreach my $key (keys %KM273_elements_default)
{
my $text = $KM273_elements_default{$key}{text};
my $idx = $KM273_elements_default{$key}{idx};
my $extid = $KM273_elements_default{$key}{extid};
my $max = $KM273_elements_default{$key}{max};
my $min = $KM273_elements_default{$key}{min};
$KM273_ReadElementListElements{$text} = {'idx' => $idx, 'extid' => $extid, 'max' => $max, 'min' => $min };
}
$KM273_ReadElementListStatus{done} = 1;
}
sub KM273_CreatePollingList($) sub KM273_CreatePollingList($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME} . ": KM273_CreatePollingList"; my $name = $hash->{NAME};
my $name1 = $hash->{NAME}; Log3 $name, 3, "$name: KM273_CreatePollingList";
Log 3, "$name";
@KM273_readingsRTR = (); @KM273_readingsRTR = ();
foreach my $element (keys %KM273_elements) foreach my $element (keys %KM273_elements)
{ {
push @KM273_readingsRTR, $KM273_elements{$element}{rtr} if $KM273_elements{$element}{read} == 1; push @KM273_readingsRTR, $KM273_elements{$element}{rtr} if $KM273_elements{$element}{read} == 1;
push @KM273_readingsRTR, $KM273_elements{$element}{rtr} if ($KM273_elements{$element}{read} == 2) && defined($attr{$name1}{HeatCircuit2Active}) && ($attr{$name1}{HeatCircuit2Active} == 1); push @KM273_readingsRTR, $KM273_elements{$element}{rtr} if ($KM273_elements{$element}{read} == 2) && defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1);
} }
foreach my $val (@KM273_readingsRTR) foreach my $val (@KM273_readingsRTR)
{ {
Log 3, "$name rtr $val"; Log3 $name, 3, "$name: KM273_CreatePollingList rtr $val";
} }
$hash->{pollingIndex} = 0; $hash->{pollingIndex} = 0;
my @getElements = (keys %KM273_getsBase);
push @getElements, (keys %KM273_getsAddHC2) if (defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1));
push @getElements, split(' ',($attr{$name}{AddToGetSet})) if (defined($attr{$name}{AddToGetSet}));
%KM273_gets = ();
foreach my $elem (@getElements) { $KM273_gets{$elem} = '';}
%KM273_writingsTXD = (); %KM273_writingsTXD = ();
foreach my $element (keys %KM273_elements) foreach my $element (keys %KM273_elements)
{ {
foreach my $get (keys %KM273_gets) foreach my $get (@getElements)
{ {
$KM273_writingsTXD{$get} = $KM273_elements{$element} if $KM273_elements{$element}{text} eq $get; $KM273_writingsTXD{$get} = $KM273_elements{$element} if $KM273_elements{$element}{text} eq $get;
} }
} }
foreach my $val (keys %KM273_writingsTXD) foreach my $val (keys %KM273_writingsTXD)
{ {
Log 3, "$name txd $val $KM273_writingsTXD{$val}{rtr}"; Log3 $name, 3, "$name: KM273_CreatePollingList txd $val $KM273_writingsTXD{$val}{rtr}";
} }
return undef; return undef;
@ -2260,6 +2299,8 @@ sub KM273_Initialize($)
$hash->{AttrFn} = 'KM273_Attr'; $hash->{AttrFn} = 'KM273_Attr';
$hash->{ReadFn} = 'KM273_Read'; $hash->{ReadFn} = 'KM273_Read';
$hash->{ReadyFn} = 'KM273_Ready'; $hash->{ReadyFn} = 'KM273_Ready';
$hash->{NotifyFn} = 'KM273_Notify';
$hash->{ShutdownFn} = 'KM273_Shutdown';
$hash->{AttrList} = "do_not_notify:1,0 " . $hash->{AttrList} = "do_not_notify:1,0 " .
"loglevel:0,1,2,3,4,5,6 " . "loglevel:0,1,2,3,4,5,6 " .
@ -2269,16 +2310,18 @@ sub KM273_Initialize($)
"DoNotPoll " . "DoNotPoll " .
"ReadBackDelay " . "ReadBackDelay " .
"HeatCircuit2Active " . "HeatCircuit2Active " .
"AddToGetSet " .
"AddToReadings " .
$readingFnAttributes; $readingFnAttributes;
} }
sub KM273_Define($$) sub KM273_Define($$)
{ {
my ($hash, $def) = @_; my ($hash, $def) = @_;
my $name = $hash->{NAME} . ": KM273_Define"; my $name = $hash->{NAME};
Log 5, "$name"; Log3 $name, 5, "$name: KM273_Define";
$hash->{VERSION} = "0014"; $hash->{VERSION} = "0015";
my @param = split('[ \t]+', $def); my @param = split('[ \t]+', $def);
@ -2289,14 +2332,17 @@ sub KM273_Define($$)
DevIo_CloseDev($hash); DevIo_CloseDev($hash);
my $dev = $param[2]; my $dev = $param[2];
if($dev eq "none") { $hash->{NOTIFYDEV} = "global";
Log 1, "$name: KM273 device is none, commands will be echoed only";
return undef;
}
KM273_ClearElementLists($hash); KM273_ClearElementLists($hash);
#KM273_CreatePollingList($hash);
#InternalTimer(gettimeofday()+10, "KM273_GetReadings", $hash, 0); if($dev eq "none") {
Log3 $name, 1, "$name: KM273_Define: KM273 device is none, commands will be echoed only";
KM273_CreateElementList($hash);
KM273_UpdateElements($hash);
KM273_CreatePollingList($hash);
return undef;
}
$hash->{DeviceName} = $dev; $hash->{DeviceName} = $dev;
my $ret = DevIo_OpenDev($hash, 0, "CAN_DoInit"); my $ret = DevIo_OpenDev($hash, 0, "CAN_DoInit");
@ -2305,11 +2351,45 @@ sub KM273_Define($$)
return undef; return undef;
} }
sub KM273_Notify($$)
{
my ($own_hash, $dev_hash) = @_;
my $ownName = $own_hash->{NAME}; # own name / hash
return "" if(IsDisabled($ownName)); # Return without any further action if the module is disabled
my $devName = $dev_hash->{NAME}; # Device that created the events
my $events = deviceEvents($dev_hash, 1);
Log3 $ownName, 3, "$ownName: KM273_Notify ".join(',',@{$events});
if($devName eq "global" && grep(m/^INITIALIZED|REREADCFG$|^ATTR /, @{$events}))
{
if ($KM273_ReadElementListStatus{done})
{
RemoveInternalTimer($own_hash);
KM273_UpdateElements($own_hash);
KM273_CreatePollingList($own_hash);
InternalTimer(gettimeofday()+10, "KM273_GetReadings", $own_hash, 0);
}
}
}
sub KM273_Undef($$) sub KM273_Undef($$)
{ {
my ($hash, $arg) = @_; my ($hash, $arg) = @_;
my $name = $hash->{NAME} . ": KM273_Undef"; my $name = $hash->{NAME};
Log 3, "$name"; Log3 $name, 3, "$name: KM273_Undef";
RemoveInternalTimer($hash);
CAN_Close($hash);
return undef;
}
sub KM273_Shutdown($)
{
my ($hash) = @_;
my $name = $hash->{NAME};
Log3 $name, 3, "$name: KM273_Shutdown";
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
CAN_Close($hash); CAN_Close($hash);
@ -2326,8 +2406,9 @@ sub KM273_Get($@)
my $opt = shift @param; my $opt = shift @param;
if(!defined($KM273_gets{$opt})) { if(!defined($KM273_gets{$opt})) {
my @cList = keys %KM273_gets; my @cList = keys %KM273_gets;
push @cList, keys %KM273_getsAdd if defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1); #push @cList, keys %KM273_getsAdd if defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1);
return "Unknown argument $opt, choose one of " . join(" ", @cList); #push @cList, split(' ',($attr{$name}{AddToGetSet})) if (defined($attr{$name}{AddToGetSet}));
return "Unknown argument $opt, choose one of " . join(":noArg ", @cList) . ":noArg";
} }
if (defined($KM273_writingsTXD{$opt})) { if (defined($KM273_writingsTXD{$opt})) {
@ -2358,7 +2439,72 @@ sub KM273_Set($@)
if(!defined($KM273_gets{$opt}) && !defined($KM273_writingsTXD{$opt})) { if(!defined($KM273_gets{$opt}) && !defined($KM273_writingsTXD{$opt})) {
my @cList = keys %KM273_gets; my @cList = keys %KM273_gets;
push @cList, keys %KM273_getsAdd if defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1); #push @cList, keys %KM273_getsAdd if defined($attr{$name}{HeatCircuit2Active}) && ($attr{$name}{HeatCircuit2Active} == 1);
#push @cList, split(' ',($attr{$name}{AddToGetSet})) if (defined($attr{$name}{AddToGetSet}));
if (!defined($attr{$name}{FormatSetParameter}) || ($attr{$name}{FormatSetParameter} == 1))
{
for my $cElem ( @cList )
{
if (defined($KM273_writingsTXD{$cElem}))
{
my $range = "";
my $format = $KM273_writingsTXD{$cElem}{format};
my $max = $KM273_writingsTXD{$cElem}{max};
my $min = $KM273_writingsTXD{$cElem}{min};
if ($max >= 16777216)
{
$max /= 16777216;
$min /= 16777216;
}
if ($max <= $min)
{
if (!($format eq "sw1" || $format eq "sw2"))
{
$range = ":noArg";
}
}
elsif (defined($KM273_format{$format}))
{
if(defined($KM273_format{$format}{'select'}))
{
my @select = @{$KM273_format{$format}{'select'}};
$range = ":" . join(",", @select);
}
else
{
my $factor = $KM273_format{$format}{factor};
if($factor != 1)
{
$max *= $factor;
$min *= $factor;
$range = ":slider,$min,$factor,$max,1";
}
else
{
if (($max - $min) <= 10)
{
$range = ":".$min;
for my $idx ($min+1 .. $max) {$range .= ",".$idx}
}
elsif ($format ne "t15")
{
$range = ":slider,$min,$factor,$max";
}
}
}
}
else
{
}
$cElem .= $range;
}
else
{
$cElem .= ":noArg";
}
#Log3 $name, 5, "KM273_Set $opt $cElem";
}
}
return "Unknown argument $opt, choose one of " . join(" ", @cList); return "Unknown argument $opt, choose one of " . join(" ", @cList);
} }
@ -2433,7 +2579,7 @@ sub KM273_Set($@)
my $data = sprintf ("%04X",$value1); my $data = sprintf ("%04X",$value1);
my $txdata = "T" . $canId . "2" . $data; my $txdata = "T" . $canId . "2" . $data;
CAN_Write($hash, $txdata); CAN_Write($hash, $txdata);
Log 3, "$name: KM273_Set CAN_Write $txdata"; Log3 $name, 3, "$name: KM273_Set CAN_Write $txdata";
} }
#$hash->{STATE} = $KM273_gets{$opt} = $value; #$hash->{STATE} = $KM273_gets{$opt} = $value;
@ -2448,9 +2594,22 @@ sub KM273_Attr(@)
if($attr_name eq "formal") { if($attr_name eq "formal") {
if($attr_value !~ /^yes|no$/) { if($attr_value !~ /^yes|no$/) {
my $err = "Invalid argument $attr_value to $attr_name. Must be yes or no."; my $err = "Invalid argument $attr_value to $attr_name. Must be yes or no.";
Log 3, "KM273: ".$err; Log3 $name, 3, "KM273: ".$err;
return $err; return $err;
} }
}
elsif(($attr_name eq "AddToReadings") || ($attr_name eq "AddToGetSet")) {
Log3 $name, 3, "$name: KM273_Attr $attr_name $attr_value";
if (!defined($KM273_ReadElementListElements{GT1_TEMP}))
{
Log3 $name, 3, "$name: KM273_Attr ReadElementListElements not ready for verify attribute";
return undef;
}
my @valuesIn = split(" ", $attr_value);
foreach my $valueIn (@valuesIn)
{
return "Unknown attr $attr_name value=$valueIn" if (!defined($KM273_ReadElementListElements{$valueIn}));
}
} else { } else {
# return "Unknown attr $attr_name"; # return "Unknown attr $attr_name";
} }
@ -2462,7 +2621,7 @@ sub KM273_Read($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: KM273_Read"; Log3 $name, 5, "$name: KM273_Read";
if (!$KM273_ReadElementListStatus{done}) if (!$KM273_ReadElementListStatus{done})
{ {
@ -2512,12 +2671,12 @@ sub KM273_Read($)
{ {
if (defined $KM273_format{$format}{'select'}) if (defined $KM273_format{$format}{'select'})
{ {
#Log 3, "$name: KM273_Read: format=$format value=$value"; #Log3 $name, 3, "$name: KM273_Read: format=$format value=$value";
my @list = @{$KM273_format{$format}{'select'}}; my @list = @{$KM273_format{$format}{'select'}};
foreach my $elem (@list) foreach my $elem (@list)
{ {
my $idx = index $elem, $value; my $idx = index $elem, $value;
#Log 3, "$name: KM273_Read: format=$format value=$value elem=$elem idx=$idx"; #Log3 $name, 3, "$name: KM273_Read: format=$format value=$value elem=$elem idx=$idx";
if ($idx >= 0) if ($idx >= 0)
{ {
$value = $elem; $value = $elem;
@ -2541,7 +2700,7 @@ sub KM273_Read($)
} }
$value = 'DEAD' if ($value1 == -8531); $value = 'DEAD' if ($value1 == -8531);
if ($readingName1 eq 'DATE_SEC') { next; } if ($readingName1 eq 'DATE_SEC') { next; }
Log 5, "$name: KM273RAW $readingName1 $value"; Log3 $name, 5, "$name: KM273RAW $readingName1 $value";
if (exists $KM273_history{$canId}) if (exists $KM273_history{$canId})
{ {
@ -2573,7 +2732,7 @@ sub KM273_GetNextValue($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: KM273_GetNextValue"; Log3 $name, 4, "$name: KM273_GetNextValue";
return undef if defined($attr{$name}{DoNotPoll}) && ($attr{$name}{DoNotPoll} == 1); return undef if defined($attr{$name}{DoNotPoll}) && ($attr{$name}{DoNotPoll} == 1);
@ -2582,7 +2741,7 @@ sub KM273_GetNextValue($)
{ {
my $canId = $KM273_readingsRTR[$index]; my $canId = $KM273_readingsRTR[$index];
CAN_Write($hash, "R".$canId."0"); CAN_Write($hash, "R".$canId."0");
Log 5, "$name: KM273_GetNextValue $index Id $canId"; Log3 $name, 5, "$name: KM273_GetNextValue $index Id $canId";
$hash->{pollingIndex}++; $hash->{pollingIndex}++;
} }
} }
@ -2592,7 +2751,7 @@ sub KM273_GetReadings($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: KM273_GetReadings"; Log3 $name, 4, "$name: KM273_GetReadings";
### Stop the current timer ### Stop the current timer
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
@ -2616,7 +2775,7 @@ sub KM273_Ready($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 3, "$name: KM273_Ready"; Log3 $name, 3, "$name: KM273_Ready";
return DevIo_OpenDev($hash, 1, "CAN_DoInit") if($hash->{STATE} eq "disconnected"); return DevIo_OpenDev($hash, 1, "CAN_DoInit") if($hash->{STATE} eq "disconnected");
@ -2632,7 +2791,7 @@ sub CAN_Write($$)
{ {
my ($hash,$data) = @_; my ($hash,$data) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: CAN_Write $data"; Log3 $name, 5, "$name: CAN_Write $data";
DevIo_SimpleWrite($hash, $data."\r", 0); DevIo_SimpleWrite($hash, $data."\r", 0);
@ -2642,12 +2801,11 @@ sub CAN_Write($$)
my @CAN_BufferIn = (); my @CAN_BufferIn = ();
##################################### #####################################
sub sub CAN_ReadBuffer($)
CAN_ReadBuffer($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: CAN_ReadBuffer"; Log3 $name, 5, "$name: CAN_ReadBuffer";
my $buf = DevIo_SimpleRead($hash); my $buf = DevIo_SimpleRead($hash);
return undef if(!defined($buf)); return undef if(!defined($buf));
@ -2673,7 +2831,7 @@ sub CAN_Read($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 5, "$name: CAN_Read"; Log3 $name, 5, "$name: CAN_Read";
while (@CAN_BufferIn > 0) while (@CAN_BufferIn > 0)
{ {
@ -2681,7 +2839,7 @@ sub CAN_Read($)
my $recv = shift @CAN_BufferIn; my $recv = shift @CAN_BufferIn;
my $dir = substr($recv,0,1); my $dir = substr($recv,0,1);
Log 5, "$name: CAN_Read recv $recv"; Log3 $name, 5, "$name: CAN_Read recv $recv";
if (($dir eq 'T') || ($dir eq 'R')) if (($dir eq 'T') || ($dir eq 'R'))
{ {
@ -2693,7 +2851,7 @@ sub CAN_Read($)
{ {
$len = hex $len; $len = hex $len;
$data = hex substr($data,0,2*$len); $data = hex substr($data,0,2*$len);
Log 4, "$name: CAN_Read recv $dir $id $len $data"; Log3 $name, 4, "$name: CAN_Read recv $dir $id $len $data";
return ($dir,$id,$len,$data); return ($dir,$id,$len,$data);
} }
} }
@ -2713,7 +2871,7 @@ sub CAN_Read($)
{ {
$len = hex $len; $len = hex $len;
$data = hex substr($data,0,2*$len); $data = hex substr($data,0,2*$len);
Log 4, "$name: CAN_Read recv $dir $id $len $data"; Log3 $name, 4, "$name: CAN_Read recv $dir $id $len $data";
return ($dir,$id,$len,$data) ; return ($dir,$id,$len,$data) ;
} }
} }
@ -2726,11 +2884,11 @@ sub CAN_Read($)
if ($dir eq 'Z') if ($dir eq 'Z')
{ {
Log 5, "$name: CAN_Read recv Z"; Log3 $name, 5, "$name: CAN_Read recv Z";
} }
elsif ($recv ne '') elsif ($recv ne '')
{ {
Log 3, "$name: CAN_Read unknown data '$recv'"; Log3 $name, 3, "$name: CAN_Read unknown data '$recv'";
} }
} }
return undef; return undef;
@ -2741,9 +2899,9 @@ sub CAN_Close($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 3, "$name: CAN_Close"; Log3 $name, 3, "$name: CAN_Close";
DevIo_SimpleWrite($hash, "C\r", 0); DevIo_SimpleWrite($hash, "C\rC\rC\r", 0);
DevIo_CloseDev($hash); DevIo_CloseDev($hash);
return undef; return undef;
} }
@ -2753,7 +2911,7 @@ sub CAN_DoInit($)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
Log 3, "$name: CAN_DoInit"; Log3 $name, 3, "$name: CAN_DoInit";
DevIo_DoSimpleRead($hash); DevIo_DoSimpleRead($hash);
DevIo_SimpleWrite($hash, "C\rS4\rO\r", 0); DevIo_SimpleWrite($hash, "C\rS4\rO\r", 0);
@ -2802,6 +2960,8 @@ sub CAN_DoInit($)
select: '0' or 'Always_On', '1' or 'Program_1', '2' or 'Program_2'</li> select: '0' or 'Always_On', '1' or 'Program_1', '2' or 'Program_2'</li>
<li><i>DHW_PROGRAM_MODE</i><br> <li><i>DHW_PROGRAM_MODE</i><br>
select: '0' or 'Automatic', '1' or 'Always_On', '2' or 'Always_Off'</li> select: '0' or 'Automatic', '1' or 'Always_On', '2' or 'Always_Off'</li>
<li><i>HEATING_SEASON_MODE</i><br>
select: '0' or 'Automatic', '1' or 'Always_On', '2' or 'Always_Off'</li>
<li><i>DHW_PROGRAM_1_1MON .. ROOM_PROGRAM_1_7SUN</i><br> <li><i>DHW_PROGRAM_1_1MON .. ROOM_PROGRAM_1_7SUN</i><br>
value: 06:00 on 21:00 off </li> value: 06:00 on 21:00 off </li>
<li><i>DHW_PROGRAM_2_1MON .. ROOM_PROGRAM_2_7SUN</i><br> <li><i>DHW_PROGRAM_2_1MON .. ROOM_PROGRAM_2_7SUN</i><br>
@ -2811,13 +2971,33 @@ sub CAN_DoInit($)
you can set 4 time ranges where the pump should be switched on you can set 4 time ranges where the pump should be switched on
value: xx:xx</li> value: xx:xx</li>
<li><i>ROOM_TIMEPROGRAM</i><br> <li><i>ROOM_TIMEPROGRAM</i><br>
time program for circuit 1<br>
select: '0' or 'HP_Optimized', '1' or 'Program_1', '2' or 'Program_2', '3' or 'Family', '4' or 'Morning', '5' or 'Evening', '6' or 'Seniors'</li> select: '0' or 'HP_Optimized', '1' or 'Program_1', '2' or 'Program_2', '3' or 'Family', '4' or 'Morning', '5' or 'Evening', '6' or 'Seniors'</li>
<li><i>ROOM_PROGRAM_MODE</i><br> <li><i>ROOM_PROGRAM_MODE</i><br>
select: '0' or 'Automatic', '1' or 'Off', '2' or 'Day', '3' or 'Night'</li> room program for circuit 1<br>
select: '0' or 'Automatic', '1' or 'Normal', '2' or 'Exception', '3' or 'HeatingOff'</li>
<li><i>ROOM_PROGRAM_1_1MON .. ROOM_PROGRAM_1_7SUN</i><br> <li><i>ROOM_PROGRAM_1_1MON .. ROOM_PROGRAM_1_7SUN</i><br>
times of Program_1 for circuit 1<br>
value: 06:00 on 21:00 off </li> value: 06:00 on 21:00 off </li>
<li><i>ROOM_PROGRAM_2_1MON .. ROOM_PROGRAM_2_7SUN</i><br> <li><i>ROOM_PROGRAM_2_1MON .. ROOM_PROGRAM_2_7SUN</i><br>
times of Program_2 for circuit 1<br>
value: 06:00 on 21:00 off </li> value: 06:00 on 21:00 off </li>
<li><i>MV_E12_EEPROM_TIME_PROGRAM</i><br>
time program for circuit 2<br>
select: '0' or 'HP_Optimized', '1' or 'Program_1', '2' or 'Program_2', '3' or 'Family', '4' or 'Morning', '5' or 'Evening', '6' or 'Seniors'</li>
<li><i>MV_E12_EEPROM_ROOM_PROGRAM_MODE</i><br>
room program for circuit 2<br>
select: '0' or 'Automatic', '1' or 'Normal', '2' or 'Exception', '3' or 'HeatingOff'</li>
<li><i>MV_E12_EEPROM_TIME_PROGRAM_1_1MON .. MV_E12_EEPROM_TIME_PROGRAM_1_7SUN</i><br>
times of Program_1 for circuit 2<br>
value: 06:00 on 21:00 off </li>
<li><i>MV_E12_EEPROM_TIME_PROGRAM_2_1MON .. MV_E12_EEPROM_TIME_PROGRAM_2_7SUN</i><br>
times of Program_2 for circuit 2<br>
value: 06:00 on 21:00 off </li>
<li><i>XDHW_STOP_TEMP</i><br>
extra hot water temperature</li>
<li><i>XDHW_TIME</i><br>
hours for extra hot water</li>
</ul> </ul>
</ul> </ul>
<br> <br>
@ -2845,10 +3025,18 @@ sub CAN_DoInit($)
Attributes: Attributes:
<ul> <ul>
<li><i>DoNotPoll</i> 0|1<br> <li><i>DoNotPoll</i> 0|1<br>
When you set DoNotPoll to "1", the module is only listening to the telegrams on CAN bus. Default is "0". When you set DoNotPoll to "1", the module is only listening to the telegrams on CAN bus. Default is "0".<br>
</li> </li>
<li><i>HeatCircuit2Active</i> 0|1<br> <li><i>HeatCircuit2Active</i> 0|1<br>
When you set HeatCircuit2Active to "1", the module read and set also the values for the second heating circuit E12. Default is "0". When you set HeatCircuit2Active to "1", the module read and set also the values for the second heating circuit E12. Default is "0".<br>
</li>
<li><i>AddToReadings</i> List of Variables<br>
additional variables, which are not polled by the module can by added here<br>
Example: attr myKM273 AddToReadings GT3_STATUS GT5_STATUS GT5_ANSLUTEN<br>
</li>
<li><i>AddToGetSet</i> List of Variables<br>
additional variables, which are not in get/set list definded by the module can by added here<br>
Example: attr myKM273 AddToGetSet ACCESS_LEVEL GT3_KORRIGERING GT5_KVITTERAD<br>
</li> </li>
</ul> </ul>
</ul> </ul>