mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-01 20:20:10 +00:00
structure: *_map attribute is now a regexp
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@4379 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
277d592b18
commit
b05d0b7038
@ -191,19 +191,19 @@ sub structure_Notify($$)
|
||||
my @value;
|
||||
for (my $i=0; $i<@gruppe; $i++) {
|
||||
@value = split(":", $gruppe[$i]);
|
||||
if(@value == 1) { # Reading
|
||||
if(@value == 1) { # value[0]:.* -> .*
|
||||
$devstate = ReadingsVal($d, $value[0], undef);
|
||||
|
||||
} elsif(@value == 2) { # bsp: on:An
|
||||
} elsif(@value == 2) { # state:value[0] -> value[1]
|
||||
$devstate = ReadingsVal($d, "state", undef);
|
||||
if(defined($devstate) && $devstate eq $value[0]){
|
||||
if(defined($devstate) && $devstate =~ m/^$value[0]/){
|
||||
$devstate = $value[1];
|
||||
$i=99999; # RKO: ??
|
||||
}
|
||||
|
||||
} elsif(@value == 3) { # Reading:OriginalStatus:NeuerStatus
|
||||
} elsif(@value == 3) { # value[0]:value[1] -> value[2]
|
||||
$devstate = ReadingsVal($d, $value[0], undef);
|
||||
if(defined($devstate) && $devstate eq $value[1]){
|
||||
if(defined($devstate) && $devstate =~ m/^$value[1]/){
|
||||
$devstate = $value[2];
|
||||
}
|
||||
}
|
||||
@ -494,15 +494,24 @@ structure_Attr($@)
|
||||
</ul>
|
||||
In this example the status of kitchen is either on or off. The status
|
||||
of house is either Any_on or All_off.
|
||||
<br>
|
||||
To group more devices from different types of devices you can define
|
||||
a clientstate redefining on each device with the attribute <struct_type>_map.
|
||||
For example the reading "A" of device door is "open" or "closed"
|
||||
and the state of device lamp1 should redefine from "on" to "An" and "off" to "Aus".
|
||||
A special case is a device with more than 1 input port (eg. OWSWITCH). The last
|
||||
example shows the attribute only with a value of "A". The propagated
|
||||
value of the device depends only on port A with an unmodified state.
|
||||
<br>Example:<br>
|
||||
</li>
|
||||
<li><struct_type>_map<br>
|
||||
With this attribute, which has to specified for the structure-
|
||||
<b>member</b>, you can redefine the value reported by a specific
|
||||
structure-member for the structure value. The attribute has three
|
||||
variants:
|
||||
<ul>
|
||||
<li>readingName<br>
|
||||
take the value from readingName instead of state.
|
||||
</li>
|
||||
<li>oldVal:newVal<br>
|
||||
if the state reading matches oldVal, then replace it with newVal
|
||||
</li>
|
||||
<li>readingName:oldVal:newVal<br>
|
||||
if readingName matches oldVal, then replace it with newVal
|
||||
</li>
|
||||
</ul>
|
||||
Example:
|
||||
<ul>
|
||||
<li>define door OWSWITCH <ROMID></li>
|
||||
<li>define lamp1 dummy</li>
|
||||
@ -546,20 +555,25 @@ structure_Attr($@)
|
||||
<a name="structuredefine"></a>
|
||||
<b>Define</b>
|
||||
<ul>
|
||||
<code>define <name> structure <struct_type> <dev1> <dev2> ...</code>
|
||||
<br><br>
|
||||
<code>define <name> structure <struct_type> <dev1>
|
||||
<dev2> ...</code> <br><br>
|
||||
|
||||
Mit dem Device "Structure" werden Strukturen/Zusammenstellungen von anderen
|
||||
Devices erstellt um sie zu Gruppen zusammenzufassen. (Beispiel: im Haus alles ausschalten)
|
||||
<br>
|
||||
Die Liste der Devices die einer Struktur zugeordnet sind kann duch das Kommando
|
||||
<code>addstruct / delstruct</code> im laufenden Betrieb verändert werden. Es können
|
||||
sowohl einzelne Devices als auch Gruppen von Devices (TYPE=FS20) zugefügt werden.
|
||||
Jedes zugefügt Device erhält zwei neue Attribute <struct_type>=<name>
|
||||
sowie <struct_type>_map wenn es zu einer Struktur zugefügt wurde. Diese
|
||||
Attribute werden wieder automatisch entfernt, sobald das Device von der Struktur
|
||||
entfernt wird.<br>
|
||||
Eine Struktur kann ebenfalls zu einer anderen Struktur zugefügt werden. Somit
|
||||
können z b. kaskadierende Strukturen erstellt werden. (Z.b. KG,EG,OG, Haus)
|
||||
Devices erstellt um sie zu Gruppen zusammenzufassen. (Beispiel: im Haus
|
||||
alles ausschalten) <br>
|
||||
|
||||
Die Liste der Devices die einer Struktur zugeordnet sind kann duch das
|
||||
Kommando <code>addstruct / delstruct</code> im laufenden Betrieb
|
||||
verändert werden. Es können sowohl einzelne Devices als auch
|
||||
Gruppen von Devices (TYPE=FS20) zugefügt werden. Jedes zugefügt
|
||||
Device erhält zwei neue Attribute <struct_type>=<name>
|
||||
sowie <struct_type>_map wenn es zu einer Struktur zugefügt
|
||||
wurde. Diese Attribute werden wieder automatisch entfernt, sobald das
|
||||
Device von der Struktur entfernt wird.<br>
|
||||
|
||||
Eine Struktur kann ebenfalls zu einer anderen Struktur zugefügt
|
||||
werden. Somit können z b. kaskadierende Strukturen erstellt werden.
|
||||
(Z.b. KG,EG,OG, Haus)
|
||||
|
||||
Beispiel:<br>
|
||||
<ul>
|
||||
@ -587,20 +601,22 @@ structure_Attr($@)
|
||||
Get wird im Structur-Device nicht unterstützt.
|
||||
</ul>
|
||||
<br>
|
||||
|
||||
<a name="structureattr"></a>
|
||||
<b>Attribute</b>
|
||||
<ul>
|
||||
<a name="clientstate_behavior"></a>
|
||||
<li>clientstate_behavior<br>
|
||||
Der Status einer Struktur hängt von den Stati der zugefügten Devices ab.
|
||||
Dabei wird das propagieren der Stati der Devices in zwei Gruppen klassifiziert
|
||||
und mittels diesem Attribut definiert:
|
||||
Der Status einer Struktur hängt von den Stati der zugefügten
|
||||
Devices ab. Dabei wird das propagieren der Stati der Devices in zwei
|
||||
Gruppen klassifiziert und mittels diesem Attribut definiert:
|
||||
<ul>
|
||||
<li>absolute<br>
|
||||
Die Struktur wird erst dann den Status der zugefügten Devices annehmen,
|
||||
wenn alle Devices einen identischen Status vorweisen. Bei unterschiedlichen
|
||||
Devictypen kann dies per Attribut <struct_type>_map pro Device
|
||||
beinflusst werden. Andernfalls hat die Struktur den Status "undefined".
|
||||
Die Struktur wird erst dann den Status der zugefügten Devices
|
||||
annehmen, wenn alle Devices einen identischen Status vorweisen. Bei
|
||||
unterschiedlichen Devictypen kann dies per Attribut
|
||||
<struct_type>_map pro Device beinflusst werden. Andernfalls hat
|
||||
die Struktur den Status "undefined".
|
||||
</li>
|
||||
<li>relative<br>
|
||||
S.u. clientstate_priority.
|
||||
@ -611,66 +627,68 @@ structure_Attr($@)
|
||||
HomeMatic Geräte benötigt.
|
||||
</li>
|
||||
<li>last<br>
|
||||
Die Struktur übernimmt den Status des zuletzt geänderten Gerätes.
|
||||
Die Struktur übernimmt den Status des zuletzt geänderten
|
||||
Gerätes.
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</li>
|
||||
|
||||
<a name="clientstate_priority"></a>
|
||||
<li>clientstate_priority<br>
|
||||
Wird die Struktur auf ein relatives Verhalten eingestellt, so wird die
|
||||
Priorität der Devicestati über das Attribut <code>clientstate_priority</code>
|
||||
beinflusst. Die Prioritäten sind in absteigender Reihenfolge anzugeben.
|
||||
Dabei können Gruppen mit identischer Priorität angegeben werden, um zb.
|
||||
unterschiedliche Devicetypen zusammenfassen zu können. Jede Gruppe wird durch
|
||||
Leerzeichen oder /, jeder Eintrag pro Gruppe durch Pipe getrennt. Der Status der
|
||||
Struktur ist der erste Eintrag in der entsprechenden Gruppe.
|
||||
</li>
|
||||
<br>Beispiel:<br>
|
||||
<ul>
|
||||
<li>attr kueche clientstate_behavior relative</li>
|
||||
<li>attr kueche clientstate_priority An|On|on Aus|Off|off</li>
|
||||
<li>attr haus clientstate_priority Any_On|An All_Off|Aus</li>
|
||||
</ul>
|
||||
In diesem Beipiel nimmt die Struktur <code>kueche</code>entweder den Status
|
||||
<code>An</code> oder <code>Aus</code> an. Die Struktur <code>haus</code> nimmt
|
||||
entweder den Status <code>Any_on</code> oder <code>All_off</code> an. Sobald ein
|
||||
Device der Struktur <code>haus</code> den Status <code>An</code> hat nimmt die
|
||||
Struktur den Status <code>Any_On</code> an. Um dagegen den Status
|
||||
<code>All_off</code> anzunehmen, müssen alle Devices dieser Struktur auf
|
||||
<code>off</code> stehen.
|
||||
<br>
|
||||
Um mehrere Devices unterschiedlicher Typen gruppieren zu können ist ein
|
||||
Status-Mapping auf jedem einzelnen Device mittels Attribut <struct_type>_map
|
||||
möglich.
|
||||
Im folgenden Beispiel nimmt das Reading "A" den Status "offen" oder "geschlossen"
|
||||
an, und des Reading "state" von "lampe1" den Status "on" oder "off".
|
||||
Die Struktur "kueche" reagiert nun auf "An" bzw "on" (Prio 1) bzw.
|
||||
auf "OK", "Aus", "off". Der Status den diese Struktur schlussendlich annehmen kann
|
||||
ist entweder "An" oder "OK".<br>
|
||||
Der Status des Devices lampe1 wird umdefiniert von "on" nach "An" bzw "off" nach "Aus".
|
||||
Das Device "tuer", welches vom Type "OWSWITCH" ist, bringt ausschließlich
|
||||
das Reading A in die Struktur ein welches von "open" nach "on" sowie "clesed"
|
||||
nach "Aus" umdefiniert wird.<br>
|
||||
Die Struktur <code>kueche</code> wird folglich nur dann "An" ausgeben,
|
||||
wenn a) das Device lampe1 den Status "on" und(!) b) das Device tuer den Status
|
||||
open im Reading A aufweist. Die Struktur wird sofort auf den Status "OK" wechseln,
|
||||
sobald eines der beiden Devices den Status wechselt.<br>
|
||||
Ist im Attribut <struct_type>_map nur das Reading angegeben, so wird dessen
|
||||
Status unmodifiziert an die Struktur weitergegeben.<br>
|
||||
Ist das Attribut <struct_type>_map nicht definiert, so wird das
|
||||
Reading <code>state</code> an die Struktur weitergegeben.
|
||||
<br>Beispiel:<br>
|
||||
<ul>
|
||||
<li>define tuer OWSWITCH <ROMID></li>
|
||||
<li>define lampe1 dummy</li>
|
||||
<li>attr lampe1 cmdlist on off</li>
|
||||
<li>define kueche structure struct_kitchen lamp1 door</li>
|
||||
<li>attr kueche clientstate_priority An|on OK|Aus|off</li>
|
||||
<li>attr lampe1 struct_kitchen_map on:An off:Aus</li>
|
||||
<li>attr tuer struct_kitchen_map A:open:on A:closed:off</li>
|
||||
<li>attr tuer2 struct_kitchen_map A</li>
|
||||
</ul>
|
||||
Priorität der Devicestati über das Attribut
|
||||
<code>clientstate_priority</code> beinflusst. Die Prioritäten sind
|
||||
in absteigender Reihenfolge anzugeben. Dabei können Gruppen mit
|
||||
identischer Priorität angegeben werden, um zb. unterschiedliche
|
||||
Devicetypen zusammenfassen zu können. Jede Gruppe wird durch
|
||||
Leerzeichen oder /, jeder Eintrag pro Gruppe durch Pipe getrennt. Der
|
||||
Status der Struktur ist der erste Eintrag in der entsprechenden Gruppe.
|
||||
<br>Beispiel:
|
||||
<ul>
|
||||
<li>attr kueche clientstate_behavior relative</li>
|
||||
<li>attr kueche clientstate_priority An|On|on Aus|Off|off</li>
|
||||
<li>attr haus clientstate_priority Any_On|An All_Off|Aus</li>
|
||||
</ul>
|
||||
In diesem Beipiel nimmt die Struktur <code>kueche</code>entweder den
|
||||
Status <code>An</code> oder <code>Aus</code> an. Die Struktur
|
||||
<code>haus</code> nimmt entweder den Status <code>Any_on</code> oder
|
||||
<code>All_off</code> an. Sobald ein Device der Struktur
|
||||
<code>haus</code> den Status <code>An</code> hat nimmt die Struktur den
|
||||
Status <code>Any_On</code> an. Um dagegen den Status <code>All_off</code>
|
||||
anzunehmen, müssen alle Devices dieser Struktur auf <code>off</code>
|
||||
stehen.
|
||||
</li>
|
||||
|
||||
<li><struct_type>_map<br>
|
||||
Mit diesem Attribut, das dem Struktur-<b>Mitglied</b> zugewiesen werden
|
||||
muss, koennen die Werte, die die einzelnen Struktur- Mitglieder melden,
|
||||
umdefiniert werden, damit man unterschiedliche Geraeteklassen
|
||||
zusammenfassen kann. Es existieren drei Varianten:
|
||||
<ul>
|
||||
<li>readingName<br>
|
||||
nehme den Wert von readingName anstatt von state
|
||||
</li>
|
||||
<li>oldVal:newVal<br>
|
||||
falls der Wert der state Reading oldVal (als regex) ist, dann ersetze
|
||||
diesen mit newVal.
|
||||
</li>
|
||||
<li>readingName:oldVal:newVal<br>
|
||||
falls der Wert der readingName oldVal (als regex) ist, dann ersetze
|
||||
diesen mit newVal.
|
||||
</li>
|
||||
</ul>
|
||||
Beispiel:<br>
|
||||
<ul>
|
||||
<li>define tuer OWSWITCH <ROMID></li>
|
||||
<li>define lampe1 dummy</li>
|
||||
<li>attr lampe1 cmdlist on off</li>
|
||||
<li>define kueche structure struct_kitchen lamp1 door</li>
|
||||
<li>attr kueche clientstate_priority An|on OK|Aus|off</li>
|
||||
<li>attr lampe1 struct_kitchen_map on:An off:Aus</li>
|
||||
<li>attr tuer struct_kitchen_map A:open:on A:closed:off</li>
|
||||
<li>attr tuer2 struct_kitchen_map A</li>
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li>structexclude<br>
|
||||
Bei gesetztem Attribut wird set, attr/deleteattr ignoriert. Dies
|
||||
|
Loading…
x
Reference in New Issue
Block a user