From c9faba6d32be421b3fd8c4a95ec5310745b7284f Mon Sep 17 00:00:00 2001 From: sailor-fhem <> Date: Tue, 13 Jan 2015 19:20:34 +0000 Subject: [PATCH] 73_km200.pm: New attribute DoNotPoll and German commandref. git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@7555 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/73_km200.pm | 554 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 405 insertions(+), 149 deletions(-) diff --git a/FHEM/73_km200.pm b/FHEM/73_km200.pm index 5b1b77fba..caa4981c8 100644 --- a/FHEM/73_km200.pm +++ b/FHEM/73_km200.pm @@ -1,4 +1,4 @@ -# $Id: 73_km200.pm 0035 2015-01-06 20:00:00Z Matthias_Deeke $ +# $Id: 73_km200.pm 0036 2015-01-13 16:00:00Z Matthias_Deeke $ ######################################################################################################################## # # 73_km200.pm @@ -40,94 +40,107 @@ # CHANGELOG # # Version Date Programmer Subroutine Description of Change -# 1.00 28.08.2014 Sailor All Initial Release for collaborative programming work -# 1.01 13.10.2014 Furban km200_Define Correcting "if (int(@a) == 6))" into "if (int(@a) == 6)" -# 1.01 13.10.2014 Furban km200_Define Changing "if ($url =~ m/^((\d\d\d[01]\d\d2[0-4]\d25[0-5])\.){3}(\d\d\d[01]\d\d2[0-4]\d25[0-5])$/)" into "if ($url =~ m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)" -# 1.02 20.10.2014 Sailor km200_Encrypt Swapping over to Crypt::Rijndael -# 1.02 20.10.2014 Sailor km200_Decrypt Swapping over to Crypt::Rijndael -# 1.03 21.10.2014 Sailor All Improving log3 functions for debugging -# 1.04 22.10.2014 Sailor All New function for get status and implementing export to Readings -# 1.05 23.10.2014 Sailor km200_Define Minimum interval changed to 20s since polling procedure lasts about 10s -# 1.05 23.10.2014 Sailor km200_Get New subroutine to receive individual data adhoc -# 1.06 25.10.2014 Sailor km200_Set First try -# 1.07 26.10.2014 Nobody0472 ALL Add FailSafe & Error Handling + KM50 + Interval in Definition -# 1.08 27.10.2014 Sailor km200_GetData Trying out whether "my $options = HTTP::Headers->new("Accept" => "application/json","User-Agent" => "TeleHeater/2.2.3", "agent" => "TeleHeater/2.2.3");" is the same as "$ua->agent('TeleHeater/2.2.3');" -# 1.08 27.10.2014 Sailor km200_Define Lot's of commenting in order to improve readability :-) -# 1.08 27.10.2014 Sailor km200_CompleteDataInit Improvement of console output for easier debugging -# 1.08 27.10.2014 Sailor =pod First Issue of description added -# 1.09 27.10.2014 Sailor km200_GetData Try-out Failed and original code re enabled for: "Trying out whether "my $options = HTTP::Headers->new("Accept" => "application/json","User-Agent" => "TeleHeater/2.2.3", "agent" => "TeleHeater/2.2.3");" is the same as "$ua->agent('TeleHeater/2.2.3');"" -# 1.09 27.10.2014 Nobody0472 km200_Attr First Issue -# 1.09 27.10.2014 Sailor km200_Attr Adapted to double interval attributes "IntervalDynVal" and "IntervalStatVal" -# 1.09 27.10.2014 Sailor km200_Define Adapted to double interval attributes "IntervalDynVal" and "IntervalStatVal" and deleted interval of being imported from the define line. -# 1.09 27.10.2014 Sailor km200_Define Created list of known static services -# 1.09 27.10.2014 Sailor km200_Define Calculated a list of responding services which are not static = responding dynamic services -# 1.09 27.10.2014 Sailor km200_CompleteDynData Subroutine km200_CompleteData renamed to "km200_CompleteDynData" and only downloading responding dynamic services -# 1.09 27.10.2014 Sailor km200_CompleteStatData Subroutine "km200_CompleteStatData" created only downloading responding static services -# 1.10 28.10.2014 Sailor km200_Define Attribute check moved to km200_Attr -# 1.10 28.10.2014 Sailor km200_Attr Attribute check included -# 1.10 28.10.2014 Sailor All Clear-ups for comments and unused debug - print commands -# 1.10 28.10.2014 Sailor km200_Define Decoding of passwords with base64 implemented to avoid bare passwords in fhem.cfg -# 1.11 31.10.2014 Sailor km200_Define Added "/heatingCircuits/hc2" and subordinates -# 1.11 31.10.2014 Sailor km200_CompleteDynData First try-outs with fork() command - FAILED! All fork() commands deleted -# 1.12 04.11.2014 Sailor ----------- Nearly all subroutines renamed! ----------------------------------------------------------------------------------------------------------------------- -# 1.12 04.11.2014 Sailor All Integration of HttpUtils_NonblockingGet(). Nearly all Subroutines renamed due to new functionality -# 1.13 05.11.2014 Sailor All Clearing up "print" and "log" command -# 1.13 05.11.2014 Sailor km200_ParseHttpResponseInit encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" -# 1.13 05.11.2014 Sailor km200_ParseHttpResponseDyn encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" -# 1.13 05.11.2014 Sailor km200_ParseHttpResponseStat encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" -# 1.13 05.11.2014 Sailor km200_GetSingleService New function used to obtain single value: HttpUtils_BlockingGet() -# 1.13 05.11.2014 Sailor km200_PostSingleService New function used to write single value: HttpUtils_BlockingGet() (Yes, even called "get" in the end, it allows to write (POST) as well -# 1.14 06.11.2014 Sailor km200_PostSingleService Set value works! But only if no background download of dynamic or static values is active the same time -# 1.15 06.11.2014 Sailor km200_Get Creating proper hash out of array of responding services -# 1.15 07.11.2014 Sailor km200_Set Creating proper hash out of array of writeable services -# 1.15 07.11.2014 Sailor km200_Initialize Adding DbLog_splitFn -# 1.15 07.11.2014 Sailor km200_DbLog_splitFn First try-out. print function temporarily disabled -# 1.15 07.11.2014 Sailor All Adding some print-commands for debugging -# 1.15 07.11.2014 Sailor km200_Set Starting with blocking flags -# 1.16 09.11.2014 Sailor km200_GetDynService Additional Log for debugging added -# 1.16 09.11.2014 Sailor km200_GetStatService Additional Log for debugging added -# 1.17 10.11.2014 Sailor km200_Initialize Corrected DbLog entry to $hash->{DbLog_splitFn} = "km200_DbLog_splitFn"; -# 1.17 10.11.2014 Sailor km200_Define Password logging deleted. Too dangerous as soon a user posts its log seeking for help since gateway password cannot be changed -# 1.17 10.11.2014 Sailor km200_Define Adding $hash->{DELAYDYNVAL} and $hash->{DELAYSTATVAL} to delay start of timer -# 1.17 10.11.2014 Sailor km200_Attr Adding $hash->{DELAYDYNVAL} and $hash->{DELAYSTATVAL} to delay start of timer -# 1.17 10.11.2014 Sailor km200_PostSingleService Error handling -# 1.17 10.11.2014 Sailor km200_GetSingleService Error handling -# 1.17 10.11.2014 Sailor km200_Define Added additional STATE information -# 1.17 10.11.2014 Sailor km200_GetDynService Added additional STATE information -# 1.17 10.11.2014 Sailor km200_GetStatService Added additional STATE information -# 1.18 10.11.2014 Sailor km200_Initialize Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_Define Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_Attr Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_PostSingleService Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_GetSingleService Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_GetInitService Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_GetDynService Implementing polling time-out attribute in $hash -# 1.18 10.11.2014 Sailor km200_GetStatService Implementing polling time-out attribute in $hash -# 1.19 14.11.2014 Sailor km200_GetInitService Log Level for data not being available downgraded to Level 4 -# 1.19 14.11.2014 Sailor km200_GetSingleService Log Level for data not being available downgraded to Level 4 -# 1.19 14.11.2014 Sailor =pod Description updated -# 1.20 14.11.2014 Sailor All Implement Console-Printouts only if attribute "ConsoleMessage" is set -# 1.21 09.12.2014 Sailor km200_GetDynService Catching JSON parsing errors in order to prevent fhem crashes -# 1.21 09.12.2014 Sailor km200_GetStatService Catching JSON parsing errors in order to prevent fhem crashes -# 1.21 09.12.2014 Sailor km200_GetInitService Catching JSON parsing errors in order to prevent fhem crashes -# 1.21 09.12.2014 Sailor km200_GetSingleService Catching JSON parsing errors in order to prevent fhem crashes -# 1.22 09.12.2014 Sailor All Small format corrections -# 1.23 12.12.2014 Sailor km200_Define Swapping service for test of communication from "/system/brand" to "/gateway/DateTime" -# 1.24 12.12.2014 Sailor km200_Initialize Deactivating $hash->{DbLog_splitFn} -# 1.25 07.01.2015 Sailor Comments Updating comments based on created WIKI -# 1.25 07.01.2015 Sailor km200_Attr BugFix around ConsoleMessage Attribute -# 1.25 07.01.2015 Sailor All Log Message of verbose level 2 improved -# 1.25 07.01.2015 Sailor =pod Bugfix to be joined in commandref +# 0010 28.08.2014 Sailor All Initial Release for collaborative programming work +# 0011 13.10.2014 Furban km200_Define Correcting "if (int(@a) == 6))" into "if (int(@a) == 6)" +# 0011 13.10.2014 Furban km200_Define Changing "if ($url =~ m/^((\d\d\d[01]\d\d2[0-4]\d25[0-5])\.){3}(\d\d\d[01]\d\d2[0-4]\d25[0-5])$/)" into "if ($url =~ m/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)" +# 0012 20.10.2014 Sailor km200_Encrypt Swapping over to Crypt::Rijndael +# 0012 20.10.2014 Sailor km200_Decrypt Swapping over to Crypt::Rijndael +# 0013 21.10.2014 Sailor All Improving log3 functions for debugging +# 0014 22.10.2014 Sailor All New function for get status and implementing export to Readings +# 0015 23.10.2014 Sailor km200_Define Minimum interval changed to 20s since polling procedure lasts about 10s +# 0015 23.10.2014 Sailor km200_Get New subroutine to receive individual data adhoc +# 0016 25.10.2014 Sailor km200_Set First try +# 0017 26.10.2014 Nobody0472 ALL Add FailSafe & Error Handling + KM50 + Interval in Definition +# 0018 27.10.2014 Sailor km200_GetData Trying out whether "my $options = HTTP::Headers->new("Accept" => "application/json","User-Agent" => "TeleHeater/2.2.3", "agent" => "TeleHeater/2.2.3");" is the same as "$ua->agent('TeleHeater/2.2.3');" +# 0018 27.10.2014 Sailor km200_Define Lot's of commenting in order to improve readability :-) +# 0018 27.10.2014 Sailor km200_CompleteDataInit Improvement of console output for easier debugging +# 0018 27.10.2014 Sailor =pod First Issue of description added +# 0019 27.10.2014 Sailor km200_GetData Try-out Failed and original code re enabled for: "Trying out whether "my $options = HTTP::Headers->new("Accept" => "application/json","User-Agent" => "TeleHeater/2.2.3", "agent" => "TeleHeater/2.2.3");" is the same as "$ua->agent('TeleHeater/2.2.3');"" +# 0019 27.10.2014 Nobody0472 km200_Attr First Issue +# 0019 27.10.2014 Sailor km200_Attr Adapted to double interval attributes "IntervalDynVal" and "IntervalStatVal" +# 0019 27.10.2014 Sailor km200_Define Adapted to double interval attributes "IntervalDynVal" and "IntervalStatVal" and deleted interval of being imported from the define line. +# 0019 27.10.2014 Sailor km200_Define Created list of known static services +# 0019 27.10.2014 Sailor km200_Define Calculated a list of responding services which are not static = responding dynamic services +# 0019 27.10.2014 Sailor km200_CompleteDynData Subroutine km200_CompleteData renamed to "km200_CompleteDynData" and only downloading responding dynamic services +# 0019 27.10.2014 Sailor km200_CompleteStatData Subroutine "km200_CompleteStatData" created only downloading responding static services +# 0020 28.10.2014 Sailor km200_Define Attribute check moved to km200_Attr +# 0020 28.10.2014 Sailor km200_Attr Attribute check included +# 0020 28.10.2014 Sailor All Clear-ups for comments and unused debug - print commands +# 0020 28.10.2014 Sailor km200_Define Decoding of passwords with base64 implemented to avoid bare passwords in fhem.cfg +# 0021 31.10.2014 Sailor km200_Define Added "/heatingCircuits/hc2" and subordinates +# 0021 31.10.2014 Sailor km200_CompleteDynData First try-outs with fork() command - FAILED! All fork() commands deleted +# 0022 04.11.2014 Sailor ----------- Nearly all subroutines renamed! ----------------------------------------------------------------------------------------------------------------------- +# 0022 04.11.2014 Sailor All Integration of HttpUtils_NonblockingGet(). Nearly all Subroutines renamed due to new functionality +# 0023 05.11.2014 Sailor All Clearing up "print" and "log" command +# 0023 05.11.2014 Sailor km200_ParseHttpResponseInit encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" +# 0023 05.11.2014 Sailor km200_ParseHttpResponseDyn encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" +# 0023 05.11.2014 Sailor km200_ParseHttpResponseStat encode_utf8() command added to avoid crashes with "/heatSources/flameCurrent" or "/system/appliance/flameCurrent" +# 0023 05.11.2014 Sailor km200_GetSingleService New function used to obtain single value: HttpUtils_BlockingGet() +# 0023 05.11.2014 Sailor km200_PostSingleService New function used to write single value: HttpUtils_BlockingGet() (Yes, even called "get" in the end, it allows to write (POST) as well +# 0024 06.11.2014 Sailor km200_PostSingleService Set value works! But only if no background download of dynamic or static values is active the same time +# 0025 06.11.2014 Sailor km200_Get Creating proper hash out of array of responding services +# 0025 07.11.2014 Sailor km200_Set Creating proper hash out of array of writeable services +# 0025 07.11.2014 Sailor km200_Initialize Adding DbLog_splitFn +# 0025 07.11.2014 Sailor km200_DbLog_splitFn First try-out. print function temporarily disabled +# 0025 07.11.2014 Sailor All Adding some print-commands for debugging +# 0025 07.11.2014 Sailor km200_Set Starting with blocking flags +# 0026 09.11.2014 Sailor km200_GetDynService Additional Log for debugging added +# 0026 09.11.2014 Sailor km200_GetStatService Additional Log for debugging added +# 0027 10.11.2014 Sailor km200_Initialize Corrected DbLog entry to $hash->{DbLog_splitFn} = "km200_DbLog_splitFn"; +# 0027 10.11.2014 Sailor km200_Define Password logging deleted. Too dangerous as soon a user posts its log seeking for help since gateway password cannot be changed +# 0027 10.11.2014 Sailor km200_Define Adding $hash->{DELAYDYNVAL} and $hash->{DELAYSTATVAL} to delay start of timer +# 0027 10.11.2014 Sailor km200_Attr Adding $hash->{DELAYDYNVAL} and $hash->{DELAYSTATVAL} to delay start of timer +# 0027 10.11.2014 Sailor km200_PostSingleService Error handling +# 0027 10.11.2014 Sailor km200_GetSingleService Error handling +# 0027 10.11.2014 Sailor km200_Define Added additional STATE information +# 0027 10.11.2014 Sailor km200_GetDynService Added additional STATE information +# 0027 10.11.2014 Sailor km200_GetStatService Added additional STATE information +# 0028 10.11.2014 Sailor km200_Initialize Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_Define Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_Attr Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_PostSingleService Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_GetSingleService Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_GetInitService Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_GetDynService Implementing polling time-out attribute in $hash +# 0028 10.11.2014 Sailor km200_GetStatService Implementing polling time-out attribute in $hash +# 0029 14.11.2014 Sailor km200_GetInitService Log Level for data not being available downgraded to Level 4 +# 0029 14.11.2014 Sailor km200_GetSingleService Log Level for data not being available downgraded to Level 4 +# 0029 14.11.2014 Sailor =pod Description updated +# 0030 14.11.2014 Sailor All Implement Console-Printouts only if attribute "ConsoleMessage" is set +# 0031 09.12.2014 Sailor km200_GetDynService Catching JSON parsing errors in order to prevent fhem crashes +# 0031 09.12.2014 Sailor km200_GetStatService Catching JSON parsing errors in order to prevent fhem crashes +# 0031 09.12.2014 Sailor km200_GetInitService Catching JSON parsing errors in order to prevent fhem crashes +# 0031 09.12.2014 Sailor km200_GetSingleService Catching JSON parsing errors in order to prevent fhem crashes +# 0032 09.12.2014 Sailor All Small format corrections +# 0033 12.12.2014 Sailor km200_Define Swapping service for test of communication from "/system/brand" to "/gateway/DateTime" +# 0034 12.12.2014 Sailor km200_Initialize Deactivating $hash->{DbLog_splitFn} +# 0035 07.01.2015 Sailor Comments Updating comments based on created WIKI +# 0035 07.01.2015 Sailor km200_Attr BugFix around ConsoleMessage Attribute +# 0035 07.01.2015 Sailor All Log Message of verbose level 2 improved +# 0035 07.01.2015 Sailor =pod Bug-fix to be joined in commandref +# 0036 13.01.2015 Sailor Comments Switched version system to fhem 4-digit version number scheme +# 0036 13.01.2015 Sailor km200_Define Switched version system to fhem 4-digit version number scheme +# 0036 13.01.2015 Sailor km200_Define Implementing DoNotPoll attribute +# 0036 13.01.2015 Sailor km200_Attribute Implementing DoNotPoll attribute +# 0036 13.01.2015 Sailor km200_GetInitService Implementing DoNotPoll attribute +# 0036 13.01.2015 Sailor km200_ParseHttpResponseInit Implementing DoNotPoll attribute +# 0036 13.01.2015 Sailor km200_Initialize Try-out DbLog Split (DbLog_Split is currently disabled) +# 0036 13.01.2015 Sailor km200_Define Preparing DbLog Split +# 0036 13.01.2015 Sailor km200_DbLog_splitFn Try-out DbLog Split +# 0036 13.01.2015 Sailor km200_GetSingleService Preparing DbLog Split +# 0036 13.01.2015 Sailor km200_GetInitService Preparing DbLog Split +# 0036 13.01.2015 Sailor km200_GetDynService Preparing DbLog Split +# 0036 13.01.2015 Sailor km200_GetStatService Preparing DbLog Split +# 0036 13.01.2015 Sailor =pod Correction of errors and German description added ######################################################################################################################## ######################################################################################################################## # List of open Problems: # -# *Many values in readings make no sense at all. -# SOLUTION: Manual disable values by user attribute that are of no use. -# # *DbLog: X_DbLog_splitFn not completely implemented in order to hand over the units of the readings to DbLog database +# Unfortunately the global %hash of this module will not be transferred to the DbLog function. Therefore this +# function is useless. # ######################################################################################################################## @@ -171,6 +184,7 @@ sub km200_Initialize($) "IntervalStatVal " . "PollingTimeout " . "ConsoleMessage " . + "DoNotPoll " . $readingFnAttributes; } ####END####### Initialize module ###############################################################################END##### @@ -186,14 +200,14 @@ sub km200_Define($$) my $url = $a[2]; my $km200_gateway_password = $a[3]; my $km200_private_password = $a[4]; - my $ModuleVersion = "v1.25"; + my $ModuleVersion = "0036"; $hash->{NAME} = $name; $hash->{STATE} = "define"; Log3 $name, 5, $name. " : km200 - Starting to define module with version: " . $ModuleVersion; - ###START###### Define provided services of gateway ########################################################START#### + ###START###### Define known services of gateway ###########################################################START#### my @KM200_AllServices = ( "/", "/gateway", @@ -316,6 +330,7 @@ sub km200_Define($$) "/system/appliance/ChimneySweeper", "/system/appliance/CHpumpModulation", "/system/appliance/flameCurrent", + "/system/appliance/flameStatus", "/system/appliance/gasAirPressure", "/system/appliance/nominalBurnerLoad", "/system/appliance/numberOfStarts", @@ -358,7 +373,6 @@ sub km200_Define($$) my @KM200_StatServices = ( "/gateway/uuid", - "/gateway/instAccess", "/gateway/versionFirmware", "/gateway/versionHardware", "/system/brand", @@ -366,7 +380,7 @@ sub km200_Define($$) "/system/info", "/system/systemType" ); - ####END####### Define provided services of gateway #########################################################END##### + ####END####### Define known services of gateway ############################################################END##### ###START### Check whether all variables are available #####################################################START#### @@ -502,6 +516,7 @@ sub km200_Define($$) $hash->{temp}{ServiceCounterInit} = 0; $hash->{temp}{ServiceCounterDyn} = 0; $hash->{temp}{ServiceCounterStat} = 0; + $hash->{temp}{ServiceDbLogSplitHash} = (); $hash->{status}{FlagInitRequest} = false; $hash->{status}{FlagGetRequest} = false; $hash->{status}{FlagSetRequest} = false; @@ -513,10 +528,12 @@ sub km200_Define($$) @{$hash->{Secret}{KM200STATSERVICES}} = @KM200_StatServices; @{$hash->{Secret}{KM200RESPONDINGSERVICES}} = (); @{$hash->{Secret}{KM200WRITEABLESERVICES}} = (); + @{$hash->{Secret}{KM200DONOTPOLL}} = (); ####END####### Writing values to global hash ################################################################END##### ###START###### For Debugging purpose only ##################################################################START#### + if ($hash->{CONSOLEMESSAGE} == true) {print("\n");} Log3 $name, 5, $name. " : km200 - Define H : " .$hash; Log3 $name, 5, $name. " : km200 - Define D : " .$def; Log3 $name, 5, $name. " : km200 - Define A : " .@a; @@ -553,26 +570,14 @@ sub km200_Define($$) Log3 $name, 5, $name. " : km200 - /gateway/DateTime : " .$Km200Info->{value}; ## Communication OK and service is available ## } ####END####### Check whether communication to the physical unit is possible ################################END##### - - ###START###### Get complete set of responding services and first time readings ############################START#### - if ($hash->{CONSOLEMESSAGE} == true) {print("\n");} - km200_GetInitService($hash); - ####END####### Get complete set of responding services and first time readings #############################END##### - - ###START###### Initiate the timer for continuous polling of dynamical values from KM200 but wait 60s ######START#### - InternalTimer(gettimeofday()+$hash->{DELAYDYNVAL}, "km200_GetDynService", $hash, 0); - Log3 $name, 5, $name. " : km200 - Internal timer for dynamic values prepared with default interval."; - ####END####### Initiate the timer for continuous polling of dynamical values from KM200 ####################END##### + ###START###### Initiate the timer for first time polling of values from KM200 but wait 5s ################START#### + InternalTimer(gettimeofday()+5, "km200_GetInitService", $hash, 0); + Log3 $name, 5, $name. " : km200 - Internal timer for Initialisation of services started for the first time."; + ####END####### Initiate the timer for first time polling of values from KM200 but wait 60s ################END##### + - - ###START###### Initiate the timer for continuous polling of static values from KM200 but wait 120s ########START#### - InternalTimer(gettimeofday()+$hash->{DELAYSTATVAL}, "km200_GetStatService", $hash, 0); - Log3 $name, 5, $name. " : km200 - Internal timer for static values prepared with default interval."; - ####END####### Initiate the timer for continuous polling of static values from KM200 #######################END##### - - ###START###### Set status of km200 fhem module to Initialized #############################################START#### $hash->{STATE}="Initialized"; ####END####### Set status of km200 fhem module to Initialized ##############################################END##### @@ -583,14 +588,23 @@ sub km200_Define($$) ###START###### To bind unit of value to DbLog entries #########################################################START#### -### This Function needs to be completed later sub km200_DbLog_split($) { my ($event) = @_; my ($reading, $value, $unit); -# print("km200_DbLog_splitFn - Test for event:" . $event ."\n"); + ### Get values being changed from hash +# $reading = $hash->{temp}{ServiceDbLogSplitHash}{id}; +# $value = $hash->{temp}{ServiceDbLogSplitHash}{value}; +# $unit = $hash->{temp}{ServiceDbLogSplitHash}{unit}; + ### Get values being changed from hash + +#print("DbLog_splitFn - event:" . $event . "; value: ". $value . "; unit: ". $unit . ".\n"); + ### Delete temporary json-hash for DbLog-Split +# $hash->{temp}{ServiceDbLogSplitHash} = (); + ### Delete temporary json-hash for DbLog-Split + return ($reading, $value, $unit); } ####END####### To bind unit of value to DbLog entries ##########################################################END##### @@ -625,6 +639,7 @@ sub km200_Attr(@) my $DelayDynVal = $hash->{DELAYDYNVAL}; my $DelayStatVal = $hash->{DELAYSTATVAL}; + ### Check whether dynamic interval attribute has been provided if($a[2] eq "IntervalDynVal") { @@ -669,11 +684,6 @@ sub km200_Attr(@) ####END#### Check whether polling interval is not too short } } - ### Check whether room attribute have been provided - elsif($a[2] eq "room") - { - ### Do nothing - } ### Check whether polling timeout attribute has been provided elsif($a[2] eq "PollingTimeout") { @@ -698,6 +708,7 @@ sub km200_Attr(@) { $hash->{CONSOLEMESSAGE} = true; Log3 $name, 5, $name. " : km200 - Console printouts enabled"; + print("\n"); } ### If messages on console shall NOT be visible else @@ -706,35 +717,51 @@ sub km200_Attr(@) Log3 $name, 5, $name. " : km200 - Console printouts disabled"; } } + ### Check whether DoNotPoll attribute have been provided + elsif($a[2] eq "DoNotPoll") + { + my @KM200_AllServices = @{$hash->{Secret}{KM200ALLSERVICES}}; + my @KM200_DONOTPOLL = (); + my @temp = @a; + splice @temp, 0, 3; + + ### Insert empty field as minimum entry + push @temp, ""; + + ### Transform string entries seperated by blank into array + @KM200_DONOTPOLL = split(/ /, $temp[0]); + + ### Save list of services not to be polled into hash + @{$hash->{Secret}{KM200DONOTPOLL}} = @KM200_DONOTPOLL; + + ###START### Stop the current timer + RemoveInternalTimer($hash); + ####END#### Stop the current timer + + ###START###### Filter all services not to be polled out of known services = AllServices (new) #############START#### + foreach my $SearchWord(@KM200_DONOTPOLL) + { + my $FoundPosition = first_index{ $_ eq $SearchWord }@KM200_AllServices; + if ($FoundPosition >= 0) + { + splice(@KM200_AllServices, $FoundPosition, 1); + } + } + @{$hash->{Secret}{KM200ALLSERVICES}} = @KM200_AllServices; + ####END####### Filter all services not to be polled out of known services = AllServices (new) ##############END##### + + Log3 $name, 5, $name. " : km200 - The following services will not be polled: ". @KM200_DONOTPOLL; + + ###START###### Initiate the timer for first time polling of values from KM200 but wait 5s ################START#### + InternalTimer(gettimeofday()+5, "km200_GetInitService", $hash, 0); + Log3 $name, 5, $name. " : km200 - Internal timer for Init of services restarted after services set by attribute not to be polled."; + ####END####### Initiate the timer for first time polling of values from KM200 but wait 60s ################END##### + } ### If no attributes of the above known ones have been selected else { - Log3 $name, 5, $name. " : km200 - Unknown attribute: $a[2]"; + Log3 $name, 2, $name. " : km200 - Unknown attribute: $a[2]"; } - - - ###START### Stop the current timer - RemoveInternalTimer($hash); - ####END#### Stop the current timer - - - ###START###### Initiate the timer for continuous polling of dynamical values from KM200 ###################START#### - InternalTimer(gettimeofday()+$DelayDynVal, "km200_GetDynService", $hash, 0); - Log3 $name, 4, $name. " : km200 - Define: InternalTimer for dynamic values started with interval of: ".$IntervalDynVal; - ####END####### Initiate the timer for continuous polling of dynamical values from KM200 ####################END##### - - - ###START###### Initiate the timer for continuous polling of static values from KM200 ######################START#### - if ($DisableStatValPolling == false) - { - InternalTimer(gettimeofday()+$DelayStatVal, "km200_GetStatService", $hash, 0); - Log3 $name, 4, $name. " : km200 - Define: InternalTimer for static values started with interval of: ".$IntervalStatVal; - } - else - { - Log3 $name, 4, $name. " : km200 - Define: No InternalTimer for static values since polling disabled by \"attr IntervalStatVal 0\" in fhem.cfg "; - } - ####END####### Initiate the timer for continuous polling of static values from KM200 #######################END##### return undef; } @@ -839,7 +866,6 @@ sub km200_Set($@) ### Call set sub km200_PostSingleService($hash); - km200_PostSingleService($hash); ### Return value my $ReturnValue = "The service " . $opt . " has been changed to: " . $value; @@ -1013,7 +1039,6 @@ sub km200_PostSingleService($) sub km200_GetSingleService($) { my ($hash, $def) = @_; - my $Service = $hash->{temp}{service}; my $km200_gateway_host = $hash->{URL}; my $name = $hash->{NAME}; @@ -1063,6 +1088,11 @@ sub km200_GetSingleService($) my $JsonType = $json->{type}; my $JsonValue = $json->{value}; + + ### Save json-hash for DbLog-Split + $hash->{temp}{ServiceDbLogSplitHash} = $json; + ### Save json-hash for DbLog-Split + ### Write reading for fhem readingsSingleUpdate( $hash, $JsonId, $JsonValue, 1); ### Write reading for fhem @@ -1105,6 +1135,19 @@ sub km200_GetInitService($) my $PollingTimeout = $hash->{POLLINGTIMEOUT}; my $Service = $KM200_InitServices[$ServiceCounterInit]; + + ### If this this loop is accessed for the first time, stop the timer + if ($ServiceCounterInit == 0) + { + ### Console Message if enabled + if ($hash->{CONSOLEMESSAGE} == true) {print("\n" . "Sounding and importing of services started\n");} + + ### Stop the current timer + RemoveInternalTimer($hash); + } + + + ### Get the values my $url ="http://" . $km200_gateway_host . $Service; my $param = { @@ -1180,6 +1223,10 @@ sub km200_ParseHttpResponseInit($) push (@KM200_RespondingServices, $Service); ### Add service to the list of responding services + ### Save json-hash for DbLog-Split + $hash->{temp}{ServiceDbLogSplitHash} = $json; + ### Save json-hash for DbLog-Split + ### Write reading for fhem readingsSingleUpdate( $hash, $JsonId, $JsonValue, 1); ### Write reading for fhem @@ -1251,6 +1298,28 @@ sub km200_ParseHttpResponseInit($) ### Save arrays of services in hash $hash->{status}{FlagInitRequest} = false; + + + ###START###### Initiate the timer for continuous polling of dynamical values from KM200 ###################START#### + InternalTimer(gettimeofday()+($hash->{INTERVALDYNVAL}), "km200_GetDynService", $hash, 0); + Log3 $name, 4, $name. " : km200 - Define: InternalTimer for dynamic values started with interval of: ".($hash->{INTERVALDYNVAL}); + ####END####### Initiate the timer for continuous polling of dynamical values from KM200 ####################END##### + + + ###START###### Initiate the timer for continuous polling of static values from KM200 ######################START#### + if ($hash->{DISABLESTATVALPOLLING} == false) + { + InternalTimer(gettimeofday()+($hash->{INTERVALSTATVAL}), "km200_GetStatService", $hash, 0); + Log3 $name, 4, $name. " : km200 - Define: InternalTimer for static values started with interval of: ".($hash->{INTERVALSTATVAL}); + } + else + { + Log3 $name, 4, $name. " : km200 - Define: No InternalTimer for static values since polling disabled by \"attr IntervalStatVal 0\" in fhem.cfg "; + } + ####END####### Initiate the timer for continuous polling of static values from KM200 #######################END##### + + ### Console Message if enabled + if ($hash->{CONSOLEMESSAGE} == true) {print("Sounding and importing of services is completed\n___________________________________________________________________________________________________\n\n");} } ### Clear up temporary variables $hash->{temp}{decodedcontent} = ""; @@ -1355,7 +1424,11 @@ sub km200_ParseHttpResponseDyn($) Log3 $name, 5, $name. " : km200_parseHttpResponseDyn: id : " .$JsonId; Log3 $name, 5, $name. " : km200_parseHttpResponseDyn: value : " .$JsonValue; ### Log entries for debugging purposes - + + ### Save json-hash for DbLog-Split + $hash->{temp}{ServiceDbLogSplitHash} = $json; + ### Save json-hash for DbLog-Split + ### Write reading readingsSingleUpdate( $hash, $JsonId, $JsonValue, 1); ### Write reading @@ -1389,7 +1462,7 @@ sub km200_ParseHttpResponseDyn($) { $hash->{STATE} = "Initialized"; $hash->{temp}{ServiceCounterDyn} = 0; - if ($hash->{CONSOLEMESSAGE} == true) {print ("Finished\n");} + if ($hash->{CONSOLEMESSAGE} == true) {print ("Finished\n___________________________________________________________________________________________________\n\n");} ###START###### Re-Start the timer #####################################START#### InternalTimer(gettimeofday()+$hash->{INTERVALDYNVAL}, "km200_GetDynService", $hash, 1); ####END####### Re-Start the timer ######################################END##### @@ -1414,12 +1487,12 @@ sub km200_GetStatService($) if (@KM200_StatServices != 0) { - my $Service = $KM200_StatServices[$ServiceCounterStat]; + my $Service = $KM200_StatServices[$ServiceCounterStat]; ### Console outputs for debugging purposes if ($ServiceCounterStat == 0) { - if ($hash->{CONSOLEMESSAGE} == true) {print("Starting download of static services\n");} + if ($hash->{CONSOLEMESSAGE} == true) {print("Starting download of static services\n");} } if ($hash->{CONSOLEMESSAGE} == true) {print("$Service\n");} @@ -1495,6 +1568,12 @@ sub km200_ParseHttpResponseStat($) Log3 $name, 5, $name. " : km200_parseHttpResponseStat: value : " .$JsonValue; ### Log entries for debugging purposes + + ### Save json-hash for DbLog-Split + $hash->{temp}{ServiceDbLogSplitHash} = $json; + ### Save json-hash for DbLog-Split + + ### Write reading readingsSingleUpdate( $hash, $JsonId, $JsonValue, 1); ### Write reading @@ -1527,7 +1606,8 @@ sub km200_ParseHttpResponseStat($) { $hash->{STATE} = "Initialized"; $hash->{temp}{ServiceCounterStat} = 0; - if ($hash->{CONSOLEMESSAGE} == true) {print ("Finished\n");} + if ($hash->{CONSOLEMESSAGE} == true) {print ("Finished\n___________________________________________________________________________________________________\n\n");} + ###START###### Re-Start the timer #####################################START#### InternalTimer(gettimeofday()+$hash->{INTERVALSTATVAL}, "km200_GetStatService", $hash, 1); ####END####### Re-Start the timer ######################################END##### @@ -1579,7 +1659,7 @@ sub km200_ParseHttpResponseStat($)
<name> : | The name of the device. Recommendation: "myKm200". |
<IPv4-address> : | A valid IPv4 address of the KM200 router. You might look into your browser which DHCP address has been given to the KM200/KM50. |
<IPv4-address> : | A valid IPv4 address of the KM200. You might look into your router which DHCP address has been given to the KM200/KM50. |
<GatewayPassword> : | The gateway password which is provided on the type sign of the KM200/KM50. |
<PrivatePassword> : | The private password which has been defined by the user via EasyControl. |
<service>
: /heatingCircuits/hc1/operationMode
"IntervalDynVal
: PollingTimeout
: + | |
DoNotPoll : | A list of services separated by blanks which shall not be downloaded due to repeatable crashes or irrelevant values. + The default value (empty) therefore nothing will be ignored. + |
+ The Buderus KM200 or KM50 is a communication device to establish a connection between the Buderus central heating control unit and the internet. + It has been designed in order to allow the inhabitants accessing their heating system via his Buderus App EasyControl. + Furthermore it allows the maintenance companies to access the central heating control system to read and change settings. + The km200 module enables read/write access to these parameters. + + In order to use the KM200 or KM50 with fhem, you must define the private password with the Buderus App EasyControl first. + + Remark: + Despite the instruction of the Buderus KM200 Installation guide, the ports 5222 and 5223 should not be opened and allow access to the KM200/KM50 module from outside. + You should configure (or leave) your internet router with the respective settings. + If you want to read or change settings on the heating system, you should access the central heating control system via your fhem system only. + + As soon the module has been defined within the fhem.cfg, the module is trying to obtain all known/possible services. + After this initial contact, the module differs between a set of continuous (dynamically) changing values (e.g.: temperatures) and not changing static values (e.g.: Firmware version). + This two different set of values can be bound to an individual polling interval. Refer to Attributes + + |
+
Define |
define <name> km200 <IPv4-address> <GatewayPassword> <PrivatePassword> |
<name> : | Der Name des Gerätes. Empfehlung: "myKm200". |
<IPv4-address> : | |
<GatewayPassword> : | Das gateway Passwort, welches au dem Typenschild des KM200/KM50 zu finden ist. |
<PrivatePassword> : | Das private Passwort, welches durch den user mit Hilfe der EasyControl - App vergeben wurde. |
set <service> <value> |
<service> : | Der Name des Service welcher gesetzt werden soll. Z.B.: "/heatingCircuits/hc1/operationMode " |
<value> : | Ein gültiger Wert für diesen Service. |
get <service> |
<service> : | Der Name des Service welcher ausgelesen werden soll. Z.B.: "/heatingCircuits/hc1/operationMode "+ Es gibt nur den Wert, aber nicht die Werteliste oder den möglichen Wertebereich zurück. + |
+
Attributes |
+
+ |
+ | |
IntervalDynVal : | Ein gültiges Abfrageintervall für die sich ständig verändernden - dynamischen Werte der KM200/KM50 Services. Der Wert muss größer gleich >=20s sein um dem Modul genügend Zeit einzuräumen eine volle Abfrage auszuführen bevor die nächste Abfrage startet. + Der Default-Wert ist 90s. + |
+ | |
IntervalStatVal : | Ein gültiges Abfrageintervall für die statischen Werte des KM200/KM50. Der Wert muss größer gleich >=20s sein um dem Modul genügend Zeit einzuräumen eine volle Abfrage auszuführen bevor die nächste Abfrage startet. + Der Default-Wert ist 3600s. + Der Wert "0" deaktiviert die wiederholte Abfrage der statischen Werte bis das fhem-System erneut gestartet wird oder die fhem.cfg neu geladen wird. + |
+ | |
PollingTimeout : | Ein gültiger Zeitwert um dem KM200/KM50 genügend Zeit zur Antwort einzelner Werte einzuräumen. Normalerweise braucht dieser Wert nicht verändert werden, muss jedoch im Falle eines langsamen Netzwerks erhöht werden + Der Default-Wert ist 5s. + |
+ | |
ConsoleMessage : | Ein gültiger Boolean Wert (0 oder 1) welcher die Aktivitäten und Fehlermeldungen des Modul in der Konsole ausgibt. "0" (Deaktiviert) or "1" (Aktiviert) + Der Default-Wert ist 0 (Deaktiviert). + |
+ | |
DoNotPoll : | Eine durch Leerzeichen (Blank) getrennte Liste von Services welche von der Abfrage aufgrund irrelevanter Werte oder fhem - Abstürzen ausgenommen werden sollen. + Der Default Wert ist (empty) somit werden alle bekannten Services abgefragt. + |