Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Threads abbrechen oder manipulieren ?

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

    - √ - Threads abbrechen oder manipulieren ?

    Hallo zusammen,

    ich will mir einen retriggerbaren Timer "zusammenbasteln" und komme da gerade nicht wirklich weiter, vielleicht habt Ihr da eine Idee:

    Mein Ansatz war, in der logic.conf eine logic wie folgt zu triggern:
    Code:
    [light_delay]
      filename = light_delay.py
      knx_dpt = 5
      knx_listen = 1/3/0
    Die Logic selbst dimmt eigentlich nur das Licht und verzögert in 2 Stufen- das hab' ich quick and dirty mal wie folgt aufgesetzt:
    Code:
    dimval = trigger['value']
    if sh.nightlight ():
              sh.light_sync.w.fade(dimval, stepping, timeinc)
    if not sh.nightlight ():
              sh.light_sync.w.fade(2, stepping, timedec)
              time.sleep (300)
              sh.light_sync.w.fade(0, stepping, timedec)
    Prinzpiell funktioniert das auch. Nur habe ich das Problem, das bei mehrfachem Triggern entsprechend mehrere Threads gestartet werden, die dann (in meinem Fall) auch noch auf dem gleichen DMX Kanal herumturnen.

    Gibt es eine einfache Möglichkeit per logic.conf einen bereits gestarteten Thread abzubrechen oder zur Laufzeit dessen Parameter zu manipulieren (ohne globale Variablen)?

    Gruss
    Jochen.

    #2
    Threads abbrechen oder manipulieren ?

    Vielleicht hat Marcus noch ne bessere Idee, aber du könntest doch einfach das Threadhandle bei deiner Logik hinterlegen. Wenn diese dann erneut aufgerufen wird holst du dir das Handle und stoppst den Thread.
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      Hallo Jochen,

      Ich verstehe den Code zwar nicht so ganz. Ich würde erwarten, wenn das "Nachtlicht" An/True ist das dann auf 2 gedimmt wird und nicht andersrum. Aber egal.

      Naa, ich würde nicht mit den Theads rumfummeln.
      Mit dem change setze ich den Wert für den nächsten Logikaufruf und überschreibe Ihn bei mehrmaligen aufrufen. Weiterhin habe ich auf github Code eincheckt der ein paralleles faden verhindert.

      Ich habe den Code nicht laufen lassen, kann sein das noch kleine Fehler drin sind!

      Code:
      stepping = 1
      timeinc = 1
      dimval = trigger['value']
      
      if sh.nightlight():
          sh.light_sync.w.fade(dimval, stepping, timeinc)
      else:
          if dimval == 0:
              sh.light_sync.w.(0)
          else:
              sh.light_sync.w.fade(2, stepping, timedec)
              next_time = sh.now() + dateutil.relativedelta.relativedelta(seconds=300)
              sh.scheduler.change('light_delay', next=next_time, value=0)
      Bis bald

      Marcus

      Kommentar


        #4
        Hallo Markus,

        super, vielen Dank für die schnelle Rückmeldung- auch Dir 2ndsky.
        Der Ansatz mit dem Scheduler ist charmant- werde ich mich direkt ransetzen und testen, sobald hier keiner mehr durch's Haus schlappt

        Zitat von mknx Beitrag anzeigen
        Weiterhin habe ich auf github Code eincheckt der ein paralleles faden verhindert.
        Auch hierfür vielen herzlichen Dank!

        Der Vollständigkeit halber:
        Zitat von mknx Beitrag anzeigen
        Ich verstehe den Code zwar nicht so ganz. [...]. Aber egal.
        Beim Hochdimmen kommt die Stellgröße vom BWM/PM und hängt von Betriebszuständen und Zeiten ab.
        Das Herunterdimmen bzw. Abschalten erfolgt dann in 2 Stufen: Beim Aus-Telegramm vom BWM/PM wird zunächst auf eine Standby-Helligkeit abgedimmt und erst nach einer gewissen Verweilzeit ganz abgeschaltet.

        Gruss
        Jochen.

        Kommentar


          #5
          Hallo Marcus,

          also, ich hab's noch ein bischen umgefrickelt und es funzt jetzt. Der Ansatz das per Scheduler zu machen war ne super Idee. Nochmals vielen Dank.

          Gibt es sowas wie eine kurze Doku oder Beispiele zu den Scheduler Methoden (speziell "add")? Ich hab's mir zwar mal im Code angesehen, aber das hab ich nicht mal eben schnell durch.

          Gruss
          Jochen.

          Kommentar


            #6
            Hallo Jochen,
            Zitat von Dragonos2000 Beitrag anzeigen
            Hallo Marcus,
            Gibt es sowas wie eine kurze Doku oder Beispiele zu den Scheduler Methoden (speziell "add")?
            nein, dafür gibt es keine User-Doku. Die Scheduler-Klasse ist eigentlich intern.
            Mit der add Methode werden inter Methoden/Logiken und das setzen von Itemwerten zu dem Zeitplan hinzugefügt. Das ist evtl. für Plugin-Schreiber interessant die Methoden zu einem Zeitpunkt oder Intervall ausführen lassen wollen.
            Mit change kann man bestehen "Aufträge" ändern.
            Die letzte Methode ist trigger und die ist ja dokumentiert.

            hth

            Marcus

            Kommentar


              #7
              Hallo zusammen!

              Ich habe hier eine ähnliche Idee und Lösung, wollte aber mal kurz checken, ob es hier nicht was Nobleres gibt. Falls nicht könnte der Code ja noch für den einen oder anderen hilfreich sein..

              Anforderung: Ich möchte über 2 KNX Taster zwei verschiedene Playlisten vie Squeezebox laden und abspielen. Dabei soll sowohl beim Start als auch beim Ausschalten langsam gefadet werden. Wechsle ich während des Fadens die Playliste, soll normal weiter gefadet werden, jetzt aber eben mit der anderen Musik. Sollte ich während des Fadeout auf die Idee kommen, ich möchte doch noch weiter hören, soll das auch ohne Komplikation funktionieren.

              Die Lösung sieht nun bei mir so aus:
              Beide KNX Taster triggern "leere" Squeezeboxitems, die dem Triggern einer Logik dienen. Die entsprechende Playliste wird geladen und dann wird ein separates "Fade"-Item auf den gewünschten Lautstärkewert gesetzt, was wiederum eine eigene Fade-Logik und damit einen eigenen Thread aufruft. Diese sieht nun wie folgt aus:

              Code:
              logger.info(trigger)
              vol = sh.Squeezebox.Volume()
              stepping = 2
              time = 25000
              vol_playlist1 = 70
              vol_playlist2 = 55
              
              goal = trigger['value']
              
              logger.debug("Erhaltener Wert: "+str(goal))
              
              if goal > 0:
                  logger.debug("Run Fade In")
                  vol += stepping
                  sh.Squeezebox.Volume(vol)
                  if (vol + stepping) > goal:
                     logger.debug("Ende Fade In. Stop")
                     sh.Squeezebox.Volume(goal)
                     # alle Dinge, die passieren sollen, sobald fertig gefadet ist.
                     exit()
                  else:
                       next_time = sh.now() + dateutil.relativedelta.relativedelta(microseconds=time)
                       sh.scheduler.change('vol_fade', next=next_time, value=goal)
              
              if goal == 0:
                  logger.debug("Run Fade Out")
                  vol -= stepping
                  sh.Squeezebox.Volume(vol)
                  if (vol - stepping) <= goal:
                     logger.debug("Ende Fade Out. Status aus")
                     sh.Squeezebox_KG.Power(0)
                     logger.debug("Squeezebox aus.")
                     # alle Dinge, die passieren sollen, sobald fertig gefadet ist.
                     exit()
                  else:
                       next_time = sh.now() + dateutil.relativedelta.relativedelta(microseconds=time)
                       sh.scheduler.change('vol_fade', next=next_time, value=goal)
              Any hints? Mit dem fade-Attribut hat es bei mir irgendwie nur bedingt und sehr eingeschränkt geklappt..

              Kommentar

              Lädt...
              X