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

    #16
    So - ich hab in den letzten Tagen wirklich viel probiert und auch hinbekommen - ich bin von Openhab echt begeistert. Es geht wirklich viel. Da ich zu einigen Themen wenig gefunden habe, will ich hier die eine oder andere Lösung präsentieren, um Gleichgesinnten die Experimente zu ersparen.

    Hier meine jetzige, bereits funktionale Konfiguration:

    Youless Energiezähler über Json abgefragt. dazu folgende Dateien im Bereich der Translation angelegt:
    getAktLeistung.js mit dem Inhalt
    Code:
    JSON.parse(input).pwr;

    und getZaehlerStrom.js mit dem Inhalte
    Code:
    JSON.parse(input).cnt.replace(",", ".");

    Durch das replace wird Komme durch Punkt ersetzt und lässt sich damit auch in die Datenbank schreiben. In der Items Datei steht Folgendes:
    Code:
    Number            aktLeistung            "Leistung aktuell [%.0f Watt]"         <energy>    { http="<[http://192.168.100.210/a?f=j:10000:JS(getAktLeistung.js)]" }
    Number            ZaehlerStrom        "Stromzaehler [%.1f kWh]"             <energy>    { http="<[http://192.168.100.210/a?f=j:10000:JS(getZaehlerStrom.js)]" }
    
    Number            Strom_Ausw_Zeitr    "Auswertung"
    Number             Verb_Stunde         "Verbrauch letzte Stunde [%.1f kWh]"
    Number             Verb_Tag             "Verbrauch letzter Tag [%.1f kWh]"
    Number             Verb_Woche             "Verbrauch letzter Woche [%.1f kWh]"


    und in der Sitemap steht das:
    Code:
    Frame label="Verbrauch" {
            Text item=aktLeistung {
                Frame {
                    Switch item=Strom_Ausw_Zeitr label="Zeitraum" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Monat"]
                    Chart item=aktLeistung period=h refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==0, Strom_Ausw_Zeitr=="Uninitialized"]
                    Chart item=aktLeistung period=D refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==1]
                    Chart item=aktLeistung period=W refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==2]
                    Chart item=aktLeistung period=M refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==3]
                }
                Frame
                {
                    Text item=Verb_Stunde
                    Text item=Verb_Tag
                    Text item=Verb_Woche
                    Text item=ZaehlerStrom
                }
            }    
        }

    Jetzt müssen noch die Verbräuche pro Stunde, Tag etc. berechnet werden. Dafür habe ich folgende Rule angelegt:
    Code:
    import org.openhab.core.library.types.*
    import org.openhab.core.persistence.*
    import org.openhab.model.script.actions.*
    import org.joda.time.DateTime
    
    rule "Verb_Stunde berechnen"
    when
        Time cron "0 0/15 * * * ?" // jede viertel Stunde
    then
        {
            Verb_Stunde.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusHours(1)).state as DecimalType)
        }    
    end
    
    rule "Verb_Tag berechnen"
    when
        Time cron "0 0/15 * * * ?" // jede viertel Stunde
    then
        {
            Verb_Tag.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusHours(24)).state as DecimalType)
        }    
    end
    
    rule "Verb_Woche berechnen"
    when
        Time cron "0 0/15 * * * ?" // jede viertel Stunde
    then
        {
            Verb_Woche.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusDays(7)).state as DecimalType)
        }    
    end

    Jetzt habe ich das Ganze in eine MySQL Datenbank zur Langzeiterfassung plaziert:
    Code:
    Strategies {
        everyHour     : "0 0 * * * ?"
        everyDay     : "0 0 0 * * ?"
        everyMinute : "0 * * * * ?"
        every5Minute : "0 0/5 * * * ?"
        every10Minute : "0 0/10 * * * ?"
        every15Minute : "0 0/15 * * * ?"
        
        default = everyChange
    }
    Items {
        aktLeistung : strategy = everyMinute, restoreOnStartup
        ZaehlerStrom : strategy = every5Minute, restoreOnStartup

    Mit diesen Codeschnipseln habe ich einen Grafen gebastelt, der mir die aktuelle Leistung zeigt, darunter die Verräuche der jüngeren Vergangeheit berechnet und zeigt und den Zählerstand wiedergibt. Damit gibt es schon mal einen ganz guten Überblick. Was ich mir jetzt noch wünschen würde wäre ein weiteres Chart, in dem jeweils der Verbrauch eines Kalendermonats gezeigt wird. Man müsste also nochmal eine Regel basteln die jeweils vom Monatsletzten bis Monatsersten die Differenz berechnet, und diese in den Wert in MySQL hinterlegt und darauf dann ein Chart loslassen.

    Das fummel ich mir aber auch noch zusammen und werde hier berichten. Hier erstma vielen Dank für die helfenden Tipps.

    VG - Fossi

    Kommentar


      #17
      Hab mal eine Frage: Meine Zähler basteln jetzt schicke werte in die Datenbank. Das klappt soweit ganz gut. Jetzt wollte ich mich mal an die Berechnung des Verbrauchs des letzten Tages, der letzten Woche, das letzten Monats machen folgendes Statement funktioniert jedoch nicht:

      Code:
      Ber_Verb_Tag.postUpdate(BerZaehlerStrom.historicState(now.toDateMidnight).state as DecimalType - BerZaehlerStrom.historicState(now.toDateMidnight.minusHours(24)).state as DecimalType)
      Das toDateMidnight wird im Editor duchgestrichen. Und ich bekomme einen Fehler im Log. Mache ich hier gedanklich etwas falsch?

      VG - Fossi

      Kommentar


        #18
        toDateMidnight sollte grundsätzlich funktionieren. Allerdings ist es deprecated, weil es eine Zeitzone gibt, in der es einmal im Jahr (Zeitumstellung) kein Mitternacht gibt. Deshalb soll man stattdessen withTimeAtStartOfDay verwenden - das ist dann nicht durchgestrichen und macht ansonsten das gleiche.
        Zur Fehlersuche könntest Du mit
        Code:
        logInfo("Rules","BerZaehlerStrom: " + BerZaehlerStrom.historicState(now.withTimeAtStartOfDay).state.toString)
        logInfo("Rules","BerZaehlerStrom-24h: " + BerZaehlerStrom.historicState(now.withTimeAtStartOfDay.minusHours(24) ).state.toString)
        nachschauen, ob tatsächlich die gewünschten Werte raus fallen.

        Kommentar


          #19
          Danke Dir. Das hat geholfen. Jetzt schreibt er mir den Verbrauch des letzten Tages in die DB.

          Hab da mal noch eine Frage zu Habmin: Dort kann man ja sehr schicke Charts zusammenklicken. Kann man die auch über die Openhab.app verfügbar machen?
          Zuletzt geändert von FossiBaer; 25.11.2015, 10:54.

          Kommentar


            #20
            Hallo, der Ausdruck

            Quelle:
            {"cnt":" 18449,446","pwr":348,"lvl":10,"dev":"(&plusmn;0%)" ,"det":"","con":"","sts":"","cs0":" 0,000","ps0":0,"raw":104}
            Transformation:
            JSON.parse(input).cnt.replace(",", ".");
            bringt bei mir leider kein Ergebnis und auch keine Einträge im LOG File.

            Kann mir jemand einenTtip geben? bei Werten ohne Komma funktioniert es.
            *Gerade gesehen der Wert hat noch ein führendes Leerzeichen!!!

            Gruß Mirco


            Zitat von FossiBaer Beitrag anzeigen
            So - ich hab in den letzten Tagen wirklich viel probiert und auch hinbekommen - ich bin von Openhab echt begeistert. Es geht wirklich viel. Da ich zu einigen Themen wenig gefunden habe, will ich hier die eine oder andere Lösung präsentieren, um Gleichgesinnten die Experimente zu ersparen.

            Hier meine jetzige, bereits funktionale Konfiguration:

            Youless Energiezähler über Json abgefragt. dazu folgende Dateien im Bereich der Translation angelegt:
            getAktLeistung.js mit dem Inhalt

            Code:
            JSON.parse(input).pwr;
            und getZaehlerStrom.js mit dem Inhalte
            Code:
            JSON.parse(input).cnt.replace(",", ".");
            Durch das replace wird Komme durch Punkt ersetzt und lässt sich damit auch in die Datenbank schreiben. In der Items Datei steht Folgendes:
            Code:
            Number aktLeistung "Leistung aktuell [%.0f Watt]" <energy> { http="<[http://192.168.100.210/a?f=j:10000:JS(getAktLeistung.js)]" }
            Number ZaehlerStrom "Stromzaehler [%.1f kWh]" <energy> { http="<[http://192.168.100.210/a?f=j:10000:JS(getZaehlerStrom.js)]" }
            
            Number Strom_Ausw_Zeitr "Auswertung"
            Number Verb_Stunde "Verbrauch letzte Stunde [%.1f kWh]"
            Number Verb_Tag "Verbrauch letzter Tag [%.1f kWh]"
            Number Verb_Woche "Verbrauch letzter Woche [%.1f kWh]"
            und in der Sitemap steht das:
            Code:
            Frame label="Verbrauch" {
            Text item=aktLeistung {
            Frame {
            Switch item=Strom_Ausw_Zeitr label="Zeitraum" mappings=[0="Stunde", 1="Tag", 2="Woche", 3="Monat"]
            Chart item=aktLeistung period=h refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==0, Strom_Ausw_Zeitr=="Uninitialized"]
            Chart item=aktLeistung period=D refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==1]
            Chart item=aktLeistung period=W refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==2]
            Chart item=aktLeistung period=M refresh=30000 service="mysql" visibility=[Strom_Ausw_Zeitr==3]
            }
            Frame
            {
            Text item=Verb_Stunde
            Text item=Verb_Tag
            Text item=Verb_Woche
            Text item=ZaehlerStrom
            }
            }
            }
            Jetzt müssen noch die Verbräuche pro Stunde, Tag etc. berechnet werden. Dafür habe ich folgende Rule angelegt:
            Code:
            import org.openhab.core.library.types.*
            import org.openhab.core.persistence.*
            import org.openhab.model.script.actions.*
            import org.joda.time.DateTime
            
            rule "Verb_Stunde berechnen"
            when
            Time cron "0 0/15 * * * ?" // jede viertel Stunde
            then
            {
            Verb_Stunde.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusHours(1)).state as DecimalType)
            }
            end
            
            rule "Verb_Tag berechnen"
            when
            Time cron "0 0/15 * * * ?" // jede viertel Stunde
            then
            {
            Verb_Tag.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusHours(24)).state as DecimalType)
            }
            end
            
            rule "Verb_Woche berechnen"
            when
            Time cron "0 0/15 * * * ?" // jede viertel Stunde
            then
            {
            Verb_Woche.postUpdate(ZaehlerStrom.state as DecimalType - ZaehlerStrom.historicState(now.minusDays(7)).state as DecimalType)
            }
            end
            Jetzt habe ich das Ganze in eine MySQL Datenbank zur Langzeiterfassung plaziert:
            Code:
            Strategies {
            everyHour : "0 0 * * * ?"
            everyDay : "0 0 0 * * ?"
            everyMinute : "0 * * * * ?"
            every5Minute : "0 0/5 * * * ?"
            every10Minute : "0 0/10 * * * ?"
            every15Minute : "0 0/15 * * * ?"
            
            default = everyChange
            }
            Items {
            aktLeistung : strategy = everyMinute, restoreOnStartup
            ZaehlerStrom : strategy = every5Minute, restoreOnStartup
            Mit diesen Codeschnipseln habe ich einen Grafen gebastelt, der mir die aktuelle Leistung zeigt, darunter die Verräuche der jüngeren Vergangeheit berechnet und zeigt und den Zählerstand wiedergibt. Damit gibt es schon mal einen ganz guten Überblick. Was ich mir jetzt noch wünschen würde wäre ein weiteres Chart, in dem jeweils der Verbrauch eines Kalendermonats gezeigt wird. Man müsste also nochmal eine Regel basteln die jeweils vom Monatsletzten bis Monatsersten die Differenz berechnet, und diese in den Wert in MySQL hinterlegt und darauf dann ein Chart loslassen.

            Das fummel ich mir aber auch noch zusammen und werde hier berichten. Hier erstma vielen Dank für die helfenden Tipps.

            VG - Fossi
            Zuletzt geändert von glitzi; 15.03.2019, 20:08.

            Kommentar


              #21
              Hallo,

              ohh ich habe es selber gelöst..

              hier die Lösung:
              JSON.parse(input).cnt.replace(",", ".").replace(" ", "");

              Kommentar


                #22
                Aber mein Tageswert funktioniert noch nicht.

                Code:
                rule "täglicher Stromverbrauch"
                when
                     Item YL_Zaehlerstand changed or
                  Time cron "0 * * * * ?"
                then
                 YL_Tagesverbrauch.postUpdate((YL_Zaehlerstand.state as Number) - (YL_Zaehlerstand.historicState(now.withTimeAtStartOfDay).state as Number))
                 
                end

                Kommentar


                  #23
                  Was funktioniert denn nicht?
                  Evtl. hilft es ja, wenn Du die einzelnen Werte mal loggst:
                  Code:
                  rule "täglicher Stromverbrauch"
                  when
                      Item YL_Zaehlerstand changed or
                      Time cron "0 * * * * ?"
                  then
                      if(!(YL_Zaehlerstand.state instanceof Number)) {
                          logError("daily_curent","aktueller Zählerstand nicht vom Typ Number!")
                      }
                      if(!(YL_Zaehlerstand.historicState(now.withTimeAtStartOfDay).state instanceof Number)) {
                          logError("daily_curent","Zählerstand um 0 Uhr nicht vom Typ Number!")
                      }
                      val nZneu = YL_Zaehlerstand.state as Number
                      val nZalt = YL_Zaehlerstand.historicState(now.withTimeAtStartOfDay).state as Number
                      logInfo("daily_curent","Zähler jetzt: {} - Zähler um 0  Uhr: {} = {}",nZneu,nZalt,nZneu-nZalt)
                      YL_Tagesverbrauch.postUpdate(nZneu - nZalt)
                  end

                  Kommentar

                  Lädt...
                  X