SVG Plot mit Daten aus verschiedenen Jahren

Begonnen von FhemPiUser, 30 Dezember 2015, 20:46:03

Vorheriges Thema - Nächstes Thema

FhemPiUser

Hallo,
aktuell zeichne ich meinen mit EM1000GZ gemessenen monatlichen Gasverbrauch auf und habe einen SVG-Plot mit den Monatswerten (mit "fixedrange year").

Nun würde ich gerne
1) die Monatswerte kummuliert aufzeichnen und
2) parallel zum Vergleich Datenreihen mit den Monatswerten des letzten und vorletzten Jahres im SVG Plot aufzeichnen. Dann sehe ich immer gleich, ob ich im jeweiligen Monat über oder unter dem Verbrauch des letzten Jahres bin...

Vor allem 2) erscheint mir schwierig. Hat das schon einmal jemand gemacht oder eine Idee, ob und wie das gehen könnte? Mir fiele da höchstens logProxy mit einer eigenen Func ein, die mit "get" die Werte der letzten Jahre einliest. Wäre aber recht aufwändig zu implementieren, wenn es überhaupt ginge...

1) könnte man evtl. mit logProxy und "postfn" machen, die einfach die Werte kummuliert.

Was meint ihr?

rudolfkoenig

Zu 1.
Nachtraeglich diese Werte hinzuzufuegen geht es mWn nicht mit FHEM-Boardmitteln, da ist awk oder perl gefragt.
Ansonsten kann man die Monatswerte z.Bsp. mit dem average Modul berechnen.

Zu 2.
Ich habe eine historische Seite mit Jahres-Anzeige der Tages und Monatsdurchschnitte, und zum Vergleichen nehme ich die Copy&Paste Funktion aus der Plot-Menue
Ich weiss nicht, ob man die Werte per logProxy verschieben kann, mit den "herkoemmlichen" Mitteln geht es mWn nicht.
Als Workaround koennte man die Datei kopieren, die Datumswerte per Editor aendern, und sie mit einem neuen read-only FileLog einbinden.

justme1968

#2
zu 1: ja. das geht mit einer passenden postFn und etwas handarbeit. sollte aber nicht sooo schlimm sein.

zu2: das sollte mit logProxy und einem offset=12m bzw. offset=24m für die historischen graphen funktionieren.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

FhemPiUser

#3
@justme1968: Danke, 1) habe ich hinbekommen mit folgendem Code:

sub postFn_CUL_EM_9_cum($$) {
  my($devspec,$array) = @_;
  my $last_point = 0;
     
  foreach my $point ( @{$array} ) {
    $point->[1] += $last_point;
    $last_point = $point->[1];
  }   

  return $array;
}


Aber 2) funktioniert offenbar nicht mit offset='12m' oder offset='24m'. Ich sehe dann die Daten des aktuellen Jahres um wenige Monate verschoben. Offenbar verschiebt er immer nur die Daten des aktuellen Jahres.

Auch wenn ich die o.g. postFn-Funktion mal ein print einfüge sehe ich, dass nur Werte aus dem aktuellen Jahr verarbeitet werden...

@rudolfkoenig: Wie erstellst Du Graphen mit den Tages und Monatsdurchschnitten der letzten Jahre?

FhemPiUser

Mit ist aufgefallen, dass irgendetwas im Zusammenspiel mit dem logproxy offset und fixedrange=year nicht zu stimmen scheint. Bei offset='-1m' fehlt z.B. der Dezember in der Ansicht vom letzten Jahr. Und bei offset='12m' kommen keine Daten vom Vorjahr...


FhemPiUser

hab 2) jetzt erstmal mit separatem graph und "fixedrange year -1" gelöst...

HeikoGr

#6
Bevor ich ein neues Thema mache, recycle ich dieses alte hier.
Ich habe für Punkt 2 eine Möglichkeit gefunden die Daten in einen Plot darzustellen. Allerdings habe ich keine Ahnung ob der Offset auch über ein Jahreswechsel funktioniert.

Ich vergleiche den Tagesverbrauch Erdgas von gestern mit heute. (Macht nicht immer Sinn, ich weiß - Solange ich aber noch keine Jahreswerte vorliegen habe brauchte ich etwas zum üben).

Die Funktion zieht von allen allen angezeigten Datenpunkten der Graphen den minimum-Wert ab. Somit startet jeder Graph bei 0.

in der GPLOT Datei:
#lp DbLog:mariadb,postFn='postFnMinShift':GasZaehler:Zaehler
#lp DbLog:mariadb,offset=1*(60*60*24),postFn='postFnMinShift':GasZaehler:Zaehler


in der 99_myUtils.pm Datei
sub postFnMinShift($$) {
  my($devspec,$array) = @_;
  my $min = 0;

  foreach my $point ( @{$array} ) {
    $min = $point->[1] if !$min || $point->[1] < $min;
  }   
     
  foreach my $point ( @{$array} ) {
    $point->[1] -= $min;
  }   

  return $array;
}