Ankündigung

Einklappen
Keine Ankündigung bisher.

Cycle in Logik ändern

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

  • Msinn
    antwortet
    Nein, ich ändere bei meinen Tests auch den cycle Parameter Logik aus der laufenden Logik heraus...

    Code:
    #!/usr/bin/env python3
    # a_testlogic_temp.py
    
    logic.logger.warning("a_testlogic_temp was triggered")
    
    sh.scheduler.change('logics.a_testlogic_temp', cycle={70: None})
    logic.logger.warning("cycle value set to 70")
    
    #sh.scheduler.change('logics.a_testlogic_temp', cycle="{80: None}")
    #logic.logger.warning("cycle value set to 80")
    zwischen den beiden Varianten schalte ich durch Änderung der kommentierten Zeilen hin und her und Sichere+Starte nur die Logik neu.

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    Ich führe die Änderung in der jeweiligen Logik durch (also während der Laufzeit der Logik) - Könnte das der Unterschied sein?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Ich verstehe es nicht mehr. Bei mir laufen die Varianten 2 und 3 durch

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    Variante 1: Weiterhin unauffällig

    Variante 2: (cycle={60, None})
    Code:
    2020-08-01 10:57:46 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 551, Method: _next_time, Exception: 'set' object has no attribute 'keys'
    > Traceback (most recent call last):
    > File "/usr/local/smarthome/lib/scheduler.py", line 632, in _task
    > exec(obj.bytecode)
    > File "/usr/local/smarthome/logics/washing_machine.py", line 70, in <module>
    > sh.scheduler.change(name='logics.washing_machine', cycle={60, None})
    > File "/usr/local/smarthome/lib/scheduler.py", line 528, in change
    > self._next_time(name)
    > File "/usr/local/smarthome/lib/scheduler.py", line 551, in _next_time
    > cycle = list(job['cycle'].keys())[0]
    > AttributeError: 'set' object has no attribute 'keys'
    Variante 3: cycle="{60, None}")
    Code:
    2020-08-01 11:01:17 ERROR logics.washing_machine Logic: logics.washing_machine, File: /usr/local/smarthome/lib/scheduler.py, Line: 551, Method: _next_time, Exception: 'set' object has no attribute 'keys'
    > Traceback (most recent call last):
    > File "/usr/local/smarthome/lib/scheduler.py", line 632, in _task
    > exec(obj.bytecode)
    > File "/usr/local/smarthome/logics/washing_machine.py", line 70, in <module>
    > sh.scheduler.change(name='logics.washing_machine', cycle="{60, None}")
    > File "/usr/local/smarthome/lib/scheduler.py", line 528, in change
    > self._next_time(name)
    > File "/usr/local/smarthome/lib/scheduler.py", line 551, in _next_time
    > cycle = list(job['cycle'].keys())[0]
    > AttributeError: 'set' object has no attribute 'keys'

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von SMarcus Beitrag anzeigen
    ist das Ziel schon erreicht, oder?
    Für Dich schon, wenn jemand aber nicht (nur) die Zykluszeit setzen will, sondern den Wert mit dem die Logik aufgerufen wird, reicht da noch nicht.
    Ich habe einen weiteren Fix gepusht (der Scheduler ist die von mir am meisten gehasst Komponente: Komplex, bei Änderungen fehleranfällig und schlecht dokumentiert. Ich habe zwar schon etwas aufgeräumt, bin aber immer noch nicht am Boden des Schedulers angekommen )


    Zitat von SMarcus Beitrag anzeigen
    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.
    Das hatte ich oben schon geschrieben. Das Attribut wird nur beim initialisieren der Logik gesetzt. (andere Baustelle)

    Zitat von SMarcus Beitrag anzeigen
    Gibts eine Möglichkeit den "aktuellen" Cycle auszulesen?
    Bisher nicht. Dazu muss ich die 'andere Baustelle' lösen (nachdem ich den Scheduler nun hoffentlich gefixt habe).

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    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?

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    Martin, sorry - gib mir kurz Zeit. Irgendwas stimmt grade nicht....

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    Aber ich denke mit

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

    ist das Ziel schon erreicht, oder?

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    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'

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    SMarcus Ich habe einen Fix gepusht.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Die Warnung hatte ich vergessen auszubauen. Den Fehler bei Variante 2 schaue ich mir noch mal an.

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    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.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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'}")

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • SMarcus
    antwortet
    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....

    Einen Kommentar schreiben:

Lädt...
X