Stromverbrauch pro Monat wird nicht im SVG Plot angezeigt

Begonnen von axel.mohnen, 12 Oktober 2014, 20:01:58

Vorheriges Thema - Nächstes Thema

axel.mohnen

Hallo Fhem´ler,

ich möchte meinen Stromverbrauch als Balkendiagramm im SVG plot anzeigen lassen.
Das Attribute "fixedrange" habe ich auf "year" gesetzt damit ich den Monatsverbrauch über das ganze Jahr sehen kann.
Leider wird garnix angezeigt :-(.

Anbei habe ich die Definitionen von Device (Stromzähler SMLUSB), Filelog und SVG angehangen.
Einen Auszug aus der Filelog ist auch dabei.

Der Wert "Month" aus dem Regexp "statZählerstand-Bezug-Total" ist ein delta Wert der im Module "98_statistics" berechnet wird und an das Device 70_SMLUSB angehangen wurde.

Wenn ich die fixedrange auf "month" und die filelog Funktion "delta-d" setzen bekomme ich ein schönes Balkendiagramm mit dem Tagesverbauch angezeigt.

Hat von euch jemand eine Idee was ich vergessen habe?

Vielen Dank im Voraus.

Devive (SMLUSB):
Internals:
   CHANGED
   DEF        /dev/ttyUSB0
   DeviceName /dev/ttyUSB0
   FD         12
   NAME       eg.hw.sz.haushalt
   NR         66
   PARTIAL
   STATE      W: 305.00 - Bezug
   TYPE       SMLUSB
   Readings:
     2014-10-12 19:28:46   Momentanleistung 305.00
     2014-10-12 19:28:46   Zählerstand-Bezug-Total 6761.86
     2014-10-12 19:28:46   Zählerstand-Tarif-1-Bezug 6761.86
     2014-09-24 23:59:57   Zählerstand-Tarif-2-Bezug 0.03
     2014-10-12 19:22:56   statZählerstand-Bezug-Total Hour: 0.110 Day: 9.820 Month: 73.900 Year: 73.900 (since: 2014-10-04 )
     2014-10-12 18:59:55   statZählerstand-Bezug-TotalLast Hour: 0.520 Day: 9.910 Month: 5.8 Year: -
   Helper:
     PARTIAL    1B1B1B010101017605073C6EDC62006200726301017601010502697A4A09080535342D4C8165010163530B007605073C6EDD6200620072630701770109080535342D4C8165070100620AFFFF72620165050ECBC77B77078181C78203FF010101010449534B0177070100000009FF0101010109080535342D4C81650177070100010800FF650000018201621E52FF59000000000407C7290177070100010801FF0101621E52FF59000000000407C7290177070100010802FF0101621E52FF59000000000000000001770701000F0700FF0101621B520065000001330177070100150700FF0101621B520065000000860177070100290700FF0101621B5200650000009F01770701003D0700FF0101621B5200650000000D0177070100600505FF0101010165000001820177078181C78205FF0101010183023FD9892643654A1FEE5C76E83C4E25EF97EC41AF9D2599C72624E39C69F0966673E7F8C5D0D72D183B83CE710741E77D010101637157007605073C6EDE620062007263020171016347AA001B1B1B1B1A006DEE
     _98_statistics eg.hw.sz.haushalt.stat
Attributes:
   alias      Stromzähler Haushalt
   event-min-interval *:600
   room       HWR


Filelog:
Internals:
   DEF        ./log/HH-%Y-%m.log eg.hw.sz.haushalt
   NAME       eg.hw.sz.haushalt.log
   NOTIFYDEV  eg.hw.sz.haushalt
   NR         71
   NTFY_ORDER 50-eg.hw.sz.haushalt.log
   REGEXP     eg.hw.sz.haushalt
   STATE      active
   TYPE       FileLog
   currentlogfile ./log/HH-2014-10.log
   logfile    ./log/HH-%Y-%m.log
   Pos:
Attributes:
   custom_graph 4:measured@deg@measured
   logtype    power8:power,text
   room       HWR


SVG Plot:
Internals:
   DEF        eg.hw.sz.haushalt.log:SVG_eg.hw.sz.haushalt.log_2:CURRENT
   GPLOTFILE  SVG_eg.hw.sz.haushalt.log_2
   LOGDEVICE  eg.hw.sz.haushalt.log
   LOGFILE    CURRENT
   NAME       SVG_eg.hw.sz.haushalt.log_2
   NR         81
   STATE      initialized
   TYPE       SVG
Attributes:
   fixedrange year
   label      "Verbrauch min: $data{min1}, max: $data{max1}, last: $data{currval1}"
   room       HWR


LogFile HH-2014-10.log:
2014-10-12_19:02:54 eg.hw.sz.haushalt Zählerstand-Bezug-Total: 6761.74
2014-10-12_19:02:54 eg.hw.sz.haushalt Zählerstand-Tarif-1-Bezug: 6761.74
2014-10-12_19:02:54 eg.hw.sz.haushalt Momentanleistung: 281.00
2014-10-12_19:02:54 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.020 Day: 9.730 Month: 73.810 Year: 73.810 (since: 2014-10-04 )
2014-10-12_19:12:55 eg.hw.sz.haushalt Zählerstand-Bezug-Total: 6761.78
2014-10-12_19:12:55 eg.hw.sz.haushalt Zählerstand-Tarif-1-Bezug: 6761.78
2014-10-12_19:12:55 eg.hw.sz.haushalt Momentanleistung: 272.00
2014-10-12_19:12:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.060 Day: 9.770 Month: 73.850 Year: 73.850 (since: 2014-10-04 )
2014-10-12_19:22:56 eg.hw.sz.haushalt Zählerstand-Bezug-Total: 6761.83
2014-10-12_19:22:56 eg.hw.sz.haushalt Zählerstand-Tarif-1-Bezug: 6761.83
2014-10-12_19:22:56 eg.hw.sz.haushalt Momentanleistung: 298.00
2014-10-12_19:22:56 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 9.820 Month: 73.900 Year: 73.900 (since: 2014-10-04 )
2014-10-12_19:32:56 eg.hw.sz.haushalt Zählerstand-Bezug-Total: 6761.88
2014-10-12_19:32:56 eg.hw.sz.haushalt Zählerstand-Tarif-1-Bezug: 6761.88
2014-10-12_19:32:56 eg.hw.sz.haushalt Momentanleistung: 257.00
2014-10-12_19:32:56 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.160 Day: 9.870 Month: 73.950 Year: 73.950 (since: 2014-10-04 )
2014-10-12_19:42:57 eg.hw.sz.haushalt Zählerstand-Bezug-Total: 6761.93
2014-10-12_19:42:57 eg.hw.sz.haushalt Zählerstand-Tarif-1-Bezug: 6761.93
2014-10-12_19:42:57 eg.hw.sz.haushalt Momentanleistung: 360.00
2014-10-12_19:42:57 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.210 Day: 9.920 Month: 74.000 Year: 74.000 (since: 2014-10-04 )


Viele Grüße

Axel

fiedel

#1
Hi Axel,

es wird wohl daran liegen, dass du kein Jahres- sondern ein Monatslogfile nutzt:

ZitatDEF        ./log/HH-%Y-%m.log eg.hw.sz.haushalt

Für "yearly"- Plots brauchst du ein durchgehendes Logfile oder DB-Log. Außerdem muss mindestens ein Monatsumbruch im Logfile sein, damit du den ersten Monat als Balken angezeigt bekommst.

Das sieht z.B. so aus: ./log/OW_Counter-%Y.log

Um das Jahresfile nich zu fett werden zu lassen, habe ich z.B. Monatsfiles definiert, genau wie du und zusätzlich ein Jahresfile für Energie, worin ich nur die Monatsverbräuche logge. Dann ist auch der Aufbau des Plots nie langsam, weil die Größe der einzelnen Files immer ausreichend klein bleibt

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

axel.mohnen

Hi Fiedel,

Wow!, vielen Dank für den Hinweis, das war das fehlende Puzzleteil :-)

Ich habe mal manuell folgenden Fakelog angelegt. Dabei bin ich auf zwei neue Probleme gestoßen:

1. Die Balken pro Monat sind nicht genau ausgerichtet, gibts da vielleicht ein offset oder alignment Attribute?
2. Ich möchte wie du nur ein Log pro Monat in das Jahres-Log schreiben. Aber ich möchte gerne schon z.B. am 15. den aktuellen Monatsverbrauch sehen. Gibts hier eine Möglichkeit den letzten Eintrag im Log (aktueller Monat) zu überschreiben?

2014-05-31_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 5.000 Year: 50.500
2014-06-30_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 10.000 Year: 50.500
2014-07-31_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 20.000 Year: 50.500
2014-08-31_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 30.000 Year: 50.500
2014-09-30_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 20.000 Year: 50.500
2014-10-31_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 50.000 Year: 50.500
2014-11-30_00:09:55 eg.hw.sz.haushalt statZählerstand-Bezug-Total: Hour: 0.110 Day: 2.580 Month: 30.000 Year: 50.500


Vielen Dank und Gruß.

Axel

justme1968

schau dir mal logProxy an. ist noch nicht fertig aber damit geht das mit dem offset und mit etwas handarbeit auch das mit dem 15.

im wiki findest du mehr.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

MoopadPicKang

Auch ich schätze die Atmosphäre der Ermutigung, Austausch und Experimente auf den Brettern.
Es gibt einige wirklich außergewöhnliche Künstler hier.

netbus

Zitat von: fiedel am 13 Oktober 2014, 06:54:50
Hi Axel,

es wird wohl daran liegen, dass du kein Jahres- sondern ein Monatslogfile nutzt:

Für "yearly"- Plots brauchst du ein durchgehendes Logfile oder DB-Log. Außerdem muss mindestens ein Monatsumbruch im Logfile sein, damit du den ersten Monat als Balken angezeigt bekommst.

Das sieht z.B. so aus: ./log/OW_Counter-%Y.log

Um das Jahresfile nich zu fett werden zu lassen, habe ich z.B. Monatsfiles definiert, genau wie du und zusätzlich ein Jahresfile für Energie, worin ich nur die Monatsverbräuche logge. Dann ist auch der Aufbau des Plots nie langsam, weil die Größe der einzelnen Files immer ausreichend klein bleibt

Gruß

Frank
Wie bekommt man Monatsverbräuche?
Mein Sensor wirft die Daten im Sekundenrhytmus raus.

Puschel74

Hallo,

guggst du hier:
http://fhem.de/commandref.html#FileLog
%m steht für monatliches Logfile.
das ganze noch - so wie im ersten Beitrag  ;) - um %Y erweitert und du hast das Jahr auch noch mit drinnen:
logfile    ./log/HH-%Y-%m.log
bedeutet du hast dann ein Logfile mit folgendem Namen im Ordner ./log stehen - HH-2014-10.log

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

netbus

danke für die Info.
Ich meinte aber nicht Monatslog sondern Monatsverbrauch.
fiedel hat nämlich geschrieben das er nur Monatsverbräuche logt.

Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fiedel

Meine Energieberechnung habe ich mal ins Wiki gestellt. Da kannst du das mit den Monats- und Jahresplots abgucken und für dich abwandeln. Auf der verlinkten Seite ab "Berechnen, Loggen und Plotten von Strom- und Gasverbrauchswerten "

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

jnewton957

Hallo Axel,

könntest du bitte noch den Auszug aus der fhem.cfg posten.

Das wäre Klasse, damit man ein vollständiges Bild der Abbildung des Monats/Jahresverbauches inkl. Plot hat.

Genau das ist es, was ich auch suche, da ich nur "Zählerstand-Tarif1-Bezug" aus meinen Zähler ausgelesen und nicht autom. Tageswerte bekomme.

Danke
FHEM6.2 auf Pi5
V 1.66 nanoCUL 433 (IT)
V 1.66 nanoCUL868 (HM)
sqlite3 LogDb
ELRO AB440, DECT200,  TFA30.3125, esp8266, HM, TabletUI, IR-Schreiblesekopf (Udo),tibber Pulse, Kostal Pico, cfos Wallbox, Modbus TCP

fiedel

Hi,

hilft dir mein Wikibeispiel nicht weiter? Da ist so weit alles benötigte drin und lässt sich ggf. entsprechend abwandeln.

Gruß

Frank
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Prof. Dr. Peter Henning

Kann man zwar alles so machen.

Es sei allerdings der Vollständigkeit halber darauf verwiesen, dass im Modul OWCOUNT (das auch mit OWServer zusammen läuft) die gesamten Logging-Funktionen für Monats- und Jahreslog schon implementiert sind und nicht manuell in eine myUtils-Datei oder Konfigurationsdatei eingetragen werden müssen.

LG

pah

tupol

#13
Und dann wäre noch statistics das Tages-, Monats- und Jahresverbrauche berechnet. Da muss nur statREADINGLast geloggt werden. :-)

netbus


tupol


axel.mohnen

#16
Hallo Fhem´ler,

ich möchte euch mal meine Lösung zum Thema zeigen.

Ziel:
Ein Jahresplot (fixedrange=year) als Balkendiagramm um den monatlichen Stromverbrauch darzustellen. Dabei sollte der aktuelle Monat in "Echtzeit" angezeigt werden und nicht erst am Ende des Monats.

Lösung:
1) DB (SQLite installiert) mit "Current" und "History" Tabelle
2) Dummy Device angelegt ohne readings
3) Fake DBLOG angelegt das auf das Dummy Device (step 2) verweisst
4) myUtils geschrieben "upd_monthly_dblog()". Diese Methode wird mittels notify getriggert immer wenn sich die Readings meines Stromzählers (SMLUSB) ändern. Der Stromzähler besitzt zusätzliche readings aus dem Statistics Module. Die Methode schreibt einen Record pro Monat in die DB Tabelle "History". Sollte es für den aktuellen Monat bereits einen Eintrag geben, wird Dieser aktualisiert.
Als "Value" lesen ich mir das "statistics" reading (statZählerstand-Bezug-Total) aus dem Stromzähler (SMLUSB).
5) SVG Plot manuell angelegt, das auf den Fake DBLOG und dummy reading verweisst. Leider werden die Dummy readings nicht im SVG Editor (Drop-Down List) mitgegeben. Keine Ahnung warum?

Todo´s:
Das Balkendiagramm mittels logproxy Modul ausrichten (offset). Hat bist jetzt leider noch nicht gefunzt ;-)

Dummy Device:
#----------------------------------------------------------------------
# Monthly Consumption: Dummy Device - House Powermeter
#----------------------------------------------------------------------
define eg.hw.sz.haushalt.dum1 dummy


Fake DBLOG:
#----------------------------------------------------------------------
# Monthly Consumption: DBLog Definition - House Powermeter
#----------------------------------------------------------------------
define eg.hw.sz.haushalt.dblog1 DbLog ./db.conf eg.hw.sz.haushalt.dum1:Monatsverbrauch


Notify:
#----------------------------------------------------------------------
# Monthly Consumption: Notify Definition - House Powermeter
#----------------------------------------------------------------------
define eg.hw.sz.haushalt.not1 notify eg.hw.sz.haushalt { upd_monthly_dblog("eg.hw.sz.haushalt","statZählerstand-Bezug-Total","eg.hw.sz.haushalt.dum1","SMLUSB","Monatsverbrauch") }


SVG Plot:
#----------------------------------------------------------------------
# Monthly Consumption: SVG Definition - House Powermeter
#----------------------------------------------------------------------
define SVG_eg.hw.sz.haushalt.dblog1_1 SVG eg.hw.sz.haushalt.dblog1:SVG_eg.hw.sz.haushalt.dblog1_1:HISTORY
attr SVG_eg.hw.sz.haushalt.dblog1_1 fixedrange year
attr SVG_eg.hw.sz.haushalt.dblog1_1 label "Verbrauch min: $data{min1}, max: $data{max1}, last: $data{currval1}"
attr SVG_eg.hw.sz.haushalt.dblog1_1 plotfunction eg.hw.sz.haushalt.dum1:Monatsverbrauch
attr SVG_eg.hw.sz.haushalt.dblog1_1 room HWR


GPLOT File:
# Created by FHEM/98_SVG.pm, 2014-11-05 20:53:22
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid
set ylabel "kw/h"
set y2label "kw/h"

#DbLog eg.hw.sz.haushalt.dum1:Monatsverbrauch
plot "<IN>" using 1:2 axes x1y2 title 'Monatsverbrauch' ls l1fill lw 1 with bars


myUtils - upd_monthly_dblog()
sub upd_monthly_dblog($$$$$)
{
# ---------- Local data Definition -------------------------------------------------
my ($readingdev,$readingname,$logdev,$fake_devtype,$fake_readingname) = @_;
my $readingval;
my $readingstring;
my @readingarray;
my $dbh;
my $stmt;
my $sth;
my $rv;
my $row;
my $last_year;
my $last_month;
my $curr_year;
my $curr_month;
#my $curr_timestamp = strftime "%Y-%m-%d %H:%M:%S", localtime;
my $fake_timestamp = strftime "%Y-%m-15 00:00:00", localtime;

# ---------- Check import parameters -----------------------------------------------
if ((!$readingdev) || (!$readingname) || (!$logdev) || (!$fake_devtype) || (!$fake_readingname))
{
return "Import Parameter is missing";
}

# ---------- Retrieve reading from Powermeter --------------------------------------
$readingstring = ReadingsVal($readingdev,$readingname,"0");

if (!$readingstring)
{
return "Couldn´t retrieve Readings:$readingname from device $readingdev";
}
else
{

# ---------- Split reading string by spaces into array -----------------------------
@readingarray = split / /, "$readingstring";
# ---------- Set 5 field (statmonth) as reading value ------------------------------
$readingval = $readingarray[5];
}

# ---------- Build up DB connection ------------------------------------------------
$dbh = build_db_conn();

if (!$dbh)
{
return "DB connection failed";
}

# ---------- Build SQL select in order to retrieve the last record -----------------
$stmt = qq(select max(timestamp), timestamp, device, reading, value from history where device = "$logdev");
# ---------- Prepare SQL statement -------------------------------------------------
$sth = $dbh->prepare( $stmt ) or die "Can't prepare statement: $DBI::errstr";
# ---------- Execute SQL statement -------------------------------------------------
$rv = $sth->execute() or die "Can't execute statement: $DBI::errstr";

$row = $sth->fetchrow_hashref();
$sth->finish;

# ---------- Check DB result -------------------------------------------------------
if (!$row->{TIMESTAMP})
{
# ---------- No record exists, only for the first time -> INSERT record ------------
# ---------- Build SQL statement for insertion -------------------------------------
$stmt = qq(insert into history (timestamp,device,type,event,reading,value)
values ("$fake_timestamp", "$logdev", "$fake_devtype", "$fake_readingname", "$fake_readingname", "$readingval" ));
# ---------- Prepare SQL statement -------------------------------------------------
$sth = $dbh->prepare( $stmt ) or die "Can't prepare statement: $DBI::errstr";
# ---------- Execute SQL statement -------------------------------------------------
$rv = $sth->execute() or die "Can't execute statement: $DBI::errstr";
# ---------- Finish DB Statement ---------------------------------------------------
$sth->finish;

}
else
{
# ---------- At least one record exists --------------------------------------------
# ---------- Check if month has been switched since last record --------------------
$last_year = substr($row->{TIMESTAMP}, 0, 4);
$last_month = substr($row->{TIMESTAMP}, 5, 2);
$curr_year = strftime "%Y", localtime;
$curr_month = strftime "%m", localtime;

# ---------- Check first variables -------------------------------------------------
if (!$last_year)
{
return "Couldn´t retrieve year from timestamp: $row->{TIMESTAMP}";
}

if (!$last_month)
{
return "Couldn´t retrieve month from timestamp: $row->{TIMESTAMP}";
}

if (!$curr_year)
{
return "Couldn´t retieve actual year from localtime";
}

if (!$curr_month)
{
return "Couldn´t retieve actual month from localtime";
}

# ---------- Check if month or years has been changed ------------------------------
if (($last_year != $curr_year) || ($last_month != $curr_month))
{
# ---------- Month has been changed -> Insert record -------------------------------
# ---------- Build SQL statement for insertion -------------------------------------
$stmt = qq(insert into history (timestamp,device,type,event,reading,value)
values ("$fake_timestamp", "$logdev", "$fake_devtype", "$fake_readingname", "$fake_readingname", "$readingval"));
# ---------- Prepare SQL statement -------------------------------------------------
$sth = $dbh->prepare( $stmt ) or die "Can't prepare statement: $DBI::errstr";
# ---------- Execute SQL statement -------------------------------------------------
$rv = $sth->execute() or die "Can't execute statement: $DBI::errstr";
# ---------- Finish DB Statement ---------------------------------------------------
$sth->finish;

}
else
{
# ---------- Month hasn´t been changed -> Update last record -----------------------
# ---------- Build SQL statement for update ----------------------------------------
$stmt = qq(update history set value = "$readingval" where timestamp = "$row->{TIMESTAMP}" and device = "$row->{DEVICE}");
# ---------- Prepare SQL statement -------------------------------------------------  
$sth = $dbh->prepare( $stmt ) or die "Can't prepare statement: $DBI::errstr";
# ---------- Execute SQL statement -------------------------------------------------
$rv = $sth->execute() or die "Can't execute statement: $DBI::errstr";
# ---------- Finish DB Statement ---------------------------------------------------
$sth->finish;
}
}
# ---------- Done -> close DB connection -------------------------------------------
$dbh->disconnect();
}


Gruß Axel

justme1968

eine andere idee das umzusetzen wäre logProxy zu verwenden und die 'alten' readings ganz normal aus FileLog oder DbLog zu plotten und zusätzlich den aktuellen wert 'life' auf dem reading zu holen und mit einer kleinen funktion in den gleichen plot zu setzen. ohne extra fake db.

mehr zu logProxy findest du in der commandref oder z.b. hier: http://www.fhemwiki.de/wiki/LogProxy.

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

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

netbus

Zitat von: justme1968 am 17 November 2014, 23:10:47
eine andere idee das umzusetzen wäre logProxy zu verwenden ... ohne extra fake db.
und diesen monatsgraphen wie axel.mohnen zeigt, kann man mit logproxy auch erzeugen?

justme1968

#19
den monats teil für die vergangenen monate erzeugst du wie sonst auch per average oder statistics oder hourcounter oder was auch immer. loggst sie ganz normal per filelog oder dblog.

nur den einen wert für den aktuellen monat baust du dann per logProxy ein. ohne irgendwelche dummys oder fake log tricks sondern in dem du momentan wert direkt verwendest.

logProxy erzeugt keine daten sondern erlaubt es nur daten aus unterschiedlichen quellen zusammen zu mischen und zu manipulieren.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

netbus

Zitat von: justme1968 am 18 November 2014, 10:51:47
den monats teil für die vergangenen monate erzeugst du wie sonst auch per average oder statistics oder hourcounter oder was auch immer. loggst sie ganz normal per filelog oder dblog.

nur den einen wert für den aktuellen monat baust du dann per logProxy ein. ohne irgendwelche dummys oder fake log tricks sondern in dem du momentan wert direkt verwendest.

logProxy erzeugt keine daten sondern erlaubt es nur daten aus unterschiedlichen quellen zusammen zu mischen und zu manipulieren.

gruß
  andre
Hallo Andre,
Dein Modul ist leider alles andere als einfach zu verwenden.
Auch über die Wiki werde ich nicht wirklich schlau weil einfach die Beispiele fehlen.
Wie kann ich mein bestehenden Plot auf Monatsplott umstellen?
# Created by FHEM/98_SVG.pm, 2014-11-17 08:14:01
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid
set ylabel "Leistung"
set y2label "Leistung"

#logProxy  FileLog 3:AktuellerVerbrauch.*::

plot "<IN>" using 1:2 axes x1y2 title 'Watt' ls l1fill lw 0.5 with lines

define FileLog_AktuellerVerbrauch FileLog ./log/AktuellerVerbrauch-%Y.log AktuellerVerbrauch
attr FileLog_AktuellerVerbrauch custom_graph 3:AktuellerVerbrauch@Watt@Leistung
attr FileLog_AktuellerVerbrauch logtype text
attr FileLog_AktuellerVerbrauch room Admin


justme1968

#21
im wiki gibt es eine ganze reihe beispiele. von der einfachsten linie bis zum plotten eines thermostat wochenprofils oder der sonnen auf und untergangszeiten.

was du tun musst:

- log proxy device definieren
- im define deines SVG plots das FileLog device gegen das log proxy device austauschen
- die zugehörige zeile im plot muss so aussehen: #logProxy  FileLog:FileLog_AktuellerVerbrauch:3:AktuellerVerbrauch.*::

damit solltest erst mal wieder einen normalen plot für die vergangenen monate haben.

wenn das geht fügst du die folgende routine in dein 99_myUtils ein:sub
plotCurrent($$$$)
{
  my($from,$to,$device,$reading) = @_;
  my $fromsec = SVG_time_to_sec($from);
  my $tosec   = SVG_time_to_sec($to);

  my $ret = "";

  my $rt = ReadingsTimestamp( $device, $reading, undef );
  return $ret if( !$rt );

  my $sec = time_str2num($rt);
  return $ret if ( $sec < $fromsec || $sec > $tosec );

  my $val = ReadingsVal( $device, $reading, undef );

  my @t = localtime($sec);
  my $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);

  $ret .= "$timestamp $val\n";
  $ret .= "#plotCurrent: $device:$reading\n";

  return $ret;
}

die schaut on das letzte $reading aus $device im aktuell angezeigten plot zeitraum liegt und bereitet es zum plotten auf. wenn der wert ausserhalb des gerade angezeigten bereiches liegt wird nichts zurückgegeben. du kannst hier noch mit dem alignment des wertes auf ganze minuten, stunden oder tage spielen und auch beim vergleich sekunden, minuten, usw. unberücksichtigt lassen. das hängt alles davon ab wie weit du in den plot hinein zoomen willst.

du kannst das auf der fhem kommandozeile prüfen in dem du die sub direkt aufrufst:{plotCurrent("2014-11-19 00:00:00", "2014-11-19:17:00:00", "AktuellerVerbrauch", "state")}

als letztes baust du noch die folgende zeile für den aktuellen wert in dein plotfile ein:
#logProxy Func:plotCurrent($from,$to,"AktuellerVerbrauch","state")

eine plot... zeile brauchst du natürlich auch:
plot "<IN>" using 1:2 axes x1y2 title 'Watt Aktuell' ls l0fill lw 0.5 with bars

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

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

netbus

Zitat von: justme1968 am 19 November 2014, 11:38:25
- die zugehörige zeile im plot muss so aussehen: #logProxy  FileLog:FileLog_AktuellerVerbrauch:3:AktuellerVerbrauch.*::
damit solltest erst mal wieder einen normalen plot für die vergangenen monate haben.
Leider bekomme ich da einen Fehler
XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: http://192.168.1.50:8083/fhem/SVG_showLog?dev=SVG_FileLog_AktuellerVerbrauch_1&logdev=FileLog_AktuellerVerbrauch&gplotfile=SVG_FileLog_AktuellerVerbrauch_1&logfile=CURRENT&pos=
Zeile Nr. 2, Spalte 1:

justme1968

zeig mir bitte mal eine rein FileLog basierte konfiguration die mit deinem log geht.

gruß
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

netbus

#24
define FileLog_AktuellerVerbrauch FileLog ./log/AktuellerVerbrauch-%Y.log AktuellerVerbrauch
attr FileLog_AktuellerVerbrauch custom_graph 3:AktuellerVerbrauch@Watt@Leistung
attr FileLog_AktuellerVerbrauch logtype text
attr FileLog_AktuellerVerbrauch room Admin
define SVG_FileLog_AktuellerVerbrauch_1 SVG FileLog_AktuellerVerbrauch:SVG_FileLog_AktuellerVerbrauch_1:CURRENT
attr SVG_FileLog_AktuellerVerbrauch_1 label "min: $data{min1}, max: $data{max1}, avg: $data{avg1}, Last $data{currval1}"
attr SVG_FileLog_AktuellerVerbrauch_1 room Haus


Jetzt sehe ich einen Graphen,
Ich musste im Plot Editor einmal "write .gplot file" drücken
Wenn ich aber
{plotCurrent("2014-11-19 00:00:00", "2014-11-19:17:00:00", "AktuellerVerbrauch", "state")}
eingebe kommt nichts

justme1968

in welchem reading steht der wert? wenn es nicht state ist musst du natürlich etwas anderes eintragen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

axel.mohnen

Hi Andre und Netbus,

ich denke mal das zur Darstellung eines Balkendiagramms nur ein Log pro Monat weggeschrieben wird?
Zusätzlich kommt noch ein log aus der "plotCurrent" dazu, korrekt?

"./log/AktuellerVerbrauch-%Y.log"

Gruss
Axel

justme1968

du brauchst ein log für die historischen monats werte. plotCurrent wird nicht geloggt sondern holt den aktuellen wert im augenblick des plottens live aus dem device in dem die werte aufsummiert werden.

logProxy kombiniert die daten aus beiden quellen in einen einzigen SVG plot.

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

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

netbus

Zitat von: axel.mohnen am 17 November 2014, 21:49:45
Der Stromzähler besitzt zusätzliche readings aus dem Statistics Module. Die Methode schreibt einen Record pro Monat in die DB Tabelle "History".
Axel,
die Methode mit Statistics hatte ich auch probiert aber ich hatte nur Nullen in den Readings. Der Entwickler des Moduls hat geschrieben dass das Modul anzeigt wie lange der jeweilige state existiert. Mein Stromzähler liefert ab Watt Werte und kein On Off. Was für Werte spuckt dein Stromzähler aus?

axel.mohnen

Hi Netbus,

Hier sind meine Definitionen. Im Anhang findest du ein screenshot von den Stromzähler readings + statistics.
Bis auf ein Rundungsproblem, das bereits vom Entwickler behoben wurde funzt die Statistics sehr gut bei mir.

Definition Stromzähler (SMLUSB)

#----------------------------------------------------------------------
# Powermeter Definition:
#----------------------------------------------------------------------
define eg.hw.sz.haushalt SMLUSB /dev/ttyUSB0
attr eg.hw.sz.haushalt alias Stromzähler Haushalt
attr eg.hw.sz.haushalt event-min-interval *:1800
attr eg.hw.sz.haushalt room HWR


Definition Statistics für Stromzähler:

#----------------------------------------------------------------------
# Statistics Definition: House Powermeter
#----------------------------------------------------------------------
define eg.hw.sz.haushalt.stat statistics eg.hw.sz.haushalt
attr eg.hw.sz.haushalt.stat deltaReadings Zählerstand-Bezug-Total


Gruß
Axel

tupol

Zitat von: netbus am 19 November 2014, 19:54:23
Axel,
die Methode mit Statistics hatte ich auch probiert aber ich hatte nur Nullen in den Readings. Der Entwickler des Moduls hat geschrieben dass das Modul anzeigt wie lange der jeweilige state existiert. Mein Stromzähler liefert ab Watt Werte und kein On Off. Was für Werte spuckt dein Stromzähler aus?

Hallo netbus,
Das statistics-Modul tut natürlich einfach das, für was es konfiguriert wird. :-) In Deiner Konfiguration wertest Du die Watt-Werte als state aus, was keinen Sinn macht.

Watt ist zudem Leistung und nicht Energie. Du brauchst aber Energie in kWh. Die kann dann auch statistics auswerten (wenn es entsprechend der commandRef konfiguriert wird ;-).

Gruß

tupol