Ankündigung

Einklappen
Keine Ankündigung bisher.

Youless Stromzähler einbinden - Feinschliff der Charts.

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

    Youless Stromzähler einbinden - Feinschliff der Charts.

    Hallo liebes Forum.

    Vor etwa zwei Jahren bin ich über Fhem in die Hausautomation eingestiegen. Ich habe bereits seit 10 Jahren FHT80b's und wollte das Ganze ein wenig erweitern. Um OpenHAB habe ich da noch einen Bogen gemacht, da mir zu wenig Protokolle an Board waren, wobei mir die GUI deutlich besser gefiel.

    Mit Fhem bin ich nicht weit gekommen, da mir die GUI nicht viel zu sagen hatte. Die FHT's sind vom CUNO erfasst und eingebunden worden, warum und wie genau weiß ich bis heute nicht. Steuern kann ich auch nur ein paar Brennenstuhl Steckdosen, sonst nur ablesen.

    Jetzt habe ich mich dem ganzen Thema nochmal neu gewidmet - wir ziehen irgendwann um und dann will ichs etwas professioneller angehen. So bin ich auch nochmals über OpenHAB gefallen und war sofort begeistert, weil inzwischen echt viele Protokolle dabei sind. Ein großes Lob an die Entwickler an dieser Stelle. Auch gefällt mir an OpenHAB wirklich gut, dass eigentlich nichts passiert ohne dass ich begriffen habe, wie ichs anbinden muss. Damit ist auch sichergestellt, dass ichs ein wenig verstanden habe. - Soweit als Einleitung.

    Das WeatherBinding Wunderground habe ich heute aktiviert - gefällt mir sehr gut.
    Der Cuno (Busware.de) läuft so lala - ich habs mal mit etwas FHT versucht, kann aber nur den Ventilstand sehen, Temperaturen Soll und Ist, Fensterkontakte und Batterie - da geht noch nichts. Wenn ichs raus habe, schreibe ich aber hier gern mal noch was dazu.

    Meinen Youless Stromzähler habe inzwischen am Laufen. Die Daten werden in eine Mysql Datenbank auf einer anderen Installation geschrieben - Xen-Virtualisierung, mein OpenHAB läuft auf einer Ubuntu Installation mit zentralem Datenbankserver für Mailserver und anderen Schnickschnack.

    Die Daten werden nun also everyMinute in die Dtenbank geschrieben und ich kann mir den aktuellen Verbrauch und den Verlauf ansehen. Das kann ich auch in Stunde Woche Monat umschalten. Jetzt würde ich gern dort eine weitere Info unterbringen. Den eigentlichen Stromverbrauch des abgefragten Zeitraums. Der Youless schreibt den Zählerstand fort - sogar recht genau, ch hab jetzt nach einem Jahr 2kWh Abweichung - und gibt diesen ebenfalls per Json mit aus. Somit sollte der sich ohne Probleme stündlich in die DB schreiben lassen. Jetzt würde ich mir gerne "was" basteln, dass mir also die Differenz der Werte jetzt und vor einer Stunde, einer Woche, einem Monat berechnet und als KWh z.B. in einer Zeile über dem Stromzähler angibt.

    Hat jemand eine Idee dazu, evt. so etwas mit einem anderen Stromzähler umgesetzt?

    Vielen Dank für die Unterstützung und das offene Forum, also dass hier nicht nur zwingend KNX diskutiert wird. Wenn ich was hinbekommen habe, werde ich hier gern ein wenig dazu schreiben und meine FHT's laufen ja auch noch nicht so richtig.

    VG - Fossi
    Zuletzt geändert von FossiBaer; 02.11.2015, 18:25.

    #2
    Hi Fossi,

    wenn ich dich richtig verstanden habe, dann könnte das so ähnlich wie bei mir aussehen.
    Ich logge die Daten etwas öfter, dann hab ich alle 45 Sekunden eine Cron Rule laufen. Er nimmt sich die Zählerstände aus den items und rechnet die Differenz.
    Bsp. für Photovoltaikproduktion.

    Code:
    rule "Produktion berechnen"
        when 
                Time cron "0/45 * * * * ?"              
        then {
            var Number energyNow
            var Number energyTemp
            var Number result
            
            energyNow = EnergyProduction_Counter.state as DecimalType
        
            if (EnergyProduction_Temp.state == Uninitialized || EnergyProduction_Temp.state == Undefined) {
                energyTemp = energyNow
                postUpdate(EnergyProduction_Temp, energyNow )
            }
        
            else {
                energyTemp = EnergyProduction_Temp.state as DecimalType
            }
        
            result = energyNow - energyTemp
    
            postUpdate(EnergyProduction_Today, result)
            
        }
    end
    Falls es das nicht so genau trifft, dann sind vielleicht hier: https://github.com/openhab/openhab/wiki/Persistence ein paar gute Dinge dabei. z.B.
    Code:
    PowerMeter.historicState(now.toDateMidnight.withDayOfMonth(1))

    Grüße
    Mitch


    Kommentar


      #3
      Unter der Voraussetzung, dass der Zählerstand persistiert ist, kannst Du wahrscheinlich mit
      Code:
      var double verbrauch
      verbrauch = MyItem.state - MyItem.historicState(now.minusHours(1))
      arbeiten. Vielleicht musst Du ein as DecimalType an die states anhängen, damit aus den States Zahlen werden. Statt minusHours kannst Du dann auch noch minusDays, minusWeeks, minusMonths oder minusYears verwenden, wenn Du größere Zeiträume haben willst, oder auch minusMinutes, minusSeconds oder minusMillis für kleinere Zeiträume. Natürlich muss der entsprechende Zeitraum schon persistiert sein, damit die Berechnung funktioniert.

      Kommentar


        #4
        Moin - super. Eure Vorschläge gehen genau in meine Richtung: Wenn ich den Youless-Zähler mit

        http://10.10.10.10/a?f=j

        anspreche, schmeißt er das hier raus:

        Code:
        {"cnt":"131942,200","pwr":285,"lvl":45,"dev":"(±5%)","det":"","con":"*","sts":"","raw":382}
        Den "pwr" habe ich mir schon abgegriffen, den "cnt" würde ich jetzt auch in die Datenbank schreiben. Um die Datenbank nicht allzusehr zu bombardieren, würde ich den Zählerstand vielleicht alle 15, 30, 60 Minuten ablegen.

        Da scheint dann der Vorschlag von udo1toni zu passen: fische den aktullen Wert aus der DB und den 1 Stunde davor. Das ist ja die Funktion, wenn ich die richtig verstanden habe. "Verbrauch" ist dann der item, den ich in die Sitemap einbaue. Davon baue ich mir dann 4, die ich mittels Schalter anwählen kann. Soweit, so gut.

        Jetzt kommt meine Herausforderung: Ich hab noch nie eine Rule gebastelt. Das müsste ich jetzt quasi tun, oder? Da sitze ich jetzt ein wenig vor dem weißen Blatt Papier.
        Ich werde aber mal morgen oder so den Verbrauch in die Datenbank schieben, dass kriege ich wohl hin. Habt Ihr einen Tip für mich, wie ich an das Thema rule herangehen kann? was mache ich mit var, then, then, if, else?

        Ein bisschen VBA kann ich. Da läufts aber eigentlich immer mit if, then, else. Daher kann ich die rule oben nicht ganz greifen.

        Danke bis dahin.

        VG - Fossi

        Kommentar


          #5
          Code:
          Number item Energy_total_Wh "Verbrauch: [%f.1]" {...}
          Number item Energy_hour_Wh "Verbrauch: [%f.1] //ohne binding..."
          Code:
          rule "Verbrauch berechnen"
          when
              Time cron "0 0/15 * * * ?" // jede viertel Stunde
          then
              {
                 var double verbrauch
                  verbrauch = Energy_total_Wh.state - Energy_total_Wh.historicState(now.minusHours(1))
          //eventuell verbrauch = (Energy_total_Wh.state as DecimalType) - (Energy_total_Wh.historicState(now.minusHours(1)) as DecimalType)
                  Energy_hour_Wh.postUpdate(verbrauch)
              }
          end
          würde viermal pro Stunde den Wert neu berechnen. Wenn Du den Zählerstand nur viermal pro Stunde abspeicherst, reicht das vermutlich. Du könntest auch einen anderen Trigger verwenden, falls Du doch häufiger persistierst.
          Mit einem weiteren Number Item könntest Du noch mit Setpoint eine Auswahl für den Zeitraum realisieren, entweder berechnest Du dann immer alle Varianten und schaltest Die Anzeige um, oder Du triggerst die Berechnung abhängig von der Wertänderung, um dann entsprechend unterschiedliche Zeiträume zu berechnen
          Code:
          when
              Time cron ...
          or
              Item Auswahl changed
          then
              switch (Auswahl.state) {
                  case 1: {
                      verbrauch = Energy_total_Wh.state - Energy_total_Wh.historicState(now.minusHours(1))
                  }
                  case 2: {
                      verbrauch = Energy_total_Wh.state - Energy_total_Wh.historicState(now.minusHours(8))
                  }
                  case 3: {
                      verbrauch = Energy_total_Wh.state - Energy_total_Wh.historicState(now.minusDays(1))
                  }
                  case 4: {
                      verbrauch = Energy_total_Wh.state - Energy_total_Wh.historicState(now.minusDays(2))
                  }
              }
          ...
          Der Code ist ungetestet und ich stochere auch eher rum, als es genau zu wissen

          Kommentar


            #6
            Klappt natürlich nicht auf anhieb:

            getAktLeistung.js mit Inhalt JSON.parse(input).pwr;
            getZaehlerStrom.js mit Inhalt JSON.parse(input).cnt;

            Items:
            Code:
            Number            aktLeistung            "Leistung aktuell [%.0f Watt]"         <energy>    { http="<[http://10.10.10.10/a?f=j:10000:JS(getAktLeistung.js)]" }
            Number            ZaehlerStrom        "Stromzaehler [%.0f kWh]"             <energy>    { http="<[http://10.10.10.10/a?f=j:10000:JS(getZaehlerStrom.js)]" }
            persistence:
            Code:
            Strategies {
                everyHour     : "0 0 * * * ?"
                everyDay     : "0 0 0 * * ?"
                everyMinute : "0 * * * * ?"
                every10Minute : "0 0/10 * * * ?"
                every15Minute : "30 0/15 * * * ?"
                
                default = everyChange
            }
            Items {
                Temperatur*,Wettergrafik*,aktLeistung : strategy = everyMinute, restoreOnStartup
                ZaehlerStrom : strategy = every15Minute, restoreOnStartup
                 * : strategy = everyChange, restoreOnStartup
            Es landet jedoch nur aktLeistung in der Datenbank. ZaehlerStrom wird nicht geschrieben. Ich hab auch ein wenig rumexperimentiert. Ich vermute einen Outputfehler bei den Transforms. Oder mache ich da noch einen anderen Denkfehler?

            da der Stream aktLeistung funktioniert, habe ich dort mal pwr durch cnt ersetzt. Mit wenig Erfolg: in der DB wird ab da ein gleichbleibender Wert eingetragen. Somit muss entweder etwas anderes in die js-Datei oder in die Items Datei rein.

            Habt Ihr einen Tipp für mich?

            VG - Fossi
            Zuletzt geändert von FossiBaer; 03.11.2015, 13:57.

            Kommentar


              #7
              Ok ich hab einen Hinweis gefunden:

              Code:
              17:09:31.291 [DEBUG] [.o.b.http.internal.HttpBinding:262  ] - Couldn't create state of type 'class org.openhab.core.library.items.NumberItem' for value '131948,826'
              Somit liefert das Item wohl den Wert, kann mit diesem aber nichts anfangen. Ich vermute mal, dass es am Komma liegen wird. Was kann ich denn da anstellen?

              Kommentar


                #8
                Versuchs mal mit:
                Code:
                JSON.parse(input).cnt.replace(",", ".");
                "cnt" gegen den Wert austauschen, den du auslesen willst.

                Alternativ kannst du auch folgendes ausprobieren:
                Code:
                openhab.cfg:
                http:youless.url=http://<IP Adresse>/a?f=j&u=kWh&m
                http:youless.updateInterval=5000
                
                Item-Datei:
                Number YL_Zaehlerstand "Zählerstand [%1$s kW]" { http="<[youless:5000:REGEX(.*?"cnt":"(.*?),.*)]" }
                Du müßtest es noch anpassen.

                Ich hatte den Youless-Logger früher auch mal über das HTTP-Binding angebunden. Der war mir aber zu umständlich, wenn man z.B. den Verbrauch von gestern oder vorgestern auslesen will, daher hatte ich mir ein Binding selber geschrieben. Wenn du Interesse hast, kann ich dir mein Binding bereitstellen. Ich wollte den mal veröffentlichen, aber ich glaube es werden keine Pullquests für OpenHab 1.x angenommen.
                Zuletzt geändert von Sivarupan; 03.11.2015, 18:46.

                Kommentar


                  #9
                  Ok - vielen Dank. Durch das Ersetzen mit einem Punkt werden jetzt auch die Daten mit Komma in die Datenbank geschrieben. Somit hab ichs nun wieder auf json zurückgesetzt. Das klappt prima.

                  An die rules komme ich nicht ran. Mir erschien der Vorschlag von udo1toni nicht unlogisch. Die sachen habe ich mal so in die itemes und rules gepackt. Es "passiert" aber nichts. Kann mir jemand einen Einstieg in diese rule erklären. Was ist var double ? Wie kann ich erkennen ob die Variable verbrauch gefüllt wird? Wie kann ich erkennen ob die verbauch upgedated wird? Wie packe ich verbrauch in ein Item, oder muss ich das gar nicht? Wie kann ich testen, ob verbrauch was enthält?

                  Da hat sich bei mir echt noch nicht der Knoten gelöst.

                  VG - Fossi

                  Kommentar


                    #10
                    Also... in der Rule habe ich eine Variable verbrauch genutzt, um dort die Differenz zwischen aktuellem Gesamtverbrauch und dem Gesamtverbrauch vor x Stunden zwischenzuspeichern.
                    Diese Variable muss natürlich erstmal definiert werden. Da ich sie aber nur lokal benötige, mache ich das innerhalb der Rule, mit var double verbrauch, die Variable ist also als doppelt genaue Fließkommazahl definiert. Um zu schauen, an welcher Stelle es hakt, kannst du am einfachsten in die Rule ein log einbauen:
                    Code:
                    logInfo("myrule","berechneter Verbrauch: " + verbrauch.toString)
                    das müsste in die Zeile nach der Wertzuweisung.
                    Anschließend sollte im openhab.log bei jedem Ausführen der Rule eine log-Zeile ausgegeben werden, die dann ungefähr so aussieht
                    Code:
                    2015-11-04 09:47:22.643 [INFO ] [model.script.myrule] - berechneter Verbrauch: 0
                    Wie schon erwähnt, eventuell muss der state gecastet werden (as DecimalType), damit die Variable auch sicher einen Zahlenwert zugewiesen bekommt. Testweise könntest Du z.B. nur den aktuellen Wert der Variablen zuweisen.

                    Zum Testen allgemein kannst Du die Rule auch häufiger ausführen lassen, z. B. jede Minute - dann setzt Du in der cron-Definition statt 0/15 ein * ein.

                    Du kannst in der Rule auch auf die Variable verzichten und die Berechnung direkt ins postUpdate einbauen (verbrauch durch die Zuweisung ersetzen), die Zeile wird dann halt arg lang und unübersichtlich.

                    Kommentar


                      #11
                      Code:
                      13:05:00.022 [ERROR] [.o.m.r.i.engine.ExecuteRuleJob:57   ] - Error during the execution of rule Verbrauch berechnen
                      und dann

                      Code:
                      13:08:00.021 [ERROR] [.o.m.r.i.engine.ExecuteRuleJob:57   ] - Error during the execution of rule Verbrauch berechnen
                      java.lang.RuntimeException: The name '<XMemberFeatureCallImplCustom> - <XMemberFeatureCallImplCustom>' cannot be resolved to an item or type.
                              at org.openhab.model.script.interpreter.ScriptInterpreter.internalFeatureCallDispatch(ScriptInterpreter.java:67) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAbstractFeatureCall(XbaseInterpreter.java:658) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(XbaseInterpreter.java:843) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:204) ~[na:na]
                              at org.openhab.model.script.internal.engine.ScriptImpl.execute(ScriptImpl.java:59) ~[na:na]
                              at org.openhab.model.rule.internal.engine.ExecuteRuleJob.execute(ExecuteRuleJob.java:55) ~[na:na]
                              at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-all-2.1.7.jar:na]
                              at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-all-2.1.7.jar:na]
                      und mit DecimalType

                      Code:
                      13:12:00.050 [ERROR] [.o.m.r.i.engine.ExecuteRuleJob:57   ] - Error during the execution of rule Verbrauch berechnen
                      java.lang.ClassCastException: Cannot cast org.openhab.core.library.types.DecimalType to void
                              at java.lang.Class.cast(Class.java:3369) ~[na:1.8.0_66]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(XbaseInterpreter.java:386) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAbstractFeatureCall(XbaseInterpreter.java:657) ~[na:na]
                              at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source) ~[na:na]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(XbaseInterpreter.java:843) ~[na:na]
                              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_66]
                              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_66]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
                              at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) ~[na:na]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
                              at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) ~[na:na]
                              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_66]
                              at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_66]
                              at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
                              at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:204) ~[na:na]
                              at org.openhab.model.script.internal.engine.ScriptImpl.execute(ScriptImpl.java:59) ~[na:na]
                              at org.openhab.model.rule.internal.engine.ExecuteRuleJob.execute(ExecuteRuleJob.java:55) ~[na:na]
                              at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz-all-2.1.7.jar:na]
                              at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-all-2.1.7.jar:na]
                      Muss ich da evt. noch irgendwas nachinstallieren oder fehlen mir da noch bindings oder so was? Aber nun sehe ich, dass Openhab versucht, die Rule auszuführen.

                      VG - Fossi

                      Kommentar


                        #12
                        Hmm... erstmal hab ich keine Idee. Aber probier doch spaßeshalber mal, ob es ohne die Variable geht, also
                        Code:
                        Energy_hour_Wh.postUpdate(Energy_total_Wh.state as DecimalType - Energy_total_Wh.historicState(now.minusHours(1)) as DecimalType)
                        logInfo("myrule","berechneter Verbrauch: " + (Energy_total_Wh.state as DecimalType - Energy_total_Wh.historicState(now.minusHours(1)) as DecimalType).toString)
                        Ob die Berechnung innerhalb der Logzeile so funktioniert, weiß ich aber nicht...

                        Kommentar


                          #13
                          Argh... blöder Fehler... es muss
                          Code:
                          Energy_total_Wh.historicState(now.minusHours(1))[COLOR=#FF0000].state[/COLOR]
                          heißen. Ohne das .state wird eine komplette Information des Datensatzes ausgegeben, also Datum, Uhrzeit, Welches Item persistiert wurde und noch der eigentliche Wert...
                          Mit var double [...] = [...] as decimalType schmeißt zwar der Designer einen Fehler, aber es gibt trotzdem eine korrekte Ausgabe, also scheint Java doch ein Minimum an Eigenintelligenz zu besitzen. Ich hab echt keine Ahnung, was denn nun die korrekte Formulierung für den Fließkommawert im State ist.
                          Jedenfalls sollte
                          Code:
                          Energy_hour_Wh.postUpdate(Energy_total_Wh.state as DecimalType - Energy_total_Wh.historicState(now.minusHours(1)).state as DecimalType)
                          den Verbrauch der letzten Stunde im Item Energy_hour_Wh ablegen.

                          Kommentar


                            #14
                            Heute ganz viel zu tun - komme zu nichts.

                            Ich hab gestern mal die zweite Codezeile in die Rules gepackt und habe jetzt zumindest den Wert des Verbrauchs der letzten Stunde. So weit schon ganz gut, jetzt muss ich das och vernünftig basteln und ich habe noch immer eine ähnliche Fehlermeldung in der openhab.log.

                            import org.openhab.core.library.types.* import org.openhab.core.persistence.* import org.openhab.model.script.actions.*

                            Was hat es damit eigentlich auf sich? Ich hab gestern nach dem Fehler gegoogelt und .types.* mit in die Rule gepackt. liegt die Fehlermeldung evt. daran? Was muss unter welchen Vorrausetzungen mit import geladen werden?

                            Ich werde im WE noch ein bisschen fummeln. Schön wären der Verbrauch der letzten Stunde, der letzten 24 Stunden, der letzten 7 Tage und der letzten 30 Tage jeweils als Number. Dazu wäre es eigentlich richtig, den Verbrauch eines kalendarischen Monats abzuspeichern und den wieder per chart auszuwerten. Damit hätte man eine Analyse des Stromverbauchs als Dashboard.

                            Openhab ist echt cool. Das hätte ich in Fhem irgendwie nicht hinbekommen.

                            VG - Fossi

                            Kommentar


                              #15
                              Ach ja, die imports...
                              Auf jeden Fall brauchst Du noch joda, import org.joda.time.DateTime sollte da reichen. import java.lang.Math kann auch nicht schaden, wobei Punkt- und Strichrechnung auch ohne gehen sollten.

                              Kommentar

                              Lädt...
                              X