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!
  • Hallo Leute


    ich bekomme die Fehlermeldung "IndentationError: expected an indented block" und check einfach nicht, was am Layout meines Codes falsch ist.


    Ich habe ihn schon mit dem Pyhton Checker geprüft und versucht ihn durch probieren zu reparieren. Leider ohne Erfolg.


    Der Fehler ist in Line 36 "lines = sensor.readlines().


    Es wäre sehr cool, wenn mir jemand auf die Sprünge helfen könnte.


    Gruß,

    Sebastian


  • Go to Best Answer
  • Noch ein Hinweis... Einrückungen sind, im Gegensatz zu anderen Sprachen, bei Python Teil der Programmierung und für den Programmablauf zuständig. Das ist nicht einfach nur Layout. ;)


    Zum Layout gehören u.a. die Anzahl der Leerzeichen, also 4, usw.


    Siehe dazu hier: https://peps.python.org/pep-0008/#indentation

  • Einrückungsfehler! Zeile ab 36 vermutlich?!


    Mehr sage ich mal nicht zum Skript.

    Danke für den Hinweis. Das war mir auch klar, aber ich weiß nicht, wie ich den beheben kann.

    *hust* Python 2 *hust, röchel, hust*

    Tut mir leid, aber ich beschäfftige mich noch nicht so lange damit und kann mit deinem Kommentar leider überhaupt nichts anfangen.


    Über konkrete Hilfen würde ich mich echt freuen. Ich möchte das Skript einfach zum laufen bekommen, damit ich die Temperaturen auslesen und speichern kann.


    Was muss an meinem Skript "eingerückt" werden, damit es ohne Fehler durchläuft?


    Gruß,

    Sebastian

  • Python 2 ist EOL und wird irgendwann nicht mehr im OS vorhandenen sein.

    Besser wäre Python 3.


    Du musst Zeile 36 einrücken:

    Python
    for sensorname in os.listdir("/sys/bus/w1/devices"):
        if fnmatch.fnmatch(sensorname, '28-*'):
            with open("/sys/bus/w1/devices/" + sensorname + "/w1_slave") as sensor:
                lines = sensor.readlines()

    Ich hoffe ich hab das jetzt richtig eingerückt.

    Bin gerade nur am Telefon.

    Eingerückt wird mit 4 Leerzeichen.

    Schau dir auch den Link von Hyle an.

  • Ich bin nur am Telefon und kann das nicht genau erkennen, aber vielleicht sehe ich das ja richtig. :geek:


    Fang in Zeile 36 genau da an (rücke soweit ein), wo das "with" eine Zeile darüber steht (Edit: und rücke dann noch eine Ebene weiter ein).

    Das gleiche gilt für die "if"s darunter.


    Das wäre schon mal ein guter Anfang.

  • keepfear & hyle Hat funktioniert! Konnte es mit dem Python Checker überprüfen und des gab keine Fehlermeldung mehr. Danke für die Hilfe.


    Python 2 ist EOL und wird irgendwann nicht mehr im OS vorhandenen sein.

    Besser wäre Python 3.

    EOL = End of Lifetime?


    Gibt es eine (einfache) Möglichkeit für mich das Programm von Python 2 auf Python 3 zu überführen?


    Was ist der kritische Teil meines Codes? Ich nehme mal an, dass nicht alles neu geschrieben werden muss.


    Gruß,

    Sebastian

  • Hallo,

    Quote

    Gibt es eine (einfache) Möglichkeit für mich das Programm von Python 2 auf Python 3 zu überführen?

    Python 3 hat ein Tool Names "2to3" an Bord, mit dem Python Code von Python 2 nach Python 3 aktualisiert wird. Das heißt aber _nicht_, dass der Code fehlerfrei durchläuft, da ist sicherlich nacharbeit nötig. Und du musst natürlich alle Module, die du verwendest und nicht Teil des Standardpython sind, auch für Python 3 installieren.

    Python 2 ist übrigens seit 1.1.2020 end of life. Das du jetzt, in 2023, überhaupt noch Python 2 für was neues angepackt hast, ist der eigentliche Fehler.


    Da du den Code eh' anpacken musst:

    Das os-Modul gilt für den Umgang mit Pfaden als veraltet, dafür nimmer man schon länger das `pathlib` Modul. Dateipfade werden auch nicht `+` zusammengestückelt, dass geht mit dem pathib Modul auch schöner.

    Statt das alte `RPi.GPIO` nimmer man schon seit Jahren das neuere & schönere gpiozero Modul.

    `datetime` in Zeile 29 ist sehr falsch, weil du damit das zuvor importierte `datetime` Modul überschreibst. Dein Code funktioniert auch nur weiter, weil du nach Zeile 29 nicht mehr auf das `datetime` Modul zugreifst.

    Zeile 27 ist IMHO überflüssig, weil das MySQLdb Modul eigentlich muss `datetime` Objekten umgehen können sollte und die auch ohne umformatieren korrekt in die DB schreiben könnte sollte. Müsstest du mal ausprobieren.


    Gruß, noisefloor

  • Ich hatte Langeweile und wollte das Script aus Post #1 so nicht da stehen lassen.


    shgmongo

    Du hast sicher irgendeine Anleitung genommen? Das MySQLdb scheint von hier zu stammen? Wenn ja, ist das nicht aktuell und nur für Python2!

    Die Library solltest du wieder deinstallieren:

    Code
    pip uninstall MySQL-python

    Für nachfolgendes Script brauchst du noch w1thermsensor und MySQL :

    Code
    pip3 install w1thermsensor
    pip3 install mysql-connector-python

    Ggf. musst du die ID`s der Sensoren ab Zeile 12 und deinen Host usw. ab Zeile 19 nochmal anpassen.

    Alternativ ohne Klasse. Hier auch den Einstellungskram anpassen!:

  • @noisefloor Danke für die Erklärung. So ganz kann ich leider nicht folgen, weil ich es nicht ganz verstehe. Ich werde aber mal ein wenig darüber nachdenken ... ;)


    @keepfear Vielen Dank für deine Arbeit. Ich werden es ausprobieren und mich ggf melden....

    Zur Info, ich bin nach dieserAnleitungvorgegangen und es funktioniert auch so weit. Werde aber trotzem versuchen dein Skript für Python3 zu nehmen.


    Was bedeutet "Alternativ ohne Klasse....:"


    Eine Frage habe ich noch, ich würde gerne noch die Außentemperatur per Openweather oder so mit in meine SQL Datenbank schreiben, wie müsste ich das Pyhtonskript ergänzen?


    Gruß,


    Sebastian

    Edited once, last by shgmongo ().

  • Hallo,

    Was bedeutet "Alternativ ohne Klasse....:"

    Im ersten Code, wird eine Klasse erstellt. Das erkennst du an dem Schlüsselwort 'class'

    Infos dazu findest du zum Beispiel hier:

    https://docs.python.org/3/tutorial/classes.html


    Da wird das was Prinzip, das im zweiten Beispiel vom 'contextlib' importiert wird, nachgebaut. Es geht dabei darum, das im Fehlerfall garantiert wird, dass die Verbindung zur Datenbank geschlossen wird und ein Rollback durchgeführt wird. So damit du keine kaputten Daten in der Datenbank hast.

    Immer wenn man irgendwas öffnet versucht man das anzuwenden, das erkennst du an dem 'with'-Statemanet. Wenn du zum Beispiel eine Datei öffnen willst, dann kannst du die gleich mit 'with' öffnen, da ist diese "Funktion" (der contextmanager) schon mit eingebaut. In deiner Bibliothek zum bearbeiten der Datenbank leidere nicht, daher der Umweg.

    Oder du könntest auf PyMySQL umsteigen, da ist das schon eingebaut.


    noch die Außentemperatur per Openweather oder so mit in meine SQL Datenbank schreiben, wie müsste ich das Pyhtonskript ergänzen?

    Openweather hat ja eine schöne und gut erklärte API. Du registierst dich und je nach dem was du für ANsprüche hast nutzt du die freie API-ID oder du machst ein Abo. Es kann oder so war es bei mir, schon 2 Stunden gehen, bis die ID freigeschaltet wird.


    Ja dann wäre es zwei Stichwörter mit denen du dich beschäftigen musst: requests und json.


    Da würde ich jetzt mal gesondert von deinem Programm, erste Versuche starten.


    Grüße

    Dennis

    🎧 Mein Auto springt, mein Toaster kocht, es zwickt mich im Genick. Meine Frau ist eingelocht, die Spülmaschine tickt. Meine Telefonapperat brüllt mich seit Tagen an, er ist schon lange abgestellt im Bett liegt Peter Pan. Die Uhr geht falsch, die Haustür singt, mein Spiegel schlägt zurück - Ich werde noch verrückt, was solls ich bin entzückt. Die Badewanne zieht nicht ab ihr glaubt nicht was ich seh' - Sie ist voll Himbeerengelee 🎧

  • Was bedeutet "Alternativ ohne Klasse....:"

    Bedeutet das du 2 Scripte hast, die das gleiche tun aber etwas anders aufgebaut sind.

    Eine Frage habe ich noch, ich würde gerne noch die Außentemperatur per Openweather oder so mit in meine SQL Datenbank schreiben, wie müsste ich das Pyhtonskript ergänzen?

    Du musst dir einen API-Key von Openweather besorgen und dann gibt es wohl mehrere "Wege":

    Quelle: https://www.simplifiedpython.net/openweathermap-api-python/


    Oder:

    Code
    pip3 install pyowm

    Quelle: https://github.com/csparpa/pyowm


    Edit:

    Da war ich wohl zu langsam

    Edited once, last by keepfear ().

  • Vielen Dank @Dennis89

    Vielen Dank @keepfear


    Ich habe den Code übernommen und schon ein wenig an meine Bedürfnisse angepasst. Die Temperaturen werden ausgelesen und richtig angezeigt. Nur leider bekomme ich eine Fehlermeldung, siehe unten und es wird nichts in die Datenbank geschrieben.


    Zudem müsste ich noch eine weiter Pumpe einbauen. Wie kann ich eine zweite Pumpen, die an Pin22 ist einbauen? [tt][

    PUMPE2_STATUS_PIN = 27/tt] und dann überall wo pumpe steht einfach kopieren und pump2 eintragen?


    (Es tut mir leid, dass ich so unerfahren in der Programmierung bin, dass ich es nicht selbst hinbekomme. Aber ich sitze Stunden davor, wie der Ochs vorm Berg. Jedes mal, wenn ihr was schreibt, werde ich ein Stück schlauer.)

    Edited once, last by shgmongo ().

  • shgmongo Ein kleiner Tipp: Wenn Du jemanden erwähnst und Du den vorher kopierten Usernamen wie z.Zt. einfügst, dann klick mit der linken Maustaste auf den Usernamen und danach auf Link entfernen. Jetzt wird in den Benachrichtigungen (die wackelnde Glocke oben) auch angezeigt, dass man erwähnt wurde, so wie bei Dir in diesem Moment auch. ;)

  • Bau da vor dem Funktionsaufruf insert_to_db noch ein print ein und lass dir das Dictionary ausgeben.

    Python
    print(sensor_name_to_temperature)
    
    insert_to_db(timestamp, sensor_name_to_temperature, pumpe)

    Und dann zeig uns die Ausgabe von dem print.


    Zudem müsste ich noch eine weiter Pumpe einbauen. Wie kann ich eine zweite Pumpen, die an Pin22 ist einbauen?

    Das kannst du so ausprobieren.

  • keepfear , ich habe den print Befehl eingebaut. Leider weiß ich nicht, wie ich das / ein Dicionary aufrufe.


    Ich habe es wie folgt in meinen Code aufgenommen:



    Zur Info, hier wie die Tabelle von der Datenbank aufgebaut ist



    (Was muss ich eigentlich einstellen, wenn ich eine pi Ausgabe als Code darstellen will? Ist BASH die richtige Wahl?)