Ankündigung

Einklappen
Keine Ankündigung bisher.

Zählen von Zuständen...mit komischen Ergebnissen

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

    Zählen von Zuständen...mit komischen Ergebnissen

    Hi,

    ich möchte gerne die "ON"-Zustände von bis zu vier KNX Geräten zählen und habe dazu diese Regel gebaut:

    Code:
    rule "KellerAndereSchalterON"
    
    when
      Item KNX_K_sL_Uhren received update or
      Item KNX_K_sL_Werkstatt received update or
      Item KNX_K_sL_Vorrat received update or
      Item KNX_K_sL_Wasch received update
    then
      //
      if (Dbg_Kellerlicht.state == ON) {logDebug("DEBUGMSG", "   IN OTHER CHANGED")}
      CL_NumberOfOther.postUpdate(0)
      if ((CL_Uhren.state == ON) && (KNX_K_sL_Uhren.state == ON)) {
          CL_NumberOfOther.postUpdate(CL_NumberOfOther.state as DecimalType + 1)
      }
      if (Dbg_Kellerlicht.state == ON) {logDebug("DEBUGMSG", "   Number 1:  " + CL_NumberOfOther.state)}
    
      if ((CL_Werkstatt.state == ON) && (KNX_K_sL_Werkstatt.state == ON)) {
          CL_NumberOfOther.postUpdate(CL_NumberOfOther.state as DecimalType + 1)
      }
      if (Dbg_Kellerlicht.state == ON) {logDebug("DEBUGMSG", "   Number 2:  " + CL_NumberOfOther.state)}
    
      if ((CL_Vorrat.state == ON) && (KNX_K_sL_Vorrat.state == ON)) {
          CL_NumberOfOther.postUpdate(CL_NumberOfOther.state as DecimalType + 1)
      }
      if (Dbg_Kellerlicht.state == ON) {logDebug("DEBUGMSG", "   Number 3:  " + CL_NumberOfOther.state)}
    
      if ((CL_Wasch.state == ON) && (KNX_K_sL_Wasch.state == ON)) {
          CL_NumberOfOther.postUpdate(CL_NumberOfOther.state as DecimalType + 1)
      }
      if (Dbg_Kellerlicht.state == ON) {logDebug("DEBUGMSG", "   Number of Others is: " + CL_NumberOfOther.state)}
    
    end
    KNX_K_sL_xxxx steht dabei für 4 Aktoren (für die 4 Infragekommenden Räume im Keller), die CL_xxxx Switche dienen dazu, die Relevanz für die Zählung konfigurierbar zu machen. Insgesamt soll also im Number-Item CL_NumberOfOther die Anzahl der eingeschalteten und relevanten Aktoren erscheinen.

    Zwei Probleme habe ich:

    1. Wird während der Laufzeit der Rule ein zweiter Schalter betätigt, läuft die Rule ein zweites Mal an, die Ergebnisse, weil in einem Item gespeichert sind eher zufällig.

    Frage dazu: ist es möglich, die sequentielle Abarbeitung der Rule zu erzwingen? Für mein Empfinden würde zwar die Umstellung auf eine Variable einen Teil des Problems lösen, aber meine Erfahrungen mit Variablen zeigen, dass die gerne mal plötzlich undefiniert sind.

    2. Wenn ich KNX_K_sL_Uhren betätige, bekomme ich wie erwartet das hier:

    Code:
    2017-01-14 21:45:07 -    IN OTHER CHANGED
    2017-01-14 21:45:07 -    Number 1:  1
    2017-01-14 21:45:07 -    Number 2:  1
    2017-01-14 21:45:07 -    Number 3:  1
    2017-01-14 21:45:07 -    Number of Others is: 1
    Mit betätigen von KNX_K_sL_Vorrat wird es aber das hier:
    Code:
    2017-01-14 21:46:39 -    IN OTHER CHANGED
    2017-01-14 21:46:39 -    Number 1:  0
    2017-01-14 21:46:39 -    Number 2:  1
    2017-01-14 21:46:39 -    Number 3:  2
    2017-01-14 21:46:39 -    Number of Others is: 2
    und das leuchtet mir nicht so recht ein. Einzige Möglichkeit, die mir einfällt, ist, dass die Addition länger dauert, und der nachfolgende Befehl (die Anzeige) schon vor Fertigstellung ausgeführt wird.

    Kann da jemand bei mir mal einen Geisteblitz zünden?

    Gruß
    Peter

    #2
    So ganz verstehe ich nicht, was Du da eigentlich zählen willst. Vielleicht hab ich den Code falsch verstanden, aber wie ich den Code verstehe, passiert folgendes:
    1. Die Rule wird grundsätzlich aufgerufen, wenn eines der vier Items irgendwas empfängt (update).
    2. Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus
    3. Setze CL_NumberOfOther auf 0.
    4. Falls CL_Uhren.state == ON und KNX_K_sL_Uhren.state == ON erhöhe CL_NumberOfOther um 1.
    5. Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus.
    6. Punkte 4 und 5 wiederholen sich mit anderen Itempaaren.
    7. Zum Abschluss: Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus.


    Ob (und wenn ja wann) gezählt wird, hängt also davon ab, welche Items zum Zeitpunkt der Ruleausführung gerade an sind, und welche nicht.
    Was möchtest Du als Ergebnis haben? Die Anzahl der eingeschalteten Aktoren? Die Anzahl der Einschaltvorgänge?

    Für Ersteres benötigst Du überhaupt keine Rule, sondern Du baust einfach eine Gruppe, die Du den Items zuordnest:
    Code:
    Group:Switch:OR(ON,OFF) gMyGroup "Anzahl eingeschaltete Aktoren[%d]"
    Switch KNX_K_sL_Uhren (gMyGroup)
    Switch KNX_K_sL_Werkstatt (gMyGroup)
    Switch KNX_K_sL_Vorrat (gMyGroup)
    Switch KNX_K_sL_Wasch (gMyGroup)
    Für die Anzahl der Einschaltvorgänge müsstest Du die Trigger auf changed to ON ändern und natürlich den Zählerstand persistieren. Ich mag aber auch einfach die Aufgabenstellung nicht richtig begriffen haben
    Zuletzt geändert von udo1toni; 15.01.2017, 19:50. Grund: Typo (vergessener Doppelpunkt...)

    Kommentar


      #3
      Hi,

      du hast es schon richtig verstanden
      1. Die Rule wird grundsätzlich aufgerufen, wenn eines der vier Items irgendwas empfängt (update). --- genau
      2. Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus --- genau... Das ist nur fürs Debugging
      3. Setze CL_NumberOfOther auf 0. --- genau
      4. Falls CL_Uhren.state == ON und KNX_K_sL_Uhren.state == ON erhöhe CL_NumberOfOther um 1. --- genau, wenn CL_Uhren = ON, dann soll dieser Zustand mitgezählt werden, sonst nicht
      5. Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus. --- genau...um den Zwischenstand anzuzeigen
      6. Punkte 4 und 5 wiederholen sich mit anderen Itempaaren. --- genau
      7. Zum Abschluss: Falls Dbg_Kellerlicht.state == ON gib eine Meldung aus. --- genau


      > Ob (und wenn ja wann) gezählt wird, hängt also davon ab, welche Items zum Zeitpunkt der Ruleausführung gerade an sind, und welche nicht.
      > Was möchtest Du als Ergebnis haben? Die Anzahl der eingeschalteten Aktoren? genau das brauche ich. Die Anzahl der Einschaltvorgänge? eher nicht.

      Code:
      Group:Switch:OR(ON,OFF) gMyGroup "Anzahl eingeschaltete Aktoren[%d]"
      Switch KNX_K_sL_Uhren (gMyGroup)
      Switch KNX_K_sL_Werkstatt (gMyGroup)
      Switch KNX_K_sL_Vorrat (gMyGroup)
      Switch KNX_K_sL_Wasch (gMyGroup)
      Wie komme ich dann in einer Rule an das Ergebnis ran? Aber wenn ich es richtig sehe, kann ich die Auswahl über die CL_xxxx Items nicht eingrenzen, oder?

      Für die Abfrage des Zählergebnisses in einer Rule wäre meine Vermutung:

      Code:
      gMyGroup.state as DecimalType
      Und könnte die CL_xxxx Einbindung so aussehen, dass ich 4 Gruppen bilde, die jeweils eine UND Verknüpfung von KNX_K_sL_xxxx und CL_xxxxx bilden und die Ergebnisgruppen dann wie in deinem Konstrukt beschrieben verknüpft werden?

      Könnte klappen, könnte klappen (Quelle: Das Boot. LI)

      Vielen Dank fürs schubsen.... gerne noch weiter, aber ich hab zumindest mal eine Idee.

      Gruß
      Peter

      Kommentar


        #4
        Na die Frage ist ja, was willst Du damit bezwecken? Du könntest grundsätzlich innerhalb einer Rule über die Gruppe zählen:
        Code:
        rule...
        then
            var Int myCounter = 0
            gMyGroup.members.forEach(i|if(i.state==ON)myCounter=MyCounter + 1)
            logDebug("myRule","myCounter = {}",myCounter)
        end
        Oder, vielleicht noch eleganter:
        Code:
        rule...
        then
            var myGroup = gMyGroup.members.filter(i|i.state==ON)
            logDebug("myRule","myGroup = {}",myGroup.size)
        end
        Um dann dynamisch Elemente zu berücksichtigen oder nicht, müsstest Du die Namen der Items geschickt wählen, dann kannst Du im Filterbereich (oder bei forEach mit if()) den Namen der items vergleichen, mit i.name. Im englischen Forum gibt es dazu recht umfangreiche Codebeispiele, ich bin aber grade zu faul, danach zu suchen
        Die Herausforderung ist dabei vor allem, den Itemnamen so zu wählen, dass Du ihn bequem innerhalb der Rule zusammensetzen kannst, also in Abhängigkeit der Auswahl.

        Kommentar

        Lädt...
        X