HMCCU: read metadata
git-svn-id: https://svn.fhem.de/fhem/trunk@28673 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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 <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/>
|
<li><b>get <name> 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
|
||||||
|
|||||||
@@ -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 <name> extValues [<filter-expr>]</b><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>
|
<a href="#HMCCUCHNget">see HMCCUCHN</a>
|
||||||
</li><br/>
|
</li><br/>
|
||||||
<li><b>get <name> update [{State | <u>Value</u>}]</b><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',
|
'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 => "",
|
||||||
|
|||||||
Reference in New Issue
Block a user