2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 06:39:11 +00:00

HMCCU: Disable initial device update

git-svn-id: https://svn.fhem.de/fhem/trunk@19373 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
zap 2019-05-11 15:18:23 +00:00
parent e3fd2c73ee
commit 6e8848d460
3 changed files with 66 additions and 11 deletions

View File

@ -1,5 +1,6 @@
# 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.
- bugfix: 88_HMCCU: Flag for disabling initial device update
- bugfix: 10_MYSENSORS_DEVICE: prevent fhem crashing by ack timeout
at higher verobse levels
- change: 98_Heating_Control.pm will be removed soon. Users will need to

View File

@ -4,7 +4,7 @@
#
# $Id$
#
# Version 4.3.014
# Version 4.3.015
#
# Module for communication between FHEM and Homematic CCU2/3.
#
@ -52,7 +52,7 @@ my %HMCCU_CUST_CHN_DEFAULTS;
my %HMCCU_CUST_DEV_DEFAULTS;
# HMCCU version
my $HMCCU_VERSION = '4.3.014';
my $HMCCU_VERSION = '4.3.015';
# Constants and default values
my $HMCCU_MAX_IOERRORS = 100;
@ -2639,9 +2639,12 @@ sub HMCCU_SetRPCState ($@)
my $st = $hash->{hmccu}{interfaces}{$i}{state};
$stc{$st}++ if (exists ($stc{$st}));
if ($hash->{hmccu}{interfaces}{$i}{manager} eq 'HMCCU') {
my $rpcFlags = AttrVal ($hash->{hmccu}{interfaces}{$i}{device}, 'ccuflags', 'null');
if ($rpcFlags !~ /noInitialUpdate/) {
$filter = defined ($filter) ? "$filter|$i" : $i;
}
}
}
# Determine overall process state
my $rpcstate = 'null';
@ -2659,7 +2662,7 @@ sub HMCCU_SetRPCState ($@)
DoTrigger ($name, "RPC server $rpcstate");
if ($rpcstate eq 'running') {
my ($c_ok, $c_err) = HMCCU_UpdateClients ($hash, '.*', 'Attr', 0, $filter);
HMCCU_Log ($hash, 2, "Updated devices. Success=$c_ok Failed=$c_err", undef);
HMCCU_Log ($hash, 2, "Updated devices for interface filter $filter. Success=$c_ok Failed=$c_err", undef);
}
}
}
@ -6813,6 +6816,7 @@ sub HMCCU_RPCGetConfig ($$$$)
return (-3, $result) if (!defined ($hmccu_hash));
return (-4, $result) if ($type ne 'HMCCU' && $hash->{ccudevstate} eq 'deleted');
my $hmccuflags = HMCCU_GetFlags ($hmccu_hash->{NAME});
my $ccuflags = HMCCU_GetFlags ($name);
my $ccureadings = AttrVal ($name, 'ccureadings', $ccuflags =~ /noReadings/ ? 0 : 1);
my $readingformat = HMCCU_GetAttrReadingFormat ($hash, $hmccu_hash);
@ -6834,7 +6838,7 @@ sub HMCCU_RPCGetConfig ($$$$)
if ($rpctype eq 'B') {
HMCCU_Trace ($hash, 2, $fnc, "Method=$method Addr=$addr Port=$port");
if ($ccuflags =~ /(extrpc|procrpc)/) {
if ($hmccuflags =~ /(extrpc|procrpc)/) {
$res = HMCCURPCPROC_SendRequest ($rpchash, $method, $BINRPC_STRING, $addr,
$BINRPC_STRING, "MASTER");
}
@ -6916,7 +6920,6 @@ sub HMCCU_RPCSetConfig ($$$)
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
my $ccuflags = HMCCU_GetFlags ($name);
my $addr;
my $res;
@ -6924,6 +6927,9 @@ sub HMCCU_RPCSetConfig ($$$)
return -3 if (!defined ($hmccu_hash));
return -4 if ($type ne 'HMCCU' && $hash->{ccudevstate} eq 'deleted');
my $hmccuflags = HMCCU_GetFlags ($hmccu_hash->{NAME});
my $ccuflags = HMCCU_GetFlags ($name);
my ($int, $add, $chn, $dpt, $nam, $flags) = HMCCU_ParseObject ($hmccu_hash, $param,
$HMCCU_FLAG_FULLADDR);
return -1 if (!($flags & $HMCCU_FLAG_ADDRESS));
@ -6954,7 +6960,7 @@ sub HMCCU_RPCSetConfig ($$$)
$binpar{$e}{V} = $parref->{$e};
}
if ($ccuflags =~ /(extrpc|procrpc)/) {
if ($hmccuflags =~ /(extrpc|procrpc)/) {
$res = HMCCURPCPROC_SendRequest ($rpchash, "putParamset", $BINRPC_STRING, $addr,
$BINRPC_STRING, "MASTER", $BINRPC_STRUCT, \%binpar);
}
@ -8400,7 +8406,7 @@ sub HMCCU_CCURPC_ListDevicesCB ($$)
procrpc - Use external RPC server provided by module HMCCPRPCPROC. During first RPC
server start HMCCU will create a HMCCURPCPROC device for each interface confiugured
in attribute 'rpcinterface'<br/>
reconnect - Automatically reconnect to CCU when events timeout occurred.
reconnect - Automatically reconnect to CCU when events timeout occurred.<br/>
Flags intrpc, extrpc and procrpc cannot be combined.
</li><br/>
<li><b>ccuget {State | <u>Value</u>}</b><br/>

View File

@ -4,7 +4,7 @@
#
# $Id$
#
# Version 1.7.001
# Version 1.7.002
#
# Subprocess based RPC Server module for HMCCU.
#
@ -158,6 +158,7 @@ sub HMCCURPCPROC_EventCB ($$$$$);
sub HMCCURPCPROC_ListDevicesCB ($$);
# Binary RPC encoding functions
sub HMCCURPCPROC_RPCNewValue ($$);
sub HMCCURPCPROC_EncInteger ($);
sub HMCCURPCPROC_EncBool ($);
sub HMCCURPCPROC_EncString ($);
@ -202,7 +203,7 @@ sub HMCCURPCPROC_Initialize ($)
$hash->{parseParams} = 1;
$hash->{AttrList} = "ccuflags:multiple-strict,expert,logEvents,ccuInit,queueEvents,noEvents".
$hash->{AttrList} = "ccuflags:multiple-strict,expert,logEvents,ccuInit,queueEvents,noEvents,noInitialUpdate".
" rpcMaxEvents rpcQueueSend rpcQueueSize rpcMaxIOErrors".
" rpcServerAddr rpcServerPort rpcWriteTimeout rpcAcceptTimeout".
" rpcConnTimeout rpcStatistics rpcEventTimeout rpcPingCCU ".
@ -2252,6 +2253,52 @@ sub HMCCURPCPROC_ListDevicesCB ($$)
return RPC::XML::array->new ();
}
######################################################################
# Convert value to RPC data type
# Valid types are bool, boolean, int, integer, float, double, string.
# If type is undefined, type is detected. If type cannot be detected
# value is returned as is.
######################################################################
sub HMCCURPCPROC_RPCNewValue ($$)
{
my ($value, $type) = @_;
# Try to detect type if type not specified
if (!defined ($type)) {
if (lc($value) =~ /^(true|false)$/) {
$type = 'boolean';
}
elsif ($value =~ /^[-+]?\d+$/) {
$type = 'integer';
}
elsif ($value =~ /^[-+]?[0-9]*\.[0-9]+$/) {
# A float must contain at least a dot followed by a digit
$type = 'float';
}
elsif ($value =~ /[a-zA-Z_ ]/ || $value =~ /^'.+'$/ || $value =~ /^".+"$/) {
$type = 'string';
}
}
if (defined ($type)) {
my $lcType = lc($type);
if ($lcType =~ /^bool/ && uc($value) =~ /^(TRUE|FALSE|0|1)$/) {
return RPC::XML::boolean->new ($value);
}
elsif ($lcType =~ /^int/ && $value =~ /^[-+]?\d+$/) {
return RPC::XML::int->new ($value);
}
elsif ($lcType =~ /^(float|double)$/ && $value =~ /^[-+]?[0-9]*\.[0-9]+$/) {
return RPC::XML::double->new ($value);
}
elsif ($lcType =~ /^str/) {
return RPC::XML::string->new ($value);
}
}
return $value;
}
######################################################################
# Binary RPC encoding functions
@ -2805,6 +2852,7 @@ sub HMCCURPCPROC_DecodeResponse ($)
expert - Activate expert mode<br/>
logEvents - Events are written into FHEM logfile if verbose is 4<br/>
noEvents - Ignore events from CCU, do not update client device readings.<br/>
noInitalUpdate - Do not update devices after RPC server started.<br/>
queueEvents - Always write events into queue and send them asynchronously to FHEM.
Frequency of event transmission to FHEM depends on attribute rpcConnTimeout.<br/>
</li><br/>