Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit "Codeblock"

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

    [callidomus] Problem mit "Codeblock"

    Ich versuche, eine ganz einfach Logik in einem Codeblock im Item ("eg.wc.pm.schalten") unterzubringen:

    Code:
    if value==True:[INDENT]<mach was>
    
    else:[/INDENT][INDENT]<mach was anderes>[/INDENT]
    (das "else" ist ausgerückt - kriege ich hier im Editor aber nicht hin) Ich kriege immer folgende Fehlermeldung:

    Code:
    2016-09-11 18:44:26 WARNING  Main         Problem compiling item code for eg.wc.pm.schalten: invalid syntax (<string>, line 2)
    2016-09-11 18:44:47 DEBUG    Main         KNX: eg.wc.pm.schalten listen on 1/1/9
    2016-09-11 18:44:47 DEBUG    Main         Item eg.wc.pm: no type specified.
    2016-09-11 18:44:52 WARNING  Main         Problem compiling item code for eg.wc.pm.schalten: invalid syntax (<string>, line 2)
    2016-09-11 18:45:06 DEBUG    Main         Triggering eg.wc.pm.schalten-code - caller: KNX source: 1.1.41 dest: 1/1/9 value: {'caller': 'KNX', 'source': '1.1.41', 'v
    2016-09-11 18:45:06 WARNING  eg.wc.pm.schalten-code Item eg.wc.pm.schalten: problem evaluating None: eval() arg 1 must be a string, bytes or code object
    (...)
    D.h. ich komme irgendwie nicht mal über die erste Zeile - wobei mich irritiert, dass er Zeile 2 anmeckert (da steht ein einfaches cd.<itempfad>(Wert) - da scheint er aber gar nicht hinzukommen - wenn ich da ein logger.info hinsetze, sehe ich das auch nicht). Das Item ist Typ bool, DPT=1 und wird mit GA 1/1/9 initialisiert (sollte also einen Wert haben). Ich habe im if-Statement auch 'an' und "1" probiert, gleiches Ergebnis.

    Was mache ich falsch?

    #2
    Hi,

    ich würde erstmal die Leerzeilen weglassen, also
    Code:
    if value:
        <mach was>
    else:
        <mach was anderes>
    Nur als Versuch. Falls es sich nur um was kurzes handelt, würde ich ein eizeiliges if versuchen, das klappte bei mir bisher immer.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #3
      Tut's auch nicht (egal ob ohne Leerzeilen oder einzeilig). Ich krieg' immer den Fehler

      Code:
      Problem compiling item code for eg.wc.pm.schalten: invalid syntax (<string>, line 2)
      (...) problem evaluating None: eval() arg 1 must be a string, bytes or code object
      Hmm, das Item ist vom typ bool... Kann es daran liegen? Aber man muss doch ein 1bit-Objekt auswerten können?!
      Zuletzt geändert von DiMa; 11.09.2016, 20:06.

      Kommentar


        #4
        Hi,

        poste doch mal genau, was Du machen willst, vielleicht liegt das Problem ja wo anders bzw. wir finden eine andere Lösung.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Ich möchte wenn der PM das Licht einschaltet die Jalousien steuern, also wenn Lichtausgang = 1 dann Jalousien 'runter und wenn Lichtausgang = 0 Jalousien hoch.

          Das Item, in dem ich den Codeblock anlege, ist die GA für den Lichtausgang, d.h. value sollte den entsprechenden Wert haben.
          Zuletzt geändert von DiMa; 11.09.2016, 20:19.

          Kommentar


            #6
            Hi,

            so rum geht es nur mit einem mehrzeiligen if. Habe ich noch nicht verwendet. Mir würde nur noch einfallen, beim Zielitem (also Jalousie) das Licht auswerten. Das ginge mit einem einzeiligen if.
            Oder Du wartest, bis Marcus oder jemand, der es schon verwendet hat, was hierzu sagt...

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Hallo,

              im Log wird doch wegen Zeile 2 gemeckert. Wie lautet denn der ganze Codeblock?

              Bis bald

              Marcus

              Kommentar


                #8
                Code:
                if value==True:            # 'an' oder "1" (ohne Anführungszeichen) führen zur gleichen Fehlermeldung[INDENT]cd.eg.wc.store.angle(255)[/INDENT]else:[INDENT]cd.eg.wc.store.angle(0)[/INDENT]
                Ist aber wie gesagt egal - auch wenn ich nur logger.info nach dem if-Statement verwende kommt die gleiche Fehlermeldung. Warum er Zeile 2 anmeckert, habe ich schon in meinem OP nicht verstanden - m.E. hängt er in Zeile 1, zumal er wie gesagt auch bei einem logger.info in Zeile 2 da nicht hin kommt.

                Kommentar


                  #9
                  Zitat von DiMa Beitrag anzeigen
                  Ich möchte wenn der PM das Licht einschaltet die Jalousien steuern, also wenn Lichtausgang = 1 dann Jalousien 'runter und wenn Lichtausgang = 0 Jalousien hoch
                  Und für was brauchst Du da externe Logik? Licht GA auf den Jalousiekanal und fertig!

                  Kommentar


                    #10
                    Hi Micha,

                    ich gehe mal davon aus, dass das nur die ersten Versuche von etwas komplizierterem sind, sonst hast Du natürlich recht...

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Hi Marcus,

                      ich habe das mal kurz mit 2 Items und dem CLI getestet. Bei mir kommt zwar keine Fehlermeldung, aber der code-Block wird gar nicht getriggert. Irgendwas ist bei den mehrzeiligen code-Blöcken noch nicht in Ordnung.

                      Gruß, Waldemar
                      OpenKNX www.openknx.de

                      Kommentar


                        #12
                        Zitat von mumpf Beitrag anzeigen
                        ich gehe mal davon aus, dass das nur die ersten Versuche von etwas komplizierterem sind, sonst hast Du natürlich recht...
                        So ist es. Wie ja auch im Code für Marcus (#8) zu erkennen, möchte ich bestimmte Werte übertragen (hier: Lamellenposition) und das ist nur mit der GA des Lichtausgangs nicht zu machen.

                        Kommentar


                          #13
                          Hi,

                          je nachdem, was Dein Aktor unterstützt, könntest Du das mit einer Szene machen, ohne Logik.

                          Ansonsten - als Workaround, solange der Bug von Marcus noch nicht gefixt ist, kannst Du das auch anders erreichen:
                          Mach Dir ein Item, dass die Lamellenposition setzt. Ich meine ein weiteres neues, nicht Dein eg.wc.store.angle, sowas wie:
                          Code:
                          [eg.wc.store.angle_automatic]
                              type = int
                              knx_send = x/y/z
                              enforce_updates = true
                              code = 255 if cd.<lichtitem>() else 0
                              trigger = <lichtitem>
                          (mit <lichtitem> ist der komplette Pfad vom Item, dass den Lichtausgang repräsentiert, gemeint)

                          So wird das funktionieren.

                          Gruß, Waldemar
                          Zuletzt geändert von mumpf; 13.09.2016, 09:24.
                          OpenKNX www.openknx.de

                          Kommentar


                            #14
                            Danke für die Tips - aber ich versuche gerade, auf callidomus umzustellen - bzw. mittlerweile muss ich sagen: Mich damit anzufreunden - und wenn es mit den verfügbaren Funktionen nicht geht, dann macht es keinen Sinn für mich, einen Workaround in callidomus zu suchen...

                            Ich könnte das ganze ja auch (so habe ich es unter smarthome.py gemacht, da läuft die Funktionalität ja bereits) in eine Logik auslagern - aber das interessante ist/wäre ja gerade, für so 08/15-Kram eben nicht mehr mit den mini-Python-Files hantieren zu müssen. Oder auch ein dediziertes item dafür anlegen zu müssen

                            Ansonsten kann ich ja auch bei smarthome.py bleiben.
                            Zuletzt geändert von DiMa; 13.09.2016, 09:36.

                            Kommentar


                              #15
                              Hallo,

                              bei mir funktioniert der Codeblock, gerade noch einmal getestet.

                              Ich habe ein Item (dev.eval) mit dem Typ Bool und dem Codeblock:

                              Code:
                              if value == '1':
                                  logger.info('Hello')
                              else:
                                  logger.info('no hello')
                              Wenn ich das Item über das CLI auf 1 setzte:
                              Code:
                              > up dev.eval = 1
                              Dann erscheint folgendes im Logfile:

                              Code:
                              2016-09-13 11:01:04,748 DEBUG Main Triggering dev.eval-code - caller: CLI source: 127.0.0.1:37182 dest: None value: {'dest': None, 'value': '1', 'caller': ' scheduler.py:trigger:210
                              2016-09-13 11:01:04,750 INFO dev.eval-code Hello -- <string>:<module>:2
                              DiMa : der Codeblock von Dir passt nicht zu der Fehlermeldung, das ist ein anderes Item. Bitte poste den Codeblock passend zu der Fehlermeldung.
                              mumpf : Bitte nicht so allgemeine Aussagen, wenn Du ein Problem mit der Evaluation hast, dann bitte mit Beispiel und Debuglog.

                              Bis bald

                              Marcus
                              Zuletzt geändert von callidomus; 13.09.2016, 14:15. Grund: Verweis auf unvollständige Logzeile entfernt

                              Kommentar

                              Lädt...
                              X