mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +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
6c87a7d503
commit
4fd153f8a6
@ -23,6 +23,7 @@ sequence_Initialize($)
|
||||
reportEvents:1,0
|
||||
triggerPartial:1,0
|
||||
showtime:1,0
|
||||
strictSequence:1,0
|
||||
);
|
||||
use warnings 'qw';
|
||||
$hash->{AttrList} = join(" ", @attrList);
|
||||
@ -79,11 +80,17 @@ sequence_Notify($$)
|
||||
my $events = deviceEvents($dev, AttrVal($ln, "addStateEvent", 0));
|
||||
return if(!$events);
|
||||
my $max = int(@{$events});
|
||||
my $strictSequence = AttrVal($ln, "strictSequence", 0);
|
||||
|
||||
for (my $i = 0; $i < $max; $i++) {
|
||||
my $s = $events->[$i];
|
||||
$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);
|
||||
$hash->{last_source} = $n;
|
||||
@ -169,12 +176,12 @@ sequence_Undef($$)
|
||||
=item summary_DE generiert Event nach Empfang einer definierten Event-Sequenz
|
||||
=begin html
|
||||
|
||||
<a name="sequence"></a>
|
||||
<a id="sequence"></a>
|
||||
<h3>sequence</h3>
|
||||
<ul>
|
||||
<br>
|
||||
|
||||
<a name="sequencedefine"></a>
|
||||
<a id="sequence-define"></a>
|
||||
<b>Define</b>
|
||||
<ul>
|
||||
<code>define <name> sequence <re1> <timeout1>
|
||||
@ -219,20 +226,21 @@ sequence_Undef($$)
|
||||
</ul>
|
||||
<br>
|
||||
|
||||
<a name="sequenceset"></a>
|
||||
<a id="sequence-set"></a>
|
||||
<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>
|
||||
|
||||
<a name="sequenceattr"></a>
|
||||
<a id="sequence-attr"></a>
|
||||
<b>Attributes</b>
|
||||
<ul>
|
||||
<li><a href="#addStateEvent">addStateEvent</a></li>
|
||||
<li><a href="#disable">disable</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
|
||||
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>
|
||||
@ -243,17 +251,28 @@ sequence_Undef($$)
|
||||
tasks for a single button, depending on the number of times it is
|
||||
pressed.
|
||||
</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
|
||||
"trigger" or "partial_X" keyword. This way one can create more general
|
||||
sequences, and create different notifies to react:<br>
|
||||
<ul><code>
|
||||
define seq sequence remote:btn.* remote:btn.*<br>
|
||||
define seq sequence remote:btn.* 1 remote:btn.*<br>
|
||||
attr seq reportEvents<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>
|
||||
</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>
|
||||
<br>
|
||||
|
||||
@ -263,12 +282,12 @@ sequence_Undef($$)
|
||||
|
||||
=begin html_DE
|
||||
|
||||
<a name="sequence"></a>
|
||||
<a id="sequence"></a>
|
||||
<h3>sequence</h3>
|
||||
<ul>
|
||||
<br>
|
||||
|
||||
<a name="sequencedefine"></a>
|
||||
<a id="sequence-define"></a>
|
||||
<b>Define</b>
|
||||
<ul>
|
||||
<code>define <name> sequence <re1> <timeout1>
|
||||
@ -312,21 +331,21 @@ sequence_Undef($$)
|
||||
</ul>
|
||||
<br>
|
||||
|
||||
<a name="sequenceset"></a>
|
||||
<a id="sequence-set"></a>
|
||||
<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>
|
||||
|
||||
<a name="sequenceattr"></a>
|
||||
<a id="sequence-attr"></a>
|
||||
<b>Attributes</b>
|
||||
<ul>
|
||||
<li><a href="#addStateEvent">addStateEvent</a></li>
|
||||
<li><a href="#disable">disable</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
|
||||
sind, dann wird ein partial_X Event generiert, wobei X durch Anzahl der
|
||||
eingetroffenen Events ersetzt wird. Beispiel:<br><code><ul>
|
||||
@ -339,18 +358,30 @@ sequence_Undef($$)
|
||||
gedrückt wurde.
|
||||
</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
|
||||
getrennt) nach dem "trigger" oder "partial_X" Schlüsselwort.
|
||||
Das kann verwendet werden, um generische sequence Instanzen zu definieren:
|
||||
<br>
|
||||
<ul><code>
|
||||
define seq sequence remote:btn.* remote:btn.*<br>
|
||||
define seq sequence remote:btn.* 1 remote:btn.*<br>
|
||||
attr seq reportEvents<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>
|
||||
</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>
|
||||
<br>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user