Was ist an meinem Code falsch? "IndentationError: expected an indented block"

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Es fehlt das

    Python
    print(sensor_name_to_temperature)

    in der Ausgaben aus deinem letzten Post.

    Da müsste zusätzlich zum Fehler noch etwas in der Art erscheinen:

    Python
    {
        "S1": 22.4
        "S2": 23.0,
        "S3": 21.7,
    }

    Ein Dictionary erkennst du an den geschweiften Klammer {}.

    Das enthält dann ein Key:Value Paar oder mehrere. Wobei man mit dem Key an den jeweiligen Wert kommt.

    Zum Beispiel hast du folgendes Dic:

    Python
    thisdict = {
      "brand": "Ford",
      "model": "Mustang",
      "year": 1964
    }

    mit print kannst du dir den Inhalt ausgeben lassen:

    Python
    print(thisdict)

    Dann erscheint in der Ausgabe:

    Code
    {'brand': 'Ford', 'model': 'Mustang', 'year': 1964}

    Man könnte jetzt auch sagen du möchtest nur den Wert für "brand" haben. Dann greift man da mittels des Key´s also "brand" darauf zu:

    Python
    print(thisdict["brand"])

    Ausgabe:

    Code
    Ford

    Man kann auch Werte von Dictionary überschreiben usw. was im auch in deinem Fall gemacht wird.

    Die Fehlermeldung:

    Python
    KeyError: 'S1'

    würde jetzt sagen, das es kein Key "S1" gibt. Darum würde ich gern die Ausgabe des Dictionary sehen wollen, um zu sehen was tatsächlich im Dictionary, also in sensor_name_to_temperature, steht.

  • Was ist an meinem Code falsch? "IndentationError: expected an indented block"? Schau mal ob du hier fündig wirst!

  • Angenommen, die Sensoren haben einen Timeout und sind nicht immer alle in der Auflistung enthalten, dann fehlen auch die Zuweisungen im dict.

    Einmal editiert, zuletzt von RestlessMud46765 (25. April 2023 um 12:48) aus folgendem Grund: math.nan -> None

  • keepfear Vielen Dank für deine Hilfe und Erklärungen, dennoch habe ich eine weitere Verständnisfrage:

    print(sensor_name_to_temperature) habe ich ein meinen Python Code in Zeile 86 eingetragen,

    Ist das richtig?

    Oder habe ich dich falsch verstanden und sollte das print(sensor_name_to_temperature) in die Konsole eintragen? (Bin gerade nicht vor dem PI, daher kann ich es nicht ausprobieren)

    Bash
    pi@raspberrypi:~/solarueberwachung $ print(sensor_name_to_temperature)
  • Bash
    pi@raspberrypi:~/solarueberwachung $ print(sensor_name_to_temperature)

    Das ist falsch. Du versuchst Python-Code von der Bash (dort, wo du das eingeben hast) auszuführen. Das kann so nicht funktionieren. Die print-Funktion muss in deinen Quellcode.

  • Benutze Python3, dann wird es vielleicht gehen.

  • Beitrag von shgmongo (26. April 2023 um 16:55)

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • keepfear mit dem print(sensor_name_to_temperature) scheint nichts auszugeben. Die Ausgabe ändert sich nicht. Die Ausgabe mit auskommtentierten

    insert_to_db(timestamp, sensor_name_to_temperature) ergibt folgende Ausgabe (hab die Pumpen erstmal rausgenommen)

    Bash
    pi@raspberrypi:~/solarueberwachung $  python heiztemp.py
     Zeit: 2023-04-26 16:59:48 Sensor: d64e421f64ff hat die Temperatur 22.5
     Zeit: 2023-04-26 16:59:48 Sensor: 3077421f64ff hat die Temperatur 18.75
     Zeit: 2023-04-26 16:59:48 Sensor: 566a9c1e64ff hat die Temperatur 18.8125
    {None: 18.8125}

    Mit dem Befehl

    insert_to_db(timestamp, sensor_name_to_temperature) ergibt sich folgendes

    Kann es an meiner SQL Datenbank liegen?

  • keepfear mit dem print(sensor_name_to_temperature) scheint nichts auszugeben. Die Ausgabe ändert sich nicht. Die Ausgabe mit auskommtentierten

    insert_to_db(timestamp, sensor_name_to_temperature) ergibt folgende Ausgabe (hab die Pumpen erstmal rausgenommen)

    Bash
    pi@raspberrypi:~/solarueberwachung $  python heiztemp.py
     Zeit: 2023-04-26 16:59:48 Sensor: d64e421f64ff hat die Temperatur 22.5
     Zeit: 2023-04-26 16:59:48 Sensor: 3077421f64ff hat die Temperatur 18.75
     Zeit: 2023-04-26 16:59:48 Sensor: 566a9c1e64ff hat die Temperatur 18.8125
    {None: 18.8125}

    Die Zeile in Deiner Ausgabe

    Code
    {None: 18.8125}

    ist nicht "nichts". Sondern der Inhalt eines Dictionary.

    Das zeigt, dass Dein Dictionary sensor_name_to_temperature nur einen Eintrag hat, nämlich den der letzten Temperatur.

    Leider ist die Sensor-ID "None", und zwar für alle Sensoren. Deshalb gibt es nur den einen Eintrag.

    In Deinem Quelltext ist da also noch ein kleiner Fehler.

  • Python
    pi@raspberrypi:~/solarueberwachung $  python heiztemp.py
     Zeit: 2023-04-26 16:59:48 Sensor: d64e421f64ff hat die Temperatur 22.5
     Zeit: 2023-04-26 16:59:48 Sensor: 3077421f64ff hat die Temperatur 18.75
     Zeit: 2023-04-26 16:59:48 Sensor: 566a9c1e64ff hat die Temperatur 18.8125
    {None: 18.8125}

    Das

    Python
    {None: 18.8125}

    müsste das print(sensor_name_to_temperature) sein.

    Dann lassen wir jetzt mal das

    Python
            print(
                f" Zeit: {timestamp} Sensor: {sensor.id} hat die Temperatur {sensor.get_temperature()}"
            )

    weg.

    Vllt ist das 2x hintereinander auslesen zu schnell für die Sensoren.

    Edit:

    Da war ich wieder zu langsam.

  • simonz & keepfear, vielen Dank für die Unterstützung.

    Ich frage mich, was an dem Code falsch ist. Leider bin check ich echt nicht, woran es liegt....

    Das auskommtentieren des Befehls

    Python
     #   print(
          #      f" Zeit: {timestamp} Sensor: {sensor.id} hat die Temperatur {sensor.get_temperature()}"
          #  )

    führt zu folgender Ausgabe:

    (So sieht es auch mit dem Code von keepfear aus, nur das noch Pumpe EIN in der Bash steht.)

    Bash
    {None: 19.3125}
    Traceback (most recent call last):
      File "/home/pi/solarueberwachung/heiztemp.py", line 92, in <module>
        main()
      File "/home/pi/solarueberwachung/heiztemp.py", line 87, in main
        insert_to_db(timestamp, sensor_name_to_temperature)
      File "/home/pi/solarueberwachung/heiztemp.py", line 40, in insert_to_db
        sensor_name_to_temperature["S1"],
    KeyError: 'S1'

    Wenn ich etwas mehr Code auskommentiere

    Python
        #   print(
          #      f" Zeit: {timestamp} Sensor: {sensor.id} hat die Temperatur {sensor.get_temperature()}"
          #  )
          #  sensor_name_to_temperature[
          #      ID_TO_SENSOR_NAME.get(sensor.id)
          #  ] = sensor.get_temperature()

    dann ist die Ausgabe etwas anders.

    Er scheint im Dict. drei leere Einträge zu finden.

  • Python
    ID_TO_SENSOR_NAME = {    
        "28-d64e421f64ff": "S1",
        "28-3077421f64ff": "S2",
        "28-566a9c1e64ff": "S3",
    }

    passt nicht zu den Sensor-IDs, die ausgegeben werden:

    Python
    pi@raspberrypi:~/solarueberwachung $  python heiztemp.py
    Zeit: 2023-04-26 16:59:48 Sensor: d64e421f64ff hat die Temperatur 22.5
    Zeit: 2023-04-26 16:59:48 Sensor: 3077421f64ff hat die Temperatur 18.75
    Zeit: 2023-04-26 16:59:48 Sensor: 566a9c1e64ff hat die Temperatur 18.8125
    {None: 18.8125}

    Und deswegen klappt die Umwandlung von Sensor-ID zu "S1/S2/S3" nicht!

    Also: Jeweils das "28-" im Dictionary ID_TO_SENSOR_NAME löschen...

  • simonz

    Das klinkt logisch und hat auch zu einem Teilerfolg geführt ;) Jetzt ist noch die Frage, warum es nicht in meine SQL Datenbank geht.

    Vielleicht fällt es dir ja nochmal so leicht und du kannst mir sagen, wie meine Temperaturen und die Pumpe in die Datenbank kommen.

    Hier der Output nach Änderung

    Hier mein Pythonskript

    Und meine SQL Datenbank

  • 6 Argumente werden erwartet:

    Code
    (%s, %s, %s, %s, %s, %s);

    5 Argumente sind aber nur gegeben:

    Code
        args = (
            timestamp,                        # 1
            sensor_name_to_temperature["S1"], # 2
            sensor_name_to_temperature["S2"], # 3
            sensor_name_to_temperature["S3"], # 4
            pumpe,                            # 5
        )
  • Um "unbekannte" Sensoren zu erkennen, könnte man die Sensor-Schleife zum Beispiel so schreiben (ungetestet):

    Dann bricht das Programm mit Fehlermeldung und Exit-Code 1 ab, falls sich tatsächlich doch noch einmal ein neuer Sensor einschleicht.


    Hinweis:
    Ja, eigentlich könnte/sollte man das mit einer Exception machen. Aber eins nach dem anderen.
    shgmongo ist ja offensichtlich gerade erst am Anfang bzgl. Python-Programmierung.

  • keepfear, hyle, @DeaD_EyE, simonz

    Euch vielen, vielen Dank für eure Geduld und Erklärungen. Ich habe (erstmal) das geschafft, was ich wollte.

    Ich kann die Außentemperatur von OpenWeather, fünf Temperaturmessungen und zwei Pumpenlaufmeldungen (LDR) in eine MariaDB alle fünf Minuten schreiben.

    Ich habe wirklich viel gelernt. Als nächstes möchte ich die Daten noch in die Cloud schieben und vernünftig Visualisieren.
    Falls Fragen aufkommen, werde ich die in einem anderes Thema aufmachen....

    Nur zur vollständigkeitshalber will ich hier mein fertiges Skript noch posten. Vielleicht hilft es ja in Zukunft mal jemand weiter.

    Und wie ich die SQL Datenbank aufgesetzt habe:

    • Hilfreichste Antwort

    Das Openweather Zeug sollte mit in die main().

    Außerhalb der main() kommen importe, Klassen, Funktionen und Konstanten.

    Strings bastelt man nicht mit + zusammen. Dafür nutzt man entweder f-Strings oder die format() - Methode. Das macht Strings leserlicher.

    Schön das jetzt alles läuft. Dann kannst du jetzt noch nen Haken an den Thread werfen. Das geht unter Thema bearbeiten.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!