Type Error bei DHT11 Programm

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

Guten Morgen zusammen,

ich bin ganz frisch hier und auch frisch in Python, lerne gerade wo ich nur kann. Prompt habe ich das erste Problem mit meinem Code bzw. mit dem None was bei raus kommt.
Benutze einen DHT11 für die Temperatur und die Luftfeuchtigkeit, schreibe dies in ein Log und mit Telegraf dann in eine influxDB, mit Grafana hole ich mir die Daten und gebe sie grafisch aus. Dies funktioniert auch ohne Probleme, nur wenn dann ein "None" von meinem DHT11 kommt bricht das Programm ab.

Hier mein Code:

Code: Alles auswählen

import Adafruit_DHT as adht
import time
import logging

logging.basicConfig(filename='/home/pi/scripts/temperature.log', level=logging.INFO, filemode='a', format='%(created)f %(message)s')

while True:
	try:
		h, t = adht.read_retry(adht.DHT11, 4)
		logging.info('Temp={0:0.1f} C and Humidity={1:0.1f} %'.format(t, h))
	except ValueError:
		print("RuntimeError, trying again...")
		continue
Und die Fehlermeldung

Code: Alles auswählen

TypeError: unsupported format string passed to NoneType.__format__
Nun ist die Frage wie kann ich verhindern das er dann aus dem Programm aussteigt?
Habs, wie ihr sehen könnt, mit dem except ValueError versucht ohne Erfolg.

Wäre super wenn mir jemand auf die Sprünge helfen könnte.

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

Na du bekommst ja auch einen TypeError. Den musst du fangen. Du kannst auch mehrere Ausnahmen in einem Tuple abgeben, falls irgendwo ein ValueError auch auftaucht.

Das continue am Ende ist überflüssig.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn ein TypeError geworfen wird, dann wird der nicht durch einen ValueError abgefangen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Variablennamen sollten aussagekräftig sein, also humidity und temperature statt h,t, oder temp.
`continue` sollte man sparsam benutzen, hier ist es völlig unnötig, weil die Schleife eh sofort wieder von vorne beginnt.

Code: Alles auswählen

import time
import logging
import Adafruit_DHT as adht

logger = logging.getLogger(__name__)

LOGFILENAME = '/home/pi/scripts/temperature.log'

def main():
    logging.basicConfig(filename=LOGFILENAME, level=logging.INFO, filemode='a', format='%(created)f %(message)s')

    while True:
        try:
            humidity, temperature = adht.read_retry(adht.DHT11, 4)
            logger.info('Temperature=%0.1f C and Humidity=%0.1f %%', temperature, humidity)
        except TypeError:
            print("RuntimeError, trying again...")

if __name__ == "__main__":
    main()
Susie
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 18:01

Sirius3 hat geschrieben: Donnerstag 29. September 2022, 06:56 Wenn ein TypeError geworfen wird, dann wird der nicht durch einen ValueError abgefangen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Variablennamen sollten aussagekräftig sein, also humidity und temperature statt h,t, oder temp.
`continue` sollte man sparsam benutzen, hier ist es völlig unnötig, weil die Schleife eh sofort wieder von vorne beginnt.

Hallo Sirius3,

vielen Dank für Deine Antwort, das mit den 4 Leerzeichen wusste ich nicht, mein vscode macht das mit den Tabs immer ganz gut, deswegen dachte ich ist dies ok.

Ich habe deinen Code jetzt mal übernommen, vielen Dank dafür. Das mit dem TypeError und ValueError hätte mir auch auffallen können. Manchmal bin ich blind auf beiden Augen :geek: :D

Muss noch viel lernen...

Viele Grüße
Susie
Antworten