Abwesenheitsscript "verbessern"

Begonnen von -Stefan-, 20 August 2014, 19:05:24

Vorheriges Thema - Nächstes Thema

-Stefan-

Hallo zusammen,

ich bin ein Neuling im Thema RPi und FHEM wolte eure Meinung / Erfahrung / Verbesserungsvorschläge

Ich habe mir ein kleines Script gebastelt, das derzeit schon Funktioniert. Jedoch denke ich, man kann es auch schöner "programmieren". Ich selbst  kann PHP programmieren und wenn ich mir meine alten Anfängerscripte anschaue würde ich einiges anders machen.

Meine Idee ist es, ich überwache(via BT) mein Handy ob ich Zuhause bin oder nicht. Sollte ich z.B. einkaufen oder arbeiten gehen so sollen alle unnötigen Geräte abgeschaltet werden.
Derzeit besitz ich noch keinen COC.
Also teste ich es mit meinem Denon Receiver. Diesen kann ich schon über FHEM aus / einschalten.
Da ich meine Anwesenheit mitgeloggt habe, habe ich gesehen dass auch über BT ab und an die Verbindung abbricht (meist nur zw 2-9 sec)  obwohl ich z.B. im Wohnzimmer bin und mein Handy an der selben stelle liegt. Genauso habe ich meine Wohnung vermessen und gesehen, dass im Bad in der Ecke keinen Empfang mehr habe.
Daher brauche ich einen zwischen Schritt um nicht direkt wenn ich ins Bad gehe alle Geräte ausschalte.

Mein Handy wird wenn ich daheim bin und das Gerät "anwesend"  ist alle 60 sec auf dessen Status (anwesend/abwesend) geprüft
Sollte das Gerät nicht "anwesend" sein, so prüfe ich alle 10 sec auf eine Statusänderung


Ich poste das Script und im nachfolgenden Teil schreibe ich meine Gedankengänge auf.
Das Script:
define Anwesendcheck at +*00:00:20 { if(Value("iPhone5") eq "anwesend") { fhem("set Anwesenheit on ;; set Anwesenheit_Status on ;; delete set_AnwesenheitOff ") } else { if((Value("iPhone5") eq "abwesend") && (Value("Anwesenheit_Status") eq "on")) { fhem("set Anwesenheit warten ;; set Anwesenheit_Status off ;; define set_AnwesenheitOff at +00:10:00 set Anwesenheit off") }}}
define set_DenonOff_Abwesenheit at +*00:00:20 { if((Value("Anwesenheit") eq "off") && (Value("Steuerung_Anwesenheit") eq "on")) { fhem("set denon off") } }



Meine Gedankengänge:

Ich möchte alle 20 sec prüfen ob ich daheim bin.
define Anwesendcheck at +*00:00:20
Wenn ich daheim bin, dann soll Anwesenheit und Anwesenheit_Status auf on gesetzt werden sowie die Variable set_AnwesenheitOff gelöscht werden.
if(Value("iPhone5") eq "anwesend") set Anwesenheit on ;; set Anwesenheit_Status on ;; delete set_AnwesenheitOff
Sollte mein Handy nicht daheim sein und der letze Status war von Anwesenheit_Status on -> Also das Handy ist nicht mehr da aber vor z.b. einer Minute war das Handy noch erreichbar ( bin z.B. im Bad und kein Empfang mehr )
{ if((Value("iPhone5") eq "abwesend") && (Value("Anwesenheit_Status") eq "on"))
Soll  die FHEM die Variable Abwesenheit  auf warten setzen sowie den Status Anwesenheit auf off. Dazu wird noch eine neue Variable definiert mit einem "Countdown" von 10Minuten.
define set_AnwesenheitOff at +00:10:00 set Anwesenheit off")
Sollte ich als im Bad sein, das Handy die Verbindung zu BT velieren und ich komme innerhalb 10 Minuten wieder ins Wohnzimmer muss der "Timer" ja unterbrochen werden. Daher lösche ich sobald das Handy wieder erreichbar ist die Variable, die für das Ausschlaten zuständig ist.

Als letzer Schritt schalte ich nun den Receiver aus.
Dazu definiere ich wieder eine Var, die alle 20 sec prüft ob die Var Anwesenheit auf off gesetzt wurde.
define set_DenonOff_Abwesenheit at +*00:00:20 { if(Value("Anwesenheit") eq "off")
Ist dies der Fall wird folgendes Ausgeführt ( Denon wird beendet)
{ fhem("set denon off") } }


Wie gesagt das alles läuft aber ich denken man kann es 1) verschönern 2) wenn ich noch mehr Geräte einbinde und dann immer wieder eine Schleife laufen lasse kommt der RPi ja nie "zuruhe".

ich hoffe ich konnte es einigermaßen verständlich erklären.

Als weitere Frage, benötige ich bald einen COC
Was haltet ihr von: http://shop.busware.de/product_info.php/products_id/77
Wenn ich es richtig sehe kann dieser den Bereich 868 sowie 433 MHZ abdecken. Hat jemand mit diesem schon Erfahrung?

Wenn ich diesen COC sehe, wird er parallel auf Raspberry aufgesetzt.
Wäre es auch möglich 2 Doungle - einer für 868 MHZ; der andere für 433MHZ zu kaufen - und an einem RPi betreiben?

Hollo

Ich komme gerade nicht an meine Config, aber...

- statt der "Verzögerung" für den Check kannst Du doch direkt das Intervall  der Checks ändern
- für "ich bin nicht mehr, war aber vorher" machst Du einfach einen watchdog
- zum Ab(An)schalten machst Du ein notify auf die An-/Abwesenheit statt der ganzen if's; da kannst Du jederzeit erweitern

Guck mal mit der SuFu, da gibt es schon einige Threads und diverse Codeschnipsel, aus denen Du bestimmt was Passendes für Dich findest.

Gruß,
Hollo
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

AET_FHEM

Hallo,

am Anfang hatte ich auch das Problem wenn ich in die Küche ging oder kurz in Keller waren alle Geräte aus,
ich hab das mit WatchDog gelöst:
ich bin nicht da 15 Minuten = set HomeStatus 3 (kurzweg)
ich bin nicht da 2 Stunden = set HomeStatus 4 (langweg)

und klappt wunderbar!

Icinger

Schau dir mal die Module PRESENCE, structure und Watchdog an, damit kannst du das super lösen.

Bei mir zB:
2 Handys jeweils mit PRESENCE lan-ping überwacht (Meine Frau und ich)
diese mittels Structure zusammengefasst
und dann per Watchdog auf 15 Minuten absent überprüft.

Klappt bei mir daheim seit Monaten einwandfrei.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

stoxx

Hi Stefan,
ich nutze derzeit den Raspi&COC mit FS20 Sendern/Empfängern (868Mhz) und ELRO Funksteckdosen(433Mhz) ohne zusätzliche USB CUL. Meine Erfahrung: Die Reichweite des COC für 433Mhz Empfänger ist unter aller Kanone (<3 Meter), sodas ich den Raspi direkt bei meinen ELRO Steckern plazieren musste. Für alles, was weiter weg ist, nutze ich FS20 Geräte - da ist die Reichweite größer..
Kann sein, dass das an Störquellen in der Umgebung liegt - ich wohne im Stadtzentrum...
Viele Grüße
stoxx
FHEM 5.8 auf Raspberry mit CUL, FS20, FHT, HMS, BLE, Z-Wave ..

AET_FHEM

Und ja es ist möglich zwei dongels zu nutzen ich betreibe einen COC und einen CUL an meinem Rasperry!
Der COC sendet und empfängt bei mir FS20
und mein CUL betreibt meine Heizung mit MAX! Komponenten und sendet an meine Funk Steckdosen

-Stefan-

Hallo,

vielen Dank für eure Antworten. War klar, dass es einfach geht :D
Leider steige ich bei watchdog nicht ganz durch. Habe mir nun einige Beispiele angeschaut, auch welche die sich mit der Abwesenheit beschäftigen.
Wie dieses Script von Simon74
define Zuhause structure anwesend Bluetooth_Simon Bluetooth_Freundin
define Bluetooth_Simon PRESENCE local-bluetooth xx:9B:xx:97:xx:D9 10 60
attr Bluetooth_Simon anwesend Zuhause
attr Bluetooth_Simon event-on-change-reading state
attr Bluetooth_Simon room Anwesenheit

define Bluetooth_Freundin PRESENCE local-bluetooth xx:26:xx:5B:xx:64 10 60
attr Bluetooth_Freundin anwesend Zuhause
attr Bluetooth_Freundin event-on-change-reading state
attr Bluetooth_Freundin room Anwesenheit

attr Zuhause event-on-change-reading state
attr Zuhause room Anwesenheit
attr Zuhause alias Person(en) anwesend
attr Zuhause group Anwesenheitsstatus
define Nicht_Zuhause watchdog Zuhause:absent 00:15:00 Zuhause:undefined set group=Licht off;; trigger Nicht_Zuhause .


Wenn ich das so sehe, hat er ebenfalls sein Handy über BT überwacht bzw. lässt es anpingen.

Ich habe ja einen weiteren Schlater bei mir im Raum Bewohner der anzeigt ob jemand zu Hause ist oder nicht.
Dieser heißt bei mir Abwesenheit und kann 3 verschiedene Status haben: off on warten

Nach 1 Minute "Abwesenheit" soll der Status "warten" sein, nach mehr als 10 Minuten soll der Status dann "abwesend" sein.
Also benötige ich für mein Verstädnniss 2 Watchdog-Aktionen, die einmal bei <1 einen Status setzt und einmal bei <10 oder?

Aber wie lese ich nun en Status bzw deren Status von der Variable iPhone5 ?
define iPhone5_warten watchdog iPhone5 00:01:00 warten set Anwesenheit warten.
Oder mache ich da einen Fehler?
Was macht der Befehl trigger im obrigen Script? Also wenn ich es richtig verstehe, ist das trigger-command zuständig, dass sich was geändert hat?

Vielen Dank im Voraus.

Zu dem COC.
Das klingt sehr gut, würdet ihr einen Empfehlen?
@stoxx: <3 Meter wäre mich mich unakzeptabel.
Habt ihr für einen COC 433Mhz andere Erfahrungen?

Mein RPi ist im Flur, wo auch mein DSL-Router, NAS etc liegt. Selbst habe ich 3 Zimmer + Küche, Bad. Daher muss es eigentlich gewährleistet sein, dass ich in jedem Raum verschiedene Aktoren / Sensoren an steuern etc kann.



Puschel74

Hallo,

ZitatAber wie lese ich nun en Status bzw deren Status von der Variable iPhone5 ?
Das Einsteiger.pdf ist durchaus empfehlens- und auch lesenswert  ;D

Wenn es nur um den state geht nimmst du am einfachsten Value.
Wenn es um ein beliebiges Reading geht solltest du ReadingsVal den Vorzug geben.

Zu deiner Frage zum COC.
Selbst wenn jemand eine Empfehlung abgibt KANN es immer noch sein das es bei dir nicht klappt.
Was aber sehr unwahrscheinlich ist.

Ich habe zwar keinen COC sondern einen CUL433 und der sendet aber einwandfrei seine 7 Meter vom OG auf die Terrasse (durch eine Betondecke und 2 Wände - eine davon die Aussenmauer) und die 8 Meter ins DG zu den Rollläden (nur eine Betondecke).

Grüße
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.

-Stefan-

:-) Es ist ja nicht so, als würde ich nichts lesen. Ich bin nur noch nicht ganz dahinter gekommen.
define w watchdog FHT80 00:15:00 SAME set FHT80 date;; trigger w das steht ja ebenfalls auch im http://fhem.de/commandref_DE.html#watchdog


Aber was ich mich z.B. Frage, da ich ja einer Value bei 2 verschiedenen Zeiten 2 verschiedene Werte geben kann.
Denn <1 Minute soll "warten" erhalten und bei <10 Minuten soll ja dann "abwesend" gesetzt werden.
Aber da 1 auch bei 10 kleiner ist, würde doch watchdog, sobald er wieder prüft erst warten und dann abwesend setzen, da ja 1 auch kleiner ist wie 10. Oder?

Klar, kann es sein, dass das Produkt bei mir nicht funktioniert. Aber wenn ich bei amazon ein Produkt  kaufe wo 10 neg und 1 pos Bewertung hat werde ich es auch nicht kaufen obwohl es bei mir ja zu einem pos Ergebnis führen könnte.
Daher wollt ich ja eure Erfahrungen wissen.

Hollo

#9
Auch nach mehrmaligem Lesen habe ich den Sinn noch nicht verstanden.
Warum willst Du für Anwesenheit 3 Stati haben???  Entweder ist jemand anwesend oder nicht!

Ich verweise nochmal auf meinen Beitrag oben, sinngemäß wäre das dann so...

define Stefan PRESENCE local-bluetooth xx:xx:xx:xx:xx:xx 60 300
attr Stefan event-on-change-reading state
define w_Stefan watchdog Stefan:absent 00:10:00 Stefan:present set Anwesenheit abwesend ;; trigger w_Stefan .


Du prüfst alle 5 Minuten, ob Du noch da bist.
Wenn Du scheinbar nicht da bist, wird jede Minute geprüft.
Nach 10 Minuten nicht da (in denen 10x neu geprüft wird), wird die Anwesenheit auf abwesend gesetzt, sofern Du nicht mittlerweile wieder da bist.
Da ist Deine warten also über die Prüfintervalle mit drin; Zeiten kannst Du natürlich beliebig wählen.

Gruß,
Hollo

P.S.: In Deinem geposteten Code fehlt am Ende der . (Punkt), der ist da entscheidend.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

frank

ZitatDu prüfst alle 5 Minuten, ob Du noch da bist.
8)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

-Stefan-

Entschuldige die späte Antwort.
Warum ich 3 Stati haben möchte ist folgender Grund. Ich schlate über meine Anwesenheit verschiedene Aktoren. Nun bringe ich den Müll raus und in genau zu diesem Zeitpunkt laufen die 5 Minuten z.B. ab. Dann würde bei mir ja alles " aus" gehen.
Daher habe ich einen Zwischenschritt eingebaut.
Das ist der Hindergrund für die 3 Statis

Hollo

Zitat von: -Stefan- am 24 September 2014, 12:18:33...Das ist der Hindergrund für die 3 Statis...
Deshalb versteht Dich vermutlich auch keiner.   ;D
Natürlich wird wohl jeder mit einer Anwesenheitserkennung/-prüfung irgendwelche Aktionen verknüpfen.

In Deinem Fall wäre nun die Frage, warum Du es unnötig kompliziert machen willst bzw. welche anderen Möglichkeiten es gibt...
Musst Du das Handy mit zum Müll nehmen und weit ist die Tonne entfernt (Zeitaufwand)?
Ich will damit sagen, Du kannst eigentlich alles über die Definition und Kombination der Zeiten abbilden.

In meinem Beispiel oben startet der watchdog mit der ersten Negativprüfung.
Wenn also wie von Dir geschrieben die 5 Minuten Prüfintervall gerade rum sind, wenn Du zur Tonne los gehst, wird nun 10 Minuten lang minütlich auf Deine Rückkehr geprüft (und bei Anwesenheit bleibt alles wie vorher), bevor Du wirklich abwesend bist. Du hättest in der Konstellation also minimal 10 Minuten / maximal 15 Minuten Zeit.
Das ist sinngemäß nicht anders, als wenn Du nach 5 Minuten auf "warten" setzt, und dann 5 Minuten später auf "abwesend". Das "warten" ist der watchdog, der aufpasst, ob Du wiederkommst oder wegbleibst, und dann enstprechend nichts oder etwas ändert.

Welchen Weg Du nimmst, bleibt natürlich Dir überlassen.

Gruß,
Hollo

FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

-Stefan-

Hallo Hollo,

danke für deine Antwort. Manchmal sieht man den Wald vor lauter Bäumen nicht.
Ich habe das ganze schon für watchdogs angepasst. Aber selbst da habe ich immer einen dritten Schritt eingebaut, was wirklich sehr unnötig ist (im Nachhinein).
Werde also nun auch 2 Schritt "einführen" bzw. den dritten streichen :-)