FHT Fensterkontakt auf Erreichbarkeit prüfen

Begonnen von broadway, 19 Februar 2013, 20:35:45

Vorheriges Thema - Nächstes Thema

broadway

Ich nutze einen übrig gebliebenen Fensterkontakt aus dem FHT System ("FHT_TFK") zur Störungsüberwachung unserer Heizung.

Einmal täglich prüfe ich, ob am jeweiligen Tag eine Meldung (Fenster zu, bzw. auf) empfangen wurde und schreibe das Ergebnis ins Logfile.

Folgendes at wird definiert. Das Datum der letzten Meldung in der Form "2013-02-19 12:02:24" und das heutige Datum werden an die Funktion "IsAlive" übergeben.
define checkAlive at *12:00 {\
   my $dateTFK=ReadingsTimestamp("FHT_TFK", "Window", 0);;\
   my $checkAlive=IsAlive($dateTFK,$year."-".$month."-".$mday);;\
   if($checkAlive eq "true"){Log 1, "Störmelder Heizung OK."}\
   else {Log 1, "Fehler Störmelder!"}\
}


Die Funktion IsAlive wird in den 99_Utils definiert. Hier werden die Daten verglichen.
#############################################################
# Auf gleiches Datum prüfen                     #############
#############################################################
# vorliegendes Format von FHT_TFK: 2013-2-17 12:23:40

 sub IsAlive($$) {
 my ($year1,$month1,$temp) = split("-", shift);
 my ($year2,$month2,$day2) = split("-", shift);

# Uhrzeit wird nicht benötigt
 my ($day1,$crap) = split(" ", $temp);

 if(($year1==$year2)&&($month1==$month2)&&($day1==$day2))
    {return "true";}
 else
    {return "false";}
}
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

rz259

Vielen Dank für das Beispiel, das kann ich auch gut gebrauchen - bin aber noch blutiger Anfänger in FHEM und weiß jetzt nicht, wo ich "checkAlive" genau definieren muss - in der fhem.cfg bekomme ich dann immer wieder Syntaxfehler. Wo genau muss ich denn das definieren? Und was genau ist checkAlive eigentlich? Eine Funktion?

Eine meiner Schwierigkeiten ist z. B. dass die öffnenden Klammern "{" angemeckert werden - vermutlich nur eine Trivialität.
Leider kenne ich mich mit Perl und FHEM insgesamt sehr wenig aus, ich muss mich da erst langsam vortasten.
Gibt's irgendwo eine genaue Beschreibung wie die Befehle aufgebaut sein müssen? Möglichst mit mehreren Beispielen?


Ich habe den Fehler inzwischen gefunden, das war nur eine fehlende Klammer beim if - das direkte Arbeiten in FHEM-Editor ist doch fehlerträchtig...

Vielen Dank für eure Hilfe,

Rudi

broadway

Hallo,

die Funktion IsAlive() muss in die Datei "99_Utils", diese findest du unter dem Link "Edit Files" auf deiner FHEM Seite.
"checkAlive" ist eine Variable, die ich so benannt habe, könnte auch otto heißen. Hierin speichere ich das Ergebnis von IsALive().


Wir helfen dir hier gerne bei Fragen zur Programmierung, allerdings solltest du auf jeden Fall diese Pflichtlektüre lesen:

http://fhem.de/Heimautomatisierung-mit-fhem.pdf
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

rz259

Hallo broadway,

klar, diese Dokue habe ich schon gelesen - es scheitert bei mir halt erst mal an der konkreten Syntax. Ich finde es halt gewöhnungsbedürftig, wenn eine Zeile mit zwei Semikolons abgeschlossen werden muss und wenn die Funktion über mehrere Zeilen hinaus geht, diese mit einem Escape-Zeichen terminiert werden müssen.

Oder die Funktion FB_mail - da habe ich schon öfters gelesen, dass das "@" in der E-Mail-Adresse durch "@@" ersetzt werden muss - das hat bei mir aber auch nicht funktioniert - bis ich auf einen Hinweis gestoßen bin, dass ich für meinen Fall "\@" benötige - aber das geht inzwischen auch.

Die Funktion isAlive brauche ich z. B. gar nicht, das checkAlive eine Variable ist, das war mir so nicht bewusst - ich hätte jetzt eher auf so eine Art Makro getippt, da man da ja doch auch Kontrollanweisungen wie if drin einbetten kann.
Ich habe zwar viel Erfahrung in statischen Programmiersprachen (C, C++, Pascal, Delphi, Java), aber um die dynamischen Sprachen habe ich mich bisher immer herumgedrückt;-)

Ich schaue halt, dass ich möglichst viel selbst rausfinde und das ist leider nicht immer erfolgreich;-( Für mich ist jetzt HomeMatic neu, FHEM ebenfalls und dass ich das auf meiner Fritzbox laufen lasse ebenfalls.

Danke jedenfalls für alle Unterstützung durch das Forum!

Rudi


GoinAway

Mein Codeschnipsel - der auch solo funktioniert - define checkAlive at *10:10 {\
   \
   my $dateTFK=ReadingsTimestamp("a_NotExist", "window", "nicht auslesbar");;\
   my $checkAlive=IsAlive($dateTFK,$year."-".$month."-".$mday);;\
   if($checkAlive ne "true"){\
     FB_mail('xxx@gmail.de',"a_NotExist abwesend",$dateTFK) }\
   \
# hier folgen noch viele weitere
}

Sind Einträge tatsächlich vorhanden, dann werden diese ausgelesen, verglichen und das false-Ergebnis gemailt,
sind keine Einträge auslesbar (, weil nicht vorhanden) , dann wird nämliche Meldung gemailt.

broadway

Anstelle eines Log Eintrags schickst du eine mail - aber es ist doch der gleiche code. Die Behandlung des Ergebnisses muss und kann natürlich jeder selbst definieren.

Zitat von: Ratsuchender schrieb am Di, 26 Februar 2013 12:10der auch solo funktioniert
Wie meinst du das?
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

GoinAway

Ja, es ist natürlich nahezu der gleiche Code.
Habe das nur nochmal wegen der Verdeutlichung mit dem "nA" und dem Zusammenhang geschrieben, das "nA" erschloß sich mir erst beim Ausprobieren.

Zitat von: broadway schrieb am Di, 26 Februar 2013 17:56
Zitat von: Ratsuchender schrieb am Di, 26 Februar 2013 12:10der auch solo funktioniert
Wie meinst du das?
Es funktioniert auch so alleine.
Mir fiel auf, dass viele Codeschnipsel hier so und alleine nicht funktionieren, oft muss noch etwas "aussenrum" gebaut werden. Wenn man das mangels Kenntnissen nicht kann, dann ist auch der beste Codeschnipsel erstmal wertlos.
Für Dich aber nicht relevant, denn Du hattest es ja freundlicherweise gleich vollständig angeboten,
Danke dafür !!!

rz259

Mein Code - der eine offenes Garagentor erkennt - funktioniert inzwischen soweit ganz gut. Ich prüfe das Tor um 22:00 h - was mache ich denn, wenn ich das Tor z. B. stündlich prüfen will? Gibt's da irgendeinen Trick?

Es könnte ja sein, dass das Tor nach 22:00 h nochmals aufgemacht und nicht wieder verschlossen wird. Wie löse ich das am besten? Mit einem zusaätzlichen Watchdog? Oder gibt's da eine Möglichkeit, die Prüfung stündlich durchzuführen und das am besten nicht rund um die Uhr, sondern nur nachts?  Und zwar ohne den ganzen Code jeweils immer wieder zu duplizieren?

Rudi

GoinAway

Aus
Heimautomatisierung-mit-fhem.pdf
Seite 23:

Über die absolute Angabe von Schaltzeiten (um 17:00) hinaus erlaubt der at-Befehl auch relative Angaben. Dies wird durch ein vorangestelltes Plus-Zeichen erreicht. Also ,,in 10 Minuten": define a5 at +00:10:00 set lamp on

Die Kombination von + und * bewirkt dann z.B. ,,alle 10 Minuten", hier für 30 Sekunden:
define a6 at +*00:10:00 set lamp on-for-timer 30

Für solche Durchläufe kann auch die gewünschte Anzahl der Wiederholungen in geschweiften Klammern angegeben werden:
define a7 at +*{3}00:00:02 set lamp on-for-timer 1 # drei mal blinken
(drei mal alle 2 Sekunden für 1 Sekunde einschalten).

Ohne es selbst probiert zu haben:
es sollte mit einer at ab abends über nächtens bis morgens im Takt von mit x Wiederholungen gehen.

Ralph

Moin,
ich fände es gut, wenn
Link
in der Wiki stünde.
Ist es mir erlaubt, dies dahin zu tun ohne broadways Urheberrecht zu verletzen ?
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

broadway

Hallo Ralph,

da ist nichts gegen einzuwenden. Jedoch mache ich es jetzt nach einer Idee von Puschel anders:

In einem notify für den Kontakt wird die Uhrzeit in Sekunden in das Kommentarfeld geschrieben:
define FHT_Fensterkontakt notify FHT_Fensterkontakt:Window:.* {\
     ... irgendwelche Befehle ...
     my $t = time();;\
     fhem "attr FHT_Fensterkontakt comment $t";;\
}


Im gewünschten Intervall läuft dann ein at, in dem die aktuelle Zeit mit dem Wert im Kommentarfeld verglichen wird. Sind mehr als 3600 Sekunden Differenz wird ein Fehler ausgelöst:
define BatteryCheck at +*02:00:00 {\
         my $checkTime = time() - AttrVal("FHT_Fensterkontakt","comment",4000);;\
         if(($checkTime > 3600) {\
               fhem "set Warnung Stoermelder Heizung ueberpruefen!";;\
         }\
}\

Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Puschel74

Hallo,

äh

ZitatJedoch mache ich es jetzt nach einer Idee von Puschel anders:

Hab ich was verpasst?

Ich mein das war eher die Idee von Uli ;-)

Grüße

Edith. Ohne jetzt hier irgend jemand auf den Schlips treten zu wollen. Ich habe mir den gesamten Beitrag nicht intensiv durchgelesen. Es kann daher sein das die Idee mit dem "Zeit ins comment schreiben" auch von jemand anders war/ist.
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

broadway

Zitat von: Puschel74 schrieb am Do, 18 April 2013 19:27Ich mein das war eher die Idee von Uli ;-)

Ja, stimmt glaube ich. Ich hab den Beitrag nicht wiedergefunden.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro