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:
parent
33cd55d246
commit
15c3260796
@ -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");
|
||||
|
@ -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 <name> metaData [<filter-expr>]</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 <name> 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
|
||||
|
@ -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 <name> extValues [<filter-expr>]</b><br/>
|
||||
<a href="#HMCCUCHNget">see HMCCUCHN</a>
|
||||
</li><br/>
|
||||
<li><b>get <name> metaData [<filter-expr>]</b><br/>
|
||||
<a href="#HMCCUCHNget">see HMCCUCHN</a>
|
||||
</li><br/>
|
||||
<li><b>get <name> update [{State | <u>Value</u>}]</b><br/>
|
||||
|
@ -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 => "",
|
||||
|
Loading…
x
Reference in New Issue
Block a user