Ankündigung

Einklappen
Keine Ankündigung bisher.

Zustandsautomaten: Tipps und Tricks

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

    [callidomus] Zustandsautomaten: Tipps und Tricks

    Hi,

    ich glaube (und hoffe), dass es zu den Zustandsautomaten einige Fragen im Sinne von "Wie löse ich folgendes Problem" geben wird. Und da ich mich schon länger mit den Dingern beschäftige und immer mehr über Zustandsautomaten löse, wollte ich damit anfangen, einige Ideen und eher allgemeine "Patterns" zu teilen.

    Ich fange mit was simplen an: Sperre

    Um einen Zustandsautomaten zu sperren, macht man einfach einen ersten (obersten) Zustand mit dem Namen "Sperre". Der fragt dann einfach ein Item "Sperre" ab (das wiederum z.B. durch eine GA gesetzt werden kann) auf true ab. Der Zustand hat keine Actions und tut somit nichts.
    Sperre.PNG
    Erklärung:
    Immer wenn der Automat ausgewertet (getriggert) wird, durchläuft er zuerst die Bedingungen für den Zustand "Sperre". Wenn das Sperritem nun gesetzt ist, bleibt der Zustandsautomat in diesem Zustand und tut somit gar nichts.
    Erst wenn das Sperritem auf false steht, kann der Zustandsautomat überhaupt weitere Zustände auswerten.

    Warum gibt es keine Eigenschaft "Sperren" direkt an dem Zustandsautomaten?
    Weil das über einen Zustand flexibler zu gestalten ist! Man kann so etwas ausdrücken wie: die Rollos/Jalousien sind gesperrt, aber bei Rauchalarm gehen die trotzdem hoch (indem man den Zustand "Rauchalarm" vor dem Zustand "Sperre" definiert wird). Das ginge mit einer globalen Sperre am Zustandsautomaten nicht.

    Weitere (erstmal einfache) Sachen werden nach und nach folgen.

    Gruß, Waldemar
    OpenKNX www.openknx.de

    #2
    Szenario ich hab 3 Szenen. Die Will ich von einem Schalter immer weiter schalten. Also wenn die Szene1 ist will ich wenn das Weiter Signal kommt auf 2 gehen von 2 auf 3 und von 3 auf 1. Wie mache ich das am einfachsten?
    VG
    Jürgen

    Kommentar


      #3
      Hi Jürgen,

      eigentlich hast Du den Zustandsautomaten schon oben beschrieben...

      Du willst weiter schalten können, dazu brauchst Du ein Item:
      Code:
      [Weiter]
          type = bool
          enforce_updates = true
      Nehmen wir an, Deine Zustände heißen One, Two, Three. Dem Zustandsautomaten sagst Du dann:
      Code:
      Trigger: Weiter
      Init: One
      
      One:
          enter:
              state == Three
              trigger == Weiter
      Two:
          enter:
              state == One
              trigger == Weiter
      Three:
          enter:
              state == Two
              trigger == Weiter
      Gruß, Waldemar
      OpenKNX www.openknx.de

      Kommentar


        #4

        Und wie schaut ein State in State z.b. Three in Callidomus aus? Das ist mir jetzt nicht 100% wie man state == Two und trigger = Weiter in die Formulare einträgt.

        Kommentar


          #5
          Hi Jürgen,

          hier ein Beispiel:
          ZustandMitTrigger.PNG

          Gruß, Waldemar
          OpenKNX www.openknx.de

          Kommentar


            #6
            Okay danke Auslöser Evaluation...dahinter der name es Items. Was mich jetzt wundert das Szene ohne eine Regel funktionieren.

            Kommentar


              #7
              Hi Jürgen,
              ich verstehe Deine Frage nicht. Das oben ist ein Zustandsautomat, der seine Zustände über ein trigger-item weiterschaltet. Das hat erstmal mit Szenen nichts zu tun.
              Erst wenn du diesen Automaten an ein Item mit DPT 18 hängst und den Zuständen Werte zuweist, werden Szenen draus.
              Gruß Waldemar
              OpenKNX www.openknx.de

              Kommentar


                #8
                Hi Waldemar,
                genau das habe ich vor der Zustandsautomat soll einerseits über Szenen geschaltet werden und anderseits über den Schalter Weiter. Wenn ich Szenen an einen Zustandsautomat anschliest geht das ohne das ich eine Regel im Zustandsautomat definiert habe. Wie funktioniert das im Zusammenspiel? Warum muss ich nicht noch in dem Bild oben eine Weitere Eingangsgruppe haben wo ich Zustannd == Two steht?.
                Viele Grüsse
                Jürgen

                Kommentar


                  #9
                  Hi Jürgen,

                  ich bin mir immer noch nicht sicher, ob ich Dein Ziel korrekt verstehe, ich versuche das mal allgemeiner zu beschreiben:

                  Ein Zustandsautomat kann auf 3 verschiedene Arten einen Zustand annehmen:
                  1. Automatisch (evaluate genannt)
                    Hierbei werde alle Regeln (conditions) ausgewertet und der erste Zustand, dessen Regeln erfüllt sind, wird angenommen.
                  2. Extern
                    Hierbei wird das Item, dem der Zustandsautomat zugeordnet ist (an dem der Zustandsautomat "hängt") auf einen anderen Wert gesetzt. Das kann dabei der Name des Zustandes sein oder ein Wert, der auch einem Zustand zugewiesen ist. Hierbei spielen Regeln (conditions) KEINE Rolle, es können sogar nicht aktive Zustände angenommen werden.
                  3. Init
                    Beim Initialisieren wird auch ein Zustand angenommen, dieser kann aus dem cache kommen, explizit benannt sein (also wie Extern) oder automatisch ermittelt werden
                  Das ist generisch und funktioniert immer, auch in beliebiger Kombination. Szenen sind nichts anderes, als Fall 2 (Externes setzen) mit einer kleinen Erweiterung, wenn es um das speichern von Szenen geht (was hier aber nicht Thema ist).

                  Ich hoffe, das reicht als Erklärung. Gerade im Zusammenhang mit Szenen ist eine "Eingangsgruppe", also eine weitere Regel, nicht sinnvoll, da sie sowieso nicht ausgewertet wird.

                  Gruß, Waldemar

                  OpenKNX www.openknx.de

                  Kommentar


                    #10
                    Hi Waldemar,

                    Hauptziel ist es den Zustandsautomaten zu begreifen! Und da ich verschiedene Internas noch nicht kenne scheitert es halt oft an banalen dingen.
                    Wenn man nicht weiss was passiert wenn man ein Einstellung macht kann man das auch nicht benutzen. Das mit den Externen aufrufen von zuständen ist mir nicht so richtig klar geworden. Ich habe immer gedacht das die SM angeworfen wird und es versteckte Regeln gibt die abgearbeitet werden.

                    Zu meinem Beispiel.

                    Was ich aber hier will ist über eine Taste mehrer Szene abrufen ein Szenenwahlschalter sozusagen. Meine Szenen sind wenn möglich zu 100% in KNX abgebildet da das in diesem Fall so ist muss ich auch nix lernen.

                    Ich glaube das ich mit deine Erklärungen jetzt soweit bin das ich das hinbekomme.

                    Viele Grüsse & Danke
                    Jürgen

                    Kommentar


                      #11
                      Hi Jürgen,

                      dann sind wir uns ja einig - ich habe versucht, die Konzepte zu beschreiben, dann hilft das hoffentlich auch anderen. Ich helfe auch gerne zu konkreten Beispielen, nur war ich mir in dem Fall nicht sicher, was Du genau willst. Versuch es erstmal so wie Du es verstanden hast, und falls dann noch was unklar ist, frag einfach.

                      Gruß, Waldemar
                      OpenKNX www.openknx.de

                      Kommentar


                        #12
                        Hallo (Waldemar),

                        ich möchte gerne einen Zustandsautomaten bauen, der prüft, ob die Helligkeit außen über 500 Lumen liegt und dann alle Außenlampen abschaltet.

                        Ich habe eine SM gebaut, an das Item mit der Außenhelligkeit gebunden, einen Status angelegt "Lampen aus", der als Bedingung Item Wert >= 500 hat und als Aktion alle (Außen-)Lampen ausschaltet. Diese SM habe ich dann zyklisch alle 5m ausführen lassen (zum Testen). Damit habe ich aber irgendwie gerade mein System lahm gelegt. Ich vermute ich habe alle 5 Minuten nun eine SM gestartet, die sich in einem undefinierten Zustand befindet.

                        Frage 1) Wie wäre es richtig gewesen?
                        Frage 2) Ich komme nicht mehr per SSH auf callidomus, dass Admininterface liefert ebenfalls einen Timeout, aber die Oberfläche läuft noch. Habe ich außer "Stecker ziehen" noch eine Chance?

                        Gruß
                        Thomas

                        Kommentar


                          #13
                          Hi Thomas,

                          zur Frage 2 möchte ich Dich an callidomus verweisen, eigentlich sollte das nicht passieren und ich mir bei den ganzen Tests, die ich auch in der Beta-Phase gemacht habe, nicht passiert.

                          Zu Frage 1:
                          Ich gehe mal davon aus, dass Du mit "an das Item gebunden" den Selektor des Zustandsautomaten meinst und nicht die Selektoren der einzelnen Bedingungen (conditions).
                          Hier dürfte das Problem liegen (zumindest eine Mitbeteiligung): Das Item, an das der Zustandsautomat gebunden wird, dient zur Speicherung der Zustände. Jetzt ist es das Item, dass die Helligkeit angibt. Dieses Item kommt in einer Regel vor (>500) und triggert damit den Zustandsautomaten. Der daraufhin einen neuen Zustand annehmen will und dieses in das Item schreiben will, dessen Typ womöglich nicht passt oder womöglich den Zustandsautomaten neu triggert. Um hier genaueres zu sagen, müsstest Du die Logs schicken.

                          Wie macht man es richtig? Erstmal ein Grundsatz: Der Zustandsautomat sollte nie an ein Item gebunden sein, das seinerseits eine "Eingabegröße" des Automaten darstellt (Theoretisch ist das denkbar, aber dann sollte man exakt wissen, was man tut). Ich verwende immer ein extra Item oder das Item, dass ich eigentlich steuern will (also die "Ausgabegröße" des Automaten).

                          In Deinem Beispiel könntest Du den Automaten an das Item hängen, dass die Außen-Lampen schaltet. Und dann einen Zustand "Aus" mit dem Wert 0 und der Bedingung "Außenhelligkeit > 500" definieren.

                          Wenn Du kein einzelnes Item hast, dass alle Außen-Lampen schaltet, sondern nur einzelne Items, die einzelne Lampen schalten, dann nimmst Du für den Automaten ein extra Item, machst wieder den Zustand "Aus" mit der Bedingung "Außenhelligkeit > 500" und für jede Lampe eine Aktion "itemname ( 0 )".

                          Ist das verständlich genug? Sonst müssen wir ein konkretes Beispiel aufbauen.

                          Gruß, Waldemar
                          OpenKNX www.openknx.de

                          Kommentar


                            #14
                            Hallo Waldemar,

                            Zitat von mumpf Beitrag anzeigen
                            Ist das verständlich genug? Sonst müssen wir ein konkretes Beispiel aufbauen.
                            Ja, sehr. Vielen Dank.

                            Wir kann ich jetzt die Prüfung ausführen lassen? Bzw. alle 10 Minuten oder so, dass müsste ja nicht sekündlich geprüft werden.

                            Gruß
                            Thomas

                            Kommentar


                              #15
                              Ich würde es immer Triggern wenn ein Sensorwert reinkommt.
                              VG
                              Jürgen

                              Kommentar

                              Lädt...
                              X