Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - LINKNX: timer condition regelmässig im definierten Zeitraum prüfen

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

    - √ - LINKNX: timer condition regelmässig im definierten Zeitraum prüfen

    Hallo Wissende,

    ich breche zusammen. Diese Triggerei bei den Conditions macht mich noch rasend.
    Mal wieder ein ganz triviales Problem, dass mich in den Wahnsinn treibt: Ich möchte, dass mir linknx auf dem Objekt "Urlaubsmodus" zwischen dem 11.08. und dem 06.09. ein true/"on" zurückliefert. Ich möchte aber nicht nur am Anfang und am Ende des Zeitraums die Action ausgelöst bekommen, sondern auch, wenn ich z.B. während des Zeitraums linknx neu starte. U

    Bei dieser Variante:
    Code:
    <rule id="Zeige_Urlaubsmodus">
                <condition type="and">
                    <condition type="timer" trigger="true">
                        <at day="11" month="8" hour="0" min="0" />
                        <until day="6" month="9" hour="0" min="0" />
                    </condition>
                </condition>
                <actionlist type="on-true">
                    <action type="set-value" id="Urlaubsmodus" value="on" />
                </actionlist>
                <actionlist type="on-false">
                    <action type="set-value" id="Urlaubsmodus" value="off" />
                </actionlist>
            </rule>
    wird einfach nur geprüft, aber kein "true" ausgelöst. Es wird allein der Task auf den 06.09. gerescheduled:

    2014-08-11 23:37:20 [ INFO] TimeSpec: 1899-8-11 0:0:0 (wdays=0; exception=2)
    2014-08-11 23:37:20 [ INFO] TimeSpec: 1899-9-6 0:0:0 (wdays=0; exception=2)
    2014-08-11 23:37:20 [ INFO] PeriodicTask: Rescheduled at 2014-9-6 0:0:0 (1409954400)

    Meine Idee war in der Folge einfach eine weitere Condition hinzuzufügen, mit der die Regel alle 1m (das war zum Testen) geprüft wird:

    Code:
    <rule id="Zeige_Urlaubsmodus">
                <condition type="and">
                    <condition type="timer">
                        <at day="11" month="8" hour="0" min="0" />
                        <until day="6" month="9" hour="0" min="0" />
                    </condition>
                    <condition type="timer" trigger="true">
                        <every>1m</every>
                    </condition>
                </condition>
                <actionlist type="on-true">
                    <action type="set-value" id="Urlaubsmodus" value="on" />
                </actionlist>
                <actionlist type="on-false">
                    <action type="set-value" id="Urlaubsmodus" value="off" />
                </actionlist>
            </rule>
    In diesem Fall bekomme ich aber mehrere ein- und aus-Signale, wobei dummerweise die finale Beurteilung "aus" zu sein scheint:

    2014-08-11 23:45:40 [ INFO] Rule: Evaluate rule Zeige_Urlaubsmodus
    2014-08-11 23:45:40 [ INFO] Condition: TimerCondition evaluated as '1'
    2014-08-11 23:45:40 [ INFO] Condition: TimerCondition evaluated as '1'
    2014-08-11 23:45:40 [ INFO] Rule: Rule Zeige_Urlaubsmodus evaluated as 1, prev value was 0
    2014-08-11 23:45:40 [ INFO] Rule: Evaluate rule Zeige_Urlaubsmodus
    2014-08-11 23:45:40 [ INFO] Condition: TimerCondition evaluated as '1'
    2014-08-11 23:45:40 [ INFO] Condition: TimerCondition evaluated as '0'
    2014-08-11 23:45:40 [ INFO] Rule: Rule Zeige_Urlaubsmodus evaluated as 0, prev value was 1
    2014-08-11 23:45:40 [ INFO] PeriodicTask: Rescheduled at 2014-8-11 23:46:40 (1407793600)
    2014-08-11 23:45:40 [ INFO] Action: Execute SetValueAction: set Urlaubsmodus with value on
    2014-08-11 23:45:40 [ INFO] KnxConnection: write(gad=1/7/29, buf, len=2)
    2014-08-11 23:45:40 [ INFO] Object: New value on for object Urlaubsmodus (type: 1.001)
    2014-08-11 23:45:40 [ INFO] Action: Execute SetValueAction: set Urlaubsmodus with value off
    2014-08-11 23:45:40 [ INFO] KnxConnection: write(gad=1/7/29, buf, len=2)
    2014-08-11 23:45:40 [ INFO] Object: New value off for object Urlaubsmodus (type: 1.001)
    2014-08-11 23:45:40 [ INFO] Object: New value on for object Urlaubsmodus (type: 1.001)
    2014-08-11 23:45:40 [ INFO] Object: New value off for object Urlaubsmodus (type: 1.001)
    2014-08-11 23:45:55 [ INFO] Object: New value off for object RM_OG_DL_Buero (type: 1.001)

    Ich verstehe auch nicht, warum die Timer-Condition einmal mit 1/1 und einmal mit 1/0 bewertet wird.....

    Da mit "at" und "until" ja eigentlich nur auf einen konkreten Termin geprüft wird, habe ich mich auch an "during" versucht, aber hier habe ich mangels Beispielen überhaupt keine funktionierende Syntax zusammen bekommen.

    #2
    Hi,

    bei timer-conditions sollte man mit initval arbeiten, wenn man das erreichen will, was Du möchtest:
    Code:
    <rule id="Zeige_Urlaubsmodus" >
                <condition type="and">
                    <condition type="timer" trigger="true" initval="guess">
                        <at day="11" month="8" hour="0" min="0" />
                        <until day="6" month="9" hour="0" min="0" />
                    </condition>
                </condition>
                <actionlist type="on-true">
                    <action type="set-value" id="Urlaubsmodus" value="on" />
                </actionlist>
                <actionlist type="on-false">
                    <action type="set-value" id="Urlaubsmodus" value="off" />
                </actionlist>
            </rule>
    Das sollte es schon sein! Falls nicht, versuch noch ein init="eval" bei der Rule.
    Wenn Du mit guess arbeitest, solltest Du unbedingt drauf achten, dass at und until die gleichen Attribute belegt haben. Wenn Du also z.B. mit weekdays arbeitest, dann immer bei at und until verwenden.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #3
      Zitat von mumpf Beitrag anzeigen
      Hi,

      bei timer-conditions sollte man mit initval arbeiten, wenn man das erreichen will, was Du möchtest:
      ...
      Das sollte es schon sein! Falls nicht, versuch noch ein init="eval" bei der Rule.
      Wenn Du mit guess arbeitest, solltest Du unbedingt drauf achten, dass at und until die gleichen Attribute belegt haben.
      Danke für den Tipp. initval hat keinen Unteschied gemacht. Warum ist diese Option nicht unter Linknx / Wiki / Condition&#39;s_Syntax beschrieben ? Wie soll man denn dann darauf kommen ?

      Ich habe jetzt bei der rule noch das init="eval" ergänzt damit schaut der Codeschnipsel jetzt so bei mir aus:

      Code:
      <rule id="Zeige_Urlaubsmodus" init="eval">
                  <condition type="and">
                      <condition type="timer" trigger="true" initval="guess">
                          <at day="11" month="8" hour="0" min="0" />
                          <until day="6" month="9" hour="0" min="0" />
                      </condition>
                  </condition>
                  <actionlist type="on-true">
                      <action type="set-value" id="Urlaubsmodus" value="on" />
                  </actionlist>
                  <actionlist type="on-false">
                      <action type="set-value" id="Urlaubsmodus" value="off" />
                  </actionlist>
              </rule>
      Leider ohne Erfolg ... es findet laut Log nur die Intitialisierung der Rule statt.

      Ist die Rule standardmässig true, so dass ich statt on-true if-true wählen müsste ?

      Kommentar


        #4
        Hi,

        dann würde mir noch - wie unter Linknx / Wiki / Linknx_rules_on_startup beschrieben, bei der rule ein init="True" einfallen.

        Sonst muss ich leider passen.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Hallo Waldemar,
          leider hat das alles nichts gebracht. Es findet partout keine initiale Bewertung der Regel statt.
          Was ich nicht verstehe ist, dass wenn ich z.B. einen Timer für "every 5m" hinzufüge (vgl. in meinen letzten Posts) durchaus die Regel geprüft wird, die Bewertung erst positiv ausfällt, gleich danach aber negativ.
          Warum bewertet linknx die Regel zweimal ???

          Kommentar


            #6
            OK, dann eben die nicht so schöne Lösung

            Erstmal zur Erklärung: Timer conditions sind so beschrieben, wie es sich verhält: Ein every oder ein at (ohne until) wird zum angegebenen Zeitpunkt true und anschließend sofort wieder false, und das AND mit der anderen condition ergibt das von Dir beobachtete Verhalten.

            Bei linknx muss man sich sowieso drang gewöhnen, die Regeln immer für den True- und den False-Fall zu betrachten (selbst wenn man nur den True-Fall braucht).

            Die Lösung hier ist eine conditional action. Über den Timer machst Du ein every 5 Minuten (oder was Du auch immer brauchst).
            In der actionlist (on-true) machst Du dann:
            Code:
                  <action type="conditional">
                            <condition type="timer">
                                <at day="11" month="8" hour="0" min="0" />
                                <until day="6" month="9" hour="0" min="0" />
                            </condition>
                            <action type="set-value" id="Urlaubsmodus" value="on" />
                  </action>
                  <action type="conditional">
                       <condition type="not">
                            <condition type="timer">
                                <at day="11" month="8" hour="0" min="0" />
                                <until day="6" month="9" hour="0" min="0" />
                            </condition>
                       </condition>
                       <action type="set-value" id="Urlaubsmodus" value="off" />
                  </action>
            Das wird so wahrscheinlich funktionieren, ist aber extrem hässlich, eigentlich sollten ja Timer zu Anfang evaluiert werden - achja, ich hoffe, Du verwendest linknx-Version >.30, denn ab da geht das mit initval erst überhaupt. Und noch was: Urlaubsmodus darf natürlich nicht gecached sein (persist="true" bei der Objektdefinition", denn falls es true ist, wird dann ein erneutes True nicht wieder verschickt)

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Zitat von mumpf Beitrag anzeigen
              Das wird so wahrscheinlich funktionieren
              und das tut es auch ! Ich hatte mich schon gefragt, wie man die conditional actions einsetzt ;-). Vielen Dank mal wieder für die kompetente und fixe Hilfe. Mal schauen woran ich als nächstes scheitere :-))

              Thorsten

              Kommentar


                #8
                Zitat von mumpf Beitrag anzeigen
                OK, dann eben die nicht so schöne Lösung

                Das wird so wahrscheinlich funktionieren, ist aber extrem hässlich, eigentlich sollten ja Timer zu Anfang evaluiert werden - achja, ich hoffe, Du verwendest linknx-Version >.30, denn ab da geht das mit initval erst überhaupt.
                Wie > .30 ? Ich habe 0.0.1.30 drauf und laut linknx wiki ist das auch die letzte Version. Nicht?

                Kommentar


                  #9
                  Sorry, ich meinte >= .30!
                  Ich dachte, ich hatte schon .31 gesehen, aber das mag auch die svn-Version gewesen sein!
                  Gruß, Waldemar
                  OpenKNX www.openknx.de

                  Kommentar

                  Lädt...
                  X