HMCCU: read metadata

git-svn-id: https://svn.fhem.de/fhem/trunk@28673 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
zap
2024-03-17 10:52:10 +00:00
parent b87b847bdb
commit 030923a78e
4 changed files with 129 additions and 7 deletions

View File

@@ -4341,6 +4341,7 @@ sub HMCCU_GetEnumValues ($$$$;$$)
foreach my $cv (split(',', $HMCCU_STATECONTROL->{$role}{V})) { foreach my $cv (split(',', $HMCCU_STATECONTROL->{$role}{V})) {
my ($vn, $vv) = split(':', $cv); my ($vn, $vv) = split(':', $cv);
if (defined($vv)) { if (defined($vv)) {
$vv = $vv eq 'true' ? 1 : ($vv eq 'false' ? 0 : $vv);
$valList{$vn} = $vv; $valList{$vn} = $vv;
$valIndex{$vv} = $vn; $valIndex{$vv} = $vn;
} }
@@ -7145,7 +7146,7 @@ sub HMCCU_ExecuteRoleCommand ($@)
if ($ndpval > 0 && $ncfval == 0) { $opt = 'values'; } if ($ndpval > 0 && $ncfval == 0) { $opt = 'values'; }
elsif ($ndpval == 0 && $ncfval > 0) { $opt = 'config'; } elsif ($ndpval == 0 && $ncfval > 0) { $opt = 'config'; }
elsif ($ndpval > 0 && $ncfval > 0) { $opt = 'update'; } elsif ($ndpval > 0 && $ncfval > 0) { $opt = 'update'; }
if ($opt ne '') { if ($opt ne '') {
$chnAddr =~ s/:d$//; $chnAddr =~ s/:d$//;
my $resp = HMCCU_ExecuteGetParameterCommand ($ioHash, $clHash, $opt, [ $chnAddr ]); my $resp = HMCCU_ExecuteGetParameterCommand ($ioHash, $clHash, $opt, [ $chnAddr ]);
@@ -7574,6 +7575,46 @@ sub HMCCU_ExecuteGetExtValuesCommand ($@)
return HMCCU_UpdateClients ($ioHash, $devexp, $ccuget, $ifname, $nonBlock); return HMCCU_UpdateClients ($ioHash, $devexp, $ccuget, $ifname, $nonBlock);
} }
######################################################################
# Read meta data of device or channel
######################################################################
sub HMCCU_ExecuteGetMetaDataCommand ($@)
{
my ($ioHash, $clHash, $filter) = @_;
$filter //= '.*';
my $response = HMCCU_HMScriptExt ($ioHash, '!GetMetaData', { name => $clHash->{ccuname} });
return (-2, $response) if ($response eq '' || $response =~ /^ERROR:.*/);
my %readings;
my $count = 0;
my $result = '';
foreach my $meta (split /[\n\r]+/, $response) {
# Array values: 0=dataId, 1=value
my ($address, $dataId, $value) = split /=/, $meta;
if (!defined($dataId)) {
# Return error message from script
return (-2, $address) if (defined($address));
next;
}
next if ($dataId !~ /$filter/);
$value //= '';
my ($devAddr, $chnNo) = HMCCU_SplitChnAddr ($address);
my $rn = HMCCU_CorrectName ($dataId);
$rn = "$chnNo.$rn" if ($chnNo ne '' && $clHash->{TYPE} eq 'HMCCUDEV');
my $rv = HMCCU_ISO2UTF ($value);
$readings{$rn} = HMCCU_FormatReadingValue ($clHash, $rv, $dataId);
$result .= "$rn=$rv\n";
$count++;
}
HMCCU_UpdateReadings ($clHash, \%readings) if ($count > 0);
return ($count, $count > 0 ? $result: 'OK');
}
###################################################################### ######################################################################
# Convert results into a readable format # Convert results into a readable format
###################################################################### ######################################################################
@@ -8993,7 +9034,14 @@ sub HMCCU_ScaleValue ($$$$$;$)
$min = $paramDef->{MIN} if (defined($paramDef->{MIN}) && $paramDef->{MIN} ne '' && HMCCU_IsFltNum($paramDef->{MIN})); $min = $paramDef->{MIN} if (defined($paramDef->{MIN}) && $paramDef->{MIN} ne '' && HMCCU_IsFltNum($paramDef->{MIN}));
$max = $paramDef->{MAX} if (defined($paramDef->{MAX}) && $paramDef->{MAX} ne '' && HMCCU_IsFltNum($paramDef->{MAX})); $max = $paramDef->{MAX} if (defined($paramDef->{MAX}) && $paramDef->{MAX} ne '' && HMCCU_IsFltNum($paramDef->{MAX}));
$unit = $paramDef->{UNIT}; $unit = $paramDef->{UNIT};
$unit = '100%' if (!defined($unit) && ($dpt eq 'LEVEL' || $dpt eq 'LEVEL_2' || $dpt eq 'LEVEL_SLATS')); if (!defined($unit)) {
if ($dpt eq 'LEVEL' || $dpt eq 'LEVEL_2' || $dpt eq 'LEVEL_SLATS') {
$unit = '100%';
}
elsif ($dpt =~ /^P[0-9]_ENDTIME_/ && defined($max) && $max == 1440) {
$unit = 'minutes';
}
}
} }
else { else {
HMCCU_Trace ($hash, 2, "Can't get parameter definion for addr=$ccuaddr chn=$chnno dpt=$dpt"); HMCCU_Trace ($hash, 2, "Can't get parameter definion for addr=$ccuaddr chn=$chnno dpt=$dpt");

View File

@@ -418,7 +418,7 @@ sub HMCCUCHN_Get ($@)
my $ccuflags = AttrVal ($name, 'ccuflags', 'null'); my $ccuflags = AttrVal ($name, 'ccuflags', 'null');
# Build set command syntax # Build set command syntax
my $syntax = 'update config paramsetDesc:noArg deviceInfo:noArg values extValues'; my $syntax = 'update config paramsetDesc:noArg deviceInfo:noArg values extValues metaData';
# Command datapoint depends on readable datapoints # Command datapoint depends on readable datapoints
my ($add, $chn) = split(":", $hash->{ccuaddr}); my ($add, $chn) = split(":", $hash->{ccuaddr});
@@ -459,6 +459,11 @@ sub HMCCUCHN_Get ($@)
my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash); my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash);
return defined($result) ? $result : HMCCU_SetError ($hash, "Can't get device model"); return defined($result) ? $result : HMCCU_SetError ($hash, "Can't get device model");
} }
elsif ($lcopt eq 'metadata') {
my $filter = shift @$a;
my ($rc, $result) = HMCCU_ExecuteGetMetaDataCommand ($ioHash, $hash, $filter);
return $rc < 0 ? HMCCU_SetError ($hash, $rc, $result) : $result;
}
elsif (exists($hash->{hmccu}{roleCmds}{get}{$opt})) { elsif (exists($hash->{hmccu}{roleCmds}{get}{$opt})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h); return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h);
} }
@@ -722,6 +727,11 @@ sub HMCCUCHN_Get ($@)
to the device. to the device.
If <i>filter-expr</i> is specified, only datapoints matching the expression are stored as readings. If <i>filter-expr</i> is specified, only datapoints matching the expression are stored as readings.
</li><br/> </li><br/>
<li><b>get &lt;name&gt; metaData [&lt;filter-expr&gt;]</b><br/>
Read meta data for device or channel. If <i>filter-expr</i> is specified only meta data IDs matching
the specified regular expression are stored as readings.<br/>
Example: get myDev metaData energy.*
</li><br/>
<li><b>get &lt;name&gt; paramsetDesc</b><br/> <li><b>get &lt;name&gt; paramsetDesc</b><br/>
Display description of parameter sets of channel and device. The output of this command Display description of parameter sets of channel and device. The output of this command
is helpful to gather information about new / not yet supported devices. Please add this is helpful to gather information about new / not yet supported devices. Please add this

View File

@@ -466,7 +466,7 @@ sub HMCCUDEV_Get ($@)
my $ccuflags = AttrVal ($name, 'ccuflags', 'null'); my $ccuflags = AttrVal ($name, 'ccuflags', 'null');
# Build set command syntax # Build set command syntax
my $syntax = 'update config paramsetDesc:noArg deviceInfo:noArg values extValues'; my $syntax = 'update config paramsetDesc:noArg deviceInfo:noArg values extValues metaData';
# Command datapoint depends on readable datapoints # Command datapoint depends on readable datapoints
my @dpRList; my @dpRList;
@@ -509,6 +509,11 @@ sub HMCCUDEV_Get ($@)
my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash); my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash);
return defined($result) ? $result : HMCCU_SetError ($hash, "Can't get device model"); return defined($result) ? $result : HMCCU_SetError ($hash, "Can't get device model");
} }
elsif ($lcopt eq 'metadata') {
my $filter = shift @$a;
my ($rc, $result) = HMCCU_ExecuteGetMetaDataCommand ($ioHash, $hash, $filter);
return $rc < 0 ? HMCCU_SetError ($hash, $rc, $result) : $result;
}
elsif (exists($hash->{hmccu}{roleCmds}{get}{$opt})) { elsif (exists($hash->{hmccu}{roleCmds}{get}{$opt})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h); return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h);
} }
@@ -705,6 +710,9 @@ sub HMCCUDEV_Get ($@)
</ul> </ul>
</li><br/> </li><br/>
<li><b>get &lt;name&gt; extValues [&lt;filter-expr&gt;]</b><br/> <li><b>get &lt;name&gt; extValues [&lt;filter-expr&gt;]</b><br/>
<a href="#HMCCUCHNget">see HMCCUCHN</a>
</li><br/>
<li><b>get &lt;name&gt; metaData [&lt;filter-expr&gt;]</b><br/>
<a href="#HMCCUCHNget">see HMCCUCHN</a> <a href="#HMCCUCHNget">see HMCCUCHN</a>
</li><br/> </li><br/>
<li><b>get &lt;name&gt; update [{State | <u>Value</u>}]</b><br/> <li><b>get &lt;name&gt; update [{State | <u>Value</u>}]</b><br/>

View File

@@ -430,8 +430,8 @@ $HMCCU_CONFIG_VERSION = '5.0';
'off' => 'V:MANU_MODE:4.5', 'off' => 'V:MANU_MODE:4.5',
'auto' => 'V:AUTO_MODE:1', 'auto' => 'V:AUTO_MODE:1',
'boost' => 'V:BOOST_MODE:#boost=on,off', 'boost' => 'V:BOOST_MODE:#boost=on,off',
'week-program:VirtualDevices' => 'D:WEEK_PROGRAM_POINTER:#program', 'week-program' => 'D:WEEK_PROGRAM_POINTER:#program',
'get week-program:VirtualDevices' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram' 'get week-program' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram'
}, },
'DIMMER' => { 'DIMMER' => {
'pct' => '3:V:LEVEL:?level 1:V:ON_TIME:?time=0.0 2:V:RAMP_TIME:?ramp=0.5', 'pct' => '3:V:LEVEL:?level 1:V:ON_TIME:?time=0.0 2:V:RAMP_TIME:?ramp=0.5',
@@ -484,7 +484,9 @@ $HMCCU_CONFIG_VERSION = '5.0';
'boost' => 'V:BOOST_MODE:#boost=on,off', 'boost' => 'V:BOOST_MODE:#boost=on,off',
'on' => 'V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:30.5', 'on' => 'V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:30.5',
'off' => 'V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:4.5', 'off' => 'V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:4.5',
'week-program' => 'V:ACTIVE_PROFILE:#profile=1,2,3' 'week-program' => 'V:ACTIVE_PROFILE:#profile=1,2,3',
# For getting parameters from MASTER paramset the parameter is not used. But it must be a valid parameter of the role
'get week-program' => 'M:P1_ENDTIME_MONDAY_1:#profile=1,2,3:HMCCU_DisplayWeekProgram'
}, },
'JALOUSIE' => { 'JALOUSIE' => {
'pct' => 'V:LEVEL:?level', 'pct' => 'V:LEVEL:?level',
@@ -2364,6 +2366,60 @@ if(lResult == 0) {
} }
) )
}, },
"GetMetaData" => {
description => "Read metadata of device or channel",
syntax => "name",
parameters => 1,
code => qq(
string name = "\$name";
string ignore = "AUTOCONF,DEVDESC,MASTERDESC,LINKCOUNT,PARAMSETS";
string dataId;
object hmObj = dom.GetObject(name);
if (hmObj) {
if (hmObj.IsTypeOf(OT_CHANNEL) || hmObj.IsTypeOf(OT_DEVICE)) {
string dataIdList = hmObj.EnumMetaData();
string address = hmObj.Address();
foreach (dataId, dataIdList.Split(' ')) {
if (!ignore.Contains(dataId)) {
string metaVal = hmObj.MetaData(dataId);
WriteLine(address # '=' # dataId # '=' # metaVal);
}
}
if (hmObj.IsTypeOf(OT_DEVICE)) {
string chnid;
foreach (chnid, hmObj.Channels()) {
object chnObj = dom.GetObject(chnid);
if (chnObj) {
string address = chnObj.Address();
string dataIdList = chnObj.EnumMetaData();
foreach (dataId, dataIdList.Split(' ')) {
if (!ignore.Contains(dataId)) {
string metaVal = chnObj.MetaData(dataId);
WriteLine(address # '=' # dataId # '=' # metaVal);
}
}
}
}
}
}
else {
WriteLine(name # " is no device or channel");
}
}
else {
WriteLine("Device or channel " # name # " not found");
}
)
},
"AddMetaData" => {
description => "Add metadata to channel",
syntax => "name key value",
parameters => 3,
code => qq(
object chnObj = channels.Get("\$name");
chnObj.AddMetaData("\$key", "\$value");
)
},
"GetServiceMessages" => { "GetServiceMessages" => {
description => "Read list of CCU service messages", description => "Read list of CCU service messages",
syntax => "", syntax => "",