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
Einfach: structure mit allen 3 Fenstern und diese auswerten.
Etwas schwieriger: Perl, devspec2array, forach.
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
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
devspec2array("(FensterKontakt.*):FILTER=room=Wohnzimmer")
Findet alle Devices mit Anfangsnamen Fensterkontakt im Raum Wohnzimmer.
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
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
Hi,
ja geht ;)
Was sollte denn dann Drinstehen?
Gruß
Thomas
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
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
Kann ich aus der Praxis raus nicht bestätigen. Aber im Code habe ich nun nicht geschaut.
Hallo nochmal,
Geht nicht:
unless (@winopen){
}
Geht:
if(@winopen > 0){
}
if(@winopen == 0){
}
Gruß
Thomas
unless ( not defined(@winopen) ){
}
So sollte es eigentlich gehen.
Hmm
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at ./FHEM/99_myUtils.pm line 31.
Gruß
Thomas
Ich Dussel. Habe mich hinreißen lassen. Mom
Nachtrag. Bleib Mal beim if, kann gerade nicht denken ;D
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...
- Ein Array mit dem Argument der Funktion als einziges Element. (Also z.B. "HM_SEC_Bad.*")
- Ein leeres Array
- Ein Array mit "" als einzigem Element
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:
- Das Argument der Funktion. (Also z.B. "HM_SEC_Bad.*")
- 0
- 1
Ganz toll...
Gruß,
Thorsten
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