FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Loki am 05 April 2017, 20:39:00

Titel: Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Loki am 05 April 2017, 20:39:00
Hallo,

ich schlage mich jetzt schon den ganzen Tag mit der eigentlich simplen Aufgabenstellung herum, habe unzählige Threads durchforstet und x mal die Doku angeschaut.
Trotzdem komme ich nicht zum Ziel.

Ich habe einen HM-SEC-SC-2 am Türschloss "TUERSCHLOSS".
Mein Push beim Abschließen funktioniert wunderbar.
define TUERSCHLOSS.Notify notify TUERSCHLOSS:closed set pushmsg message 'Tür abgeschlossen' 'room:10_Schalter'

Jetzt wollte ich das ganze dahingehend erweitern, dass ein Push kommt, wenn noch irgendein Fenster offen oder angekippt ist.
Meine Fester-Sensoren lauten alle "RAUM.fenster" und kennen "open, tilted, closed".

Mein DOIF sieht so aus:
Zitat([TUERSCHLOSS] eq "closed" and [.*fenster] eq "(open|tilted)") (set pushmsg message 'ACHTUNG - Tür zu, aber Fenster noch auf')

Da passiert aber nichts...

Die Aggregatfunktion bringt mich auch nicht weiter:
Zitat(([TUERSCHLOSS] eq "closed") and ([".*fenster:open","open"] != 0)) (set pushmsg message 'Tür zu fenster auf')

Wie bekomme ich die Abfrage auf "irgend ein Fenster" beim Abschließen hin?
Ich bin für jede Hilfe dankbar.
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Otto123 am 05 April 2017, 21:09:37
Hi,

ich denke ein regEx an der Stelle  eq "(open|tilted)" funktioniert nicht.
Und regEx [.*fenster] geht glaube ich auch nicht.
Zumindest nicht wenn ich das so teste.

Also nur als Idee.

Der primäre Trigger kann bei DOIF so aussehen -> [TUERSCHLOSS:"closed"]
Schau mal in die commandref das sind Beispiele -> https://fhem.de/commandref_DE.html#DOIF

Gruß Otto
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: alex885 am 05 April 2017, 21:15:01
Hallo,

bin auch noch Newbie...


aber ist da nicht eine Klammer zu viel? ob das mit eq überhaupt geht..?

so:
([TUERSCHLOSS] eq "closed" and [?".*fenster:open|tilted"] ) (set pushmsg message 'ACHTUNG - Tür zu, aber Fenster noch auf')

? weil es nur um die abfrage geht, 2 events gleichzeitig klappt nicht und alles in "" dann kanns regexen  wenn ich das verstanden hab.

viel Erfolg!

lg A.
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Loki am 06 April 2017, 08:01:35
Genau das ist ja der Punkt.
Triggern soll nur das TUERSCHLOSS, aber pushen soll es nur bei der Bedingung .*fenster$ "opened" oder "tilted".

Muss ich vielleicht ein notify auf das TUERSCHLOSS machen und dann in einem IF alle Fenster abfragen?
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Brockmann am 06 April 2017, 09:07:02
Zitat von: Otto123 am 05 April 2017, 21:09:37
ich denke ein regEx an der Stelle  eq "(open|tilted)" funktioniert nicht.
Das geht schon, aber es müsste so aussehen:
[blabla] =~ "open|tilted"

Für die Fensterkontakte: Damian hat gerade eine Aggregatsfunktion in Vorbereitung, die solche Fälle abdeckt:
https://forum.fhem.de/index.php/topic,67367.0.html

Bis dahin wäre das Mittel der Wahl vermutlich eine structure, die alle Fensterkontakte umfasst.
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Loki am 06 April 2017, 19:51:25
Auf die Aggregatfunktion hoffe ich auch.
Mit structures und der Abfrage des state davon komme ich leider nicht klar.
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Damian am 06 April 2017, 20:32:54
Zitat von: Loki am 06 April 2017, 19:51:25
Auf die Aggregatfunktion hoffe ich auch.
Mit structures und der Abfrage des state davon komme ich leider nicht klar.

Kommt wahrscheinlich als Ostergeschenk ;)
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: automatisierer am 07 April 2017, 08:35:19
Ich mache das so:

Ein DOIF:
defmod Fenster_vergessen DOIF ([rgr_Familie:"^presence: absent"]) (set pushover msg title=Warnung {(checkWindowOpen("msg"))} device=Ingo priority=2 sound=siren retry=30 expire=3600)
attr Fenster_vergessen do always
attr Fenster_vergessen event-on-change-reading state
attr Fenster_vergessen room __Befehle


und eine sub in MyUtils.
sub checkWindowOpen($)
{

my ($cmd) = @_;

my $wOpen = "";
my @list;
my $sdev;
   
# HM threestate
@list = devspec2array("subType=threeStateSensor:FILTER=winOpenMsg=1");
foreach $sdev (@list)
        {
        if($defs{$sdev})
            {
            my $devname=AttrVal($sdev,'winOpenName',AttrVal($sdev,'alias',$sdev));
            $wOpen = $wOpen."$devname\n" if (ReadingsVal($sdev,"state","unknown") !~ "closed");
            }
        }

if ( ! defined( $cmd ) || ( $cmd eq "" ) )
{
    $wOpen = undef if ( $wOpen eq "" );
    } elsif ( $cmd eq "msg" )
{
        my ($seconds, $microseconds) = gettimeofday();
        my @t = localtime($seconds);
        my $tim = sprintf("%02d.%02d %02d:%02d:%02d",
                $t[3],$t[4]+1, $t[2],$t[1],$t[0]);
        $wOpen = "Fenster nicht geschlossen:\n$wOpen [$tim]" if ( $wOpen ne "" );
    } else
{
    $wOpen = "unknwown cmd :$cmd: in checkWindowOpen";
    }
   
return $wOpen;

}



da du ja 'open und tilted' hast, wirst du wohl andere Sensoren haben und musst die Sub entsprechend anpassen.

Bei den Sensoren habe ich folgende attribute angelegt:
attr <dev> winOpenMsg #muss '1' sein, damit der Sensor bei der überprüfung berücksichtigt wird.
attr <dev> winOpenName #kann einen Namen als Bezeichnung für das Fenster enthalten. Falls nicht genutzt wird alias genommen oder sonst der Device-Name

EDIT:
falls alle Fenster zu sind, kommt nichts zurück, somit bekommt Pushover keinen MSG Text, was zu einer Fehlermeldung führt. Das könnte man sicherlich noch verschönern...
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Beta-User am 07 April 2017, 09:26:00
@Automatisierer
Zwei Dinge verstehe ich nicht:
1. Warum nimmst Du ein DOIF, wenn es sich um ein schlichtes Ereignis handelt? Dafür wäre ein notify völlig ausreichend...
2. Warum sendest Du die Message nicht aus sub heraus? Dann könntest Du mit der sub noch zusätzlich prüfen, ob das array mindestens ein Element enthält...

Am Rande: Macht die Prüfung, ob ein Device existiert Sinn, wenn vorher devspec2array aufgerufen wurde? Dann sollten eigentlich nur definierte Devices zurückgeliefert worden sein, oder unterliege ich da einem Irrtum?

Gruß, Beta-User
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: CoolTux am 07 April 2017, 10:39:16
Weil man diese Sub an mehreren Stellen einbinden kann. So ist es ohne Probleme möglich dem letzten der das Haus verlässt eine Mail zukommen zu lassen, oder eben auch der letzte der sich schlafen legt die Ansage der noch offenen Fenster zukommen zu lassen.
Subs sollten möglichst so ausgelegt werden das man sie ohne weiteres an mehreren Stelllen in mehreren Situationen verwenden kann.
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Beta-User am 07 April 2017, 10:47:21
OK, das mit der Universalität der sub leuchtet ein.

Wenn man sie in der Form verwendet, wäre es evtl. "nett", den zurückgelieferten Text anzupassen, wenn kein Fenster offen ist? Oder in diesem Fall ein "undef" (oder sowas) zurückzuliefern, damit die aufrufende Funktion entscheiden kann, ob überhaupt eine Message gesendet werden soll?
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: automatisierer am 07 April 2017, 11:42:43
Warum ich DOIF nehme, statt notify?!?!? weil ich's kann... 8)
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Beta-User am 07 April 2017, 12:03:25
Zitat von: automatisierer am 07 April 2017, 11:42:43
Warum ich DOIF nehme, statt notify?!?!? weil ich's kann... 8)
Da hast Du mir ja wirklich was wichtiges voraus :-*
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Loki am 07 April 2017, 18:26:58
So, ich habe es gelöst. Zwar ohne DOIF, aber ich möchte es euch trotzdem nicht vorenthalten.

Zunächst eine Funktion zum Sammeln aller Sensoren:
sub sensor_status {
my @sensors = devspec2array("model=HM-SEC-RHS");
my $num_wopen = 0;
my $resultstring='';

foreach(@sensors) {
  my $sensor_state = ReadingsVal($_, "state", "nA");
if ($sensor_state eq "open" || $sensor_state eq "tilted" ){
$resultstring.="- ".$_." ".$sensor_state."\n";
    Log 4, "sensor_status: ". $_. "noch offen";
   
    $num_wopen++;
   }
}

if ( $num_wopen eq 0 ) {
  $resultstring="allClosed";
}
return $resultstring;
}


Dann ein notify beim Wechseln des Status eines Sensors:
.*(fenster|garten).*(open|tilted|closed) {

my $sensor_status=sensor_status;

fhem"set Kontakte ".$sensor_status;

}


und zuletzt ein NOTIFY auf das Türschloss:
TUERSCHLOSS:closed
{
  if (Value("Kontakte") ne "allClosed"){
fhem "set pushmsg message 'ACHTUNG! Tür zu, aber ".Value("Kontakte")."' 'room:10_Schalter'";
  } else {
    fhem "set pushmsg message 'Alles ist zu. Auf Wiedersehen!'";
  }
}


Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Beta-User am 08 April 2017, 07:58:29
Hi Loki,

Danke für das Posten der Lösung. Habe aber noch eine Frage dazu: stimmt denn Dein Kontakte-Status, wenn erst beide Fenster nicht zu waren und dann eines geschlossen wird?

Sollte das nicht so sein, wie Du erwartest, könntest Du Dir das Modul "structure" mal ansehen. Das nimmt den Zustand "closed" nur an, wenn alle Fenster zu sind.

Ansonsten bitte den Thread als gelöst markieren
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Loki am 10 April 2017, 00:24:38
Ja, der Status passt, da es ja zwar bei jedem Kontakt per NOTIFY auslöst, aber dann trotzdem den Status von allen bündelt, die es findet.
Internals:
   NAME       FensterSammelStatus
   NR         582
   STATE      - ERIK.fenster gekippt- KUECHE.fenster gekippt- SCHLAF.fenster gekippt
   TYPE       dummy
   Readings:
     2017-04-09 14:48:55   state           - ERIK.fenster gekippt- KUECHE.fenster gekippt- SCHLAF.fenster gekippt
Attributes:
   room       98_Sicherheit


Bei STRUCTURE muss ich doch statisch alle relevanten Geräte aufzählen, oder geht da auch sowas wie "*.fenster"?
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Brockmann am 10 April 2017, 07:59:11
Zitat von: Loki am 10 April 2017, 00:24:38
Bei STRUCTURE muss ich doch statisch alle relevanten Geräte aufzählen, oder geht da auch sowas wie "*.fenster"?
Im Prinzip musst Du alle einzeln aufzählen. Es sei denn, alle Devices vom gleichen Typ sollen erfasst werden. Dann kannst Du sowas machen:
addstruct Kueche TYPE=FS20

Oder Du nimmst Dein "*.fenster" als Trigger für DOIF oder Notify, das alle passenden Geräte per addstruct der Structure hinzufügt. Dann würden alle Geräte automatisch hinzugefügt, sowie sie ihr erstes Event generiert haben und noch nicht in der Structure sind.
Nicht getestet, nur gerade eingefallen...
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Per am 12 April 2017, 21:22:21
Zitat von: Brockmann am 10 April 2017, 07:59:11Dann würden alle Geräte automatisch hinzugefügt, sowie sie ihr erstes Event generiert haben und noch nicht in der Structure sind.
Kann man das mit
get *.fenster irgendwas
nicht forcieren?
Titel: Antw:Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf
Beitrag von: Brockmann am 14 April 2017, 09:19:39
Zitat von: Per am 12 April 2017, 21:22:21
Kann man das mit
get *.fenster irgendwas
nicht forcieren?
Verstehe ich nicht, auf welches Modul soll sich dieses get beziehen?
Eine Structure hat zumindest kein get...