DHT22-Messwerte in fhem auslesen

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

Vorheriges Thema - Nächstes Thema

Geisha2021

Vielen Dank für den Tip.

Ich habe ein cat5 Kabel (Netzwerkkabel) verwendet jedoch den Schirm noch nicht an Masse gelegt. Werde ich heute probieren. Auch den Sensor nochmal mit kurzem Kabel testen.

Geisha2021

Die Abfrage der Temperatur geht jetzt jedoch kommen immer wieder Null-werte. Wie kann man verhindern dass diese abgespeichert werden?

Zitat2020-11-11_17:36:02 0
2020-11-11_17:36:22 9.4
2020-11-11_17:36:42 0
2020-11-11_17:37:02 9.4
2020-11-11_17:37:22 0
2020-11-11_17:37:42 9.4
2020-11-11_17:38:02 0
2020-11-11_17:38:42 9.4
2020-11-11_17:39:02 0
2020-11-11_17:39:22 9.4
2020-11-11_17:39:42 0
2020-11-11_17:40:02 9.3
2020-11-11_17:40:23 0
2020-11-11_17:40:43 9.4
2020-11-11_17:41:03 0
2020-11-11_17:41:43 9.3
2020-11-11_17:42:03 0
2020-11-11_17:42:23 9.3
2020-11-11_17:42:43 0
#DHT22:temperature:::

mumpitzstuff

Das ist ein systematischer Fehler. Du müsstest vielleicht zeigen, wie du die Werte in FHEM rein holst. An diese Stelle solltest du gucken, ob du Fehler bekommst und falls das der Fall ist, die Werte nicht an FHEM durchreichen. Wenn du ein paar Einträge zurück gehst, hatte ich ebenfalls mit solchen Problemen zu kämpfen und habe diesen Weg aufgegeben. Man konnte aber die Fehler erkennen.

https://forum.fhem.de/index.php/topic,25413.msg855374.html#msg855374

Geisha2021

Jetzt habe ich noch zusätzlich den Effekt dass keine Werte mehr ausgelesen werden.

Wenn ich in der Konsole einen Wert auslesen möchte kommt die Meldung:
Zitatcat: '/sys/devices/platform/dht11@5/iio:device0/in_temp_input': Die Wartezeit für die Verbindung ist abgelaufen

Auch eine reboot vom Raspi ändert daran nichts. Man muss ihm den Strom abschalten und dann geht es wieder.

Denselben Effekt hatte ich vor Monaten als ich DS18B20 Sensoren am GPIO 4 angeschlossen hatte. Habe dann den Busmaster DS9490 installiert und seither funktionieren alle 10 Sensoren zuverlässig.

Ich werde jetzt wie du Python installieren und die Adafruit Library verwenden.

mumpitzstuff

Die Adafruit Library die ich verwendet habe ist inzwischen veraltet und wurde ersetzt durch etwas anderes. Die alte Library arbeitet auch nicht mehr mit einem Rasperry 4 zusammen. Ich musste da die Library patchen, damit es noch geht. Eventuell musst du dir da was neueres/besseres suchen.

Geisha2021

Ich habe aber einen Raspberry B3+. Was gibt es da neueres und besseres für diese Sensoren?
Wenn die bisherige Lösung funktioniert dann muss es für mich nichts neueres sein.

Geisha2021

Ich habe jetzt nach der Anleitung https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup Python3.7 und die Adafruit Library installiert jedoch funktioniert der dort beschriebene Test nicht. In der Datei dht_simpletest.py steht der folgende Code:
import time
import board
import adafruit_dht

# Initial the dht device, with data pin connected to:
dhtDevice = adafruit_dht.DHT22(board.D18)

# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
# dhtDevice = adafruit_dht.DHT22(board.D18, use_pulseio=False)

while True:
    try:
        # Print the values to the serial port
        temperature_c = dhtDevice.temperature
        temperature_f = temperature_c * (9 / 5) + 32
        humidity = dhtDevice.humidity
        print(
            "Temp: {:.1f} F / {:.1f} C    Humidity: {}% ".format(
                temperature_f, temperature_c, humidity
            )
        )

    except RuntimeError as error:
        # Errors happen fairly often, DHT's are hard to read, just keep going
        print(error.args[0])
        time.sleep(2.0)
        continue
    except Exception as error:
        dhtDevice.exit()
        raise error

    time.sleep(2.0)


Die entsprechende Anpassung des GPIO 5 habe ich gemacht.

Wenn ich dann in der Konsole "python3 dht_simpletest.py" eingebe kommt immer die Meldung: "python3: can't open file '_simpletest.py': [Errno 2] No such file or directory"

Er findet offensichtlich die Datei nicht. Habe schon alles mögliche probiert aber komme nicht weiter.
Kann mir jemand helfen?


mumpitzstuff

Sehr komisch. Benennt die Datei mal in simpletest.py um und probier es damit.

KölnSolar

Ich hätt ja auch noch einen DHT22 u. könnt mir den direkt am Rpi vorstellen.
Mich stört aber die Python-Lösung. Hat niemand bisher über eine Perlanbindung nachgedacht ?
Dürfte doch nicht so problematisch sein, wenn man RPI_GPIO als Ausgangspunkt nimmt, oder ?  :-\
Grüße Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Geisha2021

Zitat von: mumpitzstuff am 20 November 2020, 22:27:05
Sehr komisch. Benennt die Datei mal in simpletest.py um und probier es damit.

Habe das Problem jetzt gelöst. Anscheinend muß man den Pfad zum Speicherort vorgeben. Das Script ist bei mir unter pi/DHT-Sensor gespeichert

pi@raspberrypi:~/DHT-Sensor $ python3 dht_simpletest.py

Als nächstes will ich nun die Werte alle 20s auslesen und in der Maria DB von FHEM speichern.
Python3 und die Adafruit_Python_DHT Library habe ich schon installiert  und auch die Skripte angepasst. Wo muss man die Skripte speichern. Müssen die Skripte mit .py enden?

Wie du siehst fehlen mir die elementaren Kenntniss von Python. Wie startet man die Skripte aus FHEM? Ich bin auf deine (eure) Hilfe angewiesen. Vielen Dank.

mumpitzstuff

fhem muss zugriff auf die Dateien haben bzw. die Rechte müssen entsprechend gesetzt sein. Du kannst versuchen das Script in der COmmandline von fhem zu starten, um zu überprüfen ob das geht. Dann brauchst du sowas wie ein AT device und kannst dort dein script kommando in Hochkomma schreiben. Dadurch wird es non blocking ausgeführt:

"python script.py"

Wernieman

Oder einfach in der ersten zeile den Interpreter mit #! reinschreiben,

also z.B.
#!/usr/bin/python3
Dann solltest Du in der Shell das Programm direkt starten können, wenn es ausführbar ist.
chmod +x <DeinProgramm>
Und entsprechend in FHEM wie ein Shellprogramm starten.

ABER .. wenn Du alle 20 Minuten etwas starten willst, warum aus FHEM heraus? Es gibt doch die crontab, also das System!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Geisha2021

Vielen Dank für eure Tips jedoch bin ich damit überfordert. Ich kenne mich noch einfach zu wenig damit aus.

Was will ich:
Einen DHT22 Sensor auslesen und die Werte in der FHEM Maria DB speichern. Das Interval soll frei wählbar sein.

Im Putty Terminal funktioniert die Abfrage wie ich bereits oben erwähnt habe alle 4s oder20s.

Um das ganze in FHEM zu implementieren habe ich folgendes gemacht nach diversen Anleitungen im Forum:

- Python3 und die Adafruit Library installiert.

- In FHEM den dummy WP.DHT22 angelegt

- Folgendes Script installiert: Frage: Wie muss der Dateiname (fhem-dht.py) aussehen und wo muss man es speichern (/usr/local/sbin/fhem-dht.py)? In Klammern sind meine Einstellungen.

cat << 'EOF' > /usr/local/sbin/fhem-dht.py
#!/usr/bin/python3

import Adafruit_DHT
import socket

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

sensors = [
    {
        'name': 'WP.DHT22',
        'type': Adafruit_DHT.DHT22,
        'pin':  5
    },
   
]

# 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


- Cronjob-script installiert: Frage: Dateiname (cron-dht)? Speicherort (/etc/cron.d/cron-dht)
Frage: wie ändere ich das Abfrageinterval z. Bsp. auf 4s oder 20s?
# Damit das ganze regelmäßig (in meinem Fall alle 1 min) ausgeführt wird, erstellen wir noch einen Cron-Job:

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

SHELL=/bin/sh

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


Die Rechte (Eigentümer) liegen bei beiden Scripten bei root

mumpitzstuff

Crontab funktioniert nur bis runter zu einer Minute. Das ist aber auch mehr als ausreichend. Man braucht keine Temperatur in Echtzeit...

Geisha2021

Ich möchte den DHT22 Sensor ohne das python script einbinden und habe deshalb die Lösung von arthoffhem (Beitrag 162) implementiert. Wie schon in meinem Beitrag vom 11.November kommen sehr häufig 0-Werte vor die in der Datenbank  abgespeichert werden und bei der Plotdarstellung stören.
Angewendete Attribute:
DbLogExclude .*
DbLogInclude temperature,humidity
Ich wollte das loggen dieser 0-Werte mit dem Attribut DbLogValueFn verhindern.{
   if ($READING =~ /temperature/ && $VALUE = 0)
   {\$IGNORE=1;;\
   }\
}


aber es funktioniert nicht. Die Nullwerte werden immer noch geloggt.
Was ist hier falsch?