DHT22-Messwerte in fhem auslesen

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

Vorheriges Thema - Nächstes Thema

igami

Zitat von: Rheingold am 12 Februar 2017, 10:43:54
Frage aber in die Runde: wenn ich auf meinem Raspberry auf dem FHEM läuft ein Passwort auf Telnet vergebe, wie muss ich die Datei unter "/usr/local/sbin/fhem-dht" ändern um das Passwort zu hinterlegen?
Du kannst stann password auch globalpassword verwenden. Die unterschiede sind in der commandref beschrieben.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Rheingold

Hi, danke für die flotte Antwort :)

Das heißt einfach wie hier beschrieben: https://fhem.de/commandref_DE.html#telnet folgendes eingeben:

define tPort telnet 7072 global
attr tPort SSL
attr allowed_tPort allowed
attr allowed_tPort validFor tPort
attr allowed_tPort globalpassword ASDF


Sehe ich es richtig, dass ich dann kein Passwort für das Script eintragen muss, da es ja auf dem localhost läuft?
Was ist mit einem bereits definierten Passwort? Bleibt das bestehen oder kann/soll man das entfernen?
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

igami

Ich glaube  da ist ein Fehler in der commandref und es sollte
define allowed_tPort allowed
heißen.
https://fhem.de/commandref_DE.html#allowed

Zitat von: Rheingold am 12 Februar 2017, 11:06:57
Sehe ich es richtig, dass ich dann kein Passwort für das Script eintragen muss, da es ja auf dem localhost läuft?
So sollte das sein.
Zitat von: Rheingold am 12 Februar 2017, 11:06:57
Was ist mit einem bereits definierten Passwort? Bleibt das bestehen oder kann/soll man das entfernen?
Ich würde nicht zwei Passwörter stehen lassen, da ich nicht weiß was dann passiert und ich ja nur für remote verbindungen ein passwort brauche.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Rheingold

Danke für die Hilfe und das gute Zureden :)

Habe es wie aus dem Wiki kopiert und das Script von Seite 1 funktioniert noch immer. Super :)
Fhem auf Raspi 3; Jeelink mit 6x TX29DTH; CUL433 mit 9x RCS 1000 N und Somfy-Steuerung; CUL868; MAX-Cube + Thermostate; Philips Hue & Ikea Tradfri; Google Home Assistant; FTUI für Tablet und SmartPhone via Reverse-Proxy

Frosch

Hallo zusammen,

ich hatte vor einiger Zeit schon das python-Skript von moemoe angewendet und es hatte bis vor kurzem tadellos funktioniert.
Irgendwann kam dann aber die Meldung im Log:

File "/usr/local/sbin/fhem-dht", line 67, in <module>
    humidity, temperature = Adafruit_DHT.read_retry(sensor['type'], sensor['pin'], retries, delay)
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 90, in read_retry
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 76, in read
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 56, in get_platform
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/Beaglebone_Black.py", line 24, in <module>
ImportError: cannot import name Beaglebone_Black_Driver

Als Lösung habe ich gefunden die Python Version zu aktualisieren. -> sudo apt-get install python-pip
Nun bekomme ich diese Meldung im FHEM Log:

File "/usr/local/sbin/fhem-dht", line 67, in <module>
    humidity, temperature = Adafruit_DHT.read_retry(sensor['type'], sensor['pin'], retries, delay)
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 90, in read_retry
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/common.py", line 77, in read
  File "build/bdist.linux-armv7l/egg/Adafruit_DHT/Beaglebone_Black.py", line 213, in read
RuntimeError: Error accessing GPIO. Make sure program is run as root with sudo!

FHEM ist in der group GPIO. Muss ich FHEM nun auch sudo rechte erteilen?

Gruß Mathias

mumpitzstuff

Ich habe mir inzwischen 2 DHT22 gekauft und diese erfolgreich eingebunden. Leider sind nur die Temperaturwerte zu gebrauchen, die Luftfeuchtigkeit hingegen sind irgendwelche Mondwerte. Ich habe jetzt jeweils Korrekturwerte drauf rechnen bzw. abziehen müssen. Bei dem einen -8 und bei dem anderen +7 ( was das Ganze natürlich fast unbrauchbar macht, da der Verlauf nicht linear ist). Ich hatte eigentlich angenommen, das die Dinger bereits kalibriert sind... Oder gibt es hier inzwischen Kopien aus China, die sich anders verhalten als die originalen Sensoren?

jay-jey

Hallo,

ich habe mich auch gerade mit diesem Skript beschäftigt und komme aber gerade nicht weiter: Ich würde gerne die Daten per telnet von einem pi zero auf meinen anderen pi mit fhem senden.
Gleich vorweg, ich habe nicht die kompletten 11 Seiten komplett durchgelesen, daher hoffe ich mal, das ihr mir das nachseht wenn ich hier eine Frage nochmal stelle.

Auf dem pi mit fhem hatte ich ein Passwort auf dem Telnetport. Wie kann ich das Skript von modifizieren um das Passwort einzutragen?

Bzw. da ich sowieso mqtt verwende könnte ich nicht auch die Daten vom Sensor in den mqtt server eintragen lassen?



TimoH

Hallo jay-jey,

ich hatte gerade das gleiche Problem, ich wollte auch die Daten von einem Pi zum passwortgeschützten Server senden.

Die Lösung ist eigentlich trivial, habe aber auch erst eine Weile gerätselt.
Es muss einfach nur als erste Zeile des Datenpakets das Passwort, gefolgt von \n, eingetragen werden:
if humidity is not None and temperature is not None:
            s += "PASSWORT\n"


Und schon läuft es.
Natürlich ist es nicht besonders elegant, das Passwort im Klartext in das Script zu schreiben. Sinnvoller wäre es, das PW aus einer Datei auszulesen, die nur root öffnen kann. Werde ich noch entsprechend ändern, muss mich da aber erstmal einlesen, wie das zu bewerkstelligen ist.

Viele Grüße
Timo

klugec

Zitat von: moemoe am 21 September 2014, 15:10:57
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

Vielen Dank für die super Anleitung. Hat bestens funktioniert.
Eine Frage hätte ich: Wie funktioniert das mit dem Filelog und wie kann ich das dann in einem Diagramm ausgeben?

Vielen Dank schonmal :)
Raspberry Pi 4 8GB | TRADFRI | ALEXA | Debian Buster

hobbyman

Hallo zusammen, bin noch Neuling

Ich habe Probleme den DHT22 in FHEM einzubinden, vielleicht kann mir jemand helfen.

Folgendes habe ich gemacht:
Den DHT22  angeschlossen  an  GPIO 14
/Adafruit_Python_DHT/examples      sudo ./AdafruitDHT.py 22 14
Temp=21.8* Humidity=52.6%    soweit OK.

Installation Skript: in Datei fhemdht22.py eingefügt
/usr/local/sbin/fhem-dht/fhemdht22.py Besitzer root  Gruppe staff Rechte rwxr-xr-x     
'name': 'Wohnzimmer.DHT22'  'pin':  14        eingetragen
Versuche den Skript zu starten:
sudo ./usr/local/sbin/fhem-dht
cd /usr/local/sbin  Verzeichnis  sudo ./fhem-dht          command not found

Wo ist der Fehler ?

In FHEM eingegeben:

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

Fehler: define FileLog_Wohnzimmer_Heizung first     Wie define FileLog  ?


Cron Job   sudo nano /usr/local/sbin/fhem-dht          Zeilen eingetragen

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

lässt sich nicht in Datei speichern,       errors in crontab file cant install

wo können die Fehler sein ?
Muß in FHEM.cfg  noch etwas eingetragen werden ?

Bitte um eure Hilfe
Grüsse 
Wolfgang

mumpitzstuff

Dein Skript heisst fhemdht22.py und nicht fhem-dht. Das ist nur das Verzeichnis.

hobbyman

Hallo zusammen,

Vielleicht kann mir doch noch jemand helfen ?

Den Script habe ich wohl ans Laufen gebracht. Ich habe die Zeilen:

cat << 'EOF' > /usr/local/sbin/fhem-dht   
EOF
chmod +x /usr/local/sbin/fhem-dht 
entfernt, letzten per Konsole ausgeführt.

Wenn ich jetzt als root /usr/local/sbin/fhem-dht
python fhemdht22.py  per Konsole eingebe: wird im dummy der aktuelle
Wert angezeigt und auch ins Logfile geschrieben d.h. der Script
funktioniert. (als sudo fhemdht22.py geht es aber nicht.)

Habe auch in fhem.cfg fhem ALL=(ALL) NOPASSWD: ALL hinzugefügt.

Letztes Problem ist den Cron Job ans Laufen zu bringen.

Habe mit A1 versucht den richtigen
Startbefehl zu finden sudo geht nicht (command not found) python (auch mit –c) geht nicht.
define a1 at +*00:05:00 {  system('sudo /usr/local/sbin/fhem-dht&');; }

define a1 at +*00:05:00 {  system('python /usr/local/sbin/fhem-dht/fhemdht22.py') }

vielleicht weiß jemand die richtige define, wäre toll.

Grüsse

Wolfgang


artoffhem

#162
Hallo Zusammen,

möchte hier eine Lösung teilen wie ich einen DHT11 Sensor ohne Python script eingebunden habe.
Der RPi unterstützt direkt 1-Wire (https://wiki.fhem.de/wiki/Raspberry_Pi_und_1-Wire) und DHT Sensoren an einstellbaren GPIO Pins mittels dtoverlay Einstellungen.

Ausgangspunkt für diese Beschreibung ist folgender Blog https://arduinodiy.wordpress.com/2018/05/17/reading-the-dht11-or-dht22-on-the-raspberry-via-an-overlay-and-send-it-to-the-openhab-rest-api/

Bei meinem RPi3 habe ich den DHT11 an GPIO5 angeschlossen, da der Standardport (GPIO4) mit dem HM-MOD-RPI-PCB blockiert ist. Kurze Notiz am Rande - DHT Sensoren haben kein 1-Wire Protokoll - war mir Anfangs nicht klar.

Folgende Schritte sind notwendig.

RPi Unterstützung für DHT in /boot/config.txt aktivieren
sudo nano /boot/config.txt
# activtion DHT11/DHT21/DHT22 sensor on GPIOx (default 4)
dtoverlay=dht11,gpiopin=5
# activating device tree debugging (use sudo vcdbg log msg)
dtdebug=on


Neustart RPi
sudo shutdown -r now

Kontrolle ob dht11 aktiviert wurde
sudo vcdbg log msg
in der Ausgabe taucht folgende Meldung auf
xxx: Loaded overlay 'dht11'
xxx: dtparam: gpiopin=5


Kontrolle ob die Werte ausgelesen werden können
cat /sys/devices/platform/dht11@0/iio:device0/in_temp_input
Ausgabe z.B.:
21000
cat /sys/devices/platform/dht11@0/iio:device0/in_humidityrelative_input
Ausgabe z.B:
65000

Anlegen eins CustomReadings in FHEM um die Werte auszulesen
define DHT11 CustomReadings
attr DHT11 readingDefinitions temperature:qx(cat /sys/devices/platform/dht11\@0/iio:device0/in_temp_input 2>%1) / 1000,humidity:qx(cat /sys/devices/platform/dht11\@0/iio:device0/in_humidityrelative_input 2>%1) / 1000

Abfrage Intervall festlegen
attr DHT11 interval 150
event-on-change-reading festlegen damit im Filelog nur bei Änderungen protokolliert wird
attr DHT11 event-on-change-reading .*

FileLog anlegen
define FileLog_DHT11 FileLog ./log/DHT11-%Y.log DHT11

viel Spaß

edit 2018-10-27: Tippfehler in config.txt korrigiert

mumpitzstuff

In dem was in config.txt stehen soll sind zwei Fehler. Es müsste dtoverlay und dtdebug sein und nicht dtoverly und dtbebug.

couchtomato

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.

Vielen Dank für die coole Anleitung, hat bei mir perfekt funktioniert!  :)
I ♥ FHEM.
(FHEM@ 2 x RPi1, 1 x RPi2, 1x RPi3).