Problem: Meldung bei Tür wird abgeschlossen, irgendein Fenster ist noch auf

Begonnen von Loki, 05 April 2017, 20:39:00

Vorheriges Thema - Nächstes Thema

Loki

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.

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

alex885

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.
FHEM auf Hackintosh-NUC, 5 x Rpi mit Fhem2Fhem & Shairport-Sync , FB7390, CUL, HMLAN, ZWave, Zigbee, RfxTrx, Rollotron, mySensors, Xiaomi mi, div Zeuchs..

Loki

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?

Brockmann

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.

Loki

Auf die Aggregatfunktion hoffe ich auch.
Mit structures und der Abfrage des state davon komme ich leider nicht klar.

Damian

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 ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

automatisierer

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...

Beta-User

@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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

CoolTux

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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Beta-User

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?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

automatisierer


Beta-User

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 :-*
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Loki

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!'";
  }
}



Beta-User

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
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors