Hallo zusammen,
ich bastel gerade an einem kleinen Hochschulprojekt, in dem es darum geht, z.B. Rentner in ihrer Lebensweise soweit zu überwachen, dass sie sich sicherer Fühlen für den Fall, dass ihnen im Haushalt etwas zustößt. Z.B. weil sie stürzen oder sowas in der Art.
Um so einen Fall zu simulieren, haben wir uns eine etwas andere Funktionskette überlegt.
Wir haben hier einen RasPi 2B am Start, auf dem ganz üblich Rasbian mit FHEM läuft. Als Schalt I/O gibt es einen HomeMatic Lan-Adapter mit einer Steckdose, die später eine Stereoanlage schalten wird. Unsere Überwachung ist ein Flowmeter (http://www.seeedstudio.com/wiki/G3/4_Water_Flow_sensor), welches direkt auf dem GPIO23 des RasPi steckt.
Idee dahinter ist, dass man früh Morgens eine Aufweck-Unterstützung hat. Wenn 30min nach Weckerklingeln kein Wasser im Bad entnommen wurde, soll die Stereoanlage aktiviert werden.
Jetzt bin ich bereits so weit, dass ich mit einem einfachen Python Script die Funktionsweise des Flowmeter an GPIO23 getestet habe. Um den Flowmeter in FHEM einzubinden wollte ich mich an dieser Anleitung für einen Gaszähler (http://voizchat.de/gaszaehler-verbrauch-erfassen-mit-fhem-und-raspberry-gpio/) langhangeln, da hier letztendlich genauso "nur" ein simpler Aktiv/Inaktiv Befehl am GPIO ankommt.
Also habe ich meinen GPIO Sensor wie folgt in FHEM eingebunden:
define flowmeter RPI_GPIO23
attr flowmeter direction input
attr flowmeter active_low yes
attr flowmeter interrupt both
attr flowmeter pud_resistor up
attr flowmeter toggletostate yes
attr flowmeter room HiFi
define wasserverbrauch HourCounter flowmeter:on flowmeter:off
attr wasserverbrauch room HiFi
Anfangs wurde nach einmaligem Wasserfluss (in den Sensor reinpuste) ein ON State ausgegeben. Leider blieb dieser anschließend auch bei Inaktivität stehen. Jetzt habe ich nacheinander die attribute deaktiviert und wieder aktiviert und es wird manchmal dauerhaft ON, manchmal für längere Zeit OFF ausgegeben. Der HourCounter steht auf 1. Egal wie oft oder stark ich in das flowmeter reinpuste, ich kann nicht erkennen, wie sich der Zähler bzw. die State-Angabe des flowmeter verhält
Was ich jetzt also nicht schaffe ist, dass bei Wasserfluss ON und bei Inaktivität OFF erkannt wird. Letztendlich fehlt mir dazu einfach eine Übersicht, welche Attribute welche Funktion haben und was ich für meinen Fall brauche.
Ich danke euch Vielmals für eure Unterstützung und hoffe möglichst alle nötigen Informationen geliefert zu haben.
Falls mein Anliegen bereits zu speziell ist für diesen Bereich, verschieb das Thema einfach
nur zur Sicherheit:
- steht im Log was entsprechendes drin?
- Du hast nicht die GPIO Nummer mit der Pinnummer verwechselt?
active_low ist meiner Meinung nach überflüssig, da du ja impulse zählen willst
interrupt muss falling oder rising sein, da die Flanken gezählt werden. In diesem Fall bleibt state aber immer on oder off, je nachdem auf welche Flanke getriggert wird (sollte zum zählen aber nicht wichtig sein).
Wenn du interrupt auf both setzt, wird der counter nicht hochgezählt (er wird auch nur bei rising oder falling angelegt).
Das gleiche ist mit dem reading toggle. Das wird nur bei attribut interrupt rising oder falling bedient/angelegt
Danke für die Antwort. Soweit ich mich erinnere steht im LOG nichts weiter besonderes zu dem flowmeter drin. Ich schau aber nochmal, sobald ich am Geräte sitze (vermutlich erst nächste Woche).
Ansonsten GPIO wurde natürlich nicht mit der Pinnummer verwechselt. Er steckt auf Pin16, Stromversorgung über Pin1 mit 3,3V. Funktioniert genauso wie über die 5V-Versorgung mit 10kOhm dazwischen im Python Programm.
Ansonsten danke schonmal für die Erklärung der attribute.
Ich hatte heute wieder Gelegenheit an dem ganzen zu basteln. Komischerweise hat der Wassersensor heute auf Anhieb funktioniert, der Zähler hat gezählt usw... Eigentlich alles so, wie es soll. Ich vermute, ich hatte irgendwo nen Problem in der Verkabelung, eventuell war nen Kontakt nicht voll da.
Jetzt stehe ich so ein wenig vor dem nächsten Problem, wo mir wahrscheinlich die Perl-Kenntnisse fehlen.
Ich will ja, dass z.B. ab 8Uhr das Flowmeter überwacht werden soll und wenn 30min später nicht eine gewisse Mindestmenge an Wasser abgenommen wurde, soll z.B. eine bestimmte Steckdose angehen.
Wie die Zeitschaltung standalone funzt ist mir klar. Wie ich Steckdosen anhand einer Bedigung eines anderen Geräts steuern kann auch. Was mir fehlt ist, wie ich die beiden Zeiten miteinander verknüpfe.
Ich hab ja die Möglichkeit einen Zustand zu einer bestimmten Zeit zu prüfen und dann entsprechende Schaltunge durchzuführen. Aber wie überwache ich Zustände in einem bestimmten Zeitraum, führe am Ende des Zeitraums eine IF-Anweisung und und das so, dass außerhalb des Zeitraums keine Aktionen durch die Funktion ausgeführt werden.?
Ich würde einen Timer definieren, der den Counter auf null setzt (z.B. via deletereading) und einen zweiten Timer startet, der 30min später abläuft.
Dieser zweite Timer prüft den Counterwert und kann eine Lampe oder sonstwas anschalten, wenn dieser zu klein ist.
Und wenn der Rentner jetzt um 7 aufsteht, Zähne putzt und die Klospülung aktiviert? Dann sitzt er um 7:45 vielleicht schon im Bus nach Malente... Und das Flowmeter wartet tagelang auf irgendeinen Flow.
Zitat von: Bapt. Reverend Magersuppe am 27 Mai 2015, 22:10:41
Und wenn der Rentner jetzt um 7 aufsteht, Zähne putzt und die Klospülung aktiviert? Dann sitzt er um 7:45 vielleicht schon im Bus nach Malente... Und das Flowmeter wartet tagelang auf irgendeinen Flow.
Deinen Wecker musst du auch ausschalten, wenn du eher aufstehst. Aber es wäre ja kein Problem, die Stereoanlage einige Minuten später wieder zu deaktivieren.
Wie verknüpfe ich denn Timer? Genauso wie wie beim set-Befehl?
set steckd on;;set steckd off
Schau doch mal hier (http://fhem.de/commandref.html#at)
Du gibts dem Timer beliebige Befehle mit. Anstelle von set kannst du auch setreading, deletereading oder auch perl code verwenden.
Wenn du perl code verwendest kannst du mit ReadingsVal("<device>","<reading>",<default>)
im Timer z.B. den counterwert auslesen.
Es gibt an verschiedenen Stellen Beispiele in der commandref.
Hausautomatisierung und "Lebensweise ... zu überwachen" widerspricht sich meines Erachtens ein wenig.
Ich lebe zeitweise alleine und habe mit FHEM meine Rolladen/Lichtsteuerung automatisiert. Die Nachbarn sorgen sich jetzt schon liebevollerweise, weil sie quasi nicht mehr erkennen können, ob ich da bin bzw. noch lebe.
Guten Tag,
ich habs jetzt über deletereading und setstate versucht, genauso wie setreading. Problem bei allen ist, dass nach Wasserfluss wieder der alte Stand des Wertes hergestellt wird und einfach weitergezählt wird.
Ich kann ja aber auch einfach zum Zeitpunkt des Weckers den Wasserstand auslesen und 30min später checken, ob sich der Wert um mindestens 5 erhöht hat. Dazu muss ich aber zum Weck-Zeitpunkt den aktuellen Wert auslesen und in eine Variable schreiben. Und da scheitert es wieder. Ich hätte gedacht, das geht eventuell mit CustomReadings oder UserReadings. Aber da hab ich ehrlich gesagt nicht durchgesehen, wie ich die wenn dann für meinen speziellen Fall konfiguriere.
Ob es sich um 5 oder 10 erhöht, ist fiktiv. Aber ich will nicht checken, ob überhaupt was passiert. Wenn irgendwo ein Wasserhahn tropft, dann funzt das wieder nicht richtig.
Um meinen aktuellen Stand kurz zu dokumentieren hier nochmal meine config:
#Flowmeter definieren
define flowmeter RPI_GPIO 23
attr flowmeter active_low yes
attr flowmeter direction input
attr flowmeter icon measure_water_meter
attr flowmeter interrupt both
attr flowmeter pud_resistor up
attr flowmeter room HiFi
attr flowmeter toggletostate yes
define wasserverbrauch HourCounter flowmeter:on flowmeter:off
attr wasserverbrauch icon measure_water_meter
attr wasserverbrauch room HiFi
define FileLog_wasserverbrauch FileLog ./log/wasserverbrauch-%Y%m.log wasserverbrauch:countsOverall:.*\wasserverbrauch:countsPerDay:.*\wasserverbrauch:state:.*
attr FileLog_wasserverbrauch room HiFi
#Wecker schaltet Steckdose
define flowwecker at *15:30 {\
ReadingsValue("wasserverbrauch","state",0);;\
}
attr flowwecker room HiFi
Ich würde mit "flowwecker" gerne den "wasserverbrauch" auslesen. Ich kann mir aber sicherlich diese Variable zum zwischenspeichern auch im flowwecker definieren.
"Ein kleines Hochschulprojekt", soso.
In einem Informatikstudium lernt man, zuerst eine klare Problemanalyse durchzuführen.
Was sind die Use Cases ?
Kann man das eventuell auf einen Zustandsautomaten abbilden ?
Und dann sollte man mit dem coding anfangen.
LG
pah
Hallöchen,
der Use Case ist eigentlich klar. Die Idee für die Umsetzung auch. Nen Zustandsautomaten halte ich nicht für nötig, da das Ziel an dieser Stelle klar ist und die unterschiedlichen Wege dahin sind mir auch klar. Es hängt also nur noch am Code.
Ganz grundsätzlich handelt es sich eben auch um eine (Fach)Hochschulde, nur dass es sowas eben nicht mehr gibt, deswegen nur noch Hochschule. Wir zeichnen uns dadurch aus, aktiver in der Praxis zu sein. Also Plan im Kopf zusammenfrickeln, Testaufbau und dann die nötigen Befehle zum Ziel in die Tastatur hacken. Wenn das definierte Ziel erreicht ist, gehts ans finetuning ;)
Ich bin mir fast sicher, dass es in meinem Fall an ein bis zwei kurzen Codezeilen hängt.
Na, nun mal langsam - und vielleicht mal recherchieren, wo und was ich lehre.
Auch an einer Hochschule für Angewandte Wissenschaften "frickelt" man nicht einfach los - meinen Studenten würde ich die Ohren abreißen, wenn sie so vorgehen würden.
LG
pah
Bin ich voll auf deiner Seite. Ohne Plan kein strukturiertes Vorgehen. Und so handle ich auch.
Nun bringt uns oder besser gesagt mich, die Diskussion nicht sonderlich weiter.
Meine grundsätzliche Idee kommt hier her http://www.raspberry-pi-geek.de/Magazin/2014/01/Aktivitaetsueberwachung-fuer-allein-lebende-Senioren
Auf dem Weg dahin geht es erstmal darum, die oben genannten Funktionen umzusetzen. Ob danach überhaupt noch weiter an der Umsetzung aus dem Link gearbeitet wird, weiß ich noch nicht. Vermutlich kommen später zumindest in der Theorie noch Bewegungssensoren dazu, die Aktivitäten in der Wohnung überwachen.
Mein Tipp ist wirklich: Einen Zustandsautomaten zu definieren. Denn nur damit kann man die Vielzahl der Möglichkeiten im Überblick behalten.
LG
pah
:)
Da hab' ich auch wieder was neues gelernt: Zustandsautomat. War mir so nicht bekannt, scheint aber für so manches Problem ein recht zielführender Ansatz zu sein.
Als "Hobbyprogrammierer" fehlen einfach da und dort die Grundlagen...
Muss der Zustand vom Anfang nur noch abgespeichert werden. Später lässt er sich dann vergleichen mit einer
IF readingsVal > ...
Ich weiß nur nicht, wie ich speichere. Daran ändert auch ein aufgeschriebener Zustandsautomat nichts.
ZitatIch weiß nur nicht, wie ich speichere.
entweder in einem reading mit "setreading my_device my_reading xy", oder in einem dummy mit "set my_dummy xy".
ausserdem heisst es "ReadingsVal". commandref ist dein freund. :)
Und ich würde mir mal den Watchdog von Fhem ansehen. Benutze ich um festzustellen, ob meine Schwiegermutter die Tür in einem definierten Zeitraum nach einem Klingeln öffnet und auch wieder schließt.
Grüße Jörg
Gesendet von iPhone mit Tapatalk
Ach ja, wer soll eigentlich das ganze System installieren? Mit Sanitärinstallateur kommen da sicher Euros im dreistelligen Bereich zusammen.
Grüße Jörg
Gesendet von iPhone mit Tapatalk
Na, solche Projekte sind ja nicht ganz unüblich, siehe hier:
http://www.bz-berlin.de/berlin/berlin-altert-doch-das-smart-home-hilft-senioren (http://www.bz-berlin.de/berlin/berlin-altert-doch-das-smart-home-hilft-senioren)
Danke für den Watchdog Hinweis. Ich glaube das könnte genau das richtige für mich sein.
Na, dann schaut mal bezgl. eines Zustandsautomaten auf das hier:
http://www.fhemwiki.de/wiki/1W-WPump
Ich bin derzeit in verschiedenen Forschungsaktivitäten zum Ambient Assisted Living zu Gange.
Eine Erkenntnis darau: es gibt eigentlich keinen besseren Weg als Zustandsautomaten, um das Verhalten von Maschinen auf das von Menschen abzustimmen.
LG
pah
Ich hab eben die Idee mit watchdog getestet, bin jedoch an ein paar Grenzen für meinen Fall gestoßen. Zuerst wollte ich die Watchdog Trigger mit ReadingsVal setzen. Als das nicht funktioniert hat, hab ich rausgefunden, dass ich scheinbar nur Binärwerte auswerten lassen? Also sowas wie lamp on
Außerdem kann ich wohl den Watchdog nicht zeitgesteuert aktivieren. Also z.B.
at 15:00 watchdog ReadingsVal(x,y,0) 00:00:30 {ReadingsVal(x,y,0)+5)
Um das zumindest theoretisch zu löschen und anderen Werte zu testen, hab ich folgenden Code gebastelt
define test dummy
define test2 at *16:06:40 set test on
define flowwecker watchdog test:on 00:00:10 flowmeter:on set St_schalter on;; setstate flowwecker defined;; set test off
Das funktioniert auch. Allerdings will ich sicherstellen, dass ein on-Befehl nicht zufällig kommt, sondern eben mehr als einer. Deswegen im ersten Code-Beispiel das "+5".
Jetzt hätte ich noch die Idee, mit setreading ein den aktuellen Wasserstand in mein flowwecker zu schreiben.
Allerdings funktioniert folgendes Codebeispiel nicht, weswegen ich da noch nicht weiter bin als überhaupt erstmal zu testen, ob ein setreading so funktioniert wie ich es mir vorstelle.
define flowwecker at 15:00 setreading flowwecker abfrage ReadingsVal(wasserstand,stats,0)
Er schreibt einfach den gesamten Befehl in das Reading, statt das Ergebnis aus der Funktion ReadingsVal.
Hallo zusammen,
gibt es hier noch Ideen zu meinem letzten Stand?