mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
98_powerMap: new attribute eventChainWarnOnly
git-svn-id: https://svn.fhem.de/fhem/trunk@13186 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
4a83085e5a
commit
59f89fad99
@ -47,8 +47,8 @@ sub powerMap_Notify($$);
|
|||||||
sub powerMap_AttrVal($$$$);
|
sub powerMap_AttrVal($$$$);
|
||||||
sub powerMap_load($$;$$);
|
sub powerMap_load($$;$$);
|
||||||
sub powerMap_unload($$);
|
sub powerMap_unload($$);
|
||||||
sub powerMap_findPowerMaps(;$);
|
sub powerMap_findPowerMaps($;$);
|
||||||
sub powerMap_verifyEventChain($$);
|
sub powerMap_verifyEventChain($$$);
|
||||||
sub powerMap_power($$$;$);
|
sub powerMap_power($$$;$);
|
||||||
sub powerMap_energy($$;$);
|
sub powerMap_energy($$;$);
|
||||||
sub powerMap_update($;$);
|
sub powerMap_update($;$);
|
||||||
@ -545,7 +545,12 @@ sub powerMap_Initialize($) {
|
|||||||
$hash->{NotifyFn} = $TYPE . "_Notify";
|
$hash->{NotifyFn} = $TYPE . "_Notify";
|
||||||
|
|
||||||
$hash->{AttrList} =
|
$hash->{AttrList} =
|
||||||
"disable:1,0 " . $TYPE . "_gridV:230,110 " . $readingFnAttributes;
|
"disable:1,0 "
|
||||||
|
. $TYPE
|
||||||
|
. "_gridV:230,110 "
|
||||||
|
. $TYPE
|
||||||
|
. "_eventChainWarnOnly:1,0 "
|
||||||
|
. $readingFnAttributes;
|
||||||
|
|
||||||
addToAttrList( $TYPE . "_noEnergy:1,0" );
|
addToAttrList( $TYPE . "_noEnergy:1,0" );
|
||||||
addToAttrList( $TYPE . "_noPower:1,0" );
|
addToAttrList( $TYPE . "_noPower:1,0" );
|
||||||
@ -604,7 +609,7 @@ sub powerMap_Set($@) {
|
|||||||
my $value = join( " ", @a ) if (@a);
|
my $value = join( " ", @a ) if (@a);
|
||||||
|
|
||||||
my $assign;
|
my $assign;
|
||||||
my $maps = powerMap_findPowerMaps();
|
my $maps = powerMap_findPowerMaps($name);
|
||||||
foreach ( sort keys %{$maps} ) {
|
foreach ( sort keys %{$maps} ) {
|
||||||
$assign .= "," if ($assign);
|
$assign .= "," if ($assign);
|
||||||
$assign .= $_;
|
$assign .= $_;
|
||||||
@ -671,7 +676,7 @@ sub powerMap_Get($@) {
|
|||||||
my $ret;
|
my $ret;
|
||||||
|
|
||||||
if ( $argument eq "devices" ) {
|
if ( $argument eq "devices" ) {
|
||||||
my $pmdevs = powerMap_findPowerMaps(":PM_ENABLED");
|
my $pmdevs = powerMap_findPowerMaps( $name, ":PM_ENABLED" );
|
||||||
return keys %{$pmdevs}
|
return keys %{$pmdevs}
|
||||||
? join( "\n", sort keys %{$pmdevs} )
|
? join( "\n", sort keys %{$pmdevs} )
|
||||||
: "No powerMap enabled devices found.";
|
: "No powerMap enabled devices found.";
|
||||||
@ -735,7 +740,8 @@ sub powerMap_Notify($$) {
|
|||||||
|
|
||||||
# initialize or terminate powerMap for each device
|
# initialize or terminate powerMap for each device
|
||||||
if ( $event =~ /^(INITIALIZED|SHUTDOWN)$/ ) {
|
if ( $event =~ /^(INITIALIZED|SHUTDOWN)$/ ) {
|
||||||
foreach ( keys %{ powerMap_findPowerMaps(":PM_$1") } ) {
|
foreach ( keys %{ powerMap_findPowerMaps( $name, ":PM_$1" ) } )
|
||||||
|
{
|
||||||
next
|
next
|
||||||
if ( $_ eq "global"
|
if ( $_ eq "global"
|
||||||
or $_ eq $name
|
or $_ eq $name
|
||||||
@ -982,6 +988,7 @@ sub powerMap_load($$;$$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$dev_hash->{$TYPE}{map} = $map;
|
$dev_hash->{$TYPE}{map} = $map;
|
||||||
|
powerMap_verifyEventChain( $name, $dev, $map );
|
||||||
return powerMap_update("$name|$dev");
|
return powerMap_update("$name|$dev");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -997,22 +1004,25 @@ sub powerMap_unload($$) {
|
|||||||
return powerMap_load( $n, $d, 1 );
|
return powerMap_load( $n, $d, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
sub powerMap_findPowerMaps(;$) {
|
sub powerMap_findPowerMaps($;$) {
|
||||||
my ($device) = @_;
|
my ( $name, $dev ) = @_;
|
||||||
my %maps;
|
my %maps;
|
||||||
|
|
||||||
# directly return any existing device specific definition
|
# directly return any existing device specific definition
|
||||||
if ( $device && $device !~ /^:/ ) {
|
if ( $dev && $dev !~ /^:/ ) {
|
||||||
return {}
|
return {}
|
||||||
unless ( defined( $defs{$device} )
|
unless ( defined( $defs{$dev} )
|
||||||
&& defined( $defs{$device}{TYPE} ) );
|
&& defined( $defs{$dev}{TYPE} ) );
|
||||||
|
|
||||||
return $defs{$device}{powerMap}{map}
|
return $defs{$dev}{powerMap}{map}
|
||||||
if ( $defs{$device}{powerMap}{map}
|
if (
|
||||||
&& ref( $defs{$device}{powerMap}{map} ) eq "HASH"
|
$defs{$dev}{powerMap}{map}
|
||||||
&& keys %{ $defs{$device}{powerMap}{map} }
|
&& ref( $defs{$dev}{powerMap}{map} ) eq "HASH"
|
||||||
&& powerMap_verifyEventChain( $device,
|
&& keys %{ $defs{$dev}{powerMap}{map} }
|
||||||
$defs{$device}{powerMap}{map} ) );
|
&& powerMap_verifyEventChain(
|
||||||
|
$name, $dev, $defs{$dev}{powerMap}{map}
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
# get all devices with direct powerMap definitions
|
# get all devices with direct powerMap definitions
|
||||||
@ -1024,16 +1034,18 @@ sub powerMap_findPowerMaps(;$) {
|
|||||||
&& keys %{ $defs{$_}{powerMap}{map} } );
|
&& keys %{ $defs{$_}{powerMap}{map} } );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $device && $device eq ":PM_INITIALIZED" ) {
|
# during initialization, also find devices where we
|
||||||
|
# need to load their custom attribute into the hash
|
||||||
|
if ( $dev && $dev eq ":PM_INITIALIZED" ) {
|
||||||
foreach ( devspec2array("a:powerMap=.+") ) {
|
foreach ( devspec2array("a:powerMap=.+") ) {
|
||||||
$maps{$_}{map} = $_ if ( !$maps{$_}{map} );
|
$maps{$_}{map} = {} if ( !$maps{$_}{map} );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# search templates from modules
|
# search templates from modules
|
||||||
foreach my $TYPE ( $device
|
foreach
|
||||||
&& $device !~ /^:/ ? $defs{$device}{TYPE} : keys %modules )
|
my $TYPE ( $dev && $dev !~ /^:/ ? $defs{$dev}{TYPE} : keys %modules )
|
||||||
{
|
{
|
||||||
next unless ( $modules{$TYPE}{powerMap} );
|
next unless ( $modules{$TYPE}{powerMap} );
|
||||||
my $t = $modules{$TYPE}{powerMap};
|
my $t = $modules{$TYPE}{powerMap};
|
||||||
@ -1085,7 +1097,7 @@ sub powerMap_findPowerMaps(;$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# find possible template for each Fhem device
|
# find possible template for each Fhem device
|
||||||
unless ($device) {
|
unless ($dev) {
|
||||||
foreach my $TYPE ( keys %powerMap_tmpl ) {
|
foreach my $TYPE ( keys %powerMap_tmpl ) {
|
||||||
next unless ( $modules{$TYPE} );
|
next unless ( $modules{$TYPE} );
|
||||||
|
|
||||||
@ -1143,7 +1155,7 @@ sub powerMap_findPowerMaps(;$) {
|
|||||||
foreach my $d ( keys %maps ) {
|
foreach my $d ( keys %maps ) {
|
||||||
|
|
||||||
# filter devices where no reading exists
|
# filter devices where no reading exists
|
||||||
unless ( $device && $device eq ":PM_INITIALIZED" ) {
|
unless ( $dev && $dev eq ":PM_INITIALIZED" ) {
|
||||||
if ( !$maps{$d}{map} || ref( $maps{$d}{map} ) ne "HASH" ) {
|
if ( !$maps{$d}{map} || ref( $maps{$d}{map} ) ne "HASH" ) {
|
||||||
delete $maps{$d};
|
delete $maps{$d};
|
||||||
next;
|
next;
|
||||||
@ -1160,18 +1172,20 @@ sub powerMap_findPowerMaps(;$) {
|
|||||||
delete $maps{$d} unless ($verified);
|
delete $maps{$d} unless ($verified);
|
||||||
}
|
}
|
||||||
|
|
||||||
powerMap_verifyEventChain( $d, $maps{$d}{map} );
|
powerMap_verifyEventChain( $name, $d, $maps{$d}{map} );
|
||||||
}
|
}
|
||||||
|
|
||||||
return {}
|
return {}
|
||||||
if ( $device && $device !~ /^:/ && !defined( $maps{$device} ) );
|
if ( $dev && $dev !~ /^:/ && !defined( $maps{$dev} ) );
|
||||||
return \$maps{$device} if ( $device && $device !~ /^:/ );
|
return \$maps{$dev} if ( $dev && $dev !~ /^:/ );
|
||||||
return \%maps;
|
return \%maps;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub powerMap_verifyEventChain ($$) {
|
sub powerMap_verifyEventChain($$$) {
|
||||||
my ( $dev, $map ) = @_;
|
my ( $name, $dev, $map ) = @_;
|
||||||
|
my $TYPE = $defs{$name}{TYPE};
|
||||||
my %filter;
|
my %filter;
|
||||||
|
return 0 unless ( ref($map) eq "HASH" );
|
||||||
|
|
||||||
my $attrminint = AttrVal( $dev, "event-min-interval", undef );
|
my $attrminint = AttrVal( $dev, "event-min-interval", undef );
|
||||||
if ($attrminint) {
|
if ($attrminint) {
|
||||||
@ -1236,8 +1250,9 @@ sub powerMap_verifyEventChain ($$) {
|
|||||||
&& grep( $reading =~ m/^$_$/, @{ $filter{attrtocr} } ) )
|
&& grep( $reading =~ m/^$_$/, @{ $filter{attrtocr} } ) )
|
||||||
{
|
{
|
||||||
Log3 $dev, 2,
|
Log3 $dev, 2,
|
||||||
"powerMap $dev: Attribute timestamp-on-change-reading "
|
"$TYPE $dev: WARNING - Attribute "
|
||||||
. "is not compatible when using powerMap with reading '$reading'";
|
. "timestamp-on-change-reading is not compatible "
|
||||||
|
. "when using $TYPE with reading '$reading'";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1250,8 +1265,9 @@ sub powerMap_verifyEventChain ($$) {
|
|||||||
} @{ $filter{attrminint} };
|
} @{ $filter{attrminint} };
|
||||||
if (@v) {
|
if (@v) {
|
||||||
Log3 $dev, 2,
|
Log3 $dev, 2,
|
||||||
"powerMap $dev: Attribute event-min-interval is not compatible "
|
"$TYPE $dev: WARNING - Attribute "
|
||||||
. "when using powerMap with reading '$reading'";
|
. "event-min-interval is not compatible "
|
||||||
|
. "when using $TYPE with reading '$reading'";
|
||||||
}
|
}
|
||||||
|
|
||||||
# verify aggregator
|
# verify aggregator
|
||||||
@ -1262,19 +1278,29 @@ sub powerMap_verifyEventChain ($$) {
|
|||||||
} @{ $filter{attraggr} };
|
} @{ $filter{attraggr} };
|
||||||
if (@v2) {
|
if (@v2) {
|
||||||
Log3 $dev, 2,
|
Log3 $dev, 2,
|
||||||
"powerMap $dev: Attribute event-aggregator is not compatible "
|
"$TYPE $dev: WARNING - Attribute "
|
||||||
. "when using powerMap with reading '$reading'";
|
. "event-aggregator is not compatible "
|
||||||
|
. "when using $TYPE with reading '$reading'";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $leocr ne "" ) {
|
if ( $leocr ne "" ) {
|
||||||
Log3 $dev, 2,
|
if ( powerMap_AttrVal( $name, $dev, "eventChainWarnOnly", 0 ) ) {
|
||||||
"powerMap $dev: Attribute event-on-change-reading adjusted "
|
Log3 $dev, 2,
|
||||||
. "to fulfill event chain for reading(s) '$leocr'";
|
"$TYPE $dev: ERROR: Broken event chain - Attributes "
|
||||||
$attreocr .= "," if ($attreocr);
|
. "event-on-change-reading or event-on-update-reading "
|
||||||
$attreocr .= $leocr;
|
. "need to contain reading(s) '$leocr'";
|
||||||
CommandAttr( undef, "$dev event-on-change-reading $attreocr" );
|
}
|
||||||
|
else {
|
||||||
|
Log3 $dev, 2,
|
||||||
|
"$TYPE $dev: NOTE - Attribute "
|
||||||
|
. "event-on-change-reading adjusted "
|
||||||
|
. "to fulfill event chain for reading(s) '$leocr'";
|
||||||
|
$attreocr .= "," if ($attreocr);
|
||||||
|
$attreocr .= $leocr;
|
||||||
|
CommandAttr( undef, "$dev event-on-change-reading $attreocr" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
@ -1285,7 +1311,7 @@ sub powerMap_power($$$;$) {
|
|||||||
my $hash = $defs{$name};
|
my $hash = $defs{$name};
|
||||||
my $TYPE = $hash->{TYPE};
|
my $TYPE = $hash->{TYPE};
|
||||||
my $power = 0;
|
my $power = 0;
|
||||||
my $powerMap = powerMap_findPowerMaps($dev);
|
my $powerMap = powerMap_findPowerMaps( $name, $dev );
|
||||||
|
|
||||||
return unless ( defined($powerMap) and ref($powerMap) eq "HASH" );
|
return unless ( defined($powerMap) and ref($powerMap) eq "HASH" );
|
||||||
|
|
||||||
@ -1596,6 +1622,13 @@ sub powerMap_update($;$) {
|
|||||||
<code>disable 1</code><br>
|
<code>disable 1</code><br>
|
||||||
No readings will be created or calculated by this module.
|
No readings will be created or calculated by this module.
|
||||||
</li><br>
|
</li><br>
|
||||||
|
<li>
|
||||||
|
<code>powerMap_eventChainWarnOnly <1></code><br>
|
||||||
|
When set, event chain will NOT be repaired automatically if readings
|
||||||
|
were found to be required for powerMap but their events are currently
|
||||||
|
suppressed because they are either missing from attributes event-on-change-reading
|
||||||
|
or event-on-update-reading. Instead, manual intervention is required.
|
||||||
|
</li><br>
|
||||||
<li>
|
<li>
|
||||||
<code>powerMap_interval <seconds></code><br>
|
<code>powerMap_interval <seconds></code><br>
|
||||||
Interval in seconds to calculate energy.<br>
|
Interval in seconds to calculate energy.<br>
|
||||||
@ -1651,7 +1684,7 @@ sub powerMap_update($;$) {
|
|||||||
<br>
|
<br>
|
||||||
In case several power values need to be summarized, the name of other readings may be added after
|
In case several power values need to be summarized, the name of other readings may be added after
|
||||||
number value, separated by comma. The current status of that reading will then be considered for
|
number value, separated by comma. The current status of that reading will then be considered for
|
||||||
the total power calculcation. To consider all readings known to powerMap, just as an *.<br>
|
total power calculcation. To consider all readings powerMap knows, just add an *.<br>
|
||||||
<br>
|
<br>
|
||||||
Example for FS20 socket:
|
Example for FS20 socket:
|
||||||
<ul>
|
<ul>
|
||||||
@ -1667,11 +1700,6 @@ sub powerMap_update($;$) {
|
|||||||
<code><pre>
|
<code><pre>
|
||||||
'state' => {
|
'state' => {
|
||||||
'unreachable' => 0,
|
'unreachable' => 0,
|
||||||
'off' => 0.4,
|
|
||||||
'on' => 9.2,
|
|
||||||
},
|
|
||||||
|
|
||||||
'pct' => {
|
|
||||||
'0' => 0.4,
|
'0' => 0.4,
|
||||||
'10' => 1.2,
|
'10' => 1.2,
|
||||||
'20' => 1.7,
|
'20' => 1.7,
|
||||||
@ -1761,6 +1789,21 @@ sub powerMap_update($;$) {
|
|||||||
<code>disable 1</code><br>
|
<code>disable 1</code><br>
|
||||||
Es werden keine Readings mehr durch das Modul erzeugt oder berechnet.
|
Es werden keine Readings mehr durch das Modul erzeugt oder berechnet.
|
||||||
</li><br>
|
</li><br>
|
||||||
|
<li>
|
||||||
|
<code>powerMap_eventChainWarnOnly <1></code><br>
|
||||||
|
Sofern gesetzt, wird die Ereigniskette NICHT automatisch repariert, falls
|
||||||
|
Readings zwar als für powerMap notwendig identifiziert wurden, ihre
|
||||||
|
Events jedoch derzeit dadurch unterdrückt werden, weil sie nicht in
|
||||||
|
einem der Attribute event-on-change-reading oder event-on-update-reading
|
||||||
|
enthalten sind. Stattdessen ist ein manueller Eingriff erforderlich.
|
||||||
|
</li><br>
|
||||||
|
<li>
|
||||||
|
<code>powerMap_eventChainWarnOnly <1></code><br>
|
||||||
|
When set, event chain will NOT be repaired automatically if readings
|
||||||
|
were found to be required for powerMap but their events are currently
|
||||||
|
suppressed because they are either missing from attributes event-on-change-reading
|
||||||
|
or event-on-update-reading. Instead, manual intervention is required.
|
||||||
|
</li><br>
|
||||||
<li>
|
<li>
|
||||||
<code>powerMap_interval <seconds></code><br>
|
<code>powerMap_interval <seconds></code><br>
|
||||||
Intervall in Sekunden, in dem neue Werte für die Energie berechnet
|
Intervall in Sekunden, in dem neue Werte für die Energie berechnet
|
||||||
@ -1837,11 +1880,6 @@ sub powerMap_update($;$) {
|
|||||||
<code><pre>
|
<code><pre>
|
||||||
'state' => {
|
'state' => {
|
||||||
'unreachable' => 0,
|
'unreachable' => 0,
|
||||||
'off' => 0.4,
|
|
||||||
'on' => 9.2,
|
|
||||||
},
|
|
||||||
|
|
||||||
'pct' => {
|
|
||||||
'0' => 0.4,
|
'0' => 0.4,
|
||||||
'10' => 1.2,
|
'10' => 1.2,
|
||||||
'20' => 1.7,
|
'20' => 1.7,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user