Ankündigung

Einklappen
Keine Ankündigung bisher.

Rules - Benutzerdefinierter Status - Kennt jemand eine Lösung?

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

    Rules - Benutzerdefinierter Status - Kennt jemand eine Lösung?

    Hallo
    Ich würde gerne in OH2 einen benutzerdefinierten Status verwenden und mit der "changed to" Regel darauf reagieren.

    Items:
    Code:
    String HausStatus // Soll die Werte PRESENT, AWAY, PARTY, etc. beinhalten
    Regel:

    Code:
    rule "Abwesend"
    when
        Item HausStatus changed to AWAY 
    then
        // Aktionen beim Verlassen des Hauses
    end
    
    rule "Gaeste"
    when
        Item HausStatus changed to PARTY 
    then
        // Aktionen für die Party 
    end
    Das funktioniert so natürlich nicht, da nach "changed to" wohl eine State Klasse oder Rule Klasse oder was auch immer folgen muss. Daher wird die Regel nie ausgeführt. Kennt jemand hierfür eine saubere Lösung?


    Ein Workaround wäre folgender:

    Code:
    rule "Status Wechsel"
    when
        Item HausStatus changed  
    then
       if (HausStatus.status == 'AWAY') {
          // Aktionen beim Verlassen des Hauses
    }
       if (HausStatus.status == 'PARTY') {
          // Aktionen beim Verlassen des Hauses
    }
      // u.s.w
    
    end
    Das endet dann aber in ziemlichen Spaghetti Code, was ich nicht möchte. Und auch die Idee, für jeden Status einen Switch einzuführen, führt zu unübersichtlichem Code. Ich suche quasi einen ENUM Ersatz.


    #2
    Wenn ich es richtig im Kopf habe, funktioniert changed momentan nicht mit String items (es gab dazu auch einen issue)

    Die Frage ist aber erst mal, wie das Item seinen Status bekommt - Du hast kein Binding angeben. Falls es sich um ein ungebundenes Item handelt, welches also nur über die UI oder Regeln gesteuert wird, wäre es am einfachsten, stattdessen ein Number Item mit mapping einzusetzen:

    items/my.items:
    Code:
    Number HausStatus "Haus Status [MAP(housestate.map):%s]"
    transform/housestate.map:
    Code:
    0=away
    1=present
    2=party
    -=not set
    sitemaps/my.sitemap:
    Code:
    switch item=HausStatus mappings=[0="away",1="present",2="party"]
    Dann klappt es in der Rule mit changed to 0 oder auch mit if((HausStatus.state as Number)==0), oder Du nutzt switch ... case:
    rules/my.rules:
    Code:
    rule "Haus Status"
    when
        Item HausStatus changed
    then
        if(HausStatus.state instanceof Number) {
            switch(HausStatus.state as Number) {
                case 0: {
                    logInfo("housestate","Haus Status: Niemand ist da!")
                    // mach was
                }
                case 1: {
                    logInfo("housestate","Haus Status: Jemand ist da!")
                    // mach was anderes
                }
                case 2: {
                    logInfo("housestate","Haus Status: Party!")
                    // mach party
                }
                default: {
                    logWarn("housestate","unerlauber Hausstatus: {}",HausStatus.state)
                }
            }
        }
    end
    default wird dabei abgearbeitet, falls kein anderer Fall zutrifft.

    Kommentar


      #3
      Danke, gute Idee! ja so kann das auch gelöst werden.
      Leider funktioniert es nicht mit Konstanten - somit sieht der Code nicht ganz so schöne aus, überall "Magic Numbers" :-(((
      Zuletzt geändert von misa; 05.08.2017, 19:05.

      Kommentar


        #4
        Grundsätzlich sollte es ja mit Text auch gehen, nur im Moment halt nicht... Aber wenn der Issue mal bearbeitet ist, wird das sicher auch wieder funktionieren.

        Kommentar


          #5
          Hallo udo1toni: Danke für die Info. Klingt gut.
          Ich habe mal geforscht: Das Issue gibt es wohl schon seit Mitte 2016 und wird wohl erst mal nicht behoben. Ich werde daher mal mit den Workarounds arbeiten.

          Kommentar


            #6
            Hallo,
            ich verwende zur besseren Lesbarkeit meiner Rules in einem solchen Fall einfach Konstanten:

            val PRESENT = 1
            val AWAY = 2
            val PARTY = 3

            oder mit Typ vorne
            val HAUSSTATUS_PRESENT = 1
            val HAUSSTATUS_AWAY = 2
            val HAUSSTATUS_PARTY = 3

            Leider kann man die bei "WHEN" nicht verwenden.
            Zuletzt geändert von EckartF; 18.04.2020, 11:44.

            Kommentar

            Lädt...
            X