Ankündigung

Einklappen
Keine Ankündigung bisher.

Repeater Rule

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

    Repeater Rule

    Hallo,
    ich hätte eine Frage an die Experten
    Ich habe bei mir sowohl TwistedPair-KNX als auch Powernet-KNX im Einsatz. Powernet KNX ist nicht so 100% verlässlich, weshalb ich mir mit wiederholtem Senden von Befehlen behelfe. Sprich, wenn ein Powernet Schalter geschaltet werden soll, dann sende ich den Befehl zweimal im Abstand von einer Sekunde.
    Diese Behelfslösung habe ich für alle Powernet-Schalter in den entsprechenden Rules stehen.
    Mein Wunsch wäre eine generelle "Repeater Rule", die darauf hört, ob ein Powernet Befehl abgesetzt wurde. Wenn dies der Fall ist, dann soll der Befehl einfach wiederholt werden.
    Hat wer eine gute Idee, wie das realisiert werden kann?

    Wie kann z.B. die Rule getriggert werden, ohne alle Items aufführen zu müssen?
    Wie kann ich mit einem allgemeinen Code ein Ereignis eines Items einfangen und dieses wiederholen?

    Viele Grüße
    Michael

    #2
    Idee für eine generelle Rule habe ich nicht. Du könntest aber ein Lambda im Sinner einer Funktion programmieren, welches z.B. das sendCommand ersetzt und diesem dann den Item un das Command mitgeben und das Lambda macht dann das repeaten.

    Thomas

    Kommentar


      #3
      Hi Thomas,

      klingt schon mal so, als hättest Du Ahnung ... mir sagt Dein Vorschlag aber leider nix. Hast Du vielleicht einen Tipp, wo ich das nachlesen kann? Ich bin kein Java Entwickler, nur ein Anwender.
      Wie triggert diese Rule denn?
      Michael

      Kommentar


        #4
        Im Wiki gibt es eine Seite, in der Lambdas verwendet werden. Allerdings ist das Beispiel schon etwas komplexer. Dein Problem ist ja auch, dass Du die Befehlswiederholung wohl absetzen willst, wenn ein Befehl ausgelöst wurde. Vermutlich wirst Du da mit Lambdas nicht weiter kommen.

        Eventuell könnte man alle betreffenden Items in einer Group (OR ON:OFF) zusammen fassen. Wenn sich was an der Gruppe ändert, müsste eine Rule herausfinden, was sich geändert hat und den Befehl wiederholen. Ich vermute aber, dass ein Group Item kein Rule triggern kann.

        Kommentar


          #5
          Ein Group Item kann schon eine Rule triggern, aber ein "changed" reicht nicht, da ja mehrere Items in der Gruppe z.B. ON sein können. Trotzdem sollen hinzukommende ONs erkannt werden.
          Ich denke auch, dass ich mit den Lambdas nicht weiterkomme. Ich habe eben mal versucht zu verstehen, was da passiert und auf meinen Anwendenungsfall kann ich das nicht wirklich reflektieren.

          Kommentar


            #6
            Ja, die Frage ist, wenn ich z.B. die Gruppe mit einem Zähler versehe, also Group:Switch:OR(ON, OFF) GPowernet , kann ich eine Rule darauf triggern lassen, dass sich der Zählerstand geändert hat? Denn dann könnte diese Rule die Gruppe abklappern und z.B. nachschauen, wann sich ein Item zuletzt geändert hat, also z.B. so:
            Code:
            rule "Powernet Repeater"
            when
                Item GPowernet changed
            then
                GPowernet?.members.forEach(Item|
                    if (Item.changedSince(now.minusMillis(10)))
                        Item.sendCommand(Item.state)
                    )
            end
            Aber ich fürchte, so einfach wird es nicht sein. Nebenbei schummle ich natürlich bei meinem Lösungsvorschlag, es könnte sein, dass 10msec als Reaktionszeit zu viel/zu wenig sind, also vielleicht die Rule zwar feuert, aber trotzdem keine Wiederholung geschickt wird, weil bis zum Abfragen des historicState mehr als 10msec vergangen sind (die Laufzeit der Schleife ist hier ja direkt von der Mächtigkeit der Gruppe abhängig). Der gegenteilige Fall sollte aber nicht passieren, weil sich die Gruppe durch die Befehlswiederholung ja nicht mehr ändern sollte, also die Rule auch kein zweites mal getriggert wird. Soviel zur Theorie...

            Natürlich müsste die Gruppe in der Standard-Persistence mit everyChange vermerkt sein, damit changedSince funktionieren kann

            Kommentar


              #7
              Hier würde ich gerne nochmal verstehen, was du genau mit senden von befehlen meinst? Meinst du das senden mit sendCommand in einer Rule oder das senden, wenn Du in der Oberfläche z.B. einen Switch umlegst, der direkt mit einem Aktor gekoppelt ist?

              was Du auch bedenken solltest ist, dass Rules, die auf das Kommando reagieren sollen dann immer zweimal reagieren.

              Thomas

              Kommentar

              Lädt...
              X