Hallo, irgendwie komme ich nicht dahinter wie ich folgende Bedingung prüfen kann.
Gegeben ist ein Sensor welcher beim schließen eines Drehgriffs den state von open-->closed-->open-->closed-->open wechselt, wird jetzt die Tür geöffnet soll ein dummy auf open gesetzt werden, sonst soll der dummy den state auf closed setzen.
Ich denke da schon den ganzen Nachmittag drüber nach aber bekomme das nicht in einen Code gebacken. Hat jemand eine Idee?
VG
Frank
Wenn ich's richtig verstanden habe, kommen beim Schließen kurz nacheinander 5 Events
Zitatopen-->closed-->open-->closed-->open
in genau der Reihenfolge und kurz aufeinander. Das könnte man mit einer Sequence auswerten, ich würde das dann aber schlicht den Zustand des Drehgriff-devices korrigieren lassen (sollte mit einem notify und setstate oder setreading gehen, je nachdem, ob Du noch ein Event brauchst).
Was passiert beim Öffnen? Paßt da der Status?
Gruß, Beta-User
Habe jetzt mal eine sub gebastelt, läuft aber leider noch nicht:
sub Haustuer_count()
{
#my $count_ist = 0;
my $count_ist = ReadingsVal("HsTuer_Sensor","trigger_cnt",0);
my $state_ist = Value("HsTuer_Sensor");
my $tuer = Value("Schalter_Wohnungstuer");
fhem "setreading Haust_du counter $count_ist";
if ($count_ist != 0 && ($state_ist eq "open" && $tuer eq "open")) {
fhem "set Haust_du open";
$count_ist = 0;
} else {
fhem "set Haust_du closed";
}
}
Da $count_ist in jeden Fall ungleich 0 ist, funktioniert das Ganze nicht. Mit oldvalue würde ich aber nur den alte Zustand von STATE bekommen, brauchen würde ich aber den alten Wert von trigger_cnt.
Getriggert wird über ein notify, zur Auswertung habe ich trigger_cnt genommen, da das Reading je Betätigung 4 Zähler hochzählt, Haust_du ist das dummy device.
Hier noch ein Experiment um den alten trigger_cnt zu retten und dann neu - alt zu machen, ist aber auch der Wurm drinn
sub Haustuer_count()
{
#my $count_ist = 0;
my $count_ist = ReadingsVal("HsTuer_Sensor","trigger_cnt",0);
my $count_old = Value("Hs_Tuer_count_old");
my $state_ist = Value("HsTuer_Sensor");
my $tuer = Value("Schalter_Wohnungstuer");
fhem "setreading Haust_du Anzahl $count_ist";
fhem "setreading Hs_Tuer_count_old $count_old";
my $count = ($count_ist - $count_old);
fhem "setreading Haust_du Count $count";
if ($count != 0 && ($state_ist eq "open" && $tuer eq "open")) {
fhem "set Haust_du open";
$count = 0;
#fhem "set "
} else {
fhem "set Haust_du closed";
}
}
Brauche erst mal ne Pause...
VG
Frank
Zitat von: Beta-User am 05 April 2017, 17:54:22
Wenn ich's richtig verstanden habe, kommen beim Schließen kurz nacheinander 5 Events in genau der Reihenfolge und kurz aufeinander. Das könnte man mit einer Sequence auswerten,
ich auch, denn das Ergebnis einer sequence wäre genau das hier:
Zitat von: Beta-User am 05 April 2017, 17:54:22
sollte mit einem notify und setstate oder setreading gehen, je nachdem, ob Du noch ein Event brauchst.
Die sequence liefert ja genau EINEN event.
Habe ich inzwischen schon mit sequence probiert, dass Proble ist das der Drehgriff mit verschiedenen Geschwindigkeiten gedreht werden kann und dann bei sequence device:open 0.2 device:closed 0.2 device ...
Nicht reagiert.
P.S. ein threeStateSensor ist dafür wahrscheinlich auch zu träge
VG
Frank
Das mit den Geschwindigkeiten kannst Du ja lösen, indem Du die Zeitgrenzen nicht ganz so eng setzt.
BTW: Was ist das überhaupt für ein Sensor (z.B. bei HM kann man ja auch eine Sendeverzögerung einbauen, dann sollten gar keine Zwischenstände kommen)?
@Betateilchen:
Dass sequence genau einen event feuert, ist klar. Die Frage war dann aber, ob
- das damit getriggerte notify dann nur den Wert schreiben soll (und weitere Aktionen dann direkt mit ausführen) und nur den Anzeigewert des Kontakts zutreffend kennzeichnen,
- oder die Änderung dann auch wieder einen trigger darstellen soll (was m.E. keinen großen Sinn macht, da ja grade wegen des seltsamen Verhaltens sonst viel unkontrolliert ausgelöst werden würde).
Gruß, Beta-User
Der Sensor ist ein hm-sec-sc2 und auf der Gegenseite sitzt auf einer Welle ein Magnet. Die Welle ist von einem TSR Burgwächter Türschloss und im Endeffekt geht es darum zu erkennen ob das Schloss offen oder zu ist. Werde mich heute Abend noch mal mit sequence beschäftigen.
VG
Frank
Hab's immer noch nicht ganz verstanden:
Ist der Zustand des hm-sec-sc2 closed, wenn die Tür abgeschlossen ist? Dann müßte es reichen, intern die "Warte mit dem Senden"-Zeit (ist irgend ein hm-Register) entsprechend zu setzen, die Detektierung dürfte ja nicht zeitkritisch sein, solange es zeitnah erfolgt.
Aber: gibt es den Fall, dass das Ding irgendwo dazwischen auf "offen" stehen bleibt? Da sehe ich (jedenfalls ohne intensiveres NAchdenken) schwarz, was eine zuverlässige Detektierung angeht...
so wie ich das verstehe, gibt es immer 4 trigger vom fensterkontakt, egal ob die tür auf oder zu geht.
dazu könnte man auch das triggercnt reading über userreadings auswerten. bei jedem trigger wird um eins erhöht, nach 255 fängt es wieder bei 0 an und nach batteriewechsel startet es mit 1.
wenn die tür zu ist und die batterie wird gewechselt, steht triggercnt auf 1. dann ist die tür zu bei 1,9,17,25,... und offen bei 5,13,21,29,...
Siehe oben, mit trigger_cnt habe ich es schon probiert :-)
Die Auswertung ist etwas kniffelig, wenn der Drehgriff nur einmal umgedreht wird also state von open-->closed--> oben wechselt, ist die Tür auch zu (aber nur einmal rumgeschlossen).
Das mit der trigger_cnt Auswertung funktioniert auch und der dummy geht auf closed, was nicht funktioniert ist die Auswertung von open, da sitze ich noch dran. ;)
Bis jetzt:
#
#
package main;
use strict;
use warnings;
use POSIX;
use vars qw($myCounter2);
$myCounter2 = Value("HsTuer_count_old");
sub
myCounter2Utils_Initialize($$)
{
my ($hash) = @_;
}
sub Haustuer_count()
{
my $count_ist = ReadingsVal("HsTuer_Sensor","trigger_cnt",0);
my $state_ist = Value("HsTuer_Sensor");
my $tuer = Value("Schalter_Wohnungstuer");
my $myCounter2 = Value("Hs_Tuer_count_old");
my $count_old = $myCounter2;
fhem "setreading Haust_du Anzahl $count_ist"; #debugging
fhem "set Hs_Tuer_count_old $count_old"; #debugging
my $count = ($count_ist - $count_old);
fhem "setreading Haust_du Count $count";
if ($count != 0 && ($state_ist eq "open" && $tuer eq "open")) {
fhem "set Haust_du open";
#$count = 0;
} else {
fhem "set Haust_du closed";
#$count = 0;
}
}
1;
VG
Frank
ZitatDie Auswertung ist etwas kniffelig, wenn der Drehgriff nur einmal umgedreht wird also state von open-->closed--> oben wechselt, ist die Tür auch zu (aber nur einmal rumgeschlossen).
wenn auch 2 trigger möglich sind, kannst du es vergessen. denn wenn danach nochmal 2 trigger kommen, kannst du nicht mehr entscheiden, ob nun weiter geschlossen (2-fach verschlossen) oder aufgeschlossen wurde.
mit einem rhs (drehgriffkontakt) könntest du die drehrichtung detektieren (öffnen/schliessen) und wahrscheinlich auch die anzahl der schliessungen (1/2-fach verschlossen).
Zitatwenn auch 2 trigger möglich sind, kannst du es vergessen...
sehe ich inzwischen auch so, da führt kein Weg rein >:(
Habe eben ein rhs bestellt, mal sehen :)
VG
Frank
ich habe mal etwas probiert.
man darf auf alle fälle nicht zu schnell drehen, sonst werden manche trigger nicht gesendet.
zusätzlich wird das auch etwas tricky werden, da der zustand msgPosB leider 2 mal bei einer vollen umdrehung auftaucht.
Sooo, der rhs ist gestern eingetroffen ;)
Die Frage die sich jetzt stellt ist, wie bekomme ich ich das Teil da dran... :o