Hauptmenü

Summieren von Daten

Begonnen von Matthias_1968, 13 Februar 2017, 19:07:23

Vorheriges Thema - Nächstes Thema

Matthias_1968

Hallo,
ich habe eine Sonnenbatterie, die ich auslesen und auswerten möchte, leider funktioniert meine Konfiguration nicht wie sie soll.

System: Raspberry 3 und Sonnenbatterie ECO8

Was möchte ich:
Ich möchte die Werte der Sonnenbatterie unabhängig vom Hersteller loggen, damit ich jederzeit die Werte die mich persöhnlich interessieren auf einem Blick vor mir habe.
Die Werte sollen sein: Tagesverbrauch und Monatsverbrauch der Anlage.

Was bereits funktioniert: Das Auslesen der Werte alle 5 Sekunden (Verbrauch, Produktion, Bezug, Richtung, BatterieLadung, BatterieEntladung.
Was funktioniert nicht:
Das Summieren der Werte, jede Minute zu Tages- und Monatswerten , die alle 5 Sekunden geloggt werden.

Meine cfg:
define SonnenStatus HTTPMOD http://[IP-Der-Batterie]:8080/api/v1/status 5
#attr SonnenStatus userattr Consumption_W Production_W Timestamp Pac_total_W
attr SonnenStatus userattr reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex reading05Name reading05Regex reading06Name reading06Regex
attr SonnenStatus group SonnenBatterie
attr SonnenStatus room Sonnebatterie
attr SonnenStatus icon measure_photovoltaic_inst
attr SonnenStatus event-on-update-reading .*
attr SonnenStatus reading01Name Verbrauch
attr SonnenStatus reading01Regex Consumption_W":([\d\.]+)
attr SonnenStatus reading02Name Produktion
attr SonnenStatus reading02Regex Production_W":([\d\.]+)
attr SonnenStatus reading03Name Bezug
attr SonnenStatus reading03Regex GridFeedIn_W":([\d\.]+)
attr SonnenStatus reading04Name Richtung
attr SonnenStatus reading04Regex Pac_total_W":([.\d\.]+)
attr SonnenStatus reading05Name BatterieLadung
attr SonnenStatus reading05Regex RSOC":([\d\.]+)
attr SonnenStatus reading06Name BatterieEntladung
attr SonnenStatus reading06Regex USOC":([\d\.]+)

### Werte sammeln MI_=Minute , ST_=Stunde , D_=Tag, MO=Monat
attr SonnenStatus userReadings SonnenWerte {SB_Verbrauch_Summieren(ReadingsVal("SonnenStatus","Verbrauch",0))}

define MinutenVerbrauch dummy
attr MinutenVerbrauch alias VerbrauchProMinute
attr MinutenVerbrauch group SonnenStatus
define TimeSwitch_Verbrauch DOIF ([+60])\
(set MinutenVerbrauch {([MinutenVerbrauch[+[SonnenWerte])})


Das dazugehörige Modul:
sub SB_Verbrauch_Summieren($)
{
my ($AktWert) = @_;
   $Verbrauch_MI = $Verbrauch_MI + $AktWert;
   $Verbrauch_D = $Verbrauch_D + $AktWert;
    return $Verbrauch_MI;
}


Weiter komme ich momentan nicht, ich bekomme es nicht hin, die einzelnen Werte zu summieren.

Achso: Falls jemand eine Andere oder Bessere Idee hat an die Werte zu kommen: Ich bin für alles offen!

Gruß
Matthias_1968

Thorsten Pferdekaemper

Hi,
ich bin mir nicht sicher, aber vielleicht kann da das statistics-Modul was machen.
Außerdem: Lass besser die Finger von der fhem.cfg. Die ist für FHEM, nicht für Dich...

So, jetzt zu Deinem Lösungsansatz: Mit dem userReadings-Attribut definierst Du momentan genau ein neues Reading namens SonnenWerte. Das ist aber erstmal ok. Die ganzen Variablen in Deiner Perl-Routine sind nicht definiert. Das müsste eigentlich Fehlermeldungen ergeben.
Was Du willst, das ist ja Werte zu dem Summen-Reading addieren. Also musst Du erstmal Dein Summen-Reading lesen, dann den neuen Wert dazuzählen und das ganze zurückgeben. Möglicherweise geht das so:

attr SonnenStatus userReadings SonnenWerte {return ReadingsVal("SonnenStatus","SonnenWerte",0) + ReadingsVal("SonnenStatus","Verbrauch",0)}

Gruß,
   Thorsten
FUIP

Matthias_1968

Hallo Thorsten,

danke für die Info's!

ZitatAußerdem: Lass besser die Finger von der fhem.cfg. Die ist für FHEM, nicht für Dich...

Ich habe ein include in die fhem.cfg auf meine SonnenBatterie.cfg gemacht, war der Meinung, das es so gemacht wird.

Deinen Lösungsansatz mache ich vom Prinzip ja schon, nur das ich eine eigene 99_Sonnen_ECO.pm erstellt habe, damit ich hier die nötigen Module sammeln kann.

Zitatattr SonnenStatus userReadings SonnenWerte {SB_Verbrauch_Summieren(ReadingsVal("SonnenStatus","Verbrauch",0))}

Das Summieren alle 5 Sekunden, getriggert über HTTPMOD funktioniert auch erstmal, aber ich scheitere daran, diese Werte alle 60 Sekunden zusammen zufassen.

Hintergrund: Bei Sonnen kann ich eine Liste der Werte Online ziehen, in der die Werte pro Minute drin stehen.

Da Sonnen weder auf E-Mails antwortet, noch wie mehrfach telefonisch versprochen zurückruft, um mir Zugriff auf die Daten zu geben, bin ich auf FHEM gekommen.

Das Summieren der Werte pro Minute hilft mir, die gesammelten Werte zu vergleichen, ausserdem kann ich mir die Daten anzeigen lassen, die mir wichtig sind  :)

Bisher habe ich versucht das ganze über DOIF zu ssummieren, habe aber gelesen, das es auch mit notify gehen soll.

Bin für jede Anregung offen.

Danke!


klaso

Hi,

Bekommst du irgendwo den GesamtVerbrauch ausgelesen?
Ich habe bei meinem Wärmemengenzähler nur den Gesamtverbrauch zur Verfügung, und arbeite in der Darstellung in einem Plot mit Delta-d. Somit sehe ich immer den Tagesverbrauch. Und mit fixedrange week bzw. Month bekomme ich immer einen schönen überblick. Allerdings sieht man halt nur dann den Tagesverbrauch.
Vielleicht hilft dir dieser "umgekehrte" Weg zu einer gewünschten Lösung......weiss halt nicht, was du sonst noch mit den Daten vorhast ;-)
VG
Klaso
Raspberry Pi 2 B+; Software: Raspbian Jessie, Fhem 5.8
ZWave, Enocean, FBAHAHTTP, ENIGMA2
Barebone mit openmedivault und Fhem5.8, MySQL, MyObis, VBUS LAN-Adapter in Fhem, Homematic CCU2; Jeelink mit TX29IT, HMCCU: Schnittstelle CCU2 - FHEM

Matthias_1968

Hallo klaso,

das einzige was ich auslesen kann, sind die aktuellen Werte die live auf der Webside gezeigt werden, darum der HTTPMOD.

Gruß

klaso

Hallo Matthias,

Bzgl HTTPMOD hab ich verstanden, aber wird dir auf der Website der Gesamtverbrauch angezeigt? Also Gesamtverbrauch seit Inbetriebnahme. Ein Stromzähler zeigt z. B. Unter anderem den Gesamtverbrauch seit Inbetreibnahme an. Falls du diesen Gesamtverbrauch auf der Website stehen hast, wäre es eine mögliche Lösung....
War nur eine Idee, da du ja geschrieben hast, dass du für andere Vorschläge offen bist. Eine andere Idee habe ich nicht....
VG
Klaso
Raspberry Pi 2 B+; Software: Raspbian Jessie, Fhem 5.8
ZWave, Enocean, FBAHAHTTP, ENIGMA2
Barebone mit openmedivault und Fhem5.8, MySQL, MyObis, VBUS LAN-Adapter in Fhem, Homematic CCU2; Jeelink mit TX29IT, HMCCU: Schnittstelle CCU2 - FHEM

Matthias_1968

Für so einen Wert wäre ich Dankbar!

Leider bekomme ich über HTTPMOD nur:

{"Consumption_W":515,"Fac":50,"GridFeedIn_W":-14,"IsSystemInstalled":1,"Pac_total_W":506,"Production_W":0,"RSOC":24,"Timestamp":"2017-02-14 19:31:29","USOC":20,"Uac":230,"Ubat":51}


Thorsten Pferdekaemper

Zitat von: Matthias_1968 am 14 Februar 2017, 18:48:24
Deinen Lösungsansatz mache ich vom Prinzip ja schon,
Nein, machst Du nicht. Du fummelst mit nicht ordentlich definierten lokalen Variablen rum, während ich die Readings auslese. Versuch doch einfach mal meinen Ansatz bevor Du solche Behauptungen aufstellst.
Danach kann man ja immer noch sehen, wie man das verfeinert.
Gruß,
   Thorsten
FUIP

Matthias_1968

ZitatNein, machst Du nicht. Du fummelst mit nicht ordentlich definierten lokalen Variablen rum, während ich die Readings auslese. Versuch doch einfach mal meinen Ansatz bevor Du solche Behauptungen aufstellst.

So wie ich das bisher verstanden hatte, macht dein Code das gleich wie meiner, nur das du das in einer Zeile machst und ich in einem Seperaten Modul.
In diesem Modul habe ich die benötigten Variablen eingebaut.
package main;

use strict;
use warnings;
use POSIX;
my $MI_Ticker;
my $Verbrauch_MI;
my $Verbrauch_D;


sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

# Enter you functions below _this_ line.


sub SB_Verbrauch_Summieren($)
{
my ($AktWert) = @_;
   $Verbrauch_MI = $Verbrauch_MI + $AktWert;
   $Verbrauch_D = $Verbrauch_D + $AktWert;
    return $Verbrauch_MI;
}

}

1;


Perl ist mir noch nicht so vertraut, da habe ich noch jede Menge Nachholbearf!

Gruß

Thorsten Pferdekaemper

Ah, ok. Da war noch was...
So wie das aussieht müsste es zumindest mal bis zum nächsten Restart funktionieren. Ich kann jetzt auch nicht so recht sagen, warum das nicht der Fall ist. Ist nichts im Log?
Ansonsten versuch mal meinen Ansatz, um Probleme mit Deiner sub auszuschließen.
Gruß,
   Thorsten
FUIP

Matthias_1968

Ich habe deine Version eingebaut, das funktioniert!

Jetzt würde mich interessieren, wie ich aus diesen Wert alle 60 Sekunden eine Summe erstelle.




Thorsten Pferdekaemper

Zitat von: Matthias_1968 am 14 Februar 2017, 20:48:20
Jetzt würde mich interessieren, wie ich aus diesen Wert alle 60 Sekunden eine Summe erstelle.
Was genau meinst Du damit? Immer 12 Werte sammeln und damit dann ein Reading füttern?
Gruß,
   Thorsten
FUIP

Matthias_1968

12 Werte sammeln ja, ob das ein reading ist weiß ich nicht :o

Ich möchte die Werte pro Minute (oder 12 Werte) abspeichern, damit ich die vergleichen kann.

Ich komme nur mit dem Syntax nicht zurecht:
define TimeSwitch_Verbrauch DOIF ([+60])\
(set MinutenVerbrauch {([MinutenVerbrauch[+[SonnenWerte])})

Ich bekomme es nicht auf den Schirm eine Summe zu ziehen.

Im log sehe ich zwar:
2017.02.14 21:01:45 5: Cmd: >setstate user 2017-02-14 20:43:32 state active<
2017.02.14 21:01:45 1: configfile: TimeSwitch_Verbrauch DOIF: no right bracket: [MinutenVerbrauch[+[SonnenWerte])}

aber da kann ich aktuell nichts anfangen.


mahowi

define TimeSwitch_Verbrauch DOIF ([+60])\
(set MinutenVerbrauch {([MinutenVerbrauch[+[SonnenWerte])})
                                         ^

Da ist die Klammer falsch rum. Daher auch "no right bracket".
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Thorsten Pferdekaemper

Zitat von: Matthias_1968 am 14 Februar 2017, 21:03:59
Ich komme nur mit dem Syntax nicht zurecht:
define TimeSwitch_Verbrauch DOIF ([+60])\
(set MinutenVerbrauch {([MinutenVerbrauch[+[SonnenWerte])})
Also wenn Du das mit DOIF machen willst, dann kann ich Dir nicht helfen. Ansonsten versuch erst einmal "mein" coding in eine sub auszulagern. Darauf können wir dann aufbauen.
Gruß,
   Thorsten
FUIP