DHT22-Messwerte in fhem auslesen

Begonnen von zYloriC, 16 Juli 2014, 16:22:01

Vorheriges Thema - Nächstes Thema

zYloriC

Hallo zusammen,
ich habe einen DHT22 Temp-/Luftfeuchtesensor direkt per GPIO an meinen rPI angeschlossen und entsprechend diesem Tut installiert: http://www.sweetpi.de/blog/436/luftfeuchtigkeit-und-temperatur-mit-dem-raspberry-pi-messen
Nun kann ich mit dem folgenden Befehl die Werte für Temperatur und Luftfeuchte anzeigen lassen:
sudo ./loldht 7

Wie bekomme ich diese Abfrage jetzt in FHEM alle 60Minuten ausgeführt und die Messwerte direkt in eine Log-Datei geschrieben, sodass ich eine Kurve davon zeichnen kann? Die Messergebnisse sehen wie folgt aus und müssten auch noch bereinigt werden:
ZitatRaspberry Pi wiringPi DHT22 reader
www.lolware.net
Data not good, skip
Humidity = 57.60 % Temperature = 20.40 *C

Ich habe schon im Forum und im Web gesucht, bislang aber überwiegend nur Infos zu ethersex remote-Lösungen gefunden.
Kann mir jemand von euch helfen.
Vielen Dank!

relox

Hey,

hat es geklappt?

Wenn wie hast du es geschafft? Bin gerade dabei mich mit fhem, rasPi & co vertraut zu machen und freue mich über jede Hilfe.

Besten Dank

csi

Hallo zusammen,

ich habe einen DHT22 an GPIO7 und GPIO1.
Ein cronjob ruft ein Skript auf, der die Ausleseroutine Startet.
Temperatur und Humidity werden dann direkt an FHEM gesendet.

/opt/fhem/fhem.pl 7072 "setreading DHTInnen T $Temp"
/opt/fhem/fhem.pl 7072 "setreading DHTInnen H $Hum"

Device DHTInnen angelegt.. und schon ist alles da.
Das selbe mache ich für DHTAussen.

Ich selber hänge gerade bei "dewpoint" der dewpoint wird berechnet.
Allerdings sehe ich kein reading fan. Und kann meinen Lüfter nicht ansteuern.



Zitze

Hallo csi,

kannst Du das Script mal reinstellen? Danke.

csi

Hi,

na klar. Ist bestimmt noch ausbaufähig ;-)

Carsten


#!/bin/bash
cd /home/pi/rpi_dht22
WERTE=$(sudo ./rpi_dht 1 | grep "Pin = 1")
Temp=( $(echo $WERTE | awk '{ print $ 10}'))
Hum=( $(echo $WERTE | awk '{ print $ 6}'))
/opt/fhem/fhem.pl 7072 "setreading DHTInnen temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading DHTInnen humidity $Hum"

Zitze

Hallo,

DHTInnen muss dann so

define DHTInnen dummy

angelegt werden?

zYloriC

Hallo zusammen,

danke csi für den Tipp. Ich habe es nun auch per Cron-Script gelöst. Musste lediglich z.B. das grep auf "Humidity" anpassen. Im fhem habe ich die readings per Dummy-Device nun auch schon.

Wie lasse ich diese Reading nun am elegantesten in einem Plot anzeigen? Das ist mein nächstes Vorhaben.
Habt ihr Tipps? Gruß und noch mal Danke,
zYloriC

moemoe

Ich beschreibe hier mal meine komplette Lösung. Ich verwende die python-Library von Adafruit und speise die Ergebnisse per "telnet" ein.

Gegenüber den anderen Lösungen ergeben sich folgende Vorteile:
- Das Auslesen wird im Fehlerfall (eine konfigurierbare Anzahl mal) wiederholt, denn es kann bei entsprechender Auslastung auch mal fehlschlagen (zB wenn gerade Graphen gezeichnet werden) => mehr Sicherheit beim Auslesen
- Es wird überhaupt erstmal ein Fehlerzustand festgestellt, viele Lösungen interpretieren nur gültige Daten.
- Die Werte werden über das Telnet-Interface an fhem weitergegeben, wobei hier Python-interne Funktionen genutzt werden. Damit muss kein zusätzliches externes telnet-Programm oder gar ein kompletter Perl-Interpreter mit fhem neu gestartet werden => resourcensparend.

Installation python-Library:

apt-get update
apt-get install build-essential python-dev git-core
git clone https://github.com/adafruit/Adafruit_Python_DHT
cd Adafruit_Python_DHT
python setup.py install


Installation Skript:

cat << 'EOF' > /usr/local/sbin/fhem-dht
#!/usr/bin/python

import Adafruit_DHT
import socket

### CONFIG ###
# fhem's telnet port
host = 'localhost'
port = 7072

sensors = [
    {
        'name': 'Dach.DHT22',
        'type': Adafruit_DHT.DHT22,
        'pin':  4
    },
    {
        'name': 'Wohnzimmer.DHT22',
        'type': Adafruit_DHT.DHT22,
        'pin':  17
    },
]

# retry in case of error
retries = 15
delay = 2


## config reference:
# sensors = [
#     {
#         'name': 'DHT22',
#         'type': Adafruit_DHT.DHT22,
#         'pin':  4
#     },
#     {
#         'name': 'DHT11',
#         'type': Adafruit_DHT.DHT11,
#         'pin':  4
#     },
#     {
#         'name': 'AM2302',
#         'type': Adafruit_DHT.AM2302,
#         'pin':  4
#     },
# ]

### END CONFIG ###

def netcat(hostname, port, content):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    s.sendall(content)
    s.shutdown(socket.SHUT_WR)
    while 1:
        data = s.recv(1024)
        if data == "":
            break
    if data:
        print "Received:", repr(data)
    s.close()

# empty netcat string
s = "";

for sensor in sensors:
    humidity, temperature = Adafruit_DHT.read_retry(sensor['type'], sensor['pin'], retries, delay)

    if humidity is not None and temperature is not None:
            s += 'setreading {0} Temperature {1:0.1f}\n'.format(sensor['name'], temperature)
            s += 'setreading {0} Humidity {1:0.1f}\n'.format(sensor['name'], humidity)
            s += 'setreading {0} Error 0\n'.format(sensor['name'])
    else:
            s += 'setreading {0} Error 1\n'.format(sensor['name'])

s += "quit"

netcat(host, port, s)
EOF
chmod +x /usr/local/sbin/fhem-dht


Danach muss mit einem Editor der Wahl die Datei noch angepasst werden, und logischerweise die Pins und Namen angepasst werden.

Meine Definition für die Sensoren und ihr Logging sieht folgendermaßen aus:

define Dach.DHT22 dummy
attr Dach.DHT22 stateFormat T: Temperature H: Humidity
define Wohnzimmer.DHT22 dummy
attr Wohnzimmer.DHT22 stateFormat T: Temperature H: Humidity
set FileLog_Dach_Heizung addRegexpPart  Dach\.DHT22 .*
set FileLog_Wohnzimmer_Heizung addRegexpPart  Wohnzimmer\.DHT22 .*


Damit das ganze regelmäßig (in meinem Fall alle 5min) ausgeführt wird, erstellen wir noch einen Cron-Job:

cat <<'EOF' >> /etc/cron.d/fhem-dht
# read dht22 values every 5mins and feed into fhem

SHELL=/bin/sh

# m h dom mon dow user command
*/5 * * * * root    /usr/local/sbin/fhem-dht
EOF


Grüße
Moritz

MichlB

hallo erstmal...
ich habe da ne frage, ich habe mehrere DHT11 sensoren und die würde ich jetzt gerne in FHEM einbringen (für Raspberry). ich hab auch die Anleitung soweit befolgt (hab auch eine Andere verwendet, somit weiß ich dass ich den senor, der bereits angeschlossen ist, funktioniert), jedoch bekomm ich keine Daten in das FHEM... ich hänge beim Installation script... (muss dazu sagen, ich bin neuling auf dem thema), was mach ich damit??? wie starte ich das?  und wie hole ich mir mehrere DHT11 (unterschiedliche) ins FHEM, mein plan wäre, in jedem Raum einen so einen sensor zu haben....

danke für eure hilfe...
lg
michl
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

Hi nochmal...
ok ich habs verstanden das mit den Codes, also ist meine vorhergehende Frage hinfällig, aber da ich nun einen Schritt weiter bin und vollkommen größenwahnsinnig  ;D möchte ich natürlich jetzt mehrere um nicht zu sagen VIELE DHT11 verwenden, ich habe mich schlau gemacht und herausgefunden, da ja jeder DHT11 einen eingenen GPIO-Pin braucht, nur begrenzt viele gäbe, aber - weiter informiert - mit einem MCP23017 i2c - Expander kann ich mir zusätzlich neue Pins generieren.....
jetzt nur die frage, wie kann ich dieses Script, welches übrigens vorzüglich funktioniert, MEIN LOB!!!!
ummodeln, dass ich den MCP230017 einbinde und die mehreren DHT11er auslesen kann????
bin leider programmiertechnisch und der gleichen ein totaler anfänger und hantel mich so durch die foren, deshalb bitte ich um eure unterstützung!

danke vielmals...
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

moemoe

Zitat von: Michl1003! am 01 November 2014, 10:34:29
jetzt nur die frage, wie kann ich dieses Script, welches übrigens vorzüglich funktioniert, MEIN LOB!!!!
ummodeln, dass ich den MCP230017 einbinde und die mehreren DHT11er auslesen kann????
bin leider programmiertechnisch und der gleichen ein totaler anfänger und hantel mich so durch die foren, deshalb bitte ich um eure unterstützung!

Ähm, das ist eher schwer, da das Auslesen recht zeitkritisch ist, und sich mit dem Polling eines i2c-Expanders eher nicht verträgt.

Ich würde, wenn du wirklich auf eine Kabel-Lösung setzen möchtest, direkt echte i2c-Sensoren nutzen, wie zB http://www.emsystech.de/produkt/sht21-breakout-board/

MichlB

hallo
danke für die antwort, aber wie du ja sicherlich weißt sind die GPIOs recht begrenzt... deshalb habe ich versucht eine Expander einzubauen...
das klappt ja auch alles recht gut, nur hab ich keine Ahnung wie ich diese interrupts steuern kann bzw. die dann auslese....
eine idee?
hab auch gelesen dass der MCP23S17 schneller sein soll als der MCP23017 da dieser nicht über I2C sonder SPI angesteuert wird... aber sonst sind die gleich...

http://www.microchip.com/wwwproducts/Devices.aspx?product=MCP23S17
http://www.microchip.com/wwwproducts/Devices.aspx?product=MCP23017
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

moemoe

Zitat von: Michl1003! am 03 November 2014, 09:50:13
danke für die antwort, aber wie du ja sicherlich weißt sind die GPIOs recht begrenzt... deshalb habe ich versucht eine Expander einzubauen...
das klappt ja auch alles recht gut, nur hab ich keine Ahnung wie ich diese interrupts steuern kann bzw. die dann auslese....

Was klappt dann bitte, wenn du keine Ahnung hast wie du den Expander ansprichst?

Und ich bleibe dabei: DHT22 und Port-Expander kombiniert sind eine schlechte Idee.

MichlB

hallo
was klappt ist, dass ich den expander mit leds verwenden kann... aber ich brauch bei den leds auch keine Pull up/down.... oder interrupts...
was mich interessiert, wie funktioniert das mit den interrupts und wie bekomm ich die daten der interrupts bzw. die durch diese entstehen....

andere frage, wie willst du das mit der kabelgebundenen variante machen, wenn du 10 - 20 sensoren hast, diverse andere kleinteil (zb. Shutdownschalter (3 Pins), Lüfter für PI (3 Pins), div. 1Wire (mind. 2 Pin), div. Relais (mind. 2 Pins)) ????
wo bringst du die unter, der Rpi hat nur 26Pins (ohne Breakout-gschichtln)....

deshalb, weil ich mir so wenig pins wie möglich belegen möchte, hätte ich das gerne über nen expander gemacht.... auch wenns irre klingt...
also, meine beweggründe für das vorhaben sind ja jetzt einigermassen geklärt, ob das mit deinen konform ist, ist mir eigentlich wurst, ich möchte nur eine lösung finden, das so zu verwirklichen wie ich mir das vorstelle.... wenn es aufgrund irgendwelchen wissenschaftlichen Tatsachen nicht funktioniert, dann gibt es sicher eine andere lösung, aber von vornherein zu sagen das geht nicht, weil es mir zu kompliziert ist... tja... was soll man davon halten...


1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

moemoe

Zitat von: Michl1003! am 03 November 2014, 11:16:05
andere frage, wie willst du das mit der kabelgebundenen variante machen, wenn du 10 - 20 sensoren hast, diverse andere kleinteil (zb. Shutdownschalter (3 Pins), Lüfter für PI (3 Pins), div. 1Wire (mind. 2 Pin), div. Relais (mind. 2 Pins)) ????
wo bringst du die unter, der Rpi hat nur 26Pins (ohne Breakout-gschichtln)....

Ich habe nicht gesagt, dass Breakout generell nicht tut – sondern nur mit den DHT22, und zwar aus den genannten Timing-Problemen. Du kannst natürlich, sofern du das technische Wissen dazu hast, problemlos einen eigenen Mikrocontroller dazwischensetzen. Der hat dann auf DHT-Seite keine Probleme mit dem Timing, und spricht für alle gemeinsam in Richtung RasPi wahlweise I2C oder SPI.

Gleichzeitig habe ich dir weiter oben eine Alternative genannt, und zwar Temperatur-/Feuchtesensoren, die direkt i2c sprechen, weshalb die ganzen Probleme dort nicht auftreten. Die kosten zwar ein paar Euro mehr, aber wenn du die gesparte Zeit damit aufrechnest, ist es trotzdem die günstigere Alternative.

Es spricht nichts dagegen, Ausgänge oder "langsame" Eingänge wie einzelne Schalter über Expander zu machen, das habe ich nie bestritten.

Und mal ehrlich, was erwartest du: Du weißt selber nicht, wie und ob es geht, aber willst von anderen auch ein "das geht so nicht sinnvoll" nicht akzeptieren. Du hast mich gleich an der Stelle "dann mach' es doch komplett selber, wenn du dir sicher bist, dass es gehen muss."