Ankündigung

Einklappen
Keine Ankündigung bisher.

Cycle in Logik ändern

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

    Cycle in Logik ändern

    Hallo,

    laut Doku ist es möglich den cycle einer Logik zu ändern. Beispiele hierzu habe ich nicht gefunden, deshalb habe ich es mit

    Code:
    sh.scheduler.change(name='logics.washing_machine', cycle=cycle_new)
    versucht, allerdings bekomme ich folgenden Fehler:

    Code:
    2020-07-31 11:42:44 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 455, Method: _next_time, Exception: 'int' object has no attribute 'keys'
    > Traceback (most recent call last):
    > File "/usr/local/smarthome/lib/scheduler.py", line 527, in _task
    > exec(obj.bytecode)
    > File "/usr/local/smarthome/logics/washing_machine.py", line 64, in <module>
    > sh.scheduler.change(name='logics.washing_machine', cycle=cycle_new)
    > File "/usr/local/smarthome/lib/scheduler.py", line 432, in change
    > self._next_time(name)
    > File "/usr/local/smarthome/lib/scheduler.py", line 455, in _next_time
    > cycle = list(job['cycle'].keys())[0]
    > AttributeError: 'int' object has no attribute 'keys'
    Kann mir da jemand helfen?

    Gruss
    Marcus

    #2
    Du versuchst den Wert für cycle in der Logik selbst zu ändern.
    Wie wäre es, einfach das in der Doku beschriebene Attribut cycle des logic Objektes innerhalb der Logik neu zu setzen?
    Code:
        logic.cycle = 600
    Nachtrag: Ich habe gerade gesehen, dass das Attribut r/o ist, also nicht wirkt.

    Den genauen Syntax von scheduler.change muss ich erst nachsehen. (Habe ich nie verwendet).
    Zuletzt geändert von Msinn; 31.07.2020, 11:55. Grund: Nachtrag ergänzt
    Viele Grüße
    Martin

    There is no cloud. It's only someone else's computer.

    Kommentar


      #3
      Der cycle Parameter bei scheduler.change ist kein numerischer Wert, sondern ein dict.

      In dem dict wird die Zykluszeit zusammen mit dem Wert der gesetzt werden soll übergeben. Wenn nur die Zykluszeit übergeben werden soll, kann als Wert None übergeben werden:

      Code:
      sh.scheduler.change(name='logics.washing_machine', cycle={cycle_time, value})
      wobei cycle_time ein integer Wert und value ein String (oder None) sein müssen.

      Für Deinen Fall also:
      Code:
      sh.scheduler.change(name='logics.washing_machine', cycle={cycle_new, None})
      Übrigens: Mir ist dabei aufgefallen. dass in der Admin GUI die veränderte Zeit in der Spalte Cycle im Moment nicht angezeigt wird. Dort wird nur der in der ../etc/logic.yaml konfigurierte Wert angezeigt.
      Viele Grüße
      Martin

      There is no cloud. It's only someone else's computer.

      Kommentar


        #4
        Irgendwas passt noch nicht.

        Code:
        sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
        führt zu:

        Code:
        2020-07-31 13:34:02 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 455, Method: _next_time, Exception: 'set' object has no attribute 'keys'
        > Traceback (most recent call last):
        > File "/usr/local/smarthome/lib/scheduler.py", line 527, in _task
        > exec(obj.bytecode)
        > File "/usr/local/smarthome/logics/washing_machine.py", line 61, in <module>
        > sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
        > File "/usr/local/smarthome/lib/scheduler.py", line 432, in change
        > self._next_time(name)
        > File "/usr/local/smarthome/lib/scheduler.py", line 455, in _next_time
        > cycle = list(job['cycle'].keys())[0]
        > AttributeError: 'set' object has no attribute 'keys'
        Gruss
        Marcus

        Kommentar


          #5
          Hmmm... Bei mir funktioniert es. Nimm mal einen leeren String statt None. Was passiert dann?

          Hat die Logik vorher bereits einen cycle Wert?
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Gleiche Fehlermeldung mit leerem String:

            Code:
            sh.scheduler.change(name='logics.washing_machine', cycle={60, ''})
            Ja, die Logik hat einen vordefinierten cycle Wert, aber auch ohne diesen Wert bekomme ich die Fehlermeldung....

            Kommentar


              #7
              Ich bin mal in den Untiefen des Schedulers verschwunden und habe dabei festgestellt, dass es ein sinnvolles Handling in der scheduler.change Methode nur für cron und active gibt.

              Ohne Änderung am Scheduler wird das nichts. Das kann ich aber zeitnah machen, falls Du in der Lage bist dle Datei lib/scheduler.py aus dem Develop Branch in Deine Installation zu kopieren.
              Viele Grüße
              Martin

              There is no cloud. It's only someone else's computer.

              Kommentar


                #8
                Ich habe im develop eine neue Version des schedulers gepusht. cheduler.change() akzeptiert für den Parameter cycle jetzt analog zu cheduler.add() die gleichen Werte.

                Mit der neuen Version können folgende Varianten angegeben werden:

                Code:
                # nur Zykluszeit
                sh.scheduler.change(<Logik Name>, cycle=60)
                
                # dict mit Zykluszeit und Wert
                sh.scheduler.change(<Logik Name>, cycle={60, None})
                sh.scheduler.change(<Logik Name>, cycle={60, 'zu setzender Wert'})
                
                # dict mit Zykluszeit und Wert als String kodiert
                sh.scheduler.change(<Logik Name>, cycle="{60, None}")
                sh.scheduler.change(<Logik Name>, cycle="{60, 'zu setzender Wert'}")
                Viele Grüße
                Martin

                There is no cloud. It's only someone else's computer.

                Kommentar


                  #9
                  mit lib/scheduler.py aus Develop:

                  Variante 1:
                  Code:
                  sh.scheduler.change(name='logics.washing_machine', cycle=60)
                  Es funktiniert, aber es gibt ein Warning im log:
                  Code:
                  2020-07-31 17:24:27 WARNING lib.scheduler scheduler.change: logics.washing_machine: 60, type = type(kwargs[key])=<class 'int'>
                  2020-07-31 17:24:27 WARNING lib.scheduler scheduler.change: logics.washing_machine: cycle entry {60: None}

                  Variante 2:
                  Code:
                  sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
                  Code:
                  2020-07-31 17:26:05 WARNING lib.scheduler scheduler.change: logics.washing_machine: {None, 60}, type = type(kwargs[key])=<class 'set'>
                  2020-07-31 17:26:05 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 512, Method: change, Exception: local variable '_cycle' referenced before assignment
                  > Traceback (most recent call last):
                  > File "/usr/local/smarthome/lib/scheduler.py", line 628, in _task
                  > exec(obj.bytecode)
                  > File "/usr/local/smarthome/logics/washing_machine.py", line 61, in <module>
                  > sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
                  > File "/usr/local/smarthome/lib/scheduler.py", line 512, in change
                  > kwargs[key] = _cycle
                  > UnboundLocalError: local variable '_cycle' referenced before assignment

                  Variante 3:
                  Code:
                  sh.scheduler.change(name='logics.washing_machine', cycle="{60, None}")
                  Funktiniert nicht, Warning im log:
                  Code:
                  2020-07-31  17:39:11 WARNING  lib.scheduler       scheduler.change: Invalid cycle entry for logics.washing_machine {60, None}
                  Zuletzt geändert von SMarcus; 31.07.2020, 16:43. Grund: Variante 3 funktioniert nicht.

                  Kommentar


                    #10
                    Die Warnung hatte ich vergessen auszubauen. Den Fehler bei Variante 2 schaue ich mir noch mal an.
                    Viele Grüße
                    Martin

                    There is no cloud. It's only someone else's computer.

                    Kommentar


                      #11
                      SMarcus Ich habe einen Fix gepusht.
                      Viele Grüße
                      Martin

                      There is no cloud. It's only someone else's computer.

                      Kommentar


                        #12
                        Variante 1: Funktioniert, Warnings sind weg.

                        Variante 2:
                        Code:
                        2020-07-31 18:08:27 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 554, Method: _next_time, Exception: 'set' object has no attribute 'keys'
                        > Traceback (most recent call last):
                        > File "/usr/local/smarthome/lib/scheduler.py", line 635, in _task
                        > exec(obj.bytecode)
                        > File "/usr/local/smarthome/logics/washing_machine.py", line 61, in <module>
                        > sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
                        > File "/usr/local/smarthome/lib/scheduler.py", line 531, in change
                        > self._next_time(name)
                        > File "/usr/local/smarthome/lib/scheduler.py", line 554, in _next_time
                        > cycle = list(job['cycle'].keys())[0]
                        > AttributeError: 'set' object has no attribute 'keys'
                        Variante 3:
                        Code:
                        2020-07-31 18:10:47 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 554, Method: _next_time, Exception: 'set' object has no attribute 'keys'
                        > Traceback (most recent call last):
                        > File "/usr/local/smarthome/lib/scheduler.py", line 635, in _task
                        > exec(obj.bytecode)
                        > File "/usr/local/smarthome/logics/washing_machine.py", line 61, in <module>
                        > sh.scheduler.change(name='logics.washing_machine', cycle="{60, None}")
                        > File "/usr/local/smarthome/lib/scheduler.py", line 531, in change
                        > self._next_time(name)
                        > File "/usr/local/smarthome/lib/scheduler.py", line 554, in _next_time
                        > cycle = list(job['cycle'].keys())[0]
                        > AttributeError: 'set' object has no attribute 'keys'

                        Kommentar


                          #13
                          Aber ich denke mit

                          sh.scheduler.change(name='logics.washing_machine', cycle=60)

                          ist das Ziel schon erreicht, oder?

                          Kommentar


                            #14
                            Martin, sorry - gib mir kurz Zeit. Irgendwas stimmt grade nicht....

                            Kommentar


                              #15
                              Okay - sh.scheduler.change(name='logics.washing_machine', cycle=60) funktioniert,

                              aber anscheinend übernimmt 'logic.cycle' den geänderten cycle nicht sondern zeigt immer den auf der Logik - Parameter manuell eingetragenen Wert. Daher wahrscheinlich auch die "falsche" Admin GUI Angabe.

                              Gibts eine Möglichkeit den "aktuellen" Cycle auszulesen?

                              Kommentar

                              Lädt...
                              X