Ankündigung

Einklappen
Keine Ankündigung bisher.

Gasverbrauch als Chart

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

    [Codebeispiel] Gasverbrauch als Chart

    Hallo,

    dank der Homematic Anbindung kann ich die verbrauchte Gasmenge nun messen.

    Was mir noch fehlt ist
    - die Darstellung der Verbrauchsmenge über den Tag
    - beim Anpassen der Rules den aktuellen Verbrauch nicht zu verlieren

    Aktuelle Umsetzung:

    ITEM dass jeden Durchlauf des Zählerrades mitbekommt (über ein Tastsensor + Impulsabnehmer

    Switch Gas_Tick "Gas Messsung"{homematic="FEQ0043421:1#INSTALL_TEST"}

    ITEM Summe des bisherigen Gasverbrauchs

    Number Gas_Usage "Gas Verbrauch m³ [%.1f]"

    RULE die den Gasverbrauch aktualisiert

    var Number Gas = 0
    rule "Gas Usage"
    when
    Item Gas_Tick received update
    then
    Gas = Gas + 0.05
    /* var Number percent = 0 */
    postUpdate(Gas_Usage, Gas)
    /*say("Gas usage")*/
    end

    GROUP die den Verbrauch pro Stunde enthält

    Group Usage
    Number Gas_Usage_per_hour "Gas Verbrauch m³ / h [%.1f]" (Usage)

    var Number last_Gas = 0
    rule "Gas Usage per hour"
    when
    // every hour
    Time cron "0 0 * * * ?"
    then
    var Number one_h_usage = Gas - last_Gas
    last_Gas = Gas
    postUpdate(Gas_Usage_per_hour,one_h_usage)
    end

    db4o.persist in der die Gruppe gespeichert wird

    Strategies {
    everyHour : "0 0 * * * ?"
    everyDay : "0 0 0 * * ?"
    default = everyChange
    }

    Items {
    Temperature*, Weather* : strategy = everyChange, everyHour
    Usage* : strategy = everyChange,everyHour
    }


    SITEMAP in der der Verbrauch pro Stunde angezeigt wird

    Text item=Gas_Usage_per_hour {
    Frame {
    Chart item=Usage period=D refresh=10000
    }


    Probleme:
    - Das Chart ist leer / wird nicht angezeigt
    - Die Variable für den Gasverbrauch wird beim Start zurückgesetzt

    Bitte um Unterstützung!

    Sascha.

    #2
    Hi,

    das mit dem Start bekommst du weg, wenn du im db4o.persist die beiden Variablen mitzogen und beim Boot auf den alten Stand zurücksetzten läßt, wie in dem Demo File:

    Items {
    Gas_Usage,Gas_Usage_per_hour : strategy = everyChange, everyDay, restoreOnStartup
    }

    für den Plot am einfachsten im rrd4j.persist eine Regel anlegen die beides speichert, dann sollte das klappen.

    Gruss
    Norbert

    Kommentar


      #3
      Chart funktioniert

      Das Chart funktioniert - eigenwillig ist jedoch die Darstellung.

      Im Item wird als Number der Verbrauch in [m³/h] gespeichert.

      Im Chart wird der Wert 0,5 als 500m angezeigt.

      In der Doku wird nicht gezeigt, wie man die Daten formatieren soll. Ist das abhängig vom Typ oder vom Text?

      Sascha.

      Kommentar


        #4
        Hi,

        ich habe das Script wie folgt benutzt:
        Code:
        rule "Gas Usage"
        when
        Item Gas_Impuls received update
        then
        Gas = Gas + 0.01
        /* var Number percent = 0 */
        postUpdate(Gas_Verbrauch, Gas)
        /*say("Gas usage")*/
        end
        
        rule "Gas Usage per hour"
        when 
        // every hour
        Time cron "0 0 * * * ?"
        then
        var Number one_h_usage = Gas - last_Gas
        last_Gas = Gas
        postUpdate(Gas_Verbrauch_Stunde,one_h_usage)
        	if( (Gas_Verbauch_Min.state as DecimalType) > last_Gas )
        	{
        		postUpdate(Gas_Verbauch_Min, last_Gas )
        	}
        	if( (Gas_Verbauch_Max.state as DecimalType) < last_Gas )
        	{
        	  	postUpdate(Gas_Verbauch_Max, last_Gas )
            }
        end
        und erhalte jetzt seit einem der Updates (glaube auf 1.3) immer folgende Meldung:
        Code:
        13:00:05.739 ERROR o.o.m.r.i.e.ExecuteRuleJob[:77]- Error during the execution of rule Gas Usage per hour
        java.lang.ClassCastException: Cannot cast org.openhab.core.types.UnDefType to org.openhab.core.library.types.DecimalType
        	at java.lang.Class.cast(Class.java:3007)
        	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(XbaseInterpreter.java:386)
        	at sun.reflect.GeneratedMethodAccessor1340.invoke(Unknown Source)
        	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        	at java.lang.reflect.Method.invoke(Method.java:474)
        	at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291)
        Kann mir einer sagen, wie ich die wieder beseitigt bekomme?

        Danke und Gruss
        Norbert

        Kommentar


          #5
          Hat keiner eine Idee?

          Gruss
          Norbert

          Kommentar


            #6
            das Problem könnten die beiden Zeilen

            Code:
            	if( (Gas_Verbauch_Min.state as DecimalType) > last_Gas )
            oder
            	if( (Gas_Verbauch_Max.state as DecimalType) < last_Gas )
            sein. Nämlich dann, wenn der Status der Items _Min und _Max noch die gesetzt wurde.

            Lösen könntest Du das mit einer Regel mit System startUp Trigger. Hierin könntest Du den initialen Status der Variablen setzen.

            Gruß,

            Thomas E.-E.
            Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

            Kommentar


              #7
              Hi Thomas,

              da könntest Du recht haben, dass es seit der Version ist, die beim Start die Config-Files nicht gefunden hat und die deswegen leer waren. Die Ganze Verbrauchsgruppe steht auf RestoreOnStartup.
              Ich habe per Rest versuch mal initalwerte zu setzen:
              Code:
              <item>
              <type>SwitchItem</type>
              <name>Gas_Impuls</name>
              <state>OFF</state>
              <link>http://192.168.178.22:8080/rest/items/Gas_Impuls</link>
              </item>
              <item>
              <type>NumberItem</type>
              <name>Gas_Verbrauch</name>
              <state>6236.78</state>
              <link>
              http://192.168.178.22:8080/rest/items/Gas_Verbrauch
              </link>
              </item>
              <item>
              <type>NumberItem</type>
              <name>Gas_Verbrauch_Stunde</name>
              <state>0</state>
              <link>
              http://192.168.178.22:8080/rest/items/Gas_Verbrauch_Stunde
              </link>
              </item>
              <item>
              <type>NumberItem</type>
              <name>Gas_Verbauch_Max</name>
              <state>Uninitialized</state>
              <link>
              http://192.168.178.22:8080/rest/items/Gas_Verbauch_Max
              </link>
              </item>
              <item>
              <type>NumberItem</type>
              <name>Gas_Verbauch_Min</name>
              <state>Uninitialized</state>
              <link>
              http://192.168.178.22:8080/rest/items/Gas_Verbauch_Min
              </link>
              </item>
              Hat auch, bis auf Min und Max funktioniert und Stunde ist 0, zählt aber auch nicht hoch. Ich habe auch in der Stromzählerauswertung ein komisches Phänomen, dass der Tagesverbrauch hoch geht, aber der letzte Tag immer 0 kW/h ist und alle Regeln haben mal funktioniert.

              Gruss
              Norbert

              Kommentar


                #8
                Hi,

                gibt es eine Möglichkeit die Variablen in Rules von Außen zu verändern, wenn dafür kein Item definiert ist?

                Also ich bekomme diese Regel nicht mehr auf Gang.

                Gruss
                Norbert

                Kommentar


                  #9
                  Hi,

                  ich wollte den Fred nochmal hochholen, hat jemand eine funktionierende Regel, um den Gaszählerimpuls auszuwerten?!

                  Ich bin ja noch ziemlicher Anfänger, aber was ist die beste Möglichkeit solche Regeln zu entwickeln und zu debuggen? kann man in irgendeiner Konsole auch direkt auf Variablenwerte zugreifen und Befehlssequenzen 'online' testen? Immer die Regel anzupassen, auf den reload der Datei zu warten und den Log zu lesen, finde ich irgendwie umständlich.

                  Gruss
                  Norbert

                  Kommentar


                    #10
                    Hi Norbert,

                    Zitat von NSchnitzler Beitrag anzeigen
                    gibt es eine Möglichkeit die Variablen in Rules von Außen zu verändern, wenn dafür kein Item definiert ist?
                    nein, gibt es nicht. Die Variablen sind nur exklusiv in Deiner Rule sichtbar.

                    Zitat von NSchnitzler Beitrag anzeigen
                    die beste Möglichkeit solche Regeln zu entwickeln und zu debuggen?
                    ich würde die wichtigen Werte mit logInfo() oder logDebug rausloggen, damit Du zur Laufzeit den Inhalt der Variablen sichtbar machen kannst. Einen Debugger mit Haltepunkten oder so etwas gibt es nicht.

                    Zitat von NSchnitzler Beitrag anzeigen
                    kann man in irgendeiner Konsole auch direkt auf Variablenwerte zugreifen und Befehlssequenzen 'online' testen?
                    Nein, kann man mit Ausnahme der Items nicht.

                    Zitat von NSchnitzler Beitrag anzeigen
                    Immer die Regel anzupassen, auf den reload der Datei zu warten und den Log zu lesen, finde ich irgendwie umständlich.
                    Wenn Dir das refresh zu lange dauert (per default 10 Sekunden) kannst Du den Wert in der openhab_default.cfg reduzieren.

                    Gruß,

                    Tomas E.-E.
                    Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                    Kommentar


                      #11
                      Hi,

                      Also irgendwie krieg ich das nicht auf die Kette, der letzte Zählerstand ist bei jedem Neustart weg, obwohl das item auf RestoreOnStartup steht und Stunden und Tageswerte bekomme ich auch keine anständigen. Meine Idee sieht momentan so aus:
                      Code:
                      rule "Tagesverbrauch"
                      when 
                              Time cron "0 0 0 * * ?"   
                      then
                      var Calendar current_time = java::util::Calendar::getInstance(TimeZone::getTimeZone("GMT"))
                      var int	day = current_time.get(java::util::Calendar::DAY_OF_YEAR)
                      postUpdate(Gas_Tagesverbrauch, Gas_Verbrauch.state as DecimalType - Gas_Verbrauch.minimumSince(now.minusHours(24)).state as DecimalType)
                      postUpdate(Gas_Jahresverbrauch, Gas_Verbrauch.state as DecimalType - Gas_Verbrauch.minimumSince(now.minusDays(day)).state as DecimalType)
                      end
                      
                      rule "Gas Usage per hour"
                      when 
                      // every hour
                      Time cron "0 0 * * * ?"
                      then
                      postUpdate(Gas_Verbrauch_Stunde,Gas_Verbrauch.state as DecimalType - Gas_Verbrauch(now.minusHours(1)).state as DecimalType)
                      postUpdate(Gas_Verbauch_Min, Gas_Verbrauch.minimumSince(now.minusDays(7)).state as DecimalType)
                      postUpdate(Gas_Verbauch_Max, Gas_Verbrauch.maximumSince(now.minusDays(7)).state as DecimalType)
                      end
                      Hat Jemand eine Idee was ich falsch mache oder wie man's besser machen kann. Dafür hat bestimmt jemand eine bessere Lösung.

                      Gruss
                      Norbert

                      Kommentar


                        #12
                        könntest Du mal die *.items (relevante Items) und die *.persist posten?

                        Gruß,

                        Thomas E.-E.
                        Visualisierung, Rule/Logic-Engine, Integrationsplattform mit openhab (Supportforum)

                        Kommentar


                          #13
                          Hallo Thomas,
                          hier die Definitionen:
                          Items:
                          Code:
                          Switch Gas_Impuls 			"Gas Messsung" 						(Verbrauch) 	{knx="0/6/0"}
                          Number Gas_Verbrauch		"Gas Verbrauch [%.1f m³]" 			(Verbrauch)
                          Number Gas_Verbrauch_Stunde	"Gas Verbrauch letzte Stunde [%.2f m³/h]" (Verbrauch)	
                          Number Gas_Tagesverbrauch	"Gas Tagesverbrauch [%.2f m³]"			(Verbrauch)		
                          Number Gas_Verbauch_Max 	"Gas Verbrauch Maximum [%.2f m³/h]" 	(Verbrauch)
                          Number Gas_Verbauch_Min 	"Gas Verbrauch Minimum [%.2f m³/h]" 	(Verbrauch)
                          Number Gas_Jahresverbrauch	"Jahresverbrauch [%.1f m³]" 			(Verbrauch)
                          Persistence RRD
                          Code:
                          Strategies {
                          	// for rrd charts, we need a cron strategy
                          	every30Mins  : "0 */30 * * * ?"
                          }
                          
                          Items {
                          	Verbrauch* : strategy = every30Mins, restoreOnStartup
                          }
                          Gruss
                          Norbert

                          Kommentar


                            #14
                            Sollte in der rrd.persist nicht
                            Code:
                            Items {     
                            Gas_Verbrauch* : strategy = every30Mins, restoreOnStartup 
                            Gas_Jahresverbrauch: strategy = every30Mins, restoreOnStartup 
                            }
                            stehen? Also alle Items, die mit 'Gas_Verbrauch' beginnen, werden persistitert

                            Kommentar


                              #15
                              Hi,

                              so wie ich das Verstanden habe wird doch mit Verbrauch* die ganze Gruppe gesichert oder?

                              Gruss
                              Norbert

                              Kommentar

                              Lädt...
                              X