Autor Thema: DHT22-Messwerte in fhem auslesen  (Gelesen 76743 mal)

Offline mumpitzstuff

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1366
Antw:DHT22-Messwerte in fhem auslesen
« Antwort #165 am: 08 November 2018, 00:13:09 »
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


Offline skycrack

  • New Member
  • *
  • Beiträge: 44
Antw:DHT22-Messwerte in fhem auslesen
« Antwort #166 am: 15 März 2019, 19:08:13 »
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-/AusgabefehlerGeht mir ebenso, wäre auch an einer Lösung interessiert.

Offline mumpitzstuff

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1366
Antw:DHT22-Messwerte in fhem auslesen
« Antwort #167 am: 15 März 2019, 22:26:13 »
#!/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...

Offline skycrack

  • New Member
  • *
  • Beiträge: 44
Antw:DHT22-Messwerte in fhem auslesen
« Antwort #168 am: 26 März 2019, 07:36:23 »

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