2
0
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:
rudolfkoenig 2023-07-10 09:32:40 +00:00
parent 6c87a7d503
commit 4fd153f8a6

View File

@ -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 &lt;name&gt; sequence &lt;re1&gt; &lt;timeout1&gt;
@ -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 &lt;name&gt; sequence &lt;re1&gt; &lt;timeout1&gt;
@ -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&uuml;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&uuml;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&uuml;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&uuml;nschten Events (kein
Zeitstempel, ACK, etc).
</li><br>
</ul>
<br>