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 (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!
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
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.
Hallo csi,
kannst Du das Script mal reinstellen? Danke.
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"
Hallo,
DHTInnen muss dann so
define DHTInnen dummy
angelegt werden?
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
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
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
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...
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/
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
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.
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...
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."
hallo nochmal,
ich wollte sicher nicht irgendjemand kränken oder ähnliches, sollte sich jemand angegriffen fühlen, dann sorry.
also das was ich eigentlich gerne hätte, wäre eine HowTo wie ich beim MCP23017 od. MCP23S17 einen Interrupt auslöse und diese Daten dann auswerte.. bzw. die Daten die daraus entstehen, weiterleite, wie im eingefügte nscript....
kurz: wie löse ich ein Interrupt (so eines wie aus dem script) aus am MCP... und wie bekomm ich die daten aus dem MCP raus...
obs mit dem timing dann klappt oder nicht is jetzt ein anderes thema, denn wenn ich mal weiß wie das funkt, dann kann ich es auch für andere dinge einsetzen... oder? sollte es nicht mit dem DHT11 funktionieren....
deshalb wäre ich dankbar, wenn mir jemand diese funktion verständlich erklären könnte...
vielen Dank
hallo again...
ich bin mit meinem gebastel einen schritt weiter... aber stecke nun wieder fest... leider :'(
und zwar habe ich, wie bereits angedroht das ganze szenario vom MCP23017 auf einen MCP23S17 umgebaut, die DHT11-sensoren angeschlossen (derzeit nur 1 wegen testen)...
hab mir mein script entsprechend umgeschrieben, AAAABER, die werte die ich jetzt bekomme... kann ich nicht deuten....
hier mal das script, bitte entschuldigt, wenn dieses noch etwas verwirrt und unübersichtlich und nur wenig strukturiert ist, ich bin erst am anfang mit dem programmieren.....deshalb drückt bitte ein oder 2 augen zu... ;-)
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import smbus
import sys, spidev
#SPI BASESETTINGS
spi = spidev.SpiDev() # create spi object
spi.open(0, 1) # open spi port 0, device (CS) 1
spi.max_speed_hz=(10000000)
#GPIO BASESETTINGS
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#MCP23S17 Device Adress
DEVICE_ADRESS = 0x40 #Slave-Adress
# - - MCP23S17 registers - - #
IO_DIRECTION_A = 0x00 # IO direction (0=output, 1=input (Default))
IO_DIRECTION_B = 0x01
IO_POLARITY_A = 0x02 # IO polarity (0=normal, 1=inverse)
IO_POLARITY_B = 0x03
GP_INTERRUPT_ENABLE_A = 0x04 # interrupt on change (0=disable, 1=enable)
GP_INTERRUPT_ENABLE_B = 0x05
DEF_VALUE_A = 0x06 # default comparison for interrupt on change
DEF_VALUE_B = 0x07
INTERRUPT_CONTROL_A = 0x08 # interrupt control (0=interrupt on change, 1=interrupt on change from DEFVAL)
INTERRUPT_CONTROL_B = 0x09
IO_CTRL_A = 0x0A # IO Control Adress
IO_CTRL_B = 0x0D
GP_PULLUP_A = 0x0C # pull-up resistor (0=disabled, 1=enabled)
GP_PULLUP_B = 0x0D
INFO_INTERRUPT_A = 0x0E # interrupt flag
INFO_INTERRUPT_B = 0x0F
INTERRUPT_CAPTURE_A = 0x10 # interrupt capture
INTERRUPT_CAPTURE_B = 0x11
GPIOA = 0x12 # port value
GPIOB = 0x13
OUTPUT_A = 0x14 # output Ports
OUTPUT_B = 0x15
# - - MCP23017 pins - - #
PIN7 = 0x80
PIN6 = 0x40
PIN5 = 0x20
PIN4 = 0x10
PIN3 = 0x08
PIN2 = 0x04
PIN1 = 0x02
PIN0 = 0x01
APIN = 0xff
PINOFF = 0x00
ENABLE = 0x01
DISABLE = 0x00
OUTPUT = 0x00
INPUT = 0x01
# Compare Values for the Adress Pins Bank A on the MCP23S17
PIN0 = 0x01 # = 00000001 = 1
PIN1 = 0x02 # = 00000010 = 3
PIN2 = 0x04 # = 00000100 = 4
PIN3 = 0x08 # = 00001000 = 8
PIN4 = 0x10 # = 00010000 = 16
PIN5 = 0x20 # = 00100000 = 32
PIN6 = 0x40 # = 01000000 = 64
PIN7 = 0x80 # = 10000000 = 128
# MCP23S17-Pins
SCLK = 11 # Serial-Clock
MOSI = 10 # Master-Out-Slave-In
MISO = 9 # Master-In-Slave-Out
CS = 18 # Chip-Select
#Setup GPIO Logic for Single Buttons and MCP Interrupt
GPIO.setup(23,GPIO.IN) #define BCM-Pin 23 (WPin4) as input for Interrupt Line from INIA of MCP23017
GPIO.setup(24,GPIO.IN) #define bcm-pin 24 (WPin5) as input for Interrupt Line from INTB of MCP23017
# Setup i2c logic for mcp23017 and its settings
#bus = smbus.SMBus(1) # 1 for Rev 2, and 0 for Rev 1 Raspis
data = [] #define a data array
data1 = [] #define a 2nd data array just for testing
data2 = [] #define a 3rd data array just for testing
data3 =[] #define a 4th data array just for testing
###################################################################
def sendValue(value):
# Value senden
for i in range(8):
if (value & 0x80):
GPIO.output(MOSI, GPIO.HIGH)
else:
GPIO.output(MOSI, GPIO.LOW)
# Negative Flanke des Clocksignals generieren
GPIO.output(SCLK, GPIO.HIGH)
GPIO.output(SCLK, GPIO.LOW)
value <<= 1 # Bitfolge eine Position nach links schieben
def sendSPI(opcode, addr, data):
# CS aktive (LOW-Aktiv)
GPIO.output(CS, GPIO.LOW)
sendValue(opcode|IO_CTRL_A) # OP-Code senden
sendValue(addr) # Adresse senden
sendValue(data) # Daten senden
# CS nicht aktiv
GPIO.output(CS, GPIO.HIGH)
def readSPI(opcode, addr):
# CS aktive (LOW-Aktiv)
GPIO.output(CS, GPIO.LOW)
sendValue(opcode|ENABLE) # OP-Code senden
sendValue(addr) # Adresse senden
# Empfangen der Daten
value = 0
for i in range(8):
value <<= 1 # 1 Postition nach links schieben
if(GPIO.input(MISO)):
value |= 0x01
# Abfallende Clock-Flanke generieren
GPIO.output(SCLK, GPIO.HIGH)
GPIO.output(SCLK, GPIO.LOW)
# CS nicht aktiv
GPIO.output(CS, GPIO.HIGH)
return value
def bin2dec(string_num): #define a function to convert a binary to a decimal number
return str(int(string_num, 2)) #return the string representing the integer value of the string passed to this function in base 2 (binary)
def main():
# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
# Pegel vorbereiten
GPIO.output(CS, GPIO.HIGH)
GPIO.output(SCLK, GPIO.LOW)
sendSPI(DEVICE_ADRESS,IO_DIRECTION_A,OUTPUT) #Row A = OUTPUT
sendSPI(DEVICE_ADRESS,OUTPUT_A,PIN7) #Pin A7 = high
time.sleep (0.025)#for 25ms
sendSPI(DEVICE_ADRESS,OUTPUT_A,PINOFF)#Pins = Low
time.sleep(0.02)#for 20ms.
sendSPI(DEVICE_ADRESS,GP_INTERRUPT_ENABLE_A,DISABLE) #Schalte Interrupt auf A7
sendSPI(DEVICE_ADRESS, DEF_VALUE_A,PINOFF) #Vergleichswert = alle aus
sendSPI(DEVICE_ADRESS, INTERRUPT_CONTROL_A, ENABLE) # Aktiviere vergleich
sendSPI(DEVICE_ADRESS,IO_DIRECTION_A, INPUT) #Row A = INPUT
sendSPI(DEVICE_ADRESS,GP_PULLUP_A,ENABLE)#Pullup-resistor on Row B hight
time.sleep(0.125)
for i in range(0,500):
data.append(readSPI(DEVICE_ADRESS,GPIOA))#reads data from GPIA
#data1.append(readSPI(DEVICE_ADRESS,GPIOB))#reads data from GPIB
data2.append(GPIO.input(23)) #reads data from RPi-GPIO 24
#data3.append(GPIO.input(24)) #reads data from RPi-GPIO23
data1.append(readSPI(DEVICE_ADRESS,INTERRUPT_CAPTURE_A))
data3.append(readSPI(DEVICE_ADRESS,INTERRUPT_CAPTURE_B))
#######
bit_count = 0
tmp = 0
count = 0
HumidityBit = ""
TemperatureBit = ""
crc = ""
print "daten vom GPIOA" , data
print "daten von GPIOB" , data1
print "daten von Pin23 (WPin4)" , data2
print "daten von Pin24 (WPin5)" , data3
try: #try until error then goto except
while data[count] == 1: #as long as u read a 1
tmp = 1
count = count + 1 #count how many 1s have been read
for i in range(0, 32): #do this 33 times
bit_count = 0 #reset the bit count each time
while data[count] == 0: #as long as a 0 is read
tmp = 1
count = count + 1 #move on to the next bit
while data[count] == 1:
bit_count = bit_count + 1
count = count + 1
if bit_count > 3: #if there were more then 3x1 bit in a row
if i>=0 and i<8: #if we're in the first byte
HumidityBit = HumidityBit + "1" #append a 1 to the humi-bitstring
if i>=16 and i<24:
TemperatureBit = TemperatureBit + "1"
else:
if i>=0 and i<8:
HumidityBit = HumidityBit + "0"
if i>=16 and i<24:
TemperatureBit = TemperatureBit + "0"
except:
print "ERR_RANGE-1"
exit(0)
try:
for i in range(0, 8):
if bit_count > 3:
crc = crc + "1"
else:
crc = crc + "0"
except:
print "ERR_RANGE-2"
exit(0)
try:
for i in range(0, 8):
bit_count = 0
while data[count] == 0:
tmp = 1
count = count + 1
while data[count] == 1:
bit_count = bit_count + 1
count = count + 1
except:
print "ERR_RANGE-2"
exit(0)
Humidity = bin2dec(HumidityBit)
Temperature = bin2dec(TemperatureBit)
if int(Humidity) + int(Temperature) - int(bin2dec(crc)) == 0:
print "Humidity:"+ Humidity +"%"
print "Temperature:"+ Temperature +"C"
else:
print "ERR_CRC"
if __name__ == '__main__':
main()
und die ergäbnisse des scripts:
daten vom GPIOA [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128]
daten von GPIOB [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
daten von Pin23 (WPin4) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
daten von Pin24 (WPin5) [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Humidity:0%
Temperature:0C
Hallo Michl1003!,
ohne Dir jetzt den Mut zu nehmen, kann ich moemoe nur zustimmen! Verschwende keine Zeit an aussichtslosen und vor allem viel zu zeitkritischen Projekten- nimm was Fertiges und mach' es passend. I2C mit Busexpandern sollte schmerzfrei sein.
Ich habe seit geraumer Zeit zahlreiche DHT22 an verschienenen ATmega's laufen. Mittlerweile alles stressfrei und aus jetziger Sicht sehr einfach, preiswert und schnell zusammengestrickt. Einfach einen ATmega nehmen, Ethersex konfigurieren, flashen, fertig. Auf der einen Seite können mehrere DHT22 angesteuert werden, auf der anderen Seite kannst Du die zB seriell per ECMD alle abfragen. Ohne LAN oder TCP reicht sicher ein Mega16.
Viele Grüße, Ricardo
ps: Ich würde aus heutiger Sicht die DHT22 außerhalb normal temperierter Wohnräume nicht wieder verwenden.
hallo Ricardo
danke für die antwort, mut nehmen kannst du nicht ausser mit der aussage es ist aus rein physikalischen und naturgesetzlichen Gründen nicht möglich das DHT11 mit dem MCP23x17 zu betreiben...
wie funktioniert das mit dem ATmega - ding? hättest vll. eine kleine how to tutorial zur hand? ;-)
danke.
Zitat von: Michl1003! am 25 November 2014, 14:57:24
...DHT11 mit dem MCP23x17 zu betreiben...
Warum nicht- oft geht's um den Lerneffekt und man beißt sich an solchen Zielen fest, die für Andere vielleicht nutzlos erscheinen. Mach mal! Und wenn's Fragen gibt, wird dir hier sicher geholfen. DHT11 sind leider nicht so genau, was einen sinnvollen Einsatzzweck doch eingrenzt. Nimm DHT22 oder SHT; die taugen besser.
Zitat von: Michl1003! am 25 November 2014, 14:57:24
wie funktioniert das mit dem ATmega - ding? hättest vll. eine kleine how to tutorial zur hand? ;-)
*Werbetrommelrühr*
Der Einstieg in die Wiki-Baustelle: http://www.ethersex.de/index.php/Ethersex_%28Deutsch%29 (http://www.ethersex.de/index.php/Ethersex_%28Deutsch%29)
Dort und vor allem auch im alten Wiki gibt es jede Menge Beispiele und HowTo's, wie man das an's Laufen bekommt.
Ein paar Kenntnisse von ATMEL Microcontrollern werden vorrausgesetzt. Wenn Du einen Draht zur Elektronik hast, ist das Wichtigste schnell erlernt und es stehen recht zügig Ergebnisse bereit.
Viele Grüße, Ricardo
Bei mir lief das Script zum lokalen DHT22 die letzten Woche super, aber (womöglich seit einem fhem update) bekomme ich keine readings mehr. Dies liegt daran, dass der Telnet-Zugriff auf die fhem.pl einen "permission denied" Fehler ausgibt.
Woran kann das liegen und welche Lösung gibt es. Gruß, zYloriC
Darüber bin ich gestern Abend auch gestolpert, rechte dieser Datei anpassen hat geholfen!
Hierüber gibt es einen thread, schreib einfach vor den /opt........ perl davor!
Also
perl /opt/fhem/fhem.pl 7072 "setreading DHTBuro T $Temp"
So klappt es ohne Berechtigungsprobleme!
Siehe http://forum.fhem.de/index.php?topic=28220.0 (http://forum.fhem.de/index.php?topic=28220.0)
Gruß
Zitat von: Zitze am 16 September 2014, 13:13:47
Hallo,
DHTInnen muss dann so
define DHTInnen dummy
angelegt werden?
Darauf hätte ich auch gerne eine Antwort! Wie wird das ganze nun in FHEM integriert?
Schau mal im Beitrag 4, hier im thread.
Hallo,
ich versuche gerade mein DHT22 einzubinden. Leider scheitere ich schon trotz deiner Anleitung. Ich habe eine Frage zu dem Installationsskript:
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.
Erst kam folgender Fehler:
ZitatFile "/usr/local/sbin/fhem-dht", line 26
SyntaxError: Non-ASCII character '\xc2' in file /usr/local/sbin/fhem-dht on line 26, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Diesen konnte ich durch Einfügen in der fhem-dht ganz oben mit folgendem Code beheben:
# -*- coding: utf-8 -*-
Wenn ich das Skript dann starte, erhalte ich am rPi folgenden Fehler:
Zitat/usr/local/sbin/fhem-dht: 4: /usr/local/sbin/fhem-dht: import: not found
/usr/local/sbin/fhem-dht: 5: /usr/local/sbin/fhem-dht: import: not found
;; connection timed out; no servers could be reached
/usr/local/sbin/fhem-dht: 10: /usr/local/sbin/fhem-dht: port: not found
/usr/local/sbin/fhem-dht: 12: /usr/local/sbin/fhem-dht: sensors: not found
/usr/local/sbin/fhem-dht: 46: /usr/local/sbin/fhem-dht: Syntax error: "(" unexpected (expecting "}")
Der erste Fehler, Zeile 4 in der fhem-dht, verweist auf die Adafruit_DHT. AdafruitDHT habe ich nach der Installation nicht verschoben oder verändert. Was mache ich falsch? Ich hoffe ihr könnt mir helfen =)
Beste Grüße
Andy
Hallo zusammen,
nachdem DHT22 am raspberry #1 gut funktioniert, will ich ein weiteres Modul an einem entfernten Raspberry (#2) installieren und die Werte abfragen.
Ich könnte auf #2 wie Werte per Cron in eine txt lesen und diese dann etwa mit fhem-modul WS3600 einlesen. Leider habe ich damit nur mittel-gute Erfahrungen gesammelt.
Daher ist meine Frage, ob es einen sicheren Weg gibt, dass ich vom Pi#1 auf das loldht-script oder auf die GPOIs zugreife und ich die Abfrage quasi direkt von Mutter-System #1 aus starte?
Scripts remote auszuführen ist eine heikle Sache, ich weiß... und ich ich bin auch kein Fan von abgelegten Passwörtern per telnet-Befehl.
Habt ihr noch weitere Ideen? Gruß, zYloriC
Hallo,
Danke für die Anleitung, das mit dem Auslesen geht prima.
@zYloriC wenn du einen weiteren Raspi mit benutzen willst, kannst du dir ein Skript mit expect schreiben um die Werte vom zweiten Raspi auf den fhem Raspi zu senden. klappt bei mir ganz gut.
Habe aber noch ein Problem mit dem DHT22:
Sobald ich einen Arduino per USB für eine andere Steuerung anschließe kommen bei der DHT-Abfrage nur seltsame werte raus.
Stromversorgung kann ich ausschließen, Netzteil hat 2A und es wird nur ein DHT und der Arduino versorgt.
Kann das an den Timings liegen, weil die pins nur gepollt werden?
Gruß phil
Hallo phil,
danke für deine Info. Leider habe ich noch nichts passendes zu "expect" finden können.
Hast du einen Link für mich oder kannst kurz beschreiben, wie du durch fhem triggerst, dass auf dem nicht-fhem der loldht-Befehl ausgeführt wird. Wie muss ich die Rechte setzen, wenn ich in der cfg nicht das Passwort des Users auf dem nicht-Fhem raspberry speichern muss?
Danke für eure Hilfe. zYloriC
hallo Forum,
ich habe mein Übertragungsproblem leider noch immer nicht gelöst, bin mittlerweile aber auf das Thema fHem & UDP gestoßen:
http://forum.fhem.de/index.php/topic,23540.msg181223.html#msg181223 (http://forum.fhem.de/index.php/topic,23540.msg181223.html#msg181223)
Was haltet ihr von UDP? Gibt es ein fHem-Module, dass mit mit UDP oder etwas ähnlichem unterstützt? Gibt es Nachteile von UDP?
Eigentlich will ich keine sensitiven Daten übertragen...
Hallo Moemoe,
Ich habe Deine Anleitung erfolgreich umgesetz.
Es lief auch super bis ich den 2ten DHT22 angeschlossen habe.
Dieser liert über die Abfrage auf dem rpi einen korrekten Wert, nur im fhem kommen immer die Werte -+ 8.6C und 3306.8% an.
Ich habe bereits die Pins gewechselt und die Sensoren geprüft.
Das Kabel des Sensors ist über 20m lang, die Spannung ist am DHT aber noch 3,3V.
Kann es evtl. Daran liegen das mehrere abgefragt werden?
Gruß
Sven
Hi,
habe mal etwas recherchiert, es wird oft darüber geschrieben das Python ein Timingproblem bei den DHT's hat.
Kann man eine Art sleep.time in dem Script einbauen, um die Abfrage zwischen den beiden Sensoren zu verzögern?
Gruß
Sven
Zitat von: Michl1003! am 01 November 2014, 10:34:29
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...
Kannst du mal genau kurz schreiben, wie du die dht's in fhem eingebunden hast. Habs versucht, bin aber gescheitert. Vorallen am cronjob. Wie sage ich fhem, das es auf dem raspi sudo./rpi_dht ausführen soll und wo schreibt er die Daten dann in das dummy Devise? Und das alle 1 min?
Danke schonmal für die Hilfe!!
Mit freundlichen Grüßen
Thilo
Zu dem Thema: wie lange darf die Leitung zum DHT sein: habe gestern alles fertig gelötet ( kleine Platine,DHT drauf, 4,7kOhm Widerstand zwischen 3,3V und VDD und schraubklemmen) habe als Zuleitung ein 2x2x0,8 Kabel. Schrumpfschlauch drüber und fertig. Nach dem löten alle drei nochmal getestet, da einige geschrieben haben, dass der DHT beim löten durch zu viel Temp kaputt gehen kann. Resultat: auf dem Kabelbund waren noch Ca 25m drauf und alle Werte waren genauso wie auf dem breadboard.
Viel Erfolg.
Hallo,
ich habe da ein Problem beim Installation Skript und zwar wenn ich das Skript ausführe (über cd /usr/local/sbin und dann ./fhem-dht) kommt folgende Fehlermeldung:
./fhem-dht: Zeile 81: Warnung: here-document at line 1 delimited by end-of-file (wanted `EOF')
Was mache ich da falsch habe das Skript wie folgt editiert
sensors = [
{
'name': 'Formica_fusca',
'type': Adafruit_DHT.DHT11,
'pin': 4
},
]
mehr habe ich nicht geändert...
Zuallererst oute ich mich hier als absoluten Laien, der nichtsdestotrotz seine Ideen trotzdem , wenn auch mit VIEL "try and error" umsetzen möchte. Idee ist ..eine Kellerregelung mit elektrischen
Fensteröffner (schaltbar m. Funksteckdose) und falls eine Lüftung nicht mehr möglich ist, einen Luftentfeuchter dazu zuschalten.
Habe nach moemoe 's Anleitung 2
DHT22's eingebunden. Bei define vom file_log gabs Probleme und beim cronjob mit root auch.
So habe ich es eingetragen und funktioniert bei mir:
define Dach.DHT22 dummy
attr Dach.DHT22 stateFormat T: Temperature H: Humidity
define FileLog_Dach.DHT22 FileLog ./log/Dach.DHT22-%Y.log Dach.DHT22
attr FileLog_Dach.DHT22 group DHT
attr FileLog_Dach.DHT22 logtype text
attr FileLog_Dach.DHT22 room Logs
Es gab den Vorschlag ,
anstatt */5 * * * * root /usr/local/sbin/fhem-dht
*/5 * * * * sudo /usr/local/sbin/fhem-dht
in der crontab zu benutzen.
Habe ich aber nicht probiert. Cronjob habe ich über fhem mittels at realisiert. Hat den Vorteil, das ich komfortable die Auslesezeit kurzfristig ändern kann.
Nun zu meinem Problem . Ich will eine dewpoint Berechnung realisieren , die dann entsprechend schaltet. Leider bekomme ich den dewpoint nicht in den filelog oder sonstwo angezeigt. Das habe ich versucht.......
define dew_state dewpoint dewpoint .* T H D
define dew_all dewpoint dewpoint .* temperature humidity dewpoint
Ich befürchte, das ich noch einiges dazu zu lernen habe und hoffe trotzdem auf Hilfe. Wie genau muss ich was definieren, um den Taupunkt (dewpoint ) mit den anderen Werten verarbeiten zu können ? Oder den Taupunkt visualisieren zu können ?
Danke an all , die sich das schon mal durchgelesen haben.
Mfg Tester1
mal so als Tipp
suchen tust du nach diesen readings
Zitattemperature humidity
im dewpoint modul
nach deinem attr stateformat
Zitatattr Dach.DHT22 stateFormat T: Temperature H: Humidity
sind die groß geschrieben , das wird dann nie funktionieren
Hallo
Ich wollte heute mal die Sache mit dem Installations Skrip von hier versuchen http://forum.fhem.de/index.php/topic,25413.msg201619.html#msg201619
allerdings bekomme ich folgende Fehlermeldung
-bash: /usr/local/sbin/fhem-dht: Permission denied
auch wenn ich das ganze mit sudo mache bekomme ich die Fehlermeldung nicht weg.
auch beim dem cronjob klappt es leider nicht.
-bash: /etc/cron.d/fhem-dht: Permission denied
was kann ich denn da machen? stehe total auf dem schlauch.
viel dank schon mal
Das Skrip konnte ich mit sudo su installieren.
jetzt hab ich aber noch immer ein Fehler wenn ich die Datei öffne
root@raspberrypi:/usr/local/sbin# /usr/local/sbin/fhem-dht
File "/usr/local/sbin/fhem-dht", line 22
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
^
IndentationError: expected an indented block
root@raspberrypi:/usr/local/sbin#
hier noch das Skrip
#!/usr/bin/python
import Adafruit_DHT
import socket
### CONFIG ###
# fhem's telnet port
host = 'localhost'
port = 7072
sensors = [
{
'name': 'Wohnzimmer.DHT22',
'type': Adafruit_DHT.DHT22,
'pin': 7
},
]
# retry in case of error
retries = 15
delay = 2
### 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)
wäre schön wenn mir da einer helfen könnte
Hallo,
ich bin neu hier und beschäftige mich erst seit wenigen Wochen mit dem RPi / Fhem usw.
1wire Sensoren konnte ich recht einfach einbinden in FHEM.
Aber an moemoe´s Anleitung bzw. dem DHT22 in FHEM verzweifel ich (wohl hauptsächlich an fehlenden Kenntnissen).Habe einen DHT22 am Pi (GPIO 17) dran. Der Sensor ist okay (via loldht auslesbar im Terminal).
In FHEM bekomme ich jedoch nur Fragezeichen angezeigt.
Habe die python lib gemäß Anleitung installiert (kein Problem).
Per sudo nano /usr/local/sbin/fhem-dht/fhemdht22.py entsprechende Datei erstellt.
Script reinkopiert und Sensor-Pin angepasst (schlimm wenn zwei eingetragen sind nur einer angeschlossen?)
Frage dazu:muss noch etwas angepasst werden im script?
Dann Definitionen 1zu1 in FHEM.cfg kopiert.
Cronjob via crontab -e erstellt und Code reinkopiert-hier gabs ne Fehlermeldung beim Speichern
die sich nur beheben ließ indem ich eine Raute vor EOF gesetzt habe.
Es passiert aber nicht und immer wenn ich denke ich hab irgendwas übersehen, wieder nicht.
Bitte um Schützenhilfe da ich echt nicht mehr weiss woran es hängt.
Gruß bull1t
Hallo,
das Problem mit dem cronjob hatte ich auch. Führe das Scrip mit einem at aus fhem aus.
+*00:06:00 {
system('sudo /usr/local/sbin/fhem-dht&');;
}
Gruß Andreas
Hier noch mal der Inhalt meiner fhem-dht:
#!/usr/bin/python
import Adafruit_DHT
import socket
### CONFIG ###
# fhem's telnet port
host = 'localhost'
port = 7072
sensors = [
{
'name': 'Dachboden_DHT22',
'type': Adafruit_DHT.DHT22,
'pin': 26
},
]
# retry in case of error
retries = 15
delay = 2
## config reference:
# sensors = [
# {
# 'name': 'DHT22',
# 'type': Adafruit_DHT.DHT22,
# 'pin': 26
# },
# {
# 'name': 'DHT11',
# 'type': Adafruit_DHT.DHT11,
# 'pin': 26
# },
# {
# 'name': 'AM2302',
# 'type': Adafruit_DHT.AM2302,
# 'pin': 26
# },
# ]
### 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)
Ich habe die adafruit lib nach folgender Anleitung installiert https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated (https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated).
Vielleicht hilft dir das ja weiter.
Gruss Andreas
Hallo, ich bin schon am verzweifeln.
Ich bekomme es einfach nicht hin.
Welche Pin muss ich bei Gpio18 eingeben?
Danke Klaus
Hallo,
hast du die Libary von Adafruit? Da müsste GPIO und Pin gleich sein.
mfg Andreas
Danke für die Hilfestellung...werde es mal so probieren und Rückmeldung geben!
Gruss bull1t
Danke für die schnelle Antwort.
Dann mache ich etwas anderes falsch.
Also;
sensors = [
{
'name': 'Aussen_DHT22',
'type': Adafruit_DHT.DHT22,
'pin': 18
},
]
at a1+*00:05:00 {system('sudo /usr/local/sbin/fhem-dht&');;}
FileLog_Aussen_DHT22
NAME Aussen_DHT22
NR 302
STATE T: temperature H: humidity
TYPE dummy
Gruß
Klaus
Nachtrag:
cd lol_dht22
sudo ./loldht 1
Humidity = 48.40 % Temperature = 17.70 *C
Später
cd /home/pi/Adafruit_Python_DHT/examples
sudo ./AdafruitDHT.py 22 18
Temp=3.5* Humidity=75.3%
Da kann ich die Daten auslesen.
auf dem ersten Blick sieht's ganz gut aus, nur in dem at, was ist die a1? Gib mal in der Eingabezeile von fhem folgendes ein
{system('sudo /usr/local/sbin/fhem-dht&')}
Hallo,
Ich bekomme -1
ich hatte dies gemeint, alle 5 min abrufen.
define a1 at +*00:05:00 { system('sudo /usr/local/sbin/fhem-dht&');; }
Gruß
Klaus
die Werte wurden nicht eingetragen?
Hast du auch die Rechte für dein script vergeben?
chmod +x /usr/local/sbin/fhem-dht
Hallo,
habe ich auch gemacht, jetzt gerade noch einmal, es kommt immer -1
jedoch nur so sudo chmod +x /usr/local/sbin/fhem-dht
Gruß
Klaus
Wie kann ich die Rechte noch vergeben?
der Rückgabewert -1 ist richtig, aber es müssten dann die Werte für Temperatur und Humidity als reading in deinem Dummy stehen.
Die Rechtevergabe hat geklappt?
Hallo meine at sieht so aus
COMMAND { system('sudo /usr/local/sbin/fhem-dht&')}
DEF +*00:05:00 { system('sudo /usr/local/sbin/fhem-dht&')}
NAME a1
NR 301
NTM 17:26:09
PERIODIC yes
RELATIVE yes
REP -1
STATE Next: 17:26:09
TIMESPEC 00:05:00
TRIGGERTIME 1449937569.58011
TRIGGERTIME_FMT 2015-12-12 17:26:09
TYPE at
Ob das mit den Rechten geklappt hat, Wie kann ich das prüfen?
bei der Fhem-dht steht Owner:Root Group: staff owner; read write group; Read only other: Read only
Gruß
Klaus
deine Rechte passen noch nicht.
Es fehlt das Recht, das Script auszuführen. Es sollte so aussehen:
-rwxr-xr-x 1 root staff 1562 Oct 28 23:38 fhem-dht
Wenn die Rechte korrekt vergeben sind, kannst du das Script auch direkt aus der Konsole ausführen mit
sudo /usr/local/sbin/fhem-dht
Ich habe aber auch nichts anderes.
-rwxr-xr-x 1 root staff 1,6K Dec 12 19:04 fhem-dht
Gruß Klaus
hast du oben aber nicht geschrieben. Was passiert, wenn du den Befehl in der Konsole eingibst?
Habe das Script auch direkt auf der Konsole ausgeführt : sudo /usr/local/sbin/fhem-dht
Aber es ist nichts herausgekommen. nicht einmal eine Fehlermeldung.
das ist gut. Schau mal in deinem Dummy nach, da müssten jetzt die neuen Readings Temperatur und Humidity drin stehen.
Tut mir leid, aber es kommen immer noch keine Daten.
Ich werde noch einmal alles durchgehen.
Danke für die Mühe.
Gruß
Klaus
gibt es das Reading Error in deinem Dummy?
Mehr steht nicht drinn.
NAME Aussen.DHT22
NR 305
STATE T: temperature H: humidity
TYPE dummy
Probably associated with
FileLog_Aussen_DHT22
Gruß
Klaus
Hallo, hast du dein dummy umbenannt? der Name im Script und Dummy müssen gleich heissen. Temperature und Humidity müssen auch gross geschrieben sein.
Mein letzter Versuch, dann weiss ich auch nicht weiter.
mfg Andreas
Hallo
Namen im Script und Dummy sind gleich
Temperature und Humidity habe ich auch schon groß und klein versucht.
Ich danke Dir für deine Ausdauer.
Gruß
Klaus
Rückmeldung von mir:
Bekomme auch jetzt nur 3 Fragezeichen in FHEM angezeigt.
Frustrierend wenn man so fest hängt.
Nachtrag:
Meine 2 DHT's gehen jetzt. Der Fehler war erwartungsgemäß recht simpel wenn man es denn weiß.
FHEM hat schlichtweg die Berechtigung gefehlt das Skript auszuführen.
###in ssh Konsole eingeben zum Öffnen###
visudo
###am Ende der Datei einfügen###
fhem ALL=(ALL) NOPASSWD: ALL
Und speichern....
Die Fragezeichen sind weg & die Werte sind da... Es geht mir runter wie Öl das das endlich klappt.
Danke an alle beteiligten für Anleitungen und Denkanstöße.
Gruss bull1t
Hallo habe grad mal so installiert wie moemoe mit Adafruit_Python_DHT es beschrieben hat, soweit so gut nur sind die werte T: 2662.5 H: 1651.2 irgenwie falsch.. wo kann ich dies ändern lolware gibt mir Humidity = 54.20 % Temperature = 14.70 *C
so hat sich nun erledigt , hab das per loldht hinbekommen...
#!/bin/bash
cd /home/pi/lol_dht22
WERTE=$(sudo ./loldht 0 | grep "Humidity")
Hum=$(echo $WERTE|cut -d " " -f3)
Temp=$(echo $WERTE|cut -d " " -f7)
#echo $WERTE
#echo $HUM
#echo $Temp
/opt/fhem/fhem.pl 7072 "setreading DHTInnen temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading DHTInnen humidity $Hum"
und im fhem.cfg
define telnetPort telnet 7072 global
define DHTInnen dummy
attr DHTInnen room GPIO4
attr DHTInnen stateFormat T: temperature H: humidity
komplette anleitung in #66
Hallo magentouser,
stehe gerade voll auf der Leitung, wo hast du das Skript gespeichert?
Unter /home/pi/lol_dht22, dort sind aber noch einige andere Dateien?
Wo muss ich das nun hineinkopieren, bin nun schon einige Zeit dran
vielen Dank mal für die Hilfe
Peter
ja habe das ganze Verzeichniss dort installiert,
die anderen Dateien sind nur für die Installation notwendig..
also
in deinem Home Verzeichniss (möglichst nicht root)
Dann einen clone von wiringPi ziehen und kompilieren:
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
cd ..
ob wiringPi funktioniert und Pinbelegung sieht man mit
gpio readall
Als beispiel des ergebnisses
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 1 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | OUT | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
dannl lol_dht22, dieses Programm liest den eigentlichen Sensor aus.
git clone https://github.com/technion/lol_dht22
cd lol_dht22
./configure
make
zum testen der sensoren 0 ist der wiringPi port wo die sensoren dranhängen
./loldht 0
kommen nun werte
Raspberry Pi wiringPi DHT22 reader
www.lolware.net
Humidity = 50.80 % Temperature = 16.00 *C
cd ..
nano deinscriptname.sh
den wert DHTInnen könnt ihr benennen wie ihr wolt aber keine lehr oder sonderzeichen und muss auch in der fhem.cfg dann gleich sein
#!/bin/bash
cd /home/pi/lol_dht22
WERTE=$(sudo ./loldht 0 | grep "Humidity")
Hum=$(echo $WERTE|cut -d " " -f3)
Temp=$(echo $WERTE|cut -d " " -f7)
echo $WERTE
echo $Hum
echo $Temp
/opt/fhem/fhem.pl 7072 "setreading DHTInnen temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading DHTInnen humidity $Hum"
hineinkopieren
und speichern..
chmod +x deinscriptname.sh
chomd 777 deinscriptname.sh
und im fhem.cfg folgendes eintragen
define telnetPort telnet 7072 global
define DHTInnen dummy
attr DHTInnen room GPIO4
attr DHTInnen stateFormat T: temperature H: humidity
define FileLog_DHTInnen FileLog ./log/DHTInnen -%Y.log DHTInnen
attr FileLog_DHTInnen logtype logtype temp4:Tempt,text
attr FileLog_DHTInnen room Logfiles
define SVG_DHTInnen SVG FileLog_DHTInnen:SVG_DHTInnen:CURRENT
attr SVG_DHTInnen room Plots
und fhem neu starten
zum Testen
./deinscriptname.sh
nun sollte folgendes erscheinen (Werte können abweichen)
Humidity = 50.50 % Temperature = 14.10 *C
14.10
50.50
wenn alles funktioniert
nano deinscriptname.sh
echo $WERTE
echo $Hum
echo $Temp
in
#echo $WERTE
#echo $Hum
#echo $Temp
ändern und speichern
danach per cron z.b. aller 5 minuten aufrufen
*/5 * * * * root /home/pi/deinscriptname.sh > /dev/null 2>&1 &
Hallo,
habe nun alles so gemacht wie beschrieben, aber leider funktioniert es immer noch nicht.
Ich bekomme zwar die Werte im raspberry, aber ich bekomme die Werte nicht in fhem.
Im raspberry bekomme ich die Werte wenn ich in den Ordner /home/pi/lol_dht22 gehe und dort den Befehl sudo loldht 0 eingebe.
den cron habe ich in /etc/crontab geschrieben:
1 * * * * root /home/pi/feuchtigkeit.sh >/dev/null 2>&1
in fhem.cfg habe ich dann einen Dummy gemacht, wie beschrieben:
define DHTInnen dummy
attr DHTInnen room Ameisen
attr DHTInnen stateFormat T: temperature H: humidity
aber wie gesagt funktioniert es nicht in fhem, bekomme keine Werte
hoffe mal jemand weiß wo der Fehler liegt und kann mir helfen
Danke
Peter
Ändere mal in deiner /home/pi/feuchtigkeit.sh
#echo $WERTE
#echo $Temp
in
echo $WERTE
echo $Temp
als das # davor weg und führe die datei direkt aus also $ ./feuchtigkeit.sh
nun sollten die gleichen werte wie bei loldht 0 erscheinen und auch im fhem Daten da sein.
ich denke mal das root bei dir keine rechte für die Datei hat.. dann mit chmod 777 feuchtigkeit.sh für jeden setzten.
OK, das funktioniert nun mit $ ./Feuchtigkeit.sh da bekomme ich Werte in meinen pi
aber es kommt auch noch eine Meldung:
Use of uninitialized value in numeric gt (>) at /opt/fhem/fhem.pl line 434.
und was ist das jetzt?
Wenn ich in die Datei reinschaue hat das mit Client Mode zu tun
hoffe ihr könnt mir noch immer helfen
füge mal in der datei
unter
echo $Temp
echo $Hum
hinzu
dann nochmal per hand ausführen
ergebniss sollte wie folgt aussehen
Humidity = 49.70 % Temperature = 14.00 *C
14.00
49.70
wenn dort etwas anderes steht (werte selbst können abweichen) als 14.00 und 49.70 z.b. Buchstaben dann könnte es zu problemen kommen
Hallo magentouser
habe es zu der Datei hinzugefügt und es kommt folgendes Ergebnis:
Humidity = 62.80 % Temperature = 23.70 *C
23.70
62.80
Use of uninitialized value in numeric gt (>) at /opt/fhem/fhem.pl line 434.
aber in fhem bekomme ich nur drei Fragezeichen, die Datei habe ich mit
sudo chmod 777 feuchtigkeit.sh
freigegeben.
wo liegt der Fehler? ich weiß einfach nicht mehr weiter
Gruß
Peter
Nachdem ich mich auch an der einbindung eines DHT22 versucht habe, mehrmals mit den Anleitungen weiter vorne erfolglos war und die Adafruit Library auch nicht laufen wollte, habe ich nun mit WiringPi und der Anleitung von Magentouser das ganze ans laufen gebracht.
@Magentouser Vielen dank für eine ausführliche und vor allem einsteigerfreundliche Anleitung! ;D
Bis zu deinem Beitrag war ich mir nie sicher wo ich welche Datei installieren, erstellen oder editieren muss. Ich bin allerdings auch noch blutiger Anfänger in dem ganzen Thema. ::)
Bei der beschriebenen Fehlermeldung kann ich leider nicht helfen, die kam bei mir nicht.
Dafür hat das Skript bei mir die Fehlermeldung ausgespuckt, dass es keine Berechtigung hat die Werte in die fhem.pl zu schreiben.
Dann habe ich mit "chmod" die Berechtigung der fhem.pl geändert, dann wurden die werte auch in Fhem in den Dummy eingetragen und die ?? sind verschwunden.
*edit*
Ich habe das Script bei mir manuell ausgeführt und Echo aktiviert. Bei mir steht in der Ausgabe nach der "Huminity" Zeile nur 1 Zahlenwert (23.70) , bei dir steht dort noch 62.80
Kann das das Problem sein? Wie ist es bei dir Magetouser?
bei mir funktionierts nur im pi, im fhem bekomme ich keine Werte
ist in der fhem.cfg
define telnetPort telnet 7072 global
eingetragen?
@Doublefant
WERTE=$(sudo ./loldht 0 | grep "Humidity")
Hum=$(echo $WERTE|cut -d " " -f3)
Temp=$(echo $WERTE|cut -d " " -f7)
echo $WERTE
echo $Temp
echo $Hum
dann sollten
3 Zeilen mit den werten erscheinen
in der 1. fassung vom 11 Januar 2016 & #66 stand echo $Hum noch nicht drin (ist aber auch nicht notwendig sit nur zur kontrolle ob die werte wie gewünscht erscheinen und kann dann wieder mit # davor versehen werden also
#echo $WERTE
#echo $Temp
#echo $Hum
hab mal beitrag #66 geändert
so nun funktionierts -- fast
bei mir in der fhem cfg war noch
define telnetPort telnet 7072 global
attr telnetPort SSL 1
attr telnetPort password ........
habe das SSL 1 und Password mal gelöscht und schon hatte ich einen Wert.
Nur leider verändert sich der Wert nicht, also muss was am Cronjob nicht stimmen. Habe in der Datei etc/crontab folgendes eingetragen
*/1* * * * root /home/pi/feuchtigkeit.sh >/dev/null 2>&1
habe auch probiert unter crontab -e das selbe eingetragen (worin liegt denn hier der unterschied zwischen den beiden)
aber leider verändert sich der Wert nicht.
Der Wert ändert sich erst dann wenn ich im pi die Datei wieder von Hand ausführe, dann bekomme ich auch aktuelle Werte im fhem
ich denke nach diesem Job brauche ich mal wieder eine Pause, sehe den Wald vor lauter Bäumen nicht mehr
*/1* * * * root /home/pi/feuchtigkeit.sh >/dev
*/1 *
> /dev/null 2>&1 &
Da fehlt was bei dir lehrzeichen und hinter dev..
Hast du den cron auch neu gestartet?
/etc/init.d/cron restart
habe es so eingegeben aber es funktioniert nicht
*/1* * * * root /home/pi/feuchtigkeit.sh > /dev/null 2>&1 &
und auch den cron neu gestartet
Das lehrzeichen nach der 1 fehlt */1 * * * *
ja ja ja, jetzt geht's ich glaub mir geht einer ab
vielen vielen Dank magentouser
Bei mir hat es ebenfalls erst funktioniert, nachdem ich das globalpassword von telnetPort entfernt hatte. Gibt es da keine Möglichkeit das mit globalpassword zu realisieren?
Guten Abend
Ich bin hier neu im Forum und auch neu mit FHEM am werkeln. ::)
Dank der Anleitung von Moritz habe ich das Auslesen eines DHT11 einigermassen auf die Reihe gekriegt, jedoch trägt es immer mal wieder grob fehlerhafte Werte ein. Ein Bild davon ist im Anhang... :-\
Ich bin froh um ein Tipp wie ich das beheben kann, mein bisheriger versuch war die Reduktion von zwei auf einen DHT11, dies hat aber keine sichtliche Verbesserung gebracht. Ansonsten sind per 1-Wire zwei Temperatursensoren am Raspberry, diese funktionieren soweit einwandfrei...
Vielen Dank im Voraus für die bisherige Hilfe (sonst wäre ich gar nicht so weit gekommen) und hoffentlich auch für weitere Hilfe ;)
Liebe Grüsse
Dave
Hey fridamme,
was spuckt dir denn AdafruitDHT aus? Vielleicht bekommt ja fhem auch schon komplett fehlerhafte Werte.
Starte mal aus deinem Installverzeichnis, sollte vermutlich soetwas wie "~/Adafruit_Python_DHT/examples" sein, "AdafruitDHT.py".
Du kannste es starten wenn du ins Verzeichnis gehst und "sudo ./AdafruitDHT.py 11 [den Pin auf den du den Sensor gelegt hast]" eingibst.
Mach das mal ein paar mal und poste die Ergebnisse.
Gruß,
pp
Moin fridamme,
das gleiche Problem mit den falschen Werten hatte ich auch.
Ich habe mein Skripte soweit umgebaut, das es dreimal den DHT22 abfragt und dann den mittleren Wert verwendet. Seit dem ich das so laufen habe, gibt es keine Probleme mehr.
Genauer läuft es so:
Ein Shellscript wird von FHEM aufgerufen und fragt dreimal in folge den DHT22 ab. Das Ergebnis aller drei abfragen wird an ein AWK Skript für Temperatur und eines für Luftfeuchtigkeit übergeben. Das AWK Skript sortiert die Werte nach grösse und liefert den mittleren zurück.
Ich verwende allerdings loldht um den dht abzufragen. (Quelle: https://github.com/technion/lol_dht22).
Anbei die Skripte, falls jemand sie verwenden möchte
Gruß FD
PS: Ich hab das auch mit zwei DHT laufen und es tut was es soll.
Hui seid ihr schnell.
Zitat von: paulpanter am 11 Juli 2016, 08:48:10
was spuckt dir denn AdafruitDHT aus? Vielleicht bekommt ja fhem auch schon komplett fehlerhafte Werte.
Die direkte Abfrage (15 mal nacheinander) ergab folgendes:
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=12.0* Humidity=150.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
pi@raspberrypi:~/Adafruit_Python_DHT/examples $ sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=46.0%
Also auch da ein fehlerhafter Eintrag...
Der Lösungsvorschlag von Feuerdrache klingt spannend. Ich muss mich mal darum kümmern ihn umzusetzen... Ich weiss bisher zwar noch nicht wie man ein Shellscript von FHEM aufrufen kann und was ein AWK Skribt ist... Mal sehen wie weit ich damit komme =)
Aber danke für den Input und für die bereitstellung der Skripte...
Gruss
Fridamme
Huhu,
dann liefere ich gerne noch etwas nach.
Das Skript rufe ich über ein AT alle Minute in FHEM selber auf.
Die Definition des AT sieht bei mir so aus:
define at.read_local_dht22 at +*0:01:00 {system ("/bin/bash /opt/fhem/script/read_dht_22_pi_server.sh &")}
Die Skripte aus dem zip liegen bei mir unter /opt/fhem/script mit den rechten 755.
-rwxr-xr-x 1 fhem dialout 1597 Apr 21 08:37 read_dht_22_pi_server.sh
-rwxr-xr-x 1 fhem dialout 829 Apr 21 17:31 result_humidity.awk
-rwxr-xr-x 1 fhem dialout 1226 Apr 21 17:30 result_temperature.awk
Den DHT liest bei mir das Tool loldht aus. (Wie man das kompiliert etc steht z.B. hier: http://nicht-traeumen-sondern-machen.de/RaspberryPi_Basteleien/Code_TemperaturMessen.php?anker=a3)
loldht liegt bei mir unter /usr/sbin und hat das suid bit gesetzt. Dies ist sicherheitstechnisch zwar nicht so gut, aber notwendig, damit loldht auf die Hardware zugreifen darf
-rwsr-sr-x 1 root root 9261 Apr 1 15:35 /usr/sbin/loldht
Ich hoffe das hilft bei der Implementation weiter.
Gruß FD
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.
...
Grüße
Moritz
Hallo Moritz (und alle anderen natürlich auch ;) ),
das HowTo ist wirklich genial, herzlichen Dank nochmal dafür.
Ich stehe bei Python leider noch ganz am Anfang, hätte da noch ein kleines Anliegen ;D
Wäre es möglich in die fhem-dht noch einen BMP180 mit aufzunehmen? Meinen hatte ich bisher über eine seperate FHEM-Instanz als CloneDummy an den Hauptserver angebunden, dies widerspricht allerdings meinem Verständnis von ressourcenschonenden, kleinen Raspis für die Anwesenheits- und Umwelterfassung in den einzelnden Räumen. Hättest Du da einen Tip für mich?
LG Thorsten
Zitat von: Feuerdrache am 14 Juli 2016, 18:52:41
Huhu,
dann liefere ich gerne noch etwas nach.
Ich hoffe das hilft bei der Implementation weiter.
Gruß FD
Hallo Feuerdrache
Besten Dank für deine Nachlieferung. Nun ist das ganze etwas klarer, leider bin ich nicht fähig dein Skript anzupassen. Bisher habe ich weder herausgefunden wie ich lol_dht22 mit dem DHT11 nutzen kann (es liest zwar Werte aus, diese stimmen jedoch überhaupt nicht), noch bin ich in der Lage dein sh. Skript anzupassen um den Sensor mit der Adafruit Library auszulesen. Bin leider noch blutiger Anfänger...
Naja, da die Dinger nicht so viel kosten habe ich nun DHT22 bestellt und hoffe, das Skript dann zum laufen zu bringen =)
Vielen Dank soweit, mal schauen obs nun klappt...
LG Fridamme
Hi Fridamme,
was für Ausgaben bekommst du denn? Idealerweise mit Aufruf und Ausgabe im Vergleich libarv. Evt ist es ja nur eine Kleinigkeit.
Was für einen Pi nutzt du denn?
Gruß FD
Zitat von: Feuerdrache am 28 August 2016, 21:54:32
was für Ausgaben bekommst du denn? Idealerweise mit Aufruf und Ausgabe im Vergleich libarv. Evt ist es ja nur eine Kleinigkeit.
Ich erhalte folgende Ausgabe:
sudo ./loldht 0
Raspberry Pi wiringPi DHT22 reader
www.lolware.net
Humidity = 1152.00 % Temperature = 588.80 *C
Und ich hoffe doch sehr, dass diese Werte nicht stimmen, sonst wäre das Raumklima im Wohnzimmer eher ungesund...
Zitat von: Feuerdrache am 28 August 2016, 21:54:32
Was für einen Pi nutzt du denn?
Ich nutze den Raspberry Pi 3. Per Adafruit lässt sich der Sensor auslesen:
sudo ./AdafruitDHT.py 11 5
Temp=24.0* Humidity=40.0%
Was meinst du mit Aufruf und Ausgabe im Vergleich libarv? Ich fühle mich gerade wie ein riesen Noob ;-) (OK bin ich ja auch... Aber was nicht ist kann ja noch werden...)
Gruss
Fridamme
Moin,
Brauchst dich nicht wie ein Boot fühlen, hast genau das geliefert, was ich sehen wollte. :-)
Die awk Skripte lassen sich nicht so leicht an die Adafruit Library anpassen wie ich gehofft hatte. Eventuell lässt sich was per regulären Ausdrücken machen. Ich schaue mir das mal an wenn es passt.
Gruß FD
Vielen Dank für deinen Effort... Und wirklich nur wenn es dich reizt - wie gesagt, habe bereits zwei DHT22 bestellt ;-)
Guten Tag,
ich habe soeben mithilfe dieser Ausführlichen Erklärungen und Diskussionen hier meinen DHT22 an meinem Raspberry ans laufen gebracht, Danke dafür!! In FHEM werden nun auch korrekt im Minuten-Takt Temperatur und Luftfeuchtigkeit angezeigt. Nun zum Problem: ich habe FHEM mittels Homebridge mit dem Homekit system von Apple verknüpft und kann so auf meinem iPhone unteranderem Temperatur ablesen, scheinbar hat es jedoch damit Probleme dass, die Werte des DHT22 mit Nachkommastelle angegeben werden. Denn beim DHT22 steht immer 0°C. Mit den Wetter-Daten welche ich von Yahoo in mein FHEM eingebunden hatte Funktioniert es wunderbar und der einzige Unterschied den ich feststellen konnte ist eben dass diese Ganzzahlige Messwerte sind. Da ich definitiv noch ein Laie in diesem Bereich bin hoffe ich dass mir jemand sagen kann wie ich nun die Werte des DHT22 auf Ganzzahlige Werte runden kann... Vielen Dank schonmal und ich bin auf sämtliche Antworten/Lösungsansätze gespannt :)
ZitatPin 1 wird an die 3,3V Versorgungsspannung angeschlossen
Hier gibt es eine Abhandlung darüber (Aussetzer vs. Betriebsspannung):
hier (https://forum.fhem.de/index.php/topic,43672.msg478520/topicseen.html#msg478520) und hier (https://forum.fhem.de/index.php/topic,43672.msg477474.html#msg477474)
ZitatDHT22 VCC über VIN speisen (also +5V)
dann den pull-up analog zu dieser Anleitung realisieren:
http://tansi.info/rp/interfacing5v.html (http://tansi.info/rp/interfacing5v.html)
Kleine Frage am Rande:
in der RC-Switch-Library wurde eine Arduino-Lib in eine auf dem Raspi ausführbare Datei gewrapped.
https://github.com/sui77/rc-switch (https://github.com/sui77/rc-switch)
Wäre das mit der DHT22-Lib auch (leicht) möglich?
Hallo,
ich habe auch einen DHT22 an meinen RasPi angeschlossen. Ich habe im Logfile je Messung nur eine Zeile. Das Logfile "PiSensorKellerBuero-2016.log" sieht also auszugsweise so aus:
Zitat2016-10-08_14:37:03 SensorKellerBuero temperature: 17.0 humidity 64.5
2016-10-08_14:47:04 SensorKellerBuero temperature: 16.9 humidity 64.8
2016-10-08_14:57:04 SensorKellerBuero temperature: 16.9 humidity 65.0
2016-10-08_15:07:04 SensorKellerBuero temperature: 16.9 humidity 64.9
Die Definition in fhem.cfg habe ich wie folgt angelegt:
Zitatdefine SensorKellerBuero dummy
attr SensorKellerBuero room Kellerbuero
attr SensorKellerBuero group Temperatur-Feuchtigkeit
attr SensorKellerBuero stateFormat T:temperature, H:humidity
#
define TempLogfile FileLog ./log/PiSensorKellerBuero-%Y.log SensorKellerBuero
attr TempLogfile logtype temp4:window,text
attr TempLogfile room Kellerbuero
attr TempLogfile group Temperatur-Feuchtigkeit
JEDOCH sieht die Ausgabe in FHEM auf dem Bildschirm so aus:
ZitatSensorKellerBuero T:16.9 humidity 65.1, H:humidity
und damit komme ich nun zu meiner Frage:
Wie kann ich es ungefähr so angezeigt bekommen ?
ZitatSensorKellerBuero Temperatur:16.9°C Feuchtigkeit: 65.1 %
Danke für Hilfe
Gruß Bracew
ggf. könnte das Attribut stateFormat helfen?
Gruß PeMue
OK,...(Kratz am Kopf)...aber wie?
ich hatte eher vermutet, dass es ggf. mit "temp4" zusammenhängt (Ich habe keine Ahnung für was temp4 ist).
Wie müsste ich stateFormat ändern?
attr SensorKellerBuero stateFormat T:temperature, H:humidity
das Komma nach temperature ist falsch
zeig mal ein List von deinem Dummy
list SensorKellerBuero
das mann mal sieht welche readings du dort überhaupt hast
Danke für den Hinweis. Komma habe ich rausgenommen, Anzeige ist aber gleich.
list SensorKellerBuero gibt folgende Ausgabe:
ZitatInternals:
NAME SensorKellerBuero
NR 526
STATE T:17.1 humidity 64.5, H:humidity
TYPE dummy
Readings:
2016-10-08 15:41:34 temperature 17.1 humidity 64.5
Attributes:
group Temperatur-Feuchtigkeit
room Kellerbuero
stateFormat T:temperature H:humidity
Zitat von: Bracew am 08 Oktober 2016, 15:39:02
... ich hatte eher vermutet, dass es ggf. mit "temp4" zusammenhängt (Ich habe keine Ahnung für was temp4 ist).
das könnte die gplot Datei sein, die aus dem Log die 4. Spalte zum Plotten nimmt. Wie kommen bei Dir die einzelnen Readings? Wenn diese nicht korrekt vorhanden sind, hast Du mit stateFormat auch schlechte Karten ;)
Gruß PeMue
Zitat2016-10-08 15:41:34 temperature 17.1 humidity 64.5
du hast nur das eine Reading temperature und kein Reading humidity :)
deswegen tut deine Version nicht
wie wird denn bei dir der Dummy gefüllt?
Die gplot Datei ist eine von mir abgewandelte "temp4hum4.gplot" mit Namen "WeBeTempHum.gplot". Das Plotten funktioniert auch ganz OK.
Die Definition in fhem.cfg für das Plotten sieht bei mir so aus:
define SVG_SensorKellerBuero SVG TempLogfile:WeBeTempHum:CURRENT
attr SVG_SensorKellerBuero label " Temperatur (°C)"::"Feuchtigkeit relativ (%)"::"Temperatur (Rot) Max.=$data{max1}°C, Min.=$data{min1}°C, Letzte=$data{currval1}°C"
attr SVG_SensorKellerBuero room Kellerbuero
attr SVG_SensorKellerBuero group Temperatur-Feuchtigkeit
Ich habe noch eine bash-Datei, welche alle 10 Minuten von einem Cron-Job aufgerufen wird:
#!/bin/bash
sudo killall -q loldht > /dev/null 2>&1
cd /opt/lol_dht22
WERTE=$(sudo /opt/lol_dht22/loldht 7 | grep "Humidity")
Hum=$(echo $WERTE|cut -d " " -f3)
Temp=$(echo $WERTE|cut -d " " -f7)
echo $WERTE
echo $HUM
echo $Temp
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero temperature $Temp humidity $Hum"
Das mit den "Readings" habe ich noch nie verstanden. Entschuldigung.
Deshalb weiß ich auch nicht, wie ich die Frage:
ZitatWie kommen bei Dir die einzelnen Readings?
beantworten soll?
bzw. auf
Zitatdu hast nur das eine Reading temperature und kein Reading humidity
reagieren muss?
Plot sieht übrigens wie angefügte Datei aus.
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero temperature $Temp humidity $Hum"
hier erzeugst du das eine Reading "temperature"
auf die schnelle geht bestimmt auch
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero humidity $Hum"
dann hättest zwei getrennte Readings, aber deine LOGdatei ändert sich dadurch auch
Danke, aber ich möchte gerne nur eine Zeile pro Log-Datei Eintrag haben.
Liegt es vielleicht am fehlenden Doppelpunkt in der Log Datei nach humidity ?
... ist doch kein Problem. Du machst
- ein reading temperature
- ein reading humidity.
Damit hast Du beide Einzelwerte und kannst damit Dein state sauber definieren.
Dann machst Du noch ein reading:
- T: xx H: yy
auf das Du dann mit Deinem FileLog triggerst.
Sprich es müsste dann so heißen:
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero humidity $Hum"
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero T: $Temp H: $Hum"
Oder Du nimmst nur die beiden ersten Readings, definierst Dir ein sauberes state und loggst nur den state. Ginge auch ;)
Gruß PeMue
ZitatDanke, aber ich möchte gerne nur eine Zeile pro Log-Datei Eintrag haben.
da versperrst die Standard Attribute, wie du siehst auch das dewpoint modul, auch einfaches rechnen mit deiner Variante ist "unlustig"
zumal man mit attr userReadings sich auch diesen Logdatensatz wie du ihn haben willst , neu erzeugen kann
hast doch alle Möglichkeiten offen
Ok, ausprobiert. Danke für die tolle Hilfe.
Wenn ich das Log-File auf Zweizeilig umstelle bekomme ich nun die Anzeige
ZitatSensorKellerBuero T:17.0 H:65.0
also prima, alles OK,
aber den Plot musste ich wieder auf temp4hum4.gplot zurückstellen, damit er auch wieder funktioniert.
Ich muss nun erstmal mit meiner Frau einkaufen gehen.
Wäre es zuviel verlangt nachzufragen, wie ich das
a) in "SensorKellerBuero Temperatur:17.0°C Feuchtigkeit: 65.0 %" angezeigt bekommen?
b) und wie das mit dem Taupunkt (dewpoint modul) funktioniert?
Vielen Dank von Bracew
Zitat von: Bracew am 08 Oktober 2016, 16:54:54
Wäre es zuviel verlangt nachzufragen, wie ich das
a) in "SensorKellerBuero Temperatur:17.0°C Feuchtigkeit: 65.0 %" angezeigt bekommen?
Nein, keineswegs. Aber mit ein bisschen Nachdenken, kämest Du auf mindestens auf die erste Lösung selbst ;)
1.
/opt/fhem/fhem.pl 7072 "setreading SensorKellerBuero Temperatur: $Temp Feuchtigkeit: $Hum"
in Deinem Skript und entsprechend Dein FileLog anpassen. Ich mag das nicht, da dadurch sinnlos das Log-File vergrößert wird.
2. mit userReadings oder mit stateFormat erzeugen.
Gruß PeMue
Hallo PeMue,
zu 1.)
eben, ich mag das auch nicht, dass das Log-File sinnlos vergrößert wird, deswegen wollte ich ja ursprünglich alle Messwerte eines Zeitpunktes jeweils in eine Zeile packen. Aber Ihr habt mich ja schon auf zweizeilig überredet.
Nun packst Du aber wieder alles in eine Zeile! und im Log steht doch schon "temperature:" bzw. "humidity:" aber angezeigt wird "T:" und "H:"?
Ich dachte halt, man könnte zu den gelesenen Werten für Temperatur und Feuchtigkeit einen "beliebigen" Text hinzufügen ohne dies in die Logdatei zu schreiben. Also gut, dann bleibt es eben bei der Kurzform "SensorKellerBuero T:17.0 H:65.0". Nicht schön, aber wenigstens korrekt.
zu 2.)
Wie schon mal erwähnt, stehe ich mit den neuen Begriffen auf Kriegsfuß. Ich habe halt damals zu meiner Zeit in Fortran77 noch mit Variablen, Konstanten, etc. mal gelernt und nicht userReadings oder stateFormat.
Ich möchte Deine Zeit nicht überbeanspruchen, aber kannst Du mir etwas mehr "Butter bei die Fische" geben?
Gruß Bracew
P.S. Im Moment, nachdem die Log-Datei neu erstellt wurde (nur wenig Messwerte), sieht die Ausgabe so aus:
ok, ich probier's mal (aber vermutlich bin ich auch nicht der beste Experte):
Jedes fhem Modul hat standardmäßig einen state bzw. dann beliebige (je nach Notwendigkeit generierte) Readings. Übersetzt heißt das, das jedes Modul eine Variable Status hat (die immer da ist, aber durchaus unterschiedlichen Inhalt haben kann) und beliebige andere Variablen.
Mit dem Attribut stateFormat kann man das Aussehen der Variable state anpassen. D.h. man könnte beispielsweise an eine Temperatur ein ° C anhängen. So weit ich weiß (da fehlt aber mein Expertentum) kann man keine zusätzlichen Readings einfügen.
Aus den anderen Readings kann man sich mit userReadings eigene Readings generieren (so wie z.B. aus der relativen Feuchtigkeit und der Temperatur den Taupunkt errechnen und diesen als neues Reading einfügen).
Bei Dir ist die Sache etwas einfacher: Du hast in fhem einen Dummy, in dem Du im Prinzip machen kannst, was Du willst.
Sprich: Wie die Readings aussehen bzw. wie Dein state aussehen soll, kannst Du über dein Skript entscheiden. Und: auch wenn die Readings vorhanden sind, heißt das noch lange nicht, dass diese in Deinem FileLog gespeichert werden.
Aus diesem Grund war ja mein Vorschlag, folgende Readings zu generieren:
- temperature
- humiditiy und die Kombination für das FileLog
- T: xx H: yy
Dann bist Du völlig frei, wie Du dann state bzw. Dein FileLog generierst.
Und: ggf. in der commandref (http://fhem.de/commandref) nachschauen (es gibt leider keinen Direktlink, aber nach stateFormat bzw. UserReadings suchen).
Ich hoffe, das macht die Sache etwas transparenter.
Gruß PeMue
Ok, Danke.
Mit Hilfe von Google bin ich auf:
https://forum.fhem.de/index.php/topic,24473.msg175912.html#msg175912
gestoßen.
Aufgrunddessen habe ich das stateFormat umgebaut zu:
attr SensorKellerBuero stateFormat Temperatur: temperature °C <br> Feuchtigkeit: humidity %
und sogar eine zweizeilige, formatierte Ausgabe hinbekommen, siehe Bild nachfolgend.
Jetzt fehlt mir nur noch der Taupunkt. Nach http://www.fhemwiki.de/wiki/Dewpoint sollte man ja einfach:
define dew_state dewpoint dewpoint .* T H D
einfügen. Aber in meinem FHEM tut sich nichts, wenn dies in fhem.cfg steht.
Bin etwas überrascht vom Wiki, ich hatte damals ein userReading gefunden und das bei mir eingebaut.
Hier habe ich mal eines meiner userReadings:
attr HM_Bad_WT_Weather userReadings dewpoint { my $dp;; my $temperature = ReadingsVal($name,"temperature",0);; my $humidity = ReadingsVal($name,"humidity",0);; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;;}
Ggf. musst Du das noch anpassen (temperature bzw. humidity).
Gruß PeMue
Hallo zusammen,
Lese hier gerade etwas flüchtig mit, und hoffe ich kann mich etwas einbringen.
Ich habe mein attr stateFormat . mit folgenden Werten gefüllt: Temperatur: temperature °C Luftfeuchte: humidity %
, wobei es bei dir meine ich Temperatur: T °C Luftfeuchte: H %
sein müsste.
LG Thorsten
Wow, danke PeMue,
etwas umgebaut zu:
define SensorKellerBuero dummy
attr SensorKellerBuero room Kellerbuero
attr SensorKellerBuero group Temperatur-Feuchtigkeit
attr SensorKellerBuero userReadings dewpoint { my $dp;; my $temperature = ReadingsVal($name,"temperature",0);; my $humidity = ReadingsVal($name,"humidity",0);; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;;}
attr SensorKellerBuero stateFormat Temperatur: temperature °C <br> Feuchtigkeit: humidity %<br> Taupunkt: dewpoint°C
wird jetzt auch der Taupunkt als 3. Zeile angezeigt, ich habe ihn mal Orange umrandet im nachfolgenden Bild.
Gibt es jetzt noch einen Trick die meisten Nachkommastellen abzuschneiden oder zu runden (eine Nachkommastelle würde mir reichen)?
Ja, in Dein stateFormat ein sprintf einbauen, das habe ich im Forum gefunden:
attr Counter stateFormat {sprintf("%.1f",ReadingsVal("Counter","consumption",0))." W"}
Dein letzter Term müsste dann in etwa so aussehen:
Taupunkt: {sprintf("%.1f",ReadingsVal("SenSorKellerBuero","dewpoint",0))."° C"}
Gruß PeMue
Nein, hat nicht funktioniert.
Aber dieses hier:
attr SensorKellerBuero userReadings dewpoint_gerundet { int ( 10 * ReadingsVal("SensorKellerBuero","dewpoint",0) + 0.5 ) / 10 }
also, aus dem ungerundeten "dewpoint" ein gerundetes "dewpoint1" oder wie ich es getauft habe "dewpoint_gerundet" machen und dies weiterverwenden.
Also, hier nochmals als ganzes:
define SensorKellerBuero dummy
attr SensorKellerBuero room Kellerbuero
attr SensorKellerBuero group Temperatur-Feuchtigkeit
attr SensorKellerBuero userReadings dewpoint { my $dp;; my $temperature = ReadingsVal($name,"temperature",0);; my $humidity = ReadingsVal($name,"humidity",0);; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;;}
attr SensorKellerBuero userReadings dewpoint_gerundet { int ( 10 * ReadingsVal("SensorKellerBuero","dewpoint",0) + 0.5 ) / 10 }
attr SensorKellerBuero stateFormat <span style="color:red">Temperatur: temperature °C </span><br><span style="color:green"> Feuchtigkeit: humidity %</span><br> Taupunkt: dewpoint_gerundet °C
und nun auch noch mit FARBiger Beschriftung (html-Code für rotes "Temperatur: 17.0 °C" bzw. grünes "Feuchtigkeit: 65.5 %"), siehe Bild.
Ich danke sehr herzlich für die Hilfe
Ein schönes Wochenende wünscht
Bracew
Hi nochmals,
leider habe ich nun im Logfile:
Zitat2016-10-08_20:57:04 SensorKellerBuero temperature: 17.0
2016-10-08_20:57:04 SensorKellerBuero dewpoint_gerundet: 10.5
2016-10-08_20:57:05 SensorKellerBuero humidity: 65.7
2016-10-08_20:57:05 SensorKellerBuero dewpoint_gerundet: 10.5
2016-10-08_21:01:00 SensorKellerBuero temperature: 16.9
2016-10-08_21:01:00 SensorKellerBuero dewpoint_gerundet: 10.5
2016-10-08_21:01:01 SensorKellerBuero humidity: 65.7
2016-10-08_21:01:01 SensorKellerBuero dewpoint_gerundet: 10.5
Zu jeder Messung werden nun 2 Zeilen für dewpoint_gerundet geschrieben.
Also, jetzt habe ich zwar eine "schöne" Anzeige, aber viele Bytes im Logfile.
Hmmm, mal überlegen was ich lieber will...
define dew_all dewpoint dewpoint .* temperature humidity dewpoint
attr dew_all absFeuchte 1
Das ist das Modul dewpoint,
das wäre mein Vorschlag gewesen, :)
da bekommt man noch absolute Feuchte gratis zusätzlich zum Reading dewpoint
bist ja noch am probieren/testen
Hallo,
ja, ich bin ja noch am probieren/testen.
Habs nun nochmal geändert und hoffentlich verbessert, nicht verschlimmbessert.
Deshalb hier nochmals der komplette Werdegang für alle Mitleser.
Definition in fhem.cfg:
# #################################################################
# Temperaturmesung
# #################################################################
define telnetPort telnet 7072 global
attr telnetPort room hidden
#
define dew_all dewpoint dewpoint .* temperature humidity dewpoint
attr dew_all absFeuchte 1
attr dew_all room hidden
#
define SensorKellerBuero dummy
attr SensorKellerBuero room Kellerbuero
attr SensorKellerBuero group Temperatur-Feuchtigkeit
attr SensorKellerBuero stateFormat <span style="color:red">Temperatur: temperature °C </span><br><span style="color:green"> Feuchtigkeit: humidity %</span><br> Taupunkt: dewpoint °C<br><span style="color:blue">Abs. Feuchte: absFeuchte g/m3</span>
#
define TempLogfile FileLog ./log/PiSensorKellerBuero-%Y.log SensorKellerBuero
attr TempLogfile logtype temp4:window,text
attr TempLogfile room Kellerbuero
attr TempLogfile group Temperatur-Feuchtigkeit
#
define SVG_SensorKellerBuero SVG TempLogfile:WeBetemp4hum4:CURRENT
attr SVG_SensorKellerBuero label "Temp. Max.=$data{max1}°C, Min.=$data{min1}°C, Letzte=$data{currval1}°C | Feuchtigk. Max.=$data{max2}%, Min.=$data{min2}%, Letzte=$data{currval2}%"
attr SVG_SensorKellerBuero room Kellerbuero
attr SVG_SensorKellerBuero group Temperatur-Feuchtigkeit
#
Bash-Datei, welche die Messdaten vom DHT22/AM2302 Temperatur und Luftfeuchtigkeit Sensor nach FHEM gibt und vom Cron-Job (bei mir) alle 10-Minuten ausgeführt wird:
#!/bin/bash
sudo killall -q loldht > /dev/null 2>&1
cd /opt/lol_dht22
WERTE=$(sudo /opt/lol_dht22/loldht 7 | grep "Humidity")
Hum=$(echo $WERTE|cut -d " " -f3)
Temp=$(echo $WERTE|cut -d " " -f7)
echo $WERTE
echo $HUM
echo $Temp
/opt/fhem/fhem.pl 7072 "setreading SensorAussen temperature $Temp"
/opt/fhem/fhem.pl 7072 "setreading SensorAussen humidity $Hum"
Auszug aus der Log-Datei /opt/fhem/log/PiSensorKellerBuero-2016.log:
2016-10-09_00:57:03 SensorKellerBuero temperature: 17.0
2016-10-09_00:57:04 SensorKellerBuero humidity: 65.8
2016-10-09_00:57:04 SensorKellerBuero absFeuchte: 9.5
2016-10-09_00:57:04 SensorKellerBuero dewpoint: 10.6
2016-10-09_01:07:03 SensorKellerBuero temperature: 16.9
2016-10-09_01:07:04 SensorKellerBuero humidity: 65.8
2016-10-09_01:07:04 SensorKellerBuero absFeuchte: 9.5
2016-10-09_01:07:04 SensorKellerBuero dewpoint: 10.5
dort hinein wird auch der Taupunkt und die absolute Feuchte geschrieben.
Und zum Schluß unten im Anhang (ich habe keine Ahnung wie ich das Bild hier in den Text hineinbekomme) noch wie das ganze nun auf dem Bildschirm bei mir erscheint.
Ich danke allen ganz herzlich.
Gute Nacht wünscht
Bracew
P.S. Ach ja, falls noch jemand mir helfen kann, wie ich unter das erste Diagramm noch ein zweites mit Taupunkt und Abs.Feuchte bekomme, würde ich mich freuen.
Einfach eine zweite SVG Definition mi einer angepassten gplot Datei.
Gruß PeMue
Ok, danke
aber....welchen gplot File kann ich denn dafür nehmen?
Gibt es irgendwo eine Internet-Site auf der ich die mal mit Beispieldaten sehen und mir einen aussuchen kann?
Zitat von: Bracew am 09 Oktober 2016, 11:12:08
Ok, danke
aber....welchen gplot File kann ich denn dafür nehmen?
Entweder Du nimmst Dein
WeBetemp4hum4 benennst es um und ersetzt die Daten, die aus dem Log geholt werden, oder Du nimmst den grafischen Editor (https://waschto.eu/logfileplot) (CopyPlotfile und dann bearbeiten). Du brauchst dann in fhem.cfg noch eine zweite SVG Definition ...
Gruß Peter
Ok, got it! Vielen Dank.
Ich habe WeBetemp4hum4.gplot dupliziert und umbenannt und eine zweite SVG Definition gemacht.
Sieht gut aus, oder?
Hallo,
ich konnte schon vor einigen Wochen mit Hilfe dieses Threads meinen DHT22 am RPi zum Laufen bringen. Ich habe das allerding nur mit
define telnetPort telnet 7072 global
define allowed_telnetPort allowed
hinbekommen. Aus Sicherheitsgründen wollte ich den telnetPort aber eigentlich absichern, nur klappt es dann nicht mehr. Habt Ihr dazu eine Idee?
Hallo,
ich habe die ganzen Post gelesen und mich Schritt für Schritt durchgearbeitet.
Ich bekomme im PI die Werte vom DHT22 angezeigt.
Jedoch steht in FHEM nur 3 ?.
Könnt ihr mir weiterhelfen?
Wie muss ich die cron anlegen damit diese mein Skript aufruft?
Ist /etc/crontab oder ist es /etc/corntab -e? wo ich den Aufruf einbinden muss?
*/1 * * * * root /home/pi/feuchtigkeit.sh > /dev/null 2>&1 &
Ich denke, das momentan das Script einfach noch nicht aufgerufen wird.
In der FHEM.cfg ist der telnetPort telnet 7072 definiert und ich habe FHEM auch alle Rechte gegeben
fhem ALL=(ALL) NOPASSWD: ALL
Hoffe ihr könnt mir helfen.
Danke & Gruß,
Hardtacker
Hallo hardtacker,
da mir die cron-Erstellung aus der Shell auswendig auch nicht immer ganz geläufig ist, benutze ich meistens Webmin (https://de.wikipedia.org/wiki/Webmin (https://de.wikipedia.org/wiki/Webmin)) dazu, siehe mein Screen-Shot in der Anlage.
Mit lieben Grüßen
Bracew
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
Guten Abend allerseits,
bin hier im Forum schon einige Zeit am mitlesen und habe dadurch auch schon einige Probleme lösen können, dafür schon mal ein großes Dankeschön.
Bin im Moment dabei einen DHT11 in FHEM einzubinden und stelle mich dabei wohl etwas blöd an. Ich kann die Werte übers Terminal problemlos auslesen aber beim eingliedern in FHEM habe ich große Probleme.
Ich verstehe nicht ganz wo/wie ich dieses Script erstellen muss und wie FHEM dann darauf zugreifen kann.
Auch das mit dem Cron-Job ist mir nicht ganz klar. Das ist ja auch wieder ein Script oder ? Wenn ja, wo muss dieses dann hin und wie genau erstelle ich es ?
Vielen Dank im Voraus
Hallo Mik-Black,
Ich hoffe ich kann da etwas Licht ins Dunkel bringen:
FHEM greift bei diesem Script nicht darauf zu sondern erhält die ausgelesenen Daten auf dem Telnet-Port. Damit dies funktioniert muss das Script die Daten fehlerfrei aus dem DHT Auslesen uns per Telnet an das FHEM übergeben können. Ist der DHT und fhem auf dem selben Raspi nimmt man die IP 127.0.0.1 (localhost), was aber etwas sinnfrei wäre, denn dann könnte FHEM ja besser direkt auf den DHT zugreifen.
Der Crontab ist dazu da das Script in regelmäßigen Abständen aufzurufen, zu vergleichen mit der Aufgabenplanung unter Windows.
Liebe Grüße
Thorsten
Okay, also ist das nicht die eleganteste Lösung für meinen Fall ? Bei mir laufen FHEM und DHT auf dem selben RPI. Wie würdest du die ganze Sache dann angehen ?
Vielen Dank schon mal für die Infos
Mik-black
DIE eleganteste Lösung gibt es nicht, es hängt immer davon ab was noch auf deinem RasPi läuft. ;)
Ein anderer Lösungsweg wäre zB.
https://waschto.eu/mysensors-luftfeuchtigkeitssensor
oder
http://www.ethersex.de/index.php/Nutzung_in_FHEM_(Deutsch)#DHT22_Temperatur-.2FFeuchtesensoren
Die Netzlast bei diesem Script ist allerdings verschwindend gering, ich habe auf dem RasPi im Wohnzimmer ein Ambilight, Bluetooth-Anwesenheitserkennung und den DHT22 laufen. Ein BMP180 soll noch mal folgen, hier komme ich allerdings zur Zeit nicht dazu das Script oben entsprechend anzupassen. Zu viele Hobbies und Projekte ;)
Thorsten
Der RPI wird noch für die restliche Hausautomatisierung genutzt. Eine CUL ist verbunden sowie ein 433MHZ Modul. Mit der CUL werden ein Wandthermostat und 3 Heizkörperthermostate von MAX! angesteuert. Der 433 Sender steuert einige günstige Steckdosen-Zwischenstecker.
Beim RPI handelt es sich um einen RPI 2.
Willst du denn bei dem einen DHT bleiben?
Aus persönlicher Erfahrung weiß ich, dass man sehr schnell alle Räume erfassen und auswerten und vielleicht für andere Komponenten wie der Heizung weiter verwenden möchte. Und da ist das Script oben ideal für finde ich, da es Ressourcenschonend direkt im Linux läuft, man könnte beispielsweise auch einen eigenen FHEM installieren, diesen dann per FHEM2FHEM verbinden und einen CloneDummy einrichten, aber der würde wieder Logs produzieren, was die SD wiederum unnötig belasten würde (Stichwort Haltbarkeit).
Was genau ist dir an diesem Script unklar? :)
LG Thorsten
P.S.: hier nochmal ein Link zu einem Beitrag von Justme1968, warum sich das anbinden direkt über GPIO etwas schwierig gestaltet
https://forum.fhem.de/index.php?topic=22546.msg192383#msg192383
Der ist nun schon ein paar Tage alt, ob sich da mittlerweile was getan hat kann ich so spontan auch nicht sagen, hier gilt es das Forum zu durchforsten ;)
Ja, es wird definitiv bei diesem einen DHT bleiben und den verwende ich auch nur aus Kostengründen und weil er eben vorhanden ist.
Eine 2.FHEM kann ich mir im Moment einfach nicht leisten.
Das Problem mit der SD ist nicht vorhanden da ich mit einer HDD/SSD arbeite.
Mir ist bei den ganzen Skripten nur unklar wo diese denn hin müssen und wie ich sie erstelle. Arbeite von Windows aus via SSH Terminal.
Muss ich die Skripte vom PC aus erstellen mit einem Editor und dann an den RPI senden oder direkt auf dem RPI erstellen und wenn ja dann wo ablegen? :-[
Danke nochmals für deine Bemühungen auch wenn ich mich etwas blöd anstelle.
Kein Problem, wir haben alle mal klein angefangen;)
Also: erstmal muss natürlich der DHT vernünftig angeschlossen und ausgelesen werden. Wenn das funktioniert geht es daran die entsprechenden Scripte zu schreiben. In diesem Fall sagt dir die crontab, wo das Script liegt. Hier ist es /usr/local/sbin/fhem-dht.
Erstellt wird es einfach mit sudo nano /usr/local/sbin/fhem-dht .
Hier wird dann das Script bis EOF rein kopiert. Mit dem letzten Befehl (sudo chmod...) wird das Script dann ausführbar gemacht. Wichtig ist nur es deinen Bedürfnissen anzupassen (DHT-Typ, IP des FHEM u. Port, falls geändert etc.)
Dann wird im FHEM ein dummy angelegt, hier ist auf den Namen zu achten, er muss genauso lauten wie im Script.
Wenn du nun mit cd /usr/local/sbin in das Verzeichnis wechselst und sudo ./fhem-dht eingibst sollte dein dummy im FHEM mit Readings befüllt werden. Wenn das alles funktioniert kannst du im crontab die regelmäßige "Aufgabenplanung" einbauen, in der das Script wie in diesem Fall alle 5 min ausgeführt wird und somit regelmäßig die Daten an FHEM sendet. :)
Natürlich kann das Script auch nahezu überall liegen, da ich den DHT erst mit diesem Tutorial
https://tutorials-raspberrypi.de/raspberry-pi-luftfeuchtigkeit-temperatur-messen-dht11-dht22/
Getestet habe und ich im Home-Verzeichnis war hatte ich das Script auch hier abgelegt . Das wäre dann wenn du mit dem Standard-User Pi arbeitest /home/pi/fhem-dht. Hier muss dann das crontab entsprechend angepasst werden.
Okay, das mit dem Skript und dem befüllen des Dummy in FHEM habe ich soweit verstanden. Nur der Teil mit dem Crontab ist noch nicht ganz klar, du schreibst das ich "im Crontab die regelmäßige Aufgabenplanung einbauen" kann. Wo ist denn der Crontab oder was ist der Crontab ? Wenn du mir das noch erklären könntest wäre ich soweit auf eigenen Beinen weiter zu machen ;-)
Danke für deine Geduld
Kein Problem. :)
Mit sudo crontab -e rufst du die Verwaltung für den User Root auf, hier kannst du "root " in der Zeile weg lassen (das gesamte cron wird ja schon als Root ausgeführt ).
Die Zeilen oben sind für die Bearbeitung von /etc/crontab (nano /etc/crontab) konzipiert.
Das cron , wie es funktioniert und vor allem was man dort alles einstellen kannst findest du unter
https://wiki.ubuntuusers.de/Cron/
Viel Erfolg ;)
Nochmals hallo,
habe jetzt das Skript erstellt und an meine Gegebenheiten angepasst. Habe es danach mit dem chmod ausführbar gemnacht, den DHT11 in FHEM definiert und im Cron die betreffende Zeile ergänzt um die abfrage alle 5 Minuten zu haben. Aber leider wird mir in FHEM nur:
Innen.DHT11 T: Temperature H: Humidity
angezeigt.
Vielleicht eine Idee woran das liegen könnte ?
Im ersten Moment würde ich auf Schreibweise tippen. Poste doch bitte mal dein Script und die Info deines Dummies (list <name >).
Guten Abend,
hier mal das FHEM-DHT script:
Zitat#!/usr/bin/python
import Adafruit_DHT import socket
### CONFIG ###
# fhem's telnet port
host = 'localhost' port = 7072 sensors = [ { 'name': 'Innen.DHT11',
'type': Adafruit_DHT.DHT11, 'pin': 17
},
]
# retry in case of error
retries = 15 delay = 3
### 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)
Und das hier spuckt FHEM bei list Innen.DHT11 aus:
Internals:
NAME Innen.DHT11
NR 18
STATE T: Temperature H: Humidity
TYPE dummy
Attributes:
stateFormat T: Temperature H: Humidity
Hallo,
Setz das stateFormat mal bitte auf T: temperature H: humidity (kleingeschrieben) dann sollte es funktionieren
Nur das stateFormat oder auch das STATE ?
Das stateFormat gibt an, wie das State auszusehen hat. Das befüllt sich also automatisch
also nur das attr stateFormat ändern
Hat leider nicht zum Erfolg geführt.
Könnte es daran liegen dass ich nicht Wheezy sondern Jessie als Betriebssystem nutze ?
Wird der dummy denn mit Werten befüllt?
Wenn nicht was sagt das Script von adafruit? Werden die Daten korrekt aus dem DHT ausgelesen und auf deiner console ausgegeben?
Und dein Script sieht irgendwie komisch aus. Irgendwie passen die ganzen Einrückungen nicht. Wie hast du es erstellt bzw. ausgelesen und hier eingefügt?
Wenn ich den DHT direkt aus dem Terminal anspreche gibt er die richtigen Werte aus. Im Dummy steht nicht wirklich was drin also gehe ich davon aus dass er nicht befüllt wird. Habe das Script einfach kopiert und hier eingefügt. Habe das Script nur übernommen und an meine Gegebenheiten angepasst. Was genau das Adafruit Script macht weiß ich nicht wirklich, da ich das Script ja nur übernommen habe :-\
Welche Einstellungen hast du genau angepasst? Bekommst du eine Fehlermeldung wenn du dein Script manuell aufrufst?
Servus, habe das gesamte System nochmal neu aufgesetzt, beim manuellen ausführen bekomme ich folgende Fehlermeldung:
File "./fhem-dht", line 21
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
^
IndentationError: expected an indented block
Das ist ein Einrückungsfehler, Python nimmt es sehr übel wenn man sich da nicht genau an die Vorgaben hält. Vor allem wenn man unter Windows mit einem nicht-Unix-kompatiblen Editor arbeitet.
Ich verwende hier gerne Proton, es gibt allerdings bestimmt für solche Fälle geeignetere Editoren, die diese Einrückungen auch mit anzeigen würden.
Wenn das Script nicht exakt wie im Beispiel (abgesehen von deinen Anpassungen) aussieht, wird es nicht klappen.
Hier ist es vielleicht auch hilfreich wenn man nicht benötigte Zeilen nur auskommentiert anstatt sie zu löschen. Schnell ist hier mal ein Space zu viel gelöscht und die Einrückungen passen nicht mehr.
Das ganze wird hier:
http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2011/02/Typische-Fehler-in-Python-Code-vermeiden
und hier
http://www.python-kurs.eu/python3_bloecke.php
schön erklärt.
Schick doch bitte mal ein Screenshot von deinem Code im Editor, wie du ihn bearbeitest...
LG
Thorsten
Hi,
die Anleitung hat mir super geholfen meinen DHT22 Sensor in FHEM zu integrieren. Danke dafür! :)
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?
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.
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?
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.
Danke für die Hilfe und das gute Zureden :)
Habe es wie aus dem Wiki kopiert und das Script von Seite 1 (https://forum.fhem.de/index.php/topic,25413.msg201619.html#msg201619) funktioniert noch immer. Super :)
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
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?
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?
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
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 :)
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
Dein Skript heisst fhemdht22.py und nicht fhem-dht. Das ist nur das Verzeichnis.
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
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 (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/ (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
In dem was in config.txt stehen soll sind zwei Fehler. Es müsste dtoverlay und dtdebug sein und nicht dtoverly und dtbebug.
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! :)
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
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.
#!/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...
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
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
sudo visudo
Und dort diese Zeile einfügen:
fhem ALL=(ALL) NOPASSWD: /path/to/script/fhem-dht
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
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.
Der erste Aufruf ist mit sudo erfolgt, der zweite nicht. Das chmod +x musst du auch mit sudo machen, sonst wird das nichts.
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!
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.
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?
Habe den Grund schon selbst gefunden. Es gibt kein overlay dht22. Man muss das dht11 nehmen.
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?
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.
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.
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:::
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 (https://forum.fhem.de/index.php/topic,25413.msg855374.html#msg855374)
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.
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.
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.
Ich habe jetzt nach der Anleitung https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup (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?
Sehr komisch. Benennt die Datei mal in simpletest.py um und probier es damit.
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
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.
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"
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!
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
Crontab funktioniert nur bis runter zu einer Minute. Das ist aber auch mehr als ausreichend. Man braucht keine Temperatur in Echtzeit...
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?
ZitatIch möchte den DHT22 Sensor ohne das python script einbinden und habe deshalb die Lösung von arthoffhem (Beitrag 162) implementiert.
damit wäre dann ja meine obige Frage beantwortet. :D
Hier noch der Link zu
Zitat von: https://forum.fhem.de/index.php/topic,25413.msg850276.html#msg850276Beitrag 162
Grüße Markus
Hallo Markus,
es funktioniert ja prinzipiell jedoch jeder 2. Wert ist 0 und das möchte ich nicht in meiner DB loggen.
Ich kriege es aber einfach nicht weg.
https://buyzero.de/blogs/news/tutorial-dht22-dht11-und-am2302-temperatursensor-feuchtigkeitsensor-am-raspberry-pi-anschliessen-und-ansteuern (https://buyzero.de/blogs/news/tutorial-dht22-dht11-und-am2302-temperatursensor-feuchtigkeitsensor-am-raspberry-pi-anschliessen-und-ansteuern)
Schau mal unten bei DHT11 und DHT22 auf die Sampling Rate. Vermutlich liegt es daran, das die overlay Datei versucht jede Sekunden einen Wert zu samplen, was jedoch beim DHT22 scheitern dürfte und zwar bei jedem 2. Mal. Man kann sich aus den binary overlay Dateien eine Textform erzeugen lassen, sich diese mal ansehen und eventuell die Samling Rate (falls es diese ist) anpassen und daraus wieder eine Binärdatei erzeugen und verwenden.
So ich habe es geschafft. Ich kann jetzt die Temperatur und Feuchtigkeit loggen und vernünftig auch als Plot darstellen.
Im folgenden möchte ich für Neulinge wie mich zusammenfassen was man alles machen muss.
Hier im Forum habe ich den Eindruck, dass zuviel Kenntniss über die Programmiersprachen vorausgesetzt wird.
Als FHEM user will man sich ja nicht unbedingt tief in Perl oder Python einarbeiten.
Also hier meine Lösung ohne Adafruit und ohne Phytonscript basierend auf dem Beitrag 162 von arthoffhem
Wie man den DHT22 anschließt an den Raspberry setze ich als bekannt voraus.
Jetzt alles konfigurieren wie in Beitrag 162 von arthoffhem
Ich nutze jedoch nicht FileLog sonder DBLog (MariaDB)
Dann User reading anlegen:
define DHT22 CustomReadings
Folgende attribute definieren: In den Klammern die Erklärung der Attribute)
attr DHT22 readingDefinitions temperature:qx(cat /sys/devices/platform/dht11\@5/iio:device0/in_temp_input 2>%1) / 1000,humidity:qx(cat /sys/devices/platform/dht11\@5/iio:device0/in_humidityrelative_input 2>%1) / 1000
Ich habe jedoch den DHT22 an GPIO 5 angeschlossen und deshalb muss man das obige attribut anpassen: statt....@0.. in ...@5.. ändern
(Abfrage der DHT22 Parameter die in den Dateien in_temp_input und in_humidityrelative_input abgelegt sind.
attr DHT22 DbLogExclude .* (nichts wird geloggt)
attr DHT22 DbLogInclude temperature,humidity (Temperatur und Feuchtigkeit werden geloggt)
Weil praktisch immer bei beiden Parametern der Wert 0 geloggt wurde der fast bei jeder zweiten Abfrage auftaucht, verhindert das folgende Attribut das loggen der 0-Werte.
Die Besonderheit ist, dass der 0-Wert nicht numerisch sondern als String vorliegt. Deshalb die Abfrage mit eq
attr DHT22 DbLogValueFn {if ($READING =~ /temperature/ && $VALUE eq "0"){$IGNORE=1;}}
{if ($READING =~ /humidity/ && $VALUE eq "0"){$IGNORE=1;}}
attr DHT22 event-on-change-reading temperature,humidity (nur bei Änderung loggen)
attr DHT22 interval 20 (Abfrage interval 20s. wurde zu Testzwecken zunächst auf 4s geändert um Änderungen sofort zu sehen.)
Ich hoffe, dies hilft Leuten die nicht so firm sind in den Programmiersprachen.
Gruß Uli
Zitat von: mumpitzstuff am 08 Dezember 2020, 12:20:19
https://buyzero.de/blogs/news/tutorial-dht22-dht11-und-am2302-temperatursensor-feuchtigkeitsensor-am-raspberry-pi-anschliessen-und-ansteuern (https://buyzero.de/blogs/news/tutorial-dht22-dht11-und-am2302-temperatursensor-feuchtigkeitsensor-am-raspberry-pi-anschliessen-und-ansteuern)
Schau mal unten bei DHT11 und DHT22 auf die Sampling Rate. Vermutlich liegt es daran, das die overlay Datei versucht jede Sekunden einen Wert zu samplen, was jedoch beim DHT22 scheitern dürfte und zwar bei jedem 2. Mal. Man kann sich aus den binary overlay Dateien eine Textform erzeugen lassen, sich diese mal ansehen und eventuell die Samling Rate (falls es diese ist) anpassen und daraus wieder eine Binärdatei erzeugen und verwenden.
Wie macht man aus dem overlay binary eine Textform?.
Mein Problem habe ich gelöst (siehe mein Beitrag). Mir ist es egal wenn da nullwerte kommen solange ich sie nicht loggen muss. Die Messwerte stimmen ja ziemlich.
Interessant wäre es schon wenn man das overlay entsprechend anpassen könnte um das Problem generell zu lösen. Wer hat das eigentlich erstellt?
Irgendwelche Linux Gurus.
Hier steht was dazu.
https://stackoverflow.com/questions/21670967/how-to-compile-dts-linux-device-tree-source-files-to-dtb (https://stackoverflow.com/questions/21670967/how-to-compile-dts-linux-device-tree-source-files-to-dtb)
OT:
Also ... CrossCompiling hat jetzt nicht unbedingt mit "Linux-Gurus" zu tuen ....
Das folgende attribut funktioniert jedoch nicht.
attr DHT22 event-on-change-reading temperature,humidity
Es werden auch gleiche Werte geloggt.
Gilt dieses attribut nicht für CustomReadings?
Bei den DS18B20 Sensoren funktioniert es.
Wie kann man erkennen welche attribute funktionieren?
Hallo zusammen,
ich habe folgendes Zitat ausprobiert und es funktioniert (ich musste zwar im Rasp etwas anpassen -anstatt DHT11@0 wurde es DHT11@11 ).
Leider habe ich beim Text log immer wieder Aussetzer mit dem Wert 0 für Temperatur und Luftfeuchte:
2021-05-27_16:39:20 DHT22 temperature: 0
2021-05-27_16:39:20 DHT22 humidity: 0
2021-05-27_16:41:49 DHT22 temperature: 15.3
2021-05-27_16:41:49 DHT22 humidity: 48.1
2021-05-27_16:46:49 DHT22 temperature: 15.2
2021-05-27_16:51:49 DHT22 humidity: 47.7
2021-05-27_16:54:19 DHT22 temperature: 15.1
2021-05-27_16:54:19 DHT22 humidity: 48.5
2021-05-27_16:56:49 DHT22 humidity: 48.1
2021-05-27_16:59:19 DHT22 temperature: 15
2021-05-27_16:59:19 DHT22 humidity: 48.7
2021-05-27_17:01:51 DHT22 temperature: 0
2021-05-27_17:01:51 DHT22 humidity: 0
Hat das Jemand schon in den Griff bekommen?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.
Der RPi unterstützt direkt 1-Wire (https://wiki.fhem.de/wiki/Raspberry_Pi_und_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/ (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
Ich habe nun das 58_GPIO4-Modul (https://forum.fhem.de/index.php/topic,121893.0.html) um die Funktionalität für DHT11/DHT22 erweitert. Somit sind weder Python noch CustomReading mit Systembefehl notwendig. Nur noch
- Sensor anschließen
- dtoverlay einrichten
- define des FHEM-devices
Grüße Markus
Hallo
habe es nun geschafft : ist ein Pi4
in der Config:
# activtion DHT11/DHT21/DHT22 sensor on GPIOx (default 4)
dtoverlay=dht11,gpiopin=4
# activating device tree debugging (use sudo vcdbg log msg)
dtdebug=on
Allerdings ist das Verzeichnis anders:
cat /sys/devices/platform/dht11@[b]4[/b]/iio:device0/in_temp_input
24200
allerdings bekomme ich öfters ein Fehler:
cat in_humidityrelative_input
cat: in_humidityrelative_input: Input/output error
wiederholt man es mehrmals kommt manchmal ein Wert?
Muss man da noch was einstellen?
Danke VG T
Nutze einfach mein 58_GPIO4 und es funktioniert problemlos(Lesefehler bleiben, sind aber uninteressant, solange nicht eine wie auch immer geartete zeitkritische Steuerung aufgesetzt ist. Dann ist der DHTxx per GPIO das falsche Konstrukt.)
Grüße Markus
Zitat von: KölnSolar am 04 Juli 2021, 09:38:06
Nutze einfach mein 58_GPIO4 und es funktioniert problemlos(Lesefehler bleiben, sind aber uninteressant, solange nicht eine wie auch immer geartete zeitkritische Steuerung aufgesetzt ist. Dann ist der DHTxx per GPIO das falsche Konstrukt.)
Grüße Markus
top danke läuft.
Bin aber etwas verwirrt mit dem Kommentar zu wiring p1 ....gin wäre egal?
dtoverlay=w1-gpio,gpiopin=4,pullup=off
Der gpiopin kann beliebig gewählt werden, da das FHEM-Modul diesbezüglich unabhängig funktioniert.
habe das gar nicht aktiviert.....
Danke
Zitathabe das gar nicht aktiviert.....
Musst Du ja auch nicht. :D
Das 58_GPIO4 ist im Ursprung für 1wire entstanden. Default-GPIO beim dtoverlay ist 4(genau wie beim dht11-overlay). Nutzt man beides, muss mal also für eins der beiden einen anderen GPIO wählen.
ZitatDer gpiopin kann beliebig gewählt werden, da das FHEM-Modul diesbezüglich unabhängig funktioniert.
Physikalisch kann für 1wire und auch DHT11 der GPIO frei gewählt werden und muss dann, sofern abweichend von 4, als Parameter in der config.txt definiert werden.
Meine Aussage bezog sich auf das FHEM-Modul und den Zugriffspfad auf die Sensordaten. Bei 1wire ist der Pfad "pinneutral". Bei dht11 hat der dtoverlay-Autor den gpiopin in den Pfad eingebaut, weshalb wir auch in FHEM den Pin bekannt machen müssen. Das habe ich dann über das define dht-x gelöst. Ist also eigentlich gar nicht wichtig für den Anwender, der tut, was ihm gesagt wird. Umgekehrt möchten manche ja die Hintergründe verstehen oder fragen sich: Warum muss bei dht11 der GPIO-Pin definiert werden, während es für 1wire nirgend eine Pin-Definition gibt.
Grüße Markus
super danke