Flowmeter auf RasPi mit GPIO korrekt einbinden

Begonnen von Bond246, 20 Mai 2015, 15:16:28

Vorheriges Thema - Nächstes Thema

Bond246

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, 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 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

klausw

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

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Bond246

#2
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.

Bond246

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.?

klausw

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.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Bapt. Reverend Magersuppe

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.
--
If I was born in 1453, Leonardo da Vinci would be jealous of me.
Reverend Paul Egon Magersuppe
Aus versicherungstechnischen Gründen sind sämtliche Beiträge von mir rein spekulativer und theoretischer Natur und sollten nicht in die Tat umgesetzt werden!
Bin hier selten DRIN. AUS GRÜNDEN!

Bond246

#6
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

klausw

Schau doch mal hier

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.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

t_enocean

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.

Bond246

#9
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.

Prof. Dr. Peter Henning

"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

Bond246

#11
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.

Prof. Dr. Peter Henning

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

Bond246

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.

Prof. Dr. Peter Henning

Mein Tipp ist wirklich: Einen Zustandsautomaten zu definieren. Denn nur damit kann man die Vielzahl der Möglichkeiten im Überblick behalten.

LG

pah