Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Frage zu Plugin's (Multitasking und Timer)

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] - √ - Frage zu Plugin's (Multitasking und Timer)

    Hallo Zusammen.

    Ich hab mal wieder eine Frage zu den Perl Plugins. Für eine spezielle Steuerung brauche ich einen Timer, der nach dem aufrufen des Plugin 5 Sekunden auf ein Ereigniss (KNX Telegramm) wartet.

    Es geht um folgendes. Für die Multiroomsteuerung stehen mir 8 Tasten zur Verfügung. 3 Tasten werden für Ein/Aus, Lauter und Leiser benötigt. Nun möchte ich die übrigen 5 Tasten folgendermassen auswerten...

    Ich habe eine Umschalttaste und 4 "Kurzwahltasten" (alle mit LED). Mit der Umschalttaste möchte ich die 4 Kurzwahltasten doppelt belegen. Das soll dann so aussehen:

    Taste1 normal = Playliste1
    Taste1 mit aktivierter Umschalttaste = Fernseher

    Taster2 normal = Playliste2
    Taster2 mit aktivierter Umschalttaste = Radio

    usw...

    Wenn nun die Umschalttaste gedrückt wird, wird die Status-LED Blau und die 4 LED der Kurzwahltasten gehen aus. Wird nun innerhalb von 5 Sekunden eine Kurzwahltaste gedrückt, bleibt die blaue LED der Umschalttaste an und die LED der gedrückten Kurzwahltaste wird grün.

    Wenn die Umschalttaste gedrückt wird, und nach 5 Sekunden noch keine Kurzwahltaste gedrückt wurde, soll die LED der Umschalttaste wieder ausgehen und die vorher mit grün beleuchtete Kurzwahltaste (aktuelle Quelle) wieder angezeigt werden.

    Um das ganze etwas zu veranschaulichen hab ich mal ein Bild angehängt.


    Jetzt könnte ich mit einer Schleife das Programm küstlich für 5 Sekunden anhalten aber das klingt nicht sehr smart. Vor allem frage ich mich an der Stelle, was wärend den 5 Sekunden auf dem WG geschieht. Verarbeitet das WG parallel mehrere Pluginaufrufe (Multitasking) oder blokiere ich die gesammte Datenverarbeitung aller Plugins. Oder gibt es eine Art Timerevent, dass ein Plugin automatisch nach 5 Sekunden nochmals aufruft, wenn nicht in der Zwischenzeit durch ein anderes event (KNX Telegramm) der Timer deaktiviert wird?

    Ich weiss, ist wieder mal eine Sonderlocke von mir Aber der Effekt wäre schon Cool
    Angehängte Dateien
    Gruss Patrik alias swiss

    #2
    Zitat von swiss Beitrag anzeigen
    Jetzt könnte ich mit einer Schleife das Programm küstlich für 5 Sekunden anhalten aber das klingt nicht sehr smart. Vor allem frage ich mich an der Stelle, was wärend den 5 Sekunden auf dem WG geschieht. Verarbeitet das WG parallel mehrere Pluginaufrufe (Multitasking) oder blokiere ich die gesammte Datenverarbeitung aller Plugins. Oder gibt es eine Art Timerevent, dass ein Plugin automatisch nach 5 Sekunden nochmals aufruft, wenn nicht in der Zwischenzeit durch ein anderes event (KNX Telegramm) der Timer deaktiviert wird?
    Ist leider nicht parallel, d.h. Du blockierst alles.
    Einen Timer hätte ich mich auch schon öfters gewünscht, ist aber direkt nicht möglich.

    Die Lösung sind zwei Werte, die das Plugin intern speichern muss:
    1. Den Zustand (des Zustandsautomaten) also so etwas wie "warte auf ersten Tastendruck" oder "warte auf zweiten Tastendruck"
    2. Dein Zeitpunkt des ersten Tastendrucks

    Wenn das zweite Telegramm eintrifft, der Zustand auf "warte auf zweiten Tastendruck" steht und der Zeitstempel des ersten Telegramms keine 5 Sekunden her ist: Bingo
    TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

    Kommentar


      #3
      Hallo Chris

      Danke für deine Hilfe. Schade dass das WG nicht mehrere Plugins paralell abarbeiten kann.

      Zitat von Chris M.
      Die Lösung sind zwei Werte, die das Plugin intern speichern muss:
      1. Den Zustand (des Zustandsautomaten) also so etwas wie "warte auf ersten Tastendruck" oder "warte auf zweiten Tastendruck"
      2. Dein Zeitpunkt des ersten Tastendrucks
      Hmmm...

      Das Problem ist, dass das Plugin die Zustände der LED automatisch nach Ablauf der 5 Sekunden, wenn nichts gedrückt wurde zurücksetzen soll. Also kann ich leider nicht erst beim eintreffen des nächsten Telegramms (nächster Pluginaufruf) die Bedingugn überprüfen.

      Mir ist aber etwas anderes eingefallen...

      Könnte man nicht folgende Variabel zu diesem Zweck missbrauchen?:

      Code:
      $plugin_info{$plugname.'_cycle'} = 300;
      Wenn man da die Variabel ja nach dem ob die Umschalttaste gedrückt wurde oder nicht, beeinflussen könnte, wüde das doch gehen oder?

      Also z.B.

      if $umschalttaste = 1
      $plugin_info{$plugname.'_cycle'} = 5;
      else
      $plugin_info{$plugname.'_cycle'} = 300;

      Ist das eine Möglichkeit oder gibt es noch eine andere Lösung
      Gruss Patrik alias swiss

      Kommentar


        #4
        Zitat von swiss Beitrag anzeigen
        $plugin_info{$plugname.'_cycle'} = 5;
        Exakt das hätte ich jetzt auch geschrieben
        Du musst dir halt Deine Stati merken (in plugin_info{$plugname.'_xyz'} auch persistent über restarts) und dann beim zyklischen Aufruf entsprechend reagieren/resetten.
        Um es zu gedanklich zu entwirren könnte man auch zwei Plugins verwenden, eins mit _cycle = 0 das nur bei Bedarf nach ablauf aufgerufen wird. Du musst nur "wissen" wie es heisst, $plugname ist einfach nur der (Datei)name des Plugins.

        Den immer stattfindenden einmaligen Aufruf eines Plugins nach einem restart kann man z.B. mit
        Code:
        if ($plugin_initflag) {..
        ist 0 beim ersten Aufruf nach restart und danach 1, wenn man also den cycle auf 0 setzt wird das Plugin subsequent nur noch aufgerufen wenn der cycle auf etwas > 0 verändert wird oder ein Telegramm eintrifft.


        Das war (Threading, Timer,..) ursprünglich alles etwas anders gedacht, aber bevor ich jetzt Seitenlang rumheule warum das mit dem Multithreading und Perl ein totales Trümmerfeld ist: ist derzeit so
        -> Alles was blockiert ist schlecht, sehr schlecht.
        Einen Timer könnte man schon einbauen, _cycle ist aber richtig benutzt eigentlich dasselbe und in der verfügbaren Zeit suche ich lieber eine Lösung wie man das parallelisiert

        Makki
        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
        -> Bitte KEINE PNs!

        Kommentar

        Lädt...
        X