FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: Tommi ratlos am 05 November 2017, 11:05:13

Titel: [GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 11:05:13
Hallo zusammen,

ich suche nach einer Möglichkeit bei 3x HM-SEC-SCO an einem Thermostat festzustellen, ob eines der Fenster offen ist.
Der Thermostat erkennt das, aber wie kann ich das in myutils99.pm verwenden?


Es Gibt:
HM_SEC_<NAME>_Fenster_1
HM_SEC_<NAME>_Fenster_2
HM_SEC_<NAME>_Tuer
Der Code ist natürlich nicht richtig

my $r_window = (ReadingsVal("HM_SEC_".$name."_".*, "state", ""));



Oder wie kann ich analog zu einem Notify "HM_RT_<NAME>_WindowRec:trigLast" verwenden.


Stehe gerade auf dem Schlauch

Gruß
Thomas
Titel: Antw:Prüfen ob ein von X Fenstern geöffnet
Beitrag von: marvin78 am 05 November 2017, 11:11:42
Einfach: structure mit allen 3 Fenstern und diese auswerten.


Etwas schwieriger: Perl, devspec2array, forach.
Titel: Antw:Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Thorsten Pferdekaemper am 05 November 2017, 11:30:56
Hi,
wenn es immer nur genau die drei sind, dann kann man erst einmal die drei "fest verdrahtet" per ReadingsVal abfragen und die Ergebnisse mit "or" verknüpfen.
Wenn das ganze allgemein sein soll, dann wie schon gesagt erst einmal mit devspec2array die passenden Namen ermitteln und für jedes davon ReadingsVal aufrufen.
Gruß,
   Thorsten
Titel: Antw:Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 11:33:45
Hallo,

es geht um mehrere Räume mit je ein bis vier Fensterkontakten.
Ich lese mich gerade in "devspec2array" ein, hört sich vielversprechend an.

Gruß
Thomas
Titel: Antw:Prüfen ob ein von X Fenstern geöffnet
Beitrag von: CoolTux am 05 November 2017, 13:00:03

devspec2array("(FensterKontakt.*):FILTER=room=Wohnzimmer")


Findet alle Devices mit Anfangsnamen Fensterkontakt im Raum Wohnzimmer.
Titel: Antw:Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 13:03:34
Hallo,

habe es jetzt so Gelöst

my $name = "Bad";
my @winopen = devspec2array("TYPE=CUL_HM:FILTER=model=HM-SEC-SCo:FILTER=NAME=.*_".$name."_.*:FILTER=state!=closed");
if(@winopen > 0){
    Log3(undef, 1, "AUF");
}


Danke
Thomas
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Thorsten Pferdekaemper am 05 November 2017, 13:06:39
Hi,
funktioniert das wirklich? Laut Doku zu devspec2array gibt es das Argument zurück, wenn nichts gefunden wird. D.h. es steht in @winopen immer was drin. Ich habe das allerdings nicht ausprobiert, es ist mir nur in der Doku aufgefallen.
Gruß,
   Thorsten
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 13:08:57
Hi,

ja geht  ;)
Was sollte denn dann Drinstehen?

Gruß
Thomas
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: CoolTux am 05 November 2017, 13:16:20
Eigentlich sollte dann gar nichts drin stehen.

Eine mögliche Anwendung wäre eine Funktion in einer 99_myUtils

sub statusFensterOffen($) {

    my $contactSensorDevice     = shift;
    $contactSensorDevice        = 'FensterKontakt.*' if( not defined($contactSensorDevice) );
   
    my @monitored=devspec2array("($contactSensorDevice):FILTER=STATE!=closed");
my $cnt_devs=@monitored;
my $i = 0;
my $msgtext = "";
foreach(@monitored) {
$msgtext .= AttrVal($_,"alias",$_);
if ($i < $cnt_devs - 2) {
  $msgtext .= ", ";
}
if ($i == $cnt_devs - 2) {
  $msgtext .= " und ";
}
$i++;
}

return $msgtext if ($cnt_devs > 0);
}


Kann man ja noch Anpassen/Erweitern
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Thorsten Pferdekaemper am 05 November 2017, 13:18:08
Hi,
siehe hier:
https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array
Zitat
Sollte keine Definition auf die übergebene Spezifikation passen, so wird $devspec als einziges zurückgegeben. Dieser Mechanismus ist aus historischen Gründen so gewählt um die Funktion devspec2array() transparent in Module einzufügen ohne große Änderungen im Code durchführen zu müssen. Daher ist es notwendig im Falle der Rückgabe eines einzelnen Elements dies nochmals auf Existenz in %defs zu prüfen.
Gruß,
   Thorsten
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: CoolTux am 05 November 2017, 13:20:15
Kann ich aus der Praxis raus nicht bestätigen. Aber im Code habe ich nun nicht geschaut.
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 13:25:16
Hallo nochmal,

Geht nicht:

unless (@winopen){
}


Geht:

if(@winopen > 0){
}

if(@winopen == 0){
}


Gruß
Thomas
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: CoolTux am 05 November 2017, 13:30:56

unless ( not defined(@winopen) ){
}

So sollte es eigentlich gehen.
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Tommi ratlos am 05 November 2017, 13:36:07
Hmm


Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at ./FHEM/99_myUtils.pm line 31.


Gruß
Thomas
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: CoolTux am 05 November 2017, 13:42:02
Ich Dussel. Habe mich hinreißen lassen. Mom


Nachtrag. Bleib Mal beim if, kann gerade nicht denken  ;D
Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: Thorsten Pferdekaemper am 05 November 2017, 15:23:58
Zitat von: CoolTux am 05 November 2017, 13:20:15
Kann ich aus der Praxis raus nicht bestätigen. Aber im Code habe ich nun nicht geschaut.
Ich habe jetzt nochmal scharf ins Coding geschaut. Die Routine ist wirklich etwas seltsam. Wenn man sie mit einer Devspec aufruft, in der "=" oder ">" oder sowas vorkommt, dann wird tatsächlich ein leeres Array zurück gegeben, wenn nichts past.

Zitat von: Tommi ratlos am 05 November 2017, 13:25:16
Geht nicht:

unless (@winopen){
}

Dsa finde ich sehr seltsam, da es dasselbe ist wie...

if(@winopen == 0){
}


Zitat von: CoolTux am 05 November 2017, 13:30:56

unless ( not defined(@winopen) ){
}

So sollte es eigentlich gehen.
Das ist dasselbe wie

if(defined(@winopen) ){
}

...und das ist immer wahr, da devspec2array in jedem Fall ein Array zurück gibt. Es ist immer "defined", nur manchmal leer. (Zumindest soweit ich das sehen kann.)

Insgesamt sieht es so aus, dass devspec2array unterschiedliche Dinge zurückliefern kann, wenn nichts gefunden wurde. Wenn das Ergebnis einem Array zugewiesen wird, dann kann das sein...
Wenn das Ergebnis der Funktion einem Skalar zugewiesen wird, dann würde ich sagen, dass bei "kein Treffer" dieser Skalar die folgenden Werte annehmen kann:

Ganz toll...
Gruß,
   Thorsten

Titel: Antw:[GELÖST]Prüfen ob ein von X Fenstern geöffnet
Beitrag von: thotti70 am 05 November 2017, 23:48:03
Hi, auch wenn schon als gelöst markiert, ich habe es mit dem Modul Monitoring umgesetzt:

defmod Fenster_monitoring monitoring ^Fenster_.*_.*:(open|tilted) ^Fenster_.*_.*:closed


Den String ^Fenster_.*_.* musst du halt gegen den Namen deiner Fensterkontakte austauschen.
Evtl. auch noch die Attribute errorWait bzw. warningWait setzen.

VG Thotti