Ankündigung

Einklappen
Keine Ankündigung bisher.

OH2: in Rules rechnen

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

    OH2: in Rules rechnen

    Hallo zusammen,

    ich bekomme es nicht hin, eine einfach Subtraktion in einer rules auszuführen und bräucht wieder einmal Eure Hilfe.

    Ich möchte meine tägliches Gieß-Wasser ausrechnen.
    Dazu bekomme ich über MQTT die absolute Wassermenge (Wasser_Garten_Liter) in Liter übertragen.
    Nun habe ich mir noch 2 Variablen angelegt, mit denen ich rechnen möchte.

    Die rules "WasserMenge merken" wird kurz vor Mitternacht ausgeführt, damit ich weiß wie viele Liter ich für die heutige Berechnung abziehen muss.
    Die rules "aktuelleWasserMenge" wird jedes Mal ausgeführt, wenn ein neuer Liter im Garten verschwindet und soll von der absoluten Literzahl die gemerkten Liter von gestern Nacht abziehen.
    >> quasi so: [WasserMenge_heute = Wasser_Garten_Liter - WasserMenge_gestern]

    items:
    Code:
    String        Wasser_Garten_Liter    "Wassermenge L: [%s]"        <faucet>        {mqtt="<[oh2mqtt:110/liter_all:state:default]"}
    Number        WasserMenge_gestern
    Number        WasserMenge_heute
    rules:
    Code:
    rule "WasserMenge merken"
        when
            Time cron "0 59 23 * * ?"  // jeden Tag um 23:59 Uhr
        then
            //Abspeicherung der Wassermenge für spätere Berechnungen
            WasserMenge_gestern.state = Wasser_Garten_Liter.state
    end
    
    
    rule "akuelleWasserMenge"
        when
            Item Wasser_Garten_Liter changed
        then
            WasserMenge_heute = Wasser_Garten_Liter.state - WasserMenge_gestern.state
    end
    Leider bekomme ich immer folgende Fehlermeldung:
    Code:
    2018-06-29 12:38:05.775 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'akuelleWasserMenge': Unknown variable or command '-'; line 221, column 24, length 53
    Wie muss so eine Berechnung korrekt aussehen?
    Ich stehe irgendwie auf meinem (Garten-)schlauch ;-)

    Vielleicht fällt Euch ja auch eine andere Lösung ein, die mich ans Ziel bringen könnte?
    Ich wäre Euch sehr dankbar!

    Grüße
    Martin
    Zuletzt geändert von mortyPi; 02.07.2018, 21:05.

    #2
    probier mal
    Code:
     
     WasserMenge_heute = (Wasser_Garten_Liter.state  as DecimalType) - (WasserMenge_gestern.state as DecimalType)
    Holger

    Kommentar


      #3
      Da WasserMenge_heute ein Item ist, musst Du auch die Methode (oder alternativ die Action) zum Ändern des Status verwenden:
      Code:
      WasserMenge_heute.postUpdate((Wasser_Garten_Liter.state as Number) - (WasserMenge_gestern.state as Number))
      Das Gleiche gilt sinngemäß natürlich auch für die erste Rule.
      Zuletzt geändert von udo1toni; 29.06.2018, 16:27. Grund: Klammern verbessert..

      Kommentar


        #4
        udo1toni Das es Items waren hab ich gar nicht gesehen. Bei dem postUpdate von dir fehlen noch 2 Klammern.
        Was macht eigentlich den Unterschied von as Number oder as DecimalType aus?

        Kommentar


          #5
          Zitat von HolgerW Beitrag anzeigen
          Bei dem postUpdate von dir fehlen noch 2 Klammern.
          Stimmt. Korrigiert, Danke!
          Was macht eigentlich den Unterschied von as Number oder as DecimalType aus?
          der Unterschied ist, dass DecimalType allgemeiner ist, was dazu führt, das openHAB eventuell nicht weiß, ob es die Zahl dann als Float oder als Integer behandeln soll. Der Typ Number vermeidet dies.
          Allgemein wurde früher(TM) immer DecimalType empfohlen, seit OH2 soll aber wenn möglich Number verwendet werden.

          Kommentar


            #6
            Danke, als OH1 User ist DecimalType dann ja ok, ich schiebe aber oft noch ein .intValue hinterher

            Kommentar


              #7
              Vielen Dank für Eure Tipps.
              Aber es will immer noch nicht so ganz.

              Ich habe die Rules nun wie folgt abgeändert.
              Code:
              rule "WasserMenge merken"
                  when
                      Time cron "0 59 23 * * ?"  // jeden Tag um 23:59 Uhr
                  then
                      //abspeicherung der Wassermenge für spätere Berechnungen
                      WasserMenge_gestern.postUpdate(Wasser_Garten_Liter.state as Number)
                      WasserMenge_heute.postUpdate(0)
              end
              
              rule "akuelleWasserMenge"
                  when
                      Item Wasser_Garten_Liter changed
                  then
                      logInfo("Garten >>>", "Wasser_Garten_Liter changed; ")
                      WasserMenge_heute.postUpdate((Wasser_Garten_Liter.state as Number) - (WasserMenge_gestern.state as Number))
              end
              Leider bekomme ich eine Fehlermeldung, wenn nun auch eine ander:
              Code:
              2018-07-01 21:34:20.681 [INFO ] [se.smarthome.model.script.Garten >>>] - Wasserkreis 2: ON
              2018-07-01 21:34:28.128 [INFO ] [se.smarthome.model.script.Garten >>>] - Wasser_Garten_Liter changed;
              2018-07-01 21:34:28.143 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'WasserMenge_merken': Could not cast 5 to java.lang.Number; line 218, column 33, length 35
              2018-07-01 21:34:33.113 [INFO ] [se.smarthome.model.script.Garten >>>] - Wasser_Garten_Liter changed;
              2018-07-01 21:34:33.126 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'WasserMenge_merken': Could not cast 6 to java.lang.Number; line 218, column 33, length 35
              2018-07-01 21:34:38.145 [INFO ] [se.smarthome.model.script.Garten >>>] - Wasser_Garten_Liter changed;
              2018-07-01 21:34:38.157 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'WasserMenge_merken': Could not cast 7 to java.lang.Number; line 218, column 33, length 35
              2018-07-01 21:34:40.004 [INFO ] [se.smarthome.model.script.Garten >>>] - Wasserkreis 2: OFF
              (Der Werte 5, 6 und 7 in der Fehlermeldung ist sind die aktuellen Liter-Werte von dem Item "Wasser_Garten_Liter")

              Kommentar


                #8
                Wasser_Garten_Liter sollte eigentlich auch vom Typ Number sein, nicht vom Typ String. Falls das nicht geht (mqtt sollte das eigentlich unterstützen), musst Du den Wert parsen lassen:
                Code:
                var Number nLiter = Integer::parseInt([FONT=courier new]Wasser_Garten_Liter.state.toString[/FONT])

                Kommentar


                  #9
                  Hallo udo1toni,

                  wieder einmal vielen Dank für Deine Hilfe!
                  ich habe es nun mit folgendem Code ans Laufen bekommen:
                  Code:
                  rule "akuelleWasserMenge"
                      when
                          Item Wasser_Garten_Liter changed
                      then
                          logInfo("Garten >>>", "Wasser_Garten_Liter changed; ")
                  
                          var Number nLiter = Integer::parseInt(Wasser_Garten_Liter.state.toString)
                          WasserMenge_heute.postUpdate((nLiter) - (WasserMenge_gestern.state as Number))
                  end
                  Schön, das es solche Wissenträger gibt, die auch immer online sind und Leuten wie mir unermüdlich helfen!
                  Und natürlich auch Danke an die andern fleißigen Helfer hier im Forum!

                  Danke
                  Martin

                  Kommentar

                  Lädt...
                  X