Ankündigung

Einklappen
Keine Ankündigung bisher.

Mit Items rechnen

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

    Mit Items rechnen

    Hallo Zusammen,
    leider habe ich nichts gefunden was mir weiterhilft.
    Ich habe folgendes Problem. Ich lese mit dem http Binding meine PV Anlage aus.
    Diese liefert mir 3 Werte (1.Wert=Eingangsleistung, 2.Wert Hausverbrauch, 3.Wert Netzeinspeisung)
    Wenn ich nun 1.Wert - 2.Wert - 3.Wert = 4.Wert.
    Der 4.Wert ist dann das was in den Batteriespeicher geht leider bekomme ich das in den Reglen nicht hin.

    Das ist meine aktuelle Regel:
    rule "Batterieladen"
    when
    Item Eingang_PV changed
    then

    Batteriespeisung.postUpdate(Eingang_PV.state as DecimalType - Ausgangsleistung.state as DecimalType - Eigenverbrauch.state as DecimalType)
    end

    vllt. kann mir ja jmd weiterhelfen.

    Danke
    Sebastian

    #2
    Hallo Sebastian,

    Ein Vorschlag von mir wäre das Object "Eingang_PV.state as DecimalType" in () zu setzen. Dies mus der Parser als eine Zahl betrachten.
    Sollte dies nicht funktionieren, dann hilf es vielleicht jeden der 4 Werte in eine eigene Variable (z.B. var wert1=Eingang_PV.state as DecimalType) zu schreiben. Mit "Batteriespeisung.postUpdate(wert4)" kann dann auch das Ergebnis der Berechnung in OH zurückgegeben werden. Zur Kontrolle kann man diese dann auch in der Log-Datei ausgeben.

    Im ganzen wäre ein Auszug aus der Log-Datei "openhab.log" für weitere Hilfen notwendig.

    Heiko

    Kommentar


      #3
      Wenn man Typecasting macht, sollte man immer eindeutige Zuweisungen formulieren. Beim Rechnen ist sonst nicht klar, welcher teil nun addiert oder subtrahiert werden soll.
      Die Rule ist also bis auf die von heiko74 erwähnten Klammern schon ganz gut.
      Allerdings gibt es noch ein paar Stolperfallen. Zum Ersten ist DecimalType zumindest unter OH2 nicht eindeutig, der Parser wird sich dann beschweren, dass es verschiedene Möglichkeiten gibt, den Wert zu interpretieren (Float oder Integer). Allgemein ist es deshalb besser, nach Number zu casten. Zum Zweiten rechnest Du mit drei Items. Jedes dieser Items kann potentiell auch einen NULL-Status haben, der sich weder nach DecimalType noch nach Number casten lässt, die Rule wird dann mit Fehlermeldung abgebrochen. Da solche Fehlermeldungen aber hässlich sind, sollte man das selbst abfangen:
      Code:
      rule "Batterieladen"
      when
          Item Eingang_PV changed
      then
          if( ! (Eingang_PV.state instanceof Number) ) {return;}
          if( ! (Ausgangsleistung.state instanceof Number) ){return;}
          if( ! (Eigenverbrauch.state instanceof Number) ){return;}
      
          Batteriespeisung.postUpdate((Eingang_PV.state as Number) - (Ausgangsleistung.state as Number) - (Eigenverbrauch.state as Number))
      end
      Wahlweise kann man natürlich auch noch ein logInfo() absetzen, bevor man mit return; die Rule kontrolliert abbricht, damit man weiß, warum nix geht.
      Darf die Batteriespeisung auch negativ werden? Ansonsten wäre der Umweg über eine Variable bzw. eine Konstante (zur Laufzeit der Rule) sinnvoll:
      Code:
      val Number nBatterie = (Eingang_PV.state as Number) - (Ausgangsleistung.state as Number) - (Eigenverbrauch.state as Number)
      Batteriespeisung.postUpdate(if(nBatterie <= 0) 0 else nBatterie)
      Batterieentnahme.postUpdate(if(nBatterie < 0) - nBatterie else 0) // falls das sinnvoll ist
      Zuletzt geändert von udo1toni; 30.08.2018, 17:57.

      Kommentar


        #4
        Hallo,
        Sry für die späte Rückmeldung.
        Aber eure Tipps haben geholfen. Der Wert wird nun richtig berechnet.

        Vielen Dank

        Kommentar

        Lädt...
        X