Hauptmenü

DOIF make-over mit Fragen

Begonnen von zYloriC, 07 März 2016, 19:25:37

Vorheriges Thema - Nächstes Thema

zYloriC

Hallo Community,
ich habe ein DOIF make-over vor und brauche dazu noch ein paar Denkanstoß bzw. Ideen.

1) Datum zerlegen
ich möchte per DOIF prüfen, ob eine extern eingelesene txt-Datei aktuell ist. In der Datei steht ein Write-Datum als Text, welches als Reading eingelesen wird. Es hat Format 07-Mar-2016 06:22:00. Den Zeitpunkt des letzten Reading-Updates in fhem kann ich nicht nehmen, da das Update auch vor 5Min gewesen sein kann, wenn die externe Text-Datei schon seit 2 Monaten nicht mehr aktualisiert wurde.
Meine Frage ist daher: Wie zerlege ich das Datum am besten und prüfe per DOIF ob die letzte Aktualisierung mehr als 12 Stunden her ist.

2) Watchdog ersetzen
Ich habe zu DOIF mal gelesen, dass es Watchdogs ersetzen kann. Bestehende Watchdogs prüfen bei mir z.B. mit SAME, ob ein Wert eine Stunde unverändert bleibt und sendet dann eine Info per Push: define watchdog_Wetterstation watchdog wetter 01:05:00 SAME set push_App message "Wetter weg"
Frage: wie würde ich sowas mit DOIF lösen?

3) Notify ersetzen
ich setze mehrere Notifies ein, die alle Jalousien einer Ebene zusammenfassen und gleichzeitig schalten. Ist DOIF dazu geeignet, solche Notifies zu ersetzen oder ist es eher ein Thema für structure??
3a) Wie kann man am besten Ausnahmen von solchen Stukturierungen schaffen, wenn ein Rollo mal für einen Tag aus der Gruppe herausgenommen werden soll.... geht das mit FILTER??

4) "MISSING ACK" oder disconnect von irgendeinem Gerät soll Push auslösen.
Ich möchte Fehlermeldung von (Homematic-)Geräten schnell abfangen und per Push über den Fehler informieren. Kann man per DOIF übergreifen den Status aller Geräte überwachen und dann eine Push senden, in dem die Bezeichnung des Problemgeräts genannt wird? Geht das irgendwie mit $EVENT oder $DEVICE??
Ich möchte generell meine aktuellen Definitionen optimieren und es ist ein Ziel von mir, zB. beim "MISSING ACK" Thema nicht für jedes Gerät ein einzelnes DOIF zu erstellen. Daher hätte ich großes Interesse an einer dynamischen Lösungs-Möglichkeiten.

Vielen vielen Dank für eure Infos, Tipps, Ideen und auch gerne Links, wenn ich eins der Themen hier im Forum übersehen habe.

Viele gute Grüße, zYloriC

zYloriC

hallo zusammen,

ich habe mich mal wieder an mein make-Over, also der Überarbeitung meiner fhem-Config gemacht.

Das Thema 2 (notifys) konnte ich mit "structure" sinnvoll ersetzen!!

Das Thema 4 bin ich so angegangen:
## Warnumg MISSING ACK für alle HM devices
define doif_MissingACK DOIF (["hm."] eq "MISSING ACK") (setreading tabInfo status FEHLER: MISSING ACK bei $DEVICE festgestellt)

Leider klappt es noch nicht ganz. Ich schätze, dass im regEx was im argen liegt.


Neu angelegt habe ich ein DOIF, das meinen Bewegungsmelder abfragt. Es ist an folgendem Beispiel angelehnt:
http://fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung

Nun zu meinem Thema 5: ... wenn 60 Min kein Bewegungsmelder-Event ausgelöst wird, soll der Status auf AWAY gehen. Wenn dann wieder eine Bewegung bemerkt wird, soll der Status auf HOME gehen.
Das Umstellen auf HOME funktioniert.... aber die Umstellung auf AWAY irgnoriert scheinbar Bewegungen, die in der Zwischenzeit bemerkt werden.

Mein Code:
## Abwesenheitserkennung
define doif_abwesenheit DOIF (([06:00-22:00]) and ([HomeStatus] eq "HOME") and [hm.motion.essen:state:sec] > 600) \
        (set HomeStatus AWAY) \
    DOELSEIF (([06:00-22:00]) and ([HomeStatus] eq "AWAY") and ([hm.motion.essen:state:sec] < 5)) \
        (set HomeStatus HOME)
attr doif_abwesenheit do always



Ein Beispiel:
- Status auf HOME
- 09:00 Eine Bewegung wird bemerkt
- 09:38 Weitere Bewegung wird bemerkt
- 10:00 Status wird auf AWAY gesetzt, da der alte Status HOME war und um 09:00 eine Bewegung bemerkt wurde. Die LETZTE Bewegung um 9:38 wird irgendwie ignoriert?!?!

Hast du @Damian oder ein anderer DOIF-Experte eine Idee, was ich falsch gemacht habe....

Vielen Dank schonmal! zYloriC

Ellert

Wenn hm.motion.essen:state triggert ist sec immer 0.
Versuch mal:
([?06:01-21:59] and [+300] and [?HomeStatus] eq "HOME"  and ReadingsAge("hm.motion.essen","state","0") > 600)
Voraussetzung ist, dass hm.motion.essen nicht regelmässig aktualisiert wird, sondern nur bei Bewegung.
Die Zeitspanne und HomeStatus im DOELSEIF-Zweig müsstest Du auch auf nicht triggern stellen.

Die Umrechnung von 60 Minuten in Sekunden solltest Du überprüfen  ;)

Damian

#3
Abfragen auf mehrere Devices funktionieren nur auf Events und nicht auf Readings oder Stati. Ein Event kann immer nur wahr oder nicht wahr sein, daher:

## Warnumg MISSING ACK für alle HM devices
define doif_MissingACK DOIF (["hm:MISSING ACK"]) (setreading tabInfo status FEHLER: MISSING ACK bei $DEVICE festgestellt)


Zu 5. Ich würde es so realisieren, wenn bei Bewegung ein "on" gesendet wird (sonst auf das korrekte Event anpassen, evtl. "motion"):

define doif_abwesenheit DOIF ([06:00-22:00] and [hm.motion.essen:"on"])
   (set HomeStatus HOME)(set HomeStatus AWAY)

attr doif_abwesenheit wait 0,3600
attr doif_abwesenheit do resetwait


Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF