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