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

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • 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.

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


    Edited once, last by DeaD_EyE: 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)
  • Benutze Python3, dann wird es vielleicht gehen.

  • Post by shgmongo ().

    The post was deleted, no further information is available.
  • 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:

    • Best Answer

    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.