Python3, Paho, Matt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fips49
User
Beiträge: 2
Registriert: Montag 24. September 2018, 08:21

Hallo Experten,
Ich bin noch kein Experte bei Python, aber auch nicht ganz dumm und es will einfach nicht klappen.
Sachverhalt ein Rasperry sendet die Temperatur an einen MQTT-Rasperry was ja gut funktioniert und auch noch verständlich ist.
Ein dritter Rasperry soll die Teichttemperatur in meinen Wintergarten anzeigen und gleichzeitig die Daten eines dh22 Sensors auslesen und an den MQTT-broker senden. Die Hausarbeiten mit dem Internet habe ich auch schon gemacht, traue mir fast behaupten ich habe alle Seiten mit Python und Subscribe gesehen komme aber nicht weiter.

Mit dem Programm geht es ist aber nicht richtig: (läuft einmal durch und dann für immer) irgendwie ist es ein Fehler beim DEF(???) glaube ich. habe da schon herumgespielt und gelesen wegen Return und so geht aber auch nicht :-(


#!/usr/bin/env python3
# Projekt Haussteuerung Fips
# Wintergarten für Raspberry Zero4
# Start 21.04.2018
# Auslesen Auslesen MQTT und anzeigen auf einem LCD 20x4 über i2c
#
import Adafruit_DHT
import lcddriver
import time
import os, datetime
import paho.mqtt.client as paho
import decimal
sensor = Adafruit_DHT.DHT22
sensortpin=18
lcd = lcddriver.lcd()
lcd.lcd_clear()

def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))

def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_message(client, userdata, msg):
temp=msg.payload.decode("utf-8")
# return(temp)
print("temperatur :"+str(temp))
# return(temp)
#while(1):
datum = datetime.datetime.now().strftime("%d.%m.%y")
uhrzeit = datetime.datetime.now().strftime("%H:%M") # sekunden :%S")
cpu = str( float(os.popen("cat /sys/class/thermal/thermal_zone0/temp").read()) / 1000.0 ) + "°"
# temp=on_message
lcd.lcd_display_string((" Wintergarten "), 1)
lcd.lcd_display_string((" "+ datum +" "+ uhrzeit+" "), 2)
lcd.lcd_display_string(" Teichtemp.: "+str(temp), 3)
lcd.lcd_display_string("CPU Temp.: "+cpu+" ", 4)
print("datum/Zeit =:"+datum +" "+ uhrzeit)
print("Teichtemperatur : "+str(temp))
print("cpu Temp :"+ cpu)

print("marker1")
client = paho.Client()
print("marker2")
client.on_subscribe = on_subscribe
print("marker2,5")
client.on_message = on_message
print("marker 3")
client.connect("192.168.1.67", 1883)
client.subscribe("peter_mqtt/temperatur/teich", qos=1)
print("marker4")
client.loop_forever()


Jetzt habe ich es umgeschrieben nach einen Buch und wie es mir verständlich erscheint.
zuerst mit dem Brocken Verbindung aufbauen und dann das Programm abarbeiten dank (while) für immer

#!/usr/bin/env python3
# Projekt Haussteuerung Fips
# Wintergarten für Raspberry Zero4
# Start 21.04.2018
# Auslesen Auslesen MQTT und anzeigen auf einem LCD 20x4 über i2c
#
import Adafruit_DHT
import lcddriver
import time
import os, datetime
import paho.mqtt.client as paho
import decimal

sensor = Adafruit_DHT.DHT22
sensorpin=18
lcd = lcddriver.lcd()
lcd.lcd_clear()
zahl=0
messfehler=0
temp=0

def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))

def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
temp=msg.payload.decode("utf-8")

client = paho.Client()
client.on_connect = on_connect
client.will_set("/letzterwille","wintergarten off", 2, False)
client.publish("/online","wintergarten on", 1, False)
client.connect("192.168.1.153", 1883, 60)
client.loop_start()

# return(temp)
# print("temperatur :"+str(temp))
# return(temp)
while(1):
feuchtigkeit, temperatur = Adafruit_DHT.read(sensor, sensorpin)
if feuchtigkeit is not None and temperatur is not None:
temperatur = round(temperatur, 2)
feuchtigkeit = round(float(feuchtigkeit),3)
print ("Luftfeuchtigkeit: %.2f" % feuchtigkeit)
client.publish("/temperatur/wintergarten", temperatur)
client.publish("/feuchtigkeit/wintergarten", feuchtigkeit)
lcd.lcd_display_string("Raumtemperatur: "+str(temperatur), 3)
lcd.lcd_display_string(" Feuchtigkeit: "+str(feuchtigkeit), 4)
else:
print ("Lesefehler Erneut versuchen")
# messfehler=messfehler+1
datum = datetime.datetime.now().strftime("%d.%m.%y")
uhrzeit = datetime.datetime.now().strftime("%H:%M") # sekunden :%S")
cpu = str( float(os.popen("cat /sys/class/thermal/thermal_zone0/temp").read()) / 1000.0 ) + "°"
temp = client.subscribe("/temperatur/teich/#",1)
print("test print 1", temp)
# lcd.lcd_display_string((" Wintergarten "), 1)
lcd.lcd_display_string((" "+ datum +" "+ uhrzeit+" "), 1)
lcd.lcd_display_string(" Teichtemp.: "+str(temp), 2)
# lcd.lcd_display_string("Raumtemp.: "+str(temperatur), 3)
# lcd.lcd_display_string("Feuchtigkeit:"+str(feuchtigkeit), 4)
print("datum/Zeit =:"+datum +" "+ uhrzeit)
print("Teichtemperatur : "+str(temp))
print("Raumtemperatur Wintergaten EG : "+str(temperatur))
print("Luftfeuchtigkeit Wintergarten EG : "+str(feuchtigkeit))
print("Cpu Temperatur zero4 Wintergarten EG : "+ cpu)
print(" ")

#print("marker1")
#client = paho.Client()
#print("marker2")
#client.on_subscribe = on_subscribe
#print("marker2,5")
#client.on_message = on_message
#print("marker 3")
#client.connect("192.168.1.153", 1883)
#client.subscribe("/temperatur/teich", qos=1)
#print("marker4")
client.loop_forever()


beim 2. Programm bekomme ich die Ausgabe von
Teichtemperatur : (0, 6)
wobei der 2. Wert immer weiter springt keine Ahnung von wo das kommt.

So ich sage schon einmal danke für die Hilfe und liebe Grüße Peter
fips49
User
Beiträge: 2
Registriert: Montag 24. September 2018, 08:21

Sorry ohne Einrückungen reingestellt:
mit dem geht es:


#!/usr/bin/env python3
# Projekt Haussteuerung Fips
# Wintergarten für Raspberry Zero4
# Start 21.04.2018
# Auslesen Auslesen MQTT und anzeigen auf einem LCD 20x4 über i2c
#
import Adafruit_DHT
import lcddriver
import time
import os, datetime
import paho.mqtt.client as paho
import decimal

sensor = Adafruit_DHT.DHT22
sensorpin=18
lcd = lcddriver.lcd()
lcd.lcd_clear()
zahl=0
messfehler=0

def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))

def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_message(client, userdata, msg):
temp=msg.payload.decode("utf-8")
# return(temp)
# print("temperatur :"+str(temp))
# return(temp)
#while(1):
# print ("Zähler= ",zahl," Messfehler= ",messfehler)
# zahl=zahl+1
feuchtigkeit, temperatur = Adafruit_DHT.read(sensor, sensorpin)
if feuchtigkeit is not None and temperatur is not None:
temperatur = round(temperatur, 2)
feuchtigkeit = round(float(feuchtigkeit),3)
# lcd.lcd_display_string("Temperatur C:%.2f" %temperatur ,1)
print ("Luftfeuchtigkeit: %.2f" % feuchtigkeit)
client.publish("/temperatur/wintergarten", temperatur)
client.publish("/feuchtigkeit/wintergarten", feuchtigkeit)
lcd.lcd_display_string("Raumtemperatur: "+str(temperatur), 3)
lcd.lcd_display_string(" Feuchtigkeit: "+str(feuchtigkeit), 4)
else:
print ("Lesefehler Erneut versuchen")
# messfehler=messfehler+1

datum = datetime.datetime.now().strftime("%d.%m.%y")
uhrzeit = datetime.datetime.now().strftime("%H:%M") # sekunden :%S")
cpu = str( float(os.popen("cat /sys/class/thermal/thermal_zone0/temp").read()) / 1000.0 ) + "°"
# temp=on_message
# lcd.lcd_display_string((" Wintergarten "), 1)
lcd.lcd_display_string((" "+ datum +" "+ uhrzeit+" "), 1)
lcd.lcd_display_string(" Teichtemp.: "+str(temp), 2)
# lcd.lcd_display_string("Raumtemp.: "+str(temperatur), 3)
# lcd.lcd_display_string("Feuchtigkeit:"+str(feuchtigkeit), 4)
print("datum/Zeit =:"+datum +" "+ uhrzeit)
print("Teichtemperatur : "+str(temp))
print("Raumtemperatur Wintergaten EG : "+str(temperatur))
print("Luftfeuchtigkeit Wintergarten EG : "+str(feuchtigkeit))
print("Cpu Temperatur zero4 Wintergarten EG : "+ cpu)
print(" ")

print("marker1")
client = paho.Client()
print("marker2")
client.on_subscribe = on_subscribe
print("marker2,5")
client.on_message = on_message
print("marker 3")
client.connect("192.168.1.153", 1883)
client.subscribe("/temperatur/teich", qos=1)
print("marker4")
client.loop_forever()


mit dem neuen nicht :-(


#!/usr/bin/env python3
# Projekt Haussteuerung Fips
# Wintergarten für Raspberry Zero4
# Start 21.04.2018
# Auslesen Auslesen MQTT und anzeigen auf einem LCD 20x4 über i2c
#
import Adafruit_DHT
import lcddriver
import time
import os, datetime
import paho.mqtt.client as paho
import decimal

sensor = Adafruit_DHT.DHT22
sensorpin=18
lcd = lcddriver.lcd()
lcd.lcd_clear()
zahl=0
messfehler=0
temp=0

def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))

def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))

def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
temp=msg.payload.decode("utf-8")

client = paho.Client()
client.on_connect = on_connect
client.will_set("/letzterwille","wintergarten off", 2, False)
client.publish("/online","wintergarten on", 1, False)
client.connect("192.168.1.153", 1883, 60)
client.loop_start()

# return(temp)
# print("temperatur :"+str(temp))
# return(temp)
while(1):
feuchtigkeit, temperatur = Adafruit_DHT.read(sensor, sensorpin)
if feuchtigkeit is not None and temperatur is not None:
temperatur = round(temperatur, 2)
feuchtigkeit = round(float(feuchtigkeit),3)
print ("Luftfeuchtigkeit: %.2f" % feuchtigkeit)
client.publish("/temperatur/wintergarten", temperatur)
client.publish("/feuchtigkeit/wintergarten", feuchtigkeit)
lcd.lcd_display_string("Raumtemperatur: "+str(temperatur), 3)
lcd.lcd_display_string(" Feuchtigkeit: "+str(feuchtigkeit), 4)
else:
print ("Lesefehler Erneut versuchen")
# messfehler=messfehler+1
datum = datetime.datetime.now().strftime("%d.%m.%y")
uhrzeit = datetime.datetime.now().strftime("%H:%M") # sekunden :%S")
cpu = str( float(os.popen("cat /sys/class/thermal/thermal_zone0/temp").read()) / 1000.0 ) + "°"
temp = client.subscribe("/temperatur/teich/#",1)
print("dfdfdfdf", temp)
# lcd.lcd_display_string((" Wintergarten "), 1)
lcd.lcd_display_string((" "+ datum +" "+ uhrzeit+" "), 1)
lcd.lcd_display_string(" Teichtemp.: "+str(temp), 2)
# lcd.lcd_display_string("Raumtemp.: "+str(temperatur), 3)
# lcd.lcd_display_string("Feuchtigkeit:"+str(feuchtigkeit), 4)
print("datum/Zeit =:"+datum +" "+ uhrzeit)
print("Teichtemperatur : "+str(temp))
print("Raumtemperatur Wintergaten EG : "+str(temperatur))
print("Luftfeuchtigkeit Wintergarten EG : "+str(feuchtigkeit))
print("Cpu Temperatur zero4 Wintergarten EG : "+ cpu)
print(" ")

#print("marker1")
#client = paho.Client()
#print("marker2")
#client.on_subscribe = on_subscribe
#print("marker2,5")
#client.on_message = on_message
#print("marker 3")
#client.connect("192.168.1.153", 1883)
#client.subscribe("/temperatur/teich", qos=1)
#print("marker4")
client.loop_forever()


Liebe Grüße Peter
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die Code-Tags benuzten, sonst ist das unlesbar. Und Fehlermeldungen Posten.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@fips49: ohne konkrete Problembeschreibung (Fehlermeldung) kann man da wenig helfen.

Wo man helfen kann, sind die Probleme im Code:
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Strings formatiert man mit format, nicht mit + und str.
Variablen braucht man in Python nicht zu definieren, die Zuweisung von 0 an `zahl`, `temp` sind also unnötig.
Konstanten schreibt man komplett groß: `SENSOR`, `SENSORPIN`.
Eine Endlosschleife schreibt man `while True:`.
Datum und Uhrzeit ermittelt man in einem Aufruf. Sonst kann es passieren, dass Du knapp 24Stunden in der Vergangenheit landest.
Dateien öffnet man mit `open` und nicht mit `popen('cat ...')`.
Das `loop_forever` wird nie erreicht, ist auch unnötig, weil Du schon mit `loop_start` einen Thread startest.
Antworten