Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Logik Syntax

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Problem mit Logik Syntax

    Hallo
    ich hab ein Problem mit der Syntax im einer Logik.
    Wenn ich das so schreibe:
    Code:
    # Automatik zur Steuerung der Filterpumpe um den Pool zu heizen
    if sh.Solarheizung.Automatik():
        if sh.pool.temp_poolwasser() >= sh.Solarheizung.TempMax():
            if sh.Solarheizung.Pumpe() == 1:
              sh.Solarheizung.Pumpe(0)
                logger.warning("Solarheizung Pool - Aus, Maximaltemperatur erreicht")
            else:
               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempEin()) > sh.pool.temp_poolwasser():
                   if sh.Solarheizung.Pumpe() == 0:
                        if sh.Solarheizung.TempMax() > sh.pool.temp_poolwasser():
                           sh.Solarheizung.Pumpe(1)
                           logger.info("Solarheizung Pool - Ein")
                           else:
                            #logger.info("TempAbschalt {0}".format(sh.Messdaten.Alle.Temperatur8() + sh.Pool.Solarheizung.TempAus()))
                               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempAus()) <= sh.pool.temp_poolwasser():
                                    if sh.Solarheizung.Pumpe():
                                      sh.Solarheizung.Pumpe(0)
                                       logger.info("Solarheizung Pool - Aus")
    Bekomme ich ein:
    HTML-Code:
    Traceback (most recent call last):
    File "/usr/smarthome/lib/logic.py", line 998, in _generate_bytecode
    self.bytecode = compile(code, self.pathname, 'exec')
    File "/usr/smarthome/logics/pool_heizung.py", line 7
    else:
    ^
    IndentationError: unexpected indent
    Nehme ich die Leerzeichen in Zeile 7 vor dem else weg dann ist es ok und es verlagert sich auf das zweite else Zeile 13
    Code:
    # Automatik zur Steuerung der Filterpumpe um den Pool zu heizen
    if sh.Solarheizung.Automatik():
        if sh.pool.temp_poolwasser() >= sh.Solarheizung.TempMax():
            if sh.Solarheizung.Pumpe() == 1:
              sh.Solarheizung.Pumpe(0)
                logger.warning("Solarheizung Pool - Aus, Maximaltemperatur erreicht")
    else:
               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempEin()) > sh.pool.temp_poolwasser():
                   if sh.Solarheizung.Pumpe() == 0:
                        if sh.Solarheizung.TempMax() > sh.pool.temp_poolwasser():
                           sh.Solarheizung.Pumpe(1)
                           logger.info("Solarheizung Pool - Ein")
                           else:
                            #logger.info("TempAbschalt {0}".format(sh.Messdaten.Alle.Temperatur8() + sh.Pool.Solarheizung.TempAus()))
                               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempAus()) <= sh.pool.temp_poolwasser():
                                    if sh.Solarheizung.Pumpe():
                                      sh.Solarheizung.Pumpe(0)
                                       logger.info("Solarheizung Pool - Aus")
    Es sind keine Tabs drin nur Leerzeichen. Alles mit Notepad ++ gemacht. Ich verstehe das nicht. Warum ist das so?

    Setze ich Zeile 13 das Zweite else an den Anfang der Zeile:
    Code:
    # Automatik zur Steuerung der Filterpumpe um den Pool zu heizen
    if sh.Solarheizung.Automatik():
        if sh.pool.temp_poolwasser() >= sh.Solarheizung.TempMax():
            if sh.Solarheizung.Pumpe() == 1:
              sh.Solarheizung.Pumpe(0)
                logger.warning("Solarheizung Pool - Aus, Maximaltemperatur erreicht")
    else:
               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempEin()) > sh.pool.temp_poolwasser():
                   if sh.Solarheizung.Pumpe() == 0:
                        if sh.Solarheizung.TempMax() > sh.pool.temp_poolwasser():
                           sh.Solarheizung.Pumpe(1)
                           logger.info("Solarheizung Pool - Ein")
    else:
                            #logger.info("TempAbschalt {0}".format(sh.Messdaten.Alle.Temperatur8() + sh.Pool.Solarheizung.TempAus()))
                               if (sh.pool.temp_solar_warm() - sh.Solarheizung.TempAus()) <= sh.pool.temp_poolwasser():
                                    if sh.Solarheizung.Pumpe():
                                      sh.Solarheizung.Pumpe(0)
                                       logger.info("Solarheizung Pool - Aus")
    Dann bringt das nichts.
    HTML-Code:
    File "/usr/smarthome/lib/logic.py", line 998, in _generate_bytecode
    self.bytecode = compile(code, self.pathname, 'exec')
    File "/usr/smarthome/logics/pool_heizung.py", line 13
    else:
    ^
    SyntaxError: invalid syntax
    Was mache ich hier falsch?

    Wer hat da einen Tipp für mich?

    Danke Gruß Haxley






    #2
    Zitat von Haxley Beitrag anzeigen
    File "/usr/smarthome/logics/pool_heizung.py", line 7
    else:
    ^
    IndentationError: unexpected indent[/HTML]

    Nehme ich die Leerzeichen in Zeile 7 vor dem else weg dann ist es ok und es verlagert sich auf das zweite else Zeile 13
    Ist Deine Leerzeile vor dem "else" auch mit Leerzeichen eingerückt? Sonst endet der eingerückte Block wahrscheinlich dort und das "else" kann nicht korrekt zugeordnet werden.
    Ich brauche Informationen, eine Meinung bilde ich mir selbst.

    Kommentar


      #3
      Das zweite "else" muss doch auch ein Stück nach links unter sein "if", oder?
      Ich brauche Informationen, eine Meinung bilde ich mir selbst.

      Kommentar


        #4
        Hi,

        Du kannst Dir bei Python nicht aussuchen, wie weit Du einrückst, da die Einrückungen über die Blockgröße (also was alles zu einem if oder einem else gehört) entscheiden. Du solltest Dich für eine Einrückweite entscheiden und das konsequent durchziehen, dann verschwinden auch die Fehler.
        Ich habe bei Dir in den ersten Zeilen schon 2, 3, 4 und 5 Leerzeichen als Einrückung gesehen, das kann nicht klappen. Mach immer 4 hin (als Vorschlag).
        Ein else ganz nach vorne zu ziehen verändert die Semantik und kann nicht klappen - es gehört unter das zugehörige if. Alle Zeilen zwischen if und else gehören 4 Zeichen eingerückt etc.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Ich habs hinbekommen. YAML interpretiert ja das einrücken.

          Die/der Entwickler hat sich sicher was dabei gedacht smarthome damals auf YAML umzustellen aber ich kann es nicht nachvollziehen. Gerade Nutzer die nicht regelmäßig mit YAML arbeiten haben damit extreme Probleme. (Einrücken, Tab usw.)
          Dazu kommt noch, dass hier im Forum die ganze Einrückgeschichte nicht per Einfügen übernommen wird (weder bei PHP, Code oder HTML).

          Naja aber ihr habt mir den Weg gezeigt. Dankeschön!

          Kommentar


            #6
            Hi,

            schön, dass Du es hinbekommen hast.

            Aber:
            Zitat von Haxley Beitrag anzeigen
            Dazu kommt noch, dass hier im Forum die ganze Einrückgeschichte nicht per Einfügen übernommen wird (weder bei PHP, Code oder HTML)
            kann man so nicht sagen. CODE übernimmt natürlich die Einrückung, zumindest solange es Leerzeichen sind.

            YAML ist einfach eine standardisiertes Datenformat, wie JSON oder HTML, für die es fertige Parser gibt. Und hat mit der Python-Formatierung rein gar nichts zu tun...

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Zitat von mumpf Beitrag anzeigen
              Hi,

              kann man so nicht sagen. CODE übernimmt natürlich die Einrückung, zumindest solange es Leerzeichen sind.
              Das ist nicht korrekt. Einfügen aus Notepad++ wird bei mir im Forum auch bei CODE alles linksbündig gemacht.


              Kommentar


                #8
                Das liegt dann aber am notepad++ und nicht am Forum.

                Gruß, Waldemar

                P.S.: Noch ein Tipp: Verwende eine Entwicklungsumgebung, wie z.B. Visual Studio Code, die bewahrt Dich vor solchen Fehlern, da dort die Dokumententypen für die jeweiligen Formate bekannt sind oder als Plugin nachinstalliert werden können.
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Man kann offenbar nicht oft genug darauf hinweisen:
                  wenn man auf das A rechts oben im Post clickt, um die Editorfunktionen sichtbar zu machen, dann gibt es ganz links die Taste "<>". Ein Click darauf befördert den Editor in einen Modus, in dem er Einrückungen bestens akzeptiert - auch von Notepad ++, der IMHO ein genial guter Editor ist.

                  Gruß
                  Wolfram

                  Kommentar


                    #10
                    Hallo Haxley,
                    schau Dir doch bitte mal diesen Beitrag zum Thema "Einrücken" an:
                    HTML-Code:
                    https://knx-user-forum.de/forum/supportforen/smarthome-py/1497890-hilfe-zu-smarthomeng-erhalten-python-code-und-yaml-konfig-richtig-einf%C3%BCgen#post1497890
                    Gruß
                    Hans

                    Kommentar


                      #11
                      Zitat von wvhn Beitrag anzeigen
                      Man kann offenbar nicht oft genug darauf hinweisen:
                      wenn man auf das A rechts oben im Post clickt, um die Editorfunktionen sichtbar zu machen, dann gibt es ganz links die Taste "<>". Ein Click darauf befördert den Editor in einen Modus, in dem er Einrückungen bestens akzeptiert - auch von Notepad ++, der IMHO ein genial guter Editor ist.

                      Gruß
                      Wolfram
                      Stimmt, jetzt weiß ich das auch. Danke!

                      Kommentar

                      Lädt...
                      X