mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-29 23:47:10 +00:00
sequence.pm: add strictSequence Attribute (Forum #121953)
git-svn-id: https://svn.fhem.de/fhem/trunk@27742 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
c43644610b
commit
70446b02b7
@ -23,6 +23,7 @@ sequence_Initialize($)
|
|||||||
reportEvents:1,0
|
reportEvents:1,0
|
||||||
triggerPartial:1,0
|
triggerPartial:1,0
|
||||||
showtime:1,0
|
showtime:1,0
|
||||||
|
strictSequence:1,0
|
||||||
);
|
);
|
||||||
use warnings 'qw';
|
use warnings 'qw';
|
||||||
$hash->{AttrList} = join(" ", @attrList);
|
$hash->{AttrList} = join(" ", @attrList);
|
||||||
@ -79,11 +80,17 @@ sequence_Notify($$)
|
|||||||
my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
|
my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
|
||||||
return if(!$events);
|
return if(!$events);
|
||||||
my $max = int(@{$events});
|
my $max = int(@{$events});
|
||||||
|
my $strictSequence = AttrVal($ln, "strictSequence", 0);
|
||||||
|
|
||||||
for (my $i = 0; $i < $max; $i++) {
|
for (my $i = 0; $i < $max; $i++) {
|
||||||
my $s = $events->[$i];
|
my $s = $events->[$i];
|
||||||
$s = "" if(!defined($s));
|
$s = "" if(!defined($s));
|
||||||
next if($n !~ m/^$re$/ && "$n:$s" !~ m/^$re$/);
|
if($n !~ m/^$re$/ && "$n:$s" !~ m/^$re$/) {
|
||||||
|
next if(!$strictSequence && $hash->{IDX});
|
||||||
|
RemoveInternalTimer($ln);
|
||||||
|
sequence_Trigger($ln, "abort-strict");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
RemoveInternalTimer($ln);
|
RemoveInternalTimer($ln);
|
||||||
$hash->{last_source} = $n;
|
$hash->{last_source} = $n;
|
||||||
@ -169,12 +176,12 @@ sequence_Undef($$)
|
|||||||
=item summary_DE generiert Event nach Empfang einer definierten Event-Sequenz
|
=item summary_DE generiert Event nach Empfang einer definierten Event-Sequenz
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
<a name="sequence"></a>
|
<a id="sequence"></a>
|
||||||
<h3>sequence</h3>
|
<h3>sequence</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<a name="sequencedefine"></a>
|
<a id="sequence-define"></a>
|
||||||
<b>Define</b>
|
<b>Define</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> sequence <re1> <timeout1>
|
<code>define <name> sequence <re1> <timeout1>
|
||||||
@ -219,20 +226,21 @@ sequence_Undef($$)
|
|||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<a name="sequenceset"></a>
|
<a id="sequence-set"></a>
|
||||||
<b>Set</b> <ul>N/A</ul><br>
|
<b>Set</b> <ul>N/A</ul><br>
|
||||||
|
|
||||||
<a name="sequenceget"></a>
|
<a id="sequence-get"></a>
|
||||||
<b>Get</b> <ul>N/A</ul><br>
|
<b>Get</b> <ul>N/A</ul><br>
|
||||||
|
|
||||||
<a name="sequenceattr"></a>
|
<a id="sequence-attr"></a>
|
||||||
<b>Attributes</b>
|
<b>Attributes</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#addStateEvent">addStateEvent</a></li>
|
<li><a href="#addStateEvent">addStateEvent</a></li>
|
||||||
<li><a href="#disable">disable</a></li>
|
<li><a href="#disable">disable</a></li>
|
||||||
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
|
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
|
||||||
<li><a href="#showtime">showtime</a></li>
|
|
||||||
<li><a href="#triggerPartial">triggerPartial</a><br>
|
<a id="sequence-attr-triggerPartial"></a>
|
||||||
|
<li>triggerPartial</a><br>
|
||||||
if set (to 1), and not all the events of a sequence are received, then a
|
if set (to 1), and not all the events of a sequence are received, then a
|
||||||
partial_X event is generated by the sequence. Example:<br><code><ul>
|
partial_X event is generated by the sequence. Example:<br><code><ul>
|
||||||
fhem> define seq sequence d1:on 1 d1:on 1 d1:on<br>
|
fhem> define seq sequence d1:on 1 d1:on 1 d1:on<br>
|
||||||
@ -243,17 +251,28 @@ sequence_Undef($$)
|
|||||||
tasks for a single button, depending on the number of times it is
|
tasks for a single button, depending on the number of times it is
|
||||||
pressed.
|
pressed.
|
||||||
</li><br>
|
</li><br>
|
||||||
<li><a href="#reportEvents">reportEvents</a><br>
|
|
||||||
|
<a id="sequence-attr-reportEvents"></a>
|
||||||
|
<li>reportEvents<br>
|
||||||
if set (to 1), report the events (space separated) after the
|
if set (to 1), report the events (space separated) after the
|
||||||
"trigger" or "partial_X" keyword. This way one can create more general
|
"trigger" or "partial_X" keyword. This way one can create more general
|
||||||
sequences, and create different notifies to react:<br>
|
sequences, and create different notifies to react:<br>
|
||||||
<ul><code>
|
<ul><code>
|
||||||
define seq sequence remote:btn.* remote:btn.*<br>
|
define seq sequence remote:btn.* 1 remote:btn.*<br>
|
||||||
attr seq reportEvents<br>
|
attr seq reportEvents<br>
|
||||||
define n_b1b2 notify seq:trigger.remote:btn1.remote:btn2 set lamp1 on<br>
|
define n_b1b2 notify seq:trigger.remote:btn1.remote:btn2 set lamp1 on<br>
|
||||||
define n_b2b1 notify seq:trigger.remote:btn2.remote:btn1 set lamp1 off<br>
|
define n_b2b1 notify seq:trigger.remote:btn2.remote:btn1 set lamp1 off<br>
|
||||||
</code></ul>
|
</code></ul>
|
||||||
</li>
|
</li><br>
|
||||||
|
|
||||||
|
<a id="sequence-attr-strictSequence"></a>
|
||||||
|
<li>strictSequence<br>
|
||||||
|
if set (to 1), any "unexpected" event will reset the sequence. This may
|
||||||
|
be helpful to avoid brute-force attacks.<br>
|
||||||
|
Note: it will only work as correctly if the sequence is triggering only
|
||||||
|
to the configured devices (check the NOTIFYDEV internal), and the source
|
||||||
|
is not generating "undesired" events together with the desired ones.
|
||||||
|
</li><br>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@ -263,12 +282,12 @@ sequence_Undef($$)
|
|||||||
|
|
||||||
=begin html_DE
|
=begin html_DE
|
||||||
|
|
||||||
<a name="sequence"></a>
|
<a id="sequence"></a>
|
||||||
<h3>sequence</h3>
|
<h3>sequence</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<a name="sequencedefine"></a>
|
<a id="sequence-define"></a>
|
||||||
<b>Define</b>
|
<b>Define</b>
|
||||||
<ul>
|
<ul>
|
||||||
<code>define <name> sequence <re1> <timeout1>
|
<code>define <name> sequence <re1> <timeout1>
|
||||||
@ -312,21 +331,21 @@ sequence_Undef($$)
|
|||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<a name="sequenceset"></a>
|
<a id="sequence-set"></a>
|
||||||
<b>Set</b> <ul>N/A</ul><br>
|
<b>Set</b> <ul>N/A</ul><br>
|
||||||
|
|
||||||
<a name="sequenceget"></a>
|
<a id="sequence-get"></a>
|
||||||
<b>Get</b> <ul>N/A</ul><br>
|
<b>Get</b> <ul>N/A</ul><br>
|
||||||
|
|
||||||
<a name="sequenceattr"></a>
|
<a id="sequence-attr"></a>
|
||||||
<b>Attributes</b>
|
<b>Attributes</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#addStateEvent">addStateEvent</a></li>
|
<li><a href="#addStateEvent">addStateEvent</a></li>
|
||||||
<li><a href="#disable">disable</a></li>
|
<li><a href="#disable">disable</a></li>
|
||||||
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
|
<li><a href="#disabledForIntervals">disabledForIntervals</a></li>
|
||||||
<li><a href="#showtime">showtime</a></li>
|
|
||||||
|
|
||||||
<li><a href="#sequencetriggerPartial">triggerPartial</a><br>
|
<a id="sequence-attr-triggerPartial"></a>
|
||||||
|
<li>triggerPartial<br>
|
||||||
Falls gesetzt (auf 1), und nicht alle erwarteten Events eingetroffen
|
Falls gesetzt (auf 1), und nicht alle erwarteten Events eingetroffen
|
||||||
sind, dann wird ein partial_X Event generiert, wobei X durch Anzahl der
|
sind, dann wird ein partial_X Event generiert, wobei X durch Anzahl der
|
||||||
eingetroffenen Events ersetzt wird. Beispiel:<br><code><ul>
|
eingetroffenen Events ersetzt wird. Beispiel:<br><code><ul>
|
||||||
@ -339,18 +358,30 @@ sequence_Undef($$)
|
|||||||
gedrückt wurde.
|
gedrückt wurde.
|
||||||
</li><br>
|
</li><br>
|
||||||
|
|
||||||
<li><a href="#sequencereportEvents">reportEvents</a><br>
|
<a id="sequence-attr-reportEvents"></a>
|
||||||
|
<li>reportEvents<br>
|
||||||
Falls gesetzt (auf 1), meldet trigger die empfangenen Events (Leerzeichen
|
Falls gesetzt (auf 1), meldet trigger die empfangenen Events (Leerzeichen
|
||||||
getrennt) nach dem "trigger" oder "partial_X" Schlüsselwort.
|
getrennt) nach dem "trigger" oder "partial_X" Schlüsselwort.
|
||||||
Das kann verwendet werden, um generische sequence Instanzen zu definieren:
|
Das kann verwendet werden, um generische sequence Instanzen zu definieren:
|
||||||
<br>
|
<br>
|
||||||
<ul><code>
|
<ul><code>
|
||||||
define seq sequence remote:btn.* remote:btn.*<br>
|
define seq sequence remote:btn.* 1 remote:btn.*<br>
|
||||||
attr seq reportEvents<br>
|
attr seq reportEvents<br>
|
||||||
define n_b1b2 notify seq:trigger.remote:btn1.remote:btn2 set lamp1 on<br>
|
define n_b1b2 notify seq:trigger.remote:btn1.remote:btn2 set lamp1 on<br>
|
||||||
define n_b2b1 notify seq:trigger.remote:btn2.remote:btn1 set lamp1 off<br>
|
define n_b2b1 notify seq:trigger.remote:btn2.remote:btn1 set lamp1 off<br>
|
||||||
</code></ul>
|
</code></ul>
|
||||||
</li>
|
</li><br>
|
||||||
|
|
||||||
|
<a id="sequence-attr-strictSequence"></a>
|
||||||
|
<li>strictSequence<br>
|
||||||
|
Falls gesetzt ist (auf 1), jedes "unerwartete" Event setzt die
|
||||||
|
Verarbeitung zurück. Das kann bei sog. Brute-Force Attacken helfen.
|
||||||
|
<br>
|
||||||
|
Achtung: es funktioniert nur dann wie erwartet, wenn die Definition nur
|
||||||
|
auf die konfigurierten Geraete triggert (siehe das NOTIFYDEV Internal),
|
||||||
|
und die Quelle generiert nur die gewünschten Events (kein
|
||||||
|
Zeitstempel, ACK, etc).
|
||||||
|
</li><br>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user