2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-25 16:05:19 +00:00

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 33cd55d246
commit 15c3260796
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})) {
my ($vn, $vv) = split(':', $cv);
if (defined($vv)) {
$vv = $vv eq 'true' ? 1 : ($vv eq 'false' ? 0 : $vv);
$valList{$vn} = $vv;
$valIndex{$vv} = $vn;
}
@ -7145,7 +7146,7 @@ sub HMCCU_ExecuteRoleCommand ($@)
if ($ndpval > 0 && $ncfval == 0) { $opt = 'values'; }
elsif ($ndpval == 0 && $ncfval > 0) { $opt = 'config'; }
elsif ($ndpval > 0 && $ncfval > 0) { $opt = 'update'; }
if ($opt ne '') {
$chnAddr =~ s/:d$//;
my $resp = HMCCU_ExecuteGetParameterCommand ($ioHash, $clHash, $opt, [ $chnAddr ]);
@ -7574,6 +7575,46 @@ sub HMCCU_ExecuteGetExtValuesCommand ($@)
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
######################################################################
@ -8993,7 +9034,14 @@ sub HMCCU_ScaleValue ($$$$$;$)
$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}));
$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 {
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');
# 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
my ($add, $chn) = split(":", $hash->{ccuaddr});
@ -459,6 +459,11 @@ sub HMCCUCHN_Get ($@)
my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash);
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})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h);
}
@ -722,6 +727,11 @@ sub HMCCUCHN_Get ($@)
to the device.
If <i>filter-expr</i> is specified, only datapoints matching the expression are stored as readings.
</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/>
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

View File

@ -466,7 +466,7 @@ sub HMCCUDEV_Get ($@)
my $ccuflags = AttrVal ($name, 'ccuflags', 'null');
# 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
my @dpRList;
@ -509,6 +509,11 @@ sub HMCCUDEV_Get ($@)
my $result = HMCCU_ParamsetDescToStr ($ioHash, $hash);
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})) {
return HMCCU_ExecuteRoleCommand ($ioHash, $hash, 'get', $opt, $a, $h);
}
@ -705,6 +710,9 @@ sub HMCCUDEV_Get ($@)
</ul>
</li><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>
</li><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',
'auto' => 'V:AUTO_MODE:1',
'boost' => 'V:BOOST_MODE:#boost=on,off',
'week-program:VirtualDevices' => 'D:WEEK_PROGRAM_POINTER:#program',
'get week-program:VirtualDevices' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram'
'week-program' => 'D:WEEK_PROGRAM_POINTER:#program',
'get week-program' => 'D:WEEK_PROGRAM_POINTER:#program:HMCCU_DisplayWeekProgram'
},
'DIMMER' => {
'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',
'on' => 'V:CONTROL_MODE:1 V:SET_POINT_TEMPERATURE:30.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' => {
'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" => {
description => "Read list of CCU service messages",
syntax => "",