DHT22-Messwerte in fhem auslesen

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

Vorheriges Thema - Nächstes Thema

mumpitzstuff

Ist dir zufällig bekannt wie ich 2 Sensoren über dtoverlay einbinden kann? Das folgende zeigt mir nur 1 Sensor an:

dtoverlay=dht11,gpiopin=4
dtoverlay=dht11,gpiopin=17


Und manchmal habe ich verschiedene Fehler, wahrscheinlich wenn der neue Wert grad geschrieben wird. Kann man das irgendwie verhindern?

pi@raspberrypi /sys/bus/iio/devices/iio:device0 $ cat /sys/devices/platform/dht11@0/iio:device0/in_temp_input
22200
pi@raspberrypi /sys/bus/iio/devices/iio:device0 $ cat /sys/devices/platform/dht11@0/iio:device0/in_temp_input
cat: '/sys/devices/platform/dht11@0/iio:device0/in_temp_input': Die Wartezeit für die Verbindung ist abgelaufen
pi@raspberrypi /sys/bus/iio/devices/iio:device0 $ cat /sys/devices/platform/dht11@0/iio:device0/in_temp_input
22300
pi@raspberrypi /sys/bus/iio/devices/iio:device0 $ cat /sys/devices/platform/dht11@0/iio:device0/in_temp_input
cat: '/sys/devices/platform/dht11@0/iio:device0/in_temp_input': Eingabe-/Ausgabefehler



skycrack

Zitat von: mumpitzstuff am 08 November 2018, 00:13:09
Und manchmal habe ich verschiedene Fehler, wahrscheinlich wenn der neue Wert grad geschrieben wird. Kann man das irgendwie verhindern?

/sys/devices/platform/dht11@0/iio:device0/in_temp_input: Eingabe-/Ausgabefehler
Geht mir ebenso, wäre auch an einer Lösung interessiert.

mumpitzstuff

#!/usr/bin/python

import Adafruit_DHT
import socket
import time

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

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

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


## 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 median(lst):
    n = len(lst)
    if n < 1:
        return None
    if n % 2 == 1:
        return sorted(lst)[n//2]
    else:
        return sum(sorted(lst)[n//2-1:n//2+1])/2.0

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 = []
   
    for i in range(5):
        h, t = Adafruit_DHT.read_retry(sensor['type'], sensor['pin'], retries, delay)
        humidity.append(h)
        temperature.append(t)
        time.sleep(3)

    h = median(humidity)
    t = median(temperature)
    #print "humidity: " + str(h)
    #print "temperature: " + str(t)

    if h is not None and t is not None:
            if t > 1 and t < 40:
                    s += 'setreading {0} Temperature {1:0.1f}\n'.format(sensor['name'], t)
            if h > 10 and h < 90:
                    s += 'setreading {0} Humidity {1:0.1f}\n'.format(sensor['name'], h)
            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)


Ich benutze jetzt seit Monaten dieses Script, das mit der Adafruit Library funktioniert. Zusätzlich habe ich mir einen Median über 5 Werte gebastelt, da ich immer wieder Probleme mit Ausreißern hatte. Aufgerufen wird das dann so:

defmod DHT22_AT at +*00:02:00 "sudo /usr/local/sbin/fhem-dht"

Sudo war an der Stelle leider irgendwie notwendig...

skycrack

Zitat von: mumpitzstuff am 15 März 2019, 22:26:13

Ich benutze jetzt seit Monaten dieses Script, das mit der Adafruit Library funktioniert. Zusätzlich habe ich mir einen Median über 5 Werte gebastelt, da ich immer wieder Probleme mit Ausreißern hatte.

Vielen Dank, so funktioniert es jetzt.
Gruß
Rene

Camix

Hallo zusammen

Habe nun mein FHEM Server auf einem Raps 3 neu aufgesetzt. Der DHT22 bringt mir aber keine Werte in FHEM. Im Log steht folgendes:DHT22_AT: Unknown command "sudo, try help. Ich nehme an, dass dies an den Rechten liegt?

Kann mir da jemand auf die Sprünge helfen?

Grüsse und Danke Camix

mumpitzstuff

sudo visudo

Und dort diese Zeile einfügen:

fhem ALL=(ALL) NOPASSWD: /path/to/script/fhem-dht

Forstling

Hallo

Bin ziemlich neu hier ich wollte auch mal einen Kommentar hierzu abgeben.

Ich habe 2 Tage und einige Versuche gebraucht um das zum Laufen zu bringen. Hier die Dinge über die ich gestolpert bin mit den entsprechenden Hinweisen.

Ich nutze das Python-Script und rufe es ohne Cronjob aus FHEM heraus auf.

- Das Script ist für Python 2 geschrieben wenn man es mit Python 3 testen will sind ein paar Änderungen nötig
    - Eine 3 hinter Python schreiben bei der Installation der Bibliothek
    - ein paar Klammern bei den print befehlen

- Das Script muss in einem Ordner liegen wo FHEM zugriff hat
    - ich nutze /opt/fhem/FHEM/Phyton

- Das Script muss ausführbar sein
    - Ich habe das über rechst-klick und Dateieigenschaften gemacht

- das Script mit sudo aufrufen ging bei mir nicht hier der Fehler
sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben

Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat.  Normalerweise läuft es auf drei Regeln hinaus:

    #1) Respektieren Sie die Privatsphäre anderer.
    #2) Denken Sie nach, bevor Sie tippen.
    #3) Mit großer Macht kommt große Verantwortung.


Hoffe meine Ausführungen helfen anderen Neulingen

betamax

Hallo,

ich versuche einen DHT22 auszulesen.
Auf Pi Ebene klappt das auch.

pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 22 2
Temp=23.8*  Humidity=61.5%


Ich schaffe es nicht das Installation Skript von moemoe zu installieren.
Der Pi bringt mir folgenden Fehler:

-bash: /usr/local/sbin/fhem-dht: Permission denied
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ chmod +x /usr/local/sbin/fhem-dht
chmod: changing permissions of '/usr/local/sbin/fhem-dht': Operation not permitted


Fehlen mir irgend welche Rechte?
Funktioniert das Script noch unter Debian Stretch?


Zitat von: moemoe am 21 September 2014, 15:10:57

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.



FHEM: 6.1 Raspberry Pi 3 mit Bullseye 64-bit (Debian11), CUL V3.4, 4 x HM-MOD-Re-8 V1.2, 2 x HM-CC-RT-DN V1.5, 1 x HM-RC-8 V1.1

mumpitzstuff

Der erste Aufruf ist mit sudo erfolgt, der zweite nicht. Das chmod +x musst du auch mit sudo machen, sonst wird das nichts.

betamax

Hallo @mumpitzstuff,

ich habe da ich den Ordner "fhem-dht" nicht gefunden habe den (schon installierten) Script versucht nochmals zu installierten.
Daher kommen wohl die Fehlermeldungen.

Ich habe mir die Antworten von Dangermouse ab Antwort #130 noch mal durchgelesen und jetzt klapp es.

Danke und ein schönes Wochenende!

FHEM: 6.1 Raspberry Pi 3 mit Bullseye 64-bit (Debian11), CUL V3.4, 4 x HM-MOD-Re-8 V1.2, 2 x HM-CC-RT-DN V1.5, 1 x HM-RC-8 V1.1

Geisha2021

Zitat von: artoffhem am 26 Oktober 2018, 21:58:49
Hallo Zusammen,

möchte hier eine Lösung teilen wie ich einen DHT11 Sensor ohne Python script eingebunden habe.



Geisha2021

Ich habe auf einem Raspi  B3+  (Raspbian Buster) FHEM installiert und betreibe mit dem 1-wire Busmaster DS9490R 6 DS18B20 Temperatursensoren was auch sehr gut funktioniert.

Jetzt will ich noch einen DHT22 Sensor nach der Anleitung von arthoffhem installieren jedoch klappt es nicht.
In die config.txt habe ich folgendes eingefügt:

# activation DHT22/x sensor on GPIOx (default 4)
dtoverlay=dht22,gpiopin=5

# activating device tree debugging (use sudo vcdbg log msg)
dtdebug=on


Es kommt folgende Fehlermeldung im Log (pi@raspberrypi:~ $ sudo vcdbg log msg):

002167.771: Failed to load overlay 'dht22'
002168.000: brfs: File read: /mfs/sd/overlays/dht22.dt

Kann mir da jemand weiterhelfen?

Geisha2021

Habe den Grund schon selbst gefunden. Es gibt kein overlay dht22. Man muss das dht11 nehmen.

Geisha2021

Prinzipiell funktioniert jetzt die Abfrage der Temperatur und Feuchtigkeit. Gestern konnte ich nach der Anleitung von artoffhem beide Werte mit der Konsole putty auslesen. Da hatte ich den Sensor auf dem Tisch mit 50cm Kabel angeschlossen am GPIO5.

Jetzt habe ich den Sensor mit ca 10m Kabel nach draußen verlegt. Die Abfrage funktioniert jetzt nicht mehr: Es kommt  die Meldung "Eingabe-/Ausgabefehler"

cat /sys/devices/platform/dht11@5/iio:device0/in_temp_input

cat: '/sys/devices/platform/dht11@5/iio:device0/in_temp_input': Eingabe-/Ausgabefehler

In den Dateien "in_temp_input" und "in_humidityrelative_input" stehen jedoch Messwerte die sich auch ändern.

Ich betreibe den Sensor mit 3,3V und 4,7kOhm Pullup Widerstand. Wenn ich ihn mit 5V betreibe (und pullup 3,3V) besteht da ein Risiko dass der GPIO zerschossen wird?

mumpitzstuff

Ich hab zwar wenig bis keine Ahnung von solchen Dingen, aber ich würde vermuten das du kein vernünftiges geschirmtes Kabel verwendest (twisted wäre vermutlich auch ganz nett)? Das wäre vermutlich die Grundvoraussetzung für solche Kabellängen.