Hallo und guten Morgen,
Da dies mein erster Post ist, werde ich mich mal kurz vorstellen. Ich bin der Leon und beschäftige mich seit 3 Wochen mit Heimautomatisierung im Allgemeinen und FHEM in Verbindung mit Homematic im Speziellen. Ein paar kleine Sachen habe ich auch schon am laufen. Sensorgesteuerter Luftbefeuchter (weil meine Frau gerne einen haben wollte), Anwesenheitserkennung (weil die Kinder stehts und ständig vergessen das Licht aus zu machen) und Erkennung ob die Waschmaschine fertig ist (weil ich das cool fand :-) ).
Wer sonst noch was wissen will kann mich gerne einfach fragen.
So und nun zu meiner Frage/Problem.
Voraussetzungen: Erkennung durch das Residenzmodul wenn keiner mehr zu Hause ist (läuft), daraus folgend wird geschaut ob die Eingangstür offen und oder ein Fenster offen ist durch das Structurmodul (läuft). Nun möchte ich das bei Status offen geschaut wird welches Device offen ist und wer als letztes gegangen ist und daraus soll eine Vernünftige Meldung über Pushover erfolgen.
Dabei ist darauf zu achten den Aufwand/die Unübersichtlichkeit/unnötige Dummy Devices so gering wie möglich zu halten. Hat da jemand einen Denkansatz für mich.
Meine Devices für die Fenster/Türenkontakte haben alle ein Kontakt im Namen. Es muss doch möglich sein in ein Notify eine Abfrage mit zu befüllender Variable ein zu bauen welches schaut wo ein Kontakt den Status Open hat.
{my $openDEV (Value(.*Kontakt.*:state.open))}
kann man das so nach einem if als weiteren Befehl in ein notify einbauen?
Ich würde in einem Notify (Eingangstür) eine Perl-Routine aufrufen, die die in Frage kommende Devices durchgeht (ob dabei in eine Struktur, eine feste Liste, durch alle Gerätschaften geschaut wird, ist nebensächlich) und entsprechende Meldungen ausgibt.
...und die Perl-Routine könnte so aussehen: http://forum.fhem.de/index.php/topic,33512.msg259540.html#msg259540
Vielen Dank für die Antworten und Lösungsansätze. Scheint ja doch etwas komplexer zu sein. Werde mich die Tage mal damit auseinander setzen. ;D
Grüße
Leon
Nicht komplex, nur eine Herausforderung...
Daher hier noch ein paar Tipps:
foreach my $d (keys %defs)
{
# lläuft durch alle fhem-Objekte durch
if($d->{NAME} =~m/ Kontakt oder was den Namen als Fenster kennzeichnet
{
# offen?
if($d->{STATE} eq 'offen')
oder
if(Value($d) eq 'offfen')
# habe kein HM und weiß daher nicht wie offen heißt
my $d->{NAME};
# Nenne das Fenster per alias sinnvoll...
my $klarnamen = AttrVal($name,'alias','Name nicht gesetzt');
# Nun kann mit klarnamen die Mail oder sonst was gesendet werden.
} # if Fenster
} # end foreach
Viel Spaß
Elektrolurch
statt sich durch die fhem internas zu hangeln ist es manchmal sinnvoller sich mit einem list und passendem devspec/filter direkt die namen der devices geben zu lassen auf die die von dir gewünschte Bedingung zutrifft.
gruß
andre
Klar geht auch.
Wenn er aber devspec2array aufruft, bekommt er auch eine Liste und muss die mit foreach oder while aubarbeiten.
Ich wollte bei den internals auch nur mal zeigen, dass es die gibt.
er soll ja garnicht devspec2array aufrufen sondern das ganz normale list. da bekommt er einen string den er direkt mailen kann.
@Elektrolurch
Vielen Dank für Dein Codebeispiel.
@all
Puh, mal langsam bitte. Bin doch etwas verwirrt. Bedeutet Eure Aussage mit den Internals das ich keine zusätzliche Perlroutine brauche? Wie gesagt am liebsten würde ich es mit vorhandenen FHEM Möglichkeiten lösen.
Habe nun schon so viel geschaft was ich an Anforderung hatte. Wahnsinn was FHEM von Hause aus durch die Community so kann.
@Elektrolurch
Ich glaube ich versteheh was Du meinst. Und das kann ich dich ohne zusätzliche Routine machen wenn ich das korrekt verstehe. Ich muß mal bisschen am WE rumprobieren.
Hallo und guten Morgen. Ja ja ich weiß, Ewigkeiten her und so ;D , aber ich habe eine für mich befriedigende Lösung finden können. Hat nur etwas gedauert. Mann hat ja noch andere Baustellen.
99_myUtils.pm
sub statusFensterOffen() {
my @monitored=devspec2array("(FensterKontakt.*):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);
}
Und ein entsprechendes Notify könnte so aussehen
my $condition=ReadingsVal("weatherStahnsdorfProplanta","fc1_weatherMorning","Weltuntergang");
my $fensterOffen=statusFensterOffen();
if ($fensterOffen eq "") {
fhem "set FritzBoxTuxNetDSL01 ring 610 say:Hier gibt es nichts zu sehen bitte weiter gehen";
} else {
fhem "set FritzBoxTuxNetDSL01 ring 610 say:Achtung,$fensterOffen noch offen.";
}
Thema für also abgeschlossen
LG