Hallo!
Ich hatte vor einiger Zeit schon einmal ein Projekt gestartet, den Stromverbrauch meiner Wärmepumpe auszulesen.
Das klappt soweit auch alles sehr gut und genau.
Nun hätte ich sehr gern noch eine Anzeige für den Stromverbrauch des Vortags, Woche, Monat, Jahr.
Das Define für das Logfile sieht so aus:
define FileLog_Stromverbrauch FileLog ./log/Stromverbrauch-%Y-%m.log Strom:StromverbrauchStd:.*|Strom:StromverbrauchTag:.*|Strom:zaehler_jetzt:.*
Nun wird jeden Monat ein Logfile erzeugt.
Die Werte sehen dann so aus:
2020-11-01_00:00:00 Strom StromverbrauchTag: 0
2020-11-01_00:00:40 Strom StromverbrauchTag: 0.001
2020-11-01_00:00:40 Strom zaehler_jetzt: 255.728000000259
Jetzt müsste ja quasi nur ein Dummy erzeugt werden, der jeden Tag um 23:59h das Reading Vortag erzeugt.
Gleiches dann für Woche, Monat und Jahr.
Tja und warum bin ich nun im Anfängerforum?
Weil ich leider Null Plan habe wie ich das machen kann :(
Kann mir jemand bitte unter die Arme greifen?
Mit einem at (https://fhem.de/commandref_DE.html#at), der ein
setreading Strom lastDay [Strom:StromverbrauchTag]
macht, brauchst Du kein zusätzliches Dummy
Zitat von: amenomade am 07 November 2020, 01:59:06
Mit einem at (https://fhem.de/commandref_DE.html#at), der ein
setreading Strom lastDay [Strom:StromverbrauchTag]
macht, brauchst Du kein zusätzliches Dummy
..kannst du mir da bitte etwas mehr auf die Sprünge helfen?
EDIT:
so?
define lastDay at *23:59:00 [Strom:StromverbrauchTag]
Allerdings kriege ich so kein Reading....
Nein, genau wie geschrieben: ein at, der setreading macht.
define lastDay at *23:59:00 setreading Strom lastDay [Strom:StromverbrauchTag]
Zitat von: amenomade am 07 November 2020, 08:57:14
Nein, genau wie geschrieben: ein at, der setreading macht.
define lastDay at *23:59:00 setreading Strom lastDay [Strom:StromverbrauchTag]
Danke für deine Hilfe.
Habe das jetzt mal aktuell ausprobiert.
Bekomme aber kein Reading :(
Internals:
CFGFN
COMMAND setreading Strom lastDay [Strom:StromverbrauchTag]
DEF *12:40:00 setreading Strom lastDay [Strom:StromverbrauchTag]
FUUID 5fa6876a-f33f-0855-1fc0-b7111c34616982f2
NAME lastDay
NR 29790
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 12:40:00
TIMESPEC 12:40:00
TRIGGERTIME 1604835600
TRIGGERTIME_FMT 2020-11-08 12:40:00
TYPE at
READINGS:
2020-11-07 12:40:00 state Next: 12:40:00
Attributes:
Zeig bitte das Ergebnis von "list Strom", nachdem Du auf dem at ein set execNow gemacht hast.
Zitat von: amenomade am 07 November 2020, 16:28:58
Zeig bitte das Ergebnis von "list Strom", nachdem Du auf dem at ein set execNow gemacht hast.
Internals:
FUUID 5edc1980-f33f-0855-fa44-917ad2b8c36a379e
NAME Strom
NR 278
STATE 0
TYPE dummy
READINGS:
2020-11-08 02:56:40 StromverbrauchStd 0.047
2020-11-08 02:56:40 StromverbrauchTag 0.586
2020-11-08 02:56:45 lastDay 0.586
2020-05-30 23:17:16 state 0
2020-11-08 02:56:30 zaehler_jetzt 287.353000000142
Attributes:
event-on-change-reading StromverbrauchStd,StromverbrauchTag,zaehler_jetzt
readingList StromverbrauchStd StromverbrauchTag zaehler_vortag zaehler_jetzt
room Stromverbrauch
userReadings zaehler_jetzt:StromverbrauchTag.* monotonic {ReadingsVal($name,'StromverbrauchTag',0)}
Zitat von: B.Stromberg am 08 November 2020, 02:57:39
Internals:
READINGS:
2020-11-08 02:56:40 StromverbrauchStd 0.047
2020-11-08 02:56:40 StromverbrauchTag 0.586
2020-11-08 02:56:45 lastDay 0.586
2020-05-30 23:17:16 state 0
2020-11-08 02:56:30 zaehler_jetzt 287.353000000142
Attributes:
event-on-change-reading StromverbrauchStd,StromverbrauchTag,zaehler_jetzt
Also das reading lastDay ist doch vorhanden. Von Hand gesetzt?
Oder ist ein fehlender Log-Eintrag gemeint?
Im Wiki steht dazu:
ZitatSind bei einem Device weder event-on-change-reading noch event-on-update-reading spezifiziert, werden für alle Readings sowohl bei Änderung als auch bei der Aktualisierung (mit dem gleichen Wert) Events erzeugt. Sobald jedoch eines der beiden Attribute gesetzt ist, müssen alle Readings, die protokolliert werden sollen bei (mindestens) einem der Attribute berücksichtigt sein.
Somit dürfte also das Reading lastDay in der Auflistung fehlen und damit kein Event und deshalb kein Log-Eintrag erzeugt werden.
soooo..........das Reading ist nun da.
Bin heute Nacht gespannt ob das dann auch so geht (wovon ich jetzt mal ausgehe)
Somit wäre Vortag erledigt.
Wie geht das Ganze nun mit Woche, Monat und Jahr?
Zitat von: amenomade am 07 November 2020, 16:28:58
Zeig bitte das Ergebnis von "list Strom", nachdem Du auf dem at ein set execNow gemacht hast.
Das scheint soweit zu klappen.
Kannst du mir bitte auch bei wöchentlich, monatlich und jährlich weiterhelfen?
Woche , Monat Jahr läuft bei mir nach dem gleichen Muster :
at nahe Miternacht um die aktuellen Ist Werte zu retten und die neuen berechnen. Da macht es allerdings schon Sinn auf eine eigene Funktion in der 99_myUtils auszuweichen , die muss beim Aufruf zuerst prüfen :
Ist der nächste Tag ein Montag ? wenn ja dann rette den aktuellen Wert als Wochenende und berechne aus dem Wert von letzet Woche den aktuellen Verbrauch dieser Woche.
Dann prüfen ob der nächste Tag der erste eines Monats ist , wenn ja : gleiches Spiel wie bei der Woche.
zum Schluss dann prüfen ob morgen der 1. januar ist (oder heute der 31.12) , wenn ja : Jahr berechnen.
Das ergibt zwar eine Batterie von Readings, aber so bekommt man schön den Überblick.
Ich würde bei der Gelgenheit auch gleich den Dummy entsorgen und direkt die Readings in dem Device setzen das auch die Ausgangswerte bereitstellt.
Du hast aber kein Reading, das den Verbrauch für Woche, Monat oder Jahr erfasst.
Schau mal nach Modul "statistics". Für Woche macht es nicht, aber Du hättest schon Monat und Jahr.
Sonst kannst Du auch mit einem at arbeiten: bei Tageswechsel:
- wenn $wday==1, zaehler_jetzt als zaehler_Anfang_Woche speichern
- wenn $mday==1, zaehler_jetzt als zaehler_Anfang_Monat speichern
- wenn $yday==1, zaehler_jetzt als zaehler_Anfang_Jahr speichern
Dann mit userReadings oder noch im at selbst die gewünschte Differenzen kalkulieren.
Zitat von: Wzut am 08 November 2020, 17:48:03
Woche , Monat Jahr läuft bei mir nach dem gleichen Muster :
at nahe Miternacht um die aktuellen Ist Werte zu retten und die neuen berechnen. Da macht es allerdings schon Sinn auf eine eigene Funktion in der 99_myUtils auszuweichen , die muss beim Aufruf zuerst prüfen :
Ist der nächste Tag ein Montag ? wenn ja dann rette den aktuellen Wert als Wochenende und berechne aus dem Wert von letzet Woche den aktuellen Verbrauch dieser Woche.
Dann prüfen ob der nächste Tag der erste eines Monats ist , wenn ja : gleiches Spiel wie bei der Woche.
zum Schluss dann prüfen ob morgen der 1. januar ist (oder heute der 31.12) , wenn ja : Jahr berechnen.
Das ergibt zwar eine Batterie von Readings, aber so bekommt man schön den Überblick.
Ich würde bei der Gelgenheit auch gleich den Dummy entsorgen und direkt die Readings in dem Device setzen das auch die Ausgangswerte bereitstellt.
Das übersteigt leider meine Fähigkeiten bei weitem....
Wenn du so etwas schon hast, würdest du mir den Code zur Verfügung stellen?
Hier ein Code-Beispiel für Wetterwerte am Monatsendedefmod month_end at *23:59:00 {if ((strftime "%d",localtime time+86400) eq "01") {\
my $Erg=sprintf("Durchs %.1f max %.1f min %.1f", ReadingsVal("muc","temperature_avg_month",0), \
ReadingsVal("muc","temperature_max_month",0),\
ReadingsVal("muc","temperature_min_month",0));;\
fhem("setreading muc month_end $Erg");;;; }\
}
das reading:
month_end Durchs 10.3 max 22.2 min 3.4 2020-10-31 23:59:00
@B.Stromberg:
Möchte Dir beispielhaft meine Lösung vorstellen (vermutlich ähnlich wie die von Wzut). Ist vielleicht nicht profihaft programmiert, dafür aber leicht verständlich und leicht um die Wochenwerte erweiterbar.
Zunächst brauchst Du 3 bzw. in Deinem Fall 4 Dummys, welche die Werte des Tages/Vortages, Woche/Vorwoche, Monat/Vormonat und Jahr/Vorjahr speichern. Natürlich könntest Du auch alle Werte in nur einem Dummy speichern.
Dann brauchst Du den nachfolgenden Code, den Du in die 99_myUtils.pm einfügst. Die Variablen- und Readingsnamen musst Du nach Deinen Wünschen anpassen:
sub PV_Rechner {
my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
my $Total_neu = (ReadingsVal("S0_PV","Total",0));
my $Total_alt = (ReadingsVal("S0_PV","Total_alt",0));
my $ErtragVorTag = (ReadingsVal("PV_Ertrag_Tag","Ertrag_VorTag",0));
my $ErtragVorMonat = (ReadingsVal("PV_Ertrag_Monat","Ertrag_VorMonat",0));
my $ErtragVorJahr = (ReadingsVal("PV_Ertrag_Jahr","Ertrag_VorJahr",0));
my $ErtragTag = (ReadingsVal("PV_Ertrag_Tag","Ertrag_Tag",0));
my $ErtragMonat = (ReadingsVal("PV_Ertrag_Monat","Ertrag_Monat",0));
my $ErtragJahr = (ReadingsVal("PV_Ertrag_Jahr","Ertrag_Jahr",0));
my $Diff = $Total_neu - $Total_alt;
my $ErtragTag_neu = $ErtragTag + $Diff;
my $ErtragMonat_neu = $ErtragMonat + $Diff;
my $ErtragJahr_neu = $ErtragJahr + $Diff;
fhem("setreading S0_PV Total_alt $Total_neu");
fhem("setreading PV_Ertrag_Tag Ertrag_Tag $ErtragTag_neu");
fhem("setreading PV_Ertrag_Monat Ertrag_Monat $ErtragMonat_neu");
fhem("setreading PV_Ertrag_Jahr Ertrag_Jahr $ErtragJahr_neu");
if(($hour==0) && ($min==0)){
my $neuerVortagesErtrag = $ErtragTag;
fhem("setreading PV_Ertrag_Tag Ertrag_VorTag $neuerVortagesErtrag ");
fhem("setreading PV_Ertrag_Tag Ertrag_Tag 0")
}
if(($hour==0) && ($min==0) && ($mday==1)){
my $neuerVormonatsErtrag = $ErtragMonat;
fhem("setreading PV_Ertrag_Monat Ertrag_VorMonat $neuerVormonatsErtrag ");
fhem("setreading PV_Ertrag_Monat Ertrag_Monat 0")
}
if(($hour==0) && ($min==0) && ($yday==1)){
my $neuerVorjahresErtrag = $ErtragJahr;
fhem("setreading PV_Ertrag_Jahr Ertrag_VorJahr $neuerVorjahresErtrag ");
fhem("setreading PV_Ertrag_Jahr Ertrag_Jahr 0")
}
}
Nun legst Du ein at an, welches minütlich die Routine in der 99_myUtils.pm startet:
define PV_Ertrag at +*00:01:00 {PV_Rechner]
Die Zählerwerte Total_alt/Total_neu werden direkt im Zähler-Device (hier S0-Zähler) gebildet bzw. gespeichert. Alle Readings in den Dummys solltest Du vor dem ersten Aufruf der Routine mit
setreading "Dummyname" "Readingname" "Readingwert"
aus der Kommandzeile anlegen.
Falls der minütliche Aufruf des at nicht gewüscht ist (z.B. nur jede Stunde), dann müsstest Du die "if's" in der Routine anpassen.
Vielleicht hilft Dir das weiter.
Nachtrag: Die Werte werden dann in einer Readingsgroup erfasst und mit mittels den Attributen valueStyle und valueFormat zu einer gefälligen Anzeige gebracht.
Zitat von: B.Stromberg am 08 November 2020, 18:00:50
Wenn du so etwas schon hast, würdest du mir den Code zur Verfügung stellen?
das steckt direkt in meinen Modulen und passt so nicht ganz als sub in der 99_myUtils, aber ich kann dir heute mal ein Beispiel posten.
Von der Ablauflogik kommt das Beispiel von rih schon einigermassen hin, allerdings hat der Aufruf nach Mitternacht und die Verwendung von $yday / $mday einen entscheidenden Nachteil : loggt man die Werte um daraus SVGs zu machen dann stellt das SVG den Januar als Februar da,
da der Zeitstempel im Log ja den 1. des Monats hat. IMHO ist es daher wichtig soetwas immer kurz vor Mitternacht zu machen, wie du das mit deinem at um 23:59 bereits gemacht hast.
Moin in die Runde!
Also das mit dem Vortag funktioniert nun einwandfrei :)
Ich verstehe gar nicht, dass es so eine Funktion in FHEM nicht "out of the Box" gibt...
Es ist für einen Anfänger doch recht schwer zu begreifen, was nötig ist um "der Gerät" zu sagen, lies einen bestimmten Wert aus dem Logfile am Sonntag um 23:59h.
Wobei das wohl noch die einfachere Übung zu sein scheint und auch noch mit dem at Befehl zu realisieren scheint.
Schwierig wird es mit den Monaten denke ich!
31 Tage, 30 Tage und dann noch der Februar.
Eine Variable wie "get monthly" oder "get weekly" sowie "get daily" wäre ein Träumchen.
Zitat von: B.Stromberg am 09 November 2020, 09:25:23
zu sagen, lies einen bestimmten Wert aus dem Logfile am Sonntag um 23:59h. dem at Befehl zu realisieren scheint.
<--snipp -->
31 Tage, 30 Tage und dann noch der Februar.
a. Denkfehler, es wird nichts aus einem Logfile gelesen. Im Gegenteil hier werden Events erzeugt die geloggt werden können.
b. völlig egal, denn der nächste Tag ist immer der 1. :)
Anbei wie ich es in der 99_myUtils lösen würde, egal mit welcher Device / Reading Kombi
Wichtig : die Funktion muss aufgerufen werden zwischen 23:51 und 23:59 damit sie den Anfang des neuen Tages erkennt.
Beim ersten Durchlauf wird noch kein Endwert berechnet da es ja noch keinen Startwert gibt. Behelfen kann sich etwas in dem man die Startwert Readings zuvor von Hand setzt ( sofern man noch plausible Werte hat, gerade für das Jahr schön)
Reading Namen sind immer Geschmacksache, also ggf ändern und die DEf der Logdatei anpassen damit die entsprechenden end_ Werte auch geloggt werden.
sub calc_Midnight {
my $name = shift // return 'missing device name'; # kein Name !
my $r = shift // return 'missing reading name'; # kein Reading !
my $val = ReadingsNum($name, $r, -1);
return "unknown reading $name:$r" if ($val == -1); # das Reading gibt es nicht
my $hash = (exists($defs{$name})) ? $defs{$name} : '';
return "unknown device $name" if (!$hash); # das Device gibt es nicht
my (undef, undef, undef, undef, undef, $year, $weekday) = localtime(time);
my (undef, undef, undef, $nday, undef, $nyear, $nweekday) = localtime(time+600);
my $newDay = ( $nweekday != $weekday ) ? 1 : 0;
return 'call to early' if (!$newDay); # Ende, in 10 Minuten ist noch kein neuer Tag
my $newWeek = ( $nweekday == 1 ) ? 1 : 0;
my $newMonth = ( $nday == 1 ) ? 1 : 0;
my $newYear = ( $nyear != $year) ? 1 : 0;
my $lastday = ($val - ReadingsNum($name, 'startDay_'.$r ,0));
$lastday = 0 if ($lastday == $val);
my $lastweek = ($val - ReadingsNum($name, 'startWeek_'.$r ,0));
$lastweek = 0 if ($lastweek == $val);
my $lastmonth = ($val - ReadingsNum($name, 'startMonth_'.$r ,0));
$lastmonth = 0 if ($lastmonth == $val);
my $lastyear = ($val - ReadingsNum($name, 'startYear_'.$r ,0));
$lastyear = 0 if ($lastyear == $val);
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,'startDay_'.$r, $val);
readingsBulkUpdate($hash,'startWeek_'.$r, $val) if ($newWeek);
readingsBulkUpdate($hash,'startMonth_'.$r, $val) if ($newMonth);
readingsBulkUpdate($hash,'startYear_'.$r, $val) if ($newYear);
readingsEndUpdate($hash, 0); # die Zwischenwerte ohne Event
readingsBeginUpdate($hash);
readingsBulkUpdate($hash,'endDay_'.$r, $lastday);
readingsBulkUpdate($hash,'endWeek_'.$r, $lastweek) if ($newWeek);
readingsBulkUpdate($hash,'endMonth_'.$r, $lastmonth) if ($newMonth);
readingsBulkUpdate($hash,'endYear_'.$r, $lastyear) if ($newYear);
readingsEndUpdate($hash, 1); # zum loggen mit Event
return;
}
Aufruf im 23:5x at in deinem Fall mit {calc_Midnight('Strom','zaehler_jetzt')} wenn du unbedingt bei deinem Dummy bleiben willst.
Ich würde das Device nehmen das diesen zaehler_jetzt Wert tatsächlich erzeugt.
define at_lastDay at *23:58:00 {calc_Midnight('Strom','zaehler_jetzt')}
Moin zusammen,
ganz einfach und sozusagen "Out of the Box" wäre das eigentlich auch mir dem Modul "ElectricityCalculator" zu realisieren. Da werden dann automatisch Readings für Tag, letzter Tag, Monat, Jahr, spezieller Abrechnungszeitraum angelegt, die man dann loggen und daraus einen Plot machen kann.
Man kann auch gleich den Preis pro kWh angeben, so dass dann auch Readings für die Kosten für Tag, letzter Tag, usw. angelegt werden.
Alles was du dazu brauchst ist ein separates Zählerdevice, aber das hast du ja schon:
2020-11-01_00:00:40 Strom zaehler_jetzt: 255.728000000259
@Wzut
Vielen Dank!
Habe jetzt deinen Code in die 99_myUtils eingefügt und FHEM neu gestartet.
Dann das Define auch genauso von dir übernommen.
Ein execNow hat bisher keine Readings erzeugt, ging mir aber bei der anderen Geschichte weiter oben erst genauso.
Dauert also evtl. bis "Leben" in die Readings kommt.
Wenn ich das nun richtig verstehe wird über das Ganze der Wert zaehler_jetzt, welches ja der aktuelle Zählerstand ist mit den Perioden (Tag, Woche, Montat, Jahr) verglichen bzw. berechnet?
@Wolle02
Ja, das Modul hatte ich auch schon gefunden und mich daran probiert.
Allerdings hatte das bei mir irgendwie nicht funktioniert und war eigentlich auch schon zu umfangreich
Zitat von: B.Stromberg am 09 November 2020, 18:00:00
Ein execNow hat bisher keine Readings erzeugt
warum schreibe ich wohl :
Wichtig : die Funktion muss aufgerufen werden zwischen
23:51 und 23:59 damit sie den Anfang des neuen Tages erkennt ?
edit : ich habe da gerade einen copy & paste Fehler gesehen. Die Reading Namen anfragen und speichern passen nicht zusammen.
im untere Abschnitt müsste
readingsBulkUpdate($hash,'startDay_'.$r, $val) if ($newDay);
readingsBulkUpdate($hash,'startWeek_'.$r, $val) if ($newWeek);
readingsBulkUpdate($hash,'startMonth_'.$r, $val) if ($newMonth);
readingsBulkUpdate($hash,'startYear_'.$r, $val) if ($newYear);
stehen
Zitat von: Wzut am 09 November 2020, 18:35:48
warum schreibe ich wohl :
Wichtig : die Funktion muss aufgerufen werden zwischen 23:51 und 23:59 damit sie den Anfang des neuen Tages erkennt ?
edit : ich habe da gerade einen copy & paste Fehler gesehen. Die Reading Namen anfragen und speichern passen nicht zusammen.
im untere Abschnitt müsste
readingsBulkUpdate($hash,'startDay_'.$r, $val) if ($newDay);
readingsBulkUpdate($hash,'startWeek_'.$r, $val) if ($newWeek);
readingsBulkUpdate($hash,'startMonth_'.$r, $val) if ($newMonth);
readingsBulkUpdate($hash,'startYear_'.$r, $val) if ($newYear);
stehen
Ok sorry, dachte das execNow würde das "vorverlegen"
Denkfehler....
diese sind dann richtig?
readingsBulkUpdate($hash,'end_Day'.$r, $lastday);
readingsBulkUpdate($hash,'end_Week'.$r, $lastweek) if ($newWeek);
readingsBulkUpdate($hash,'end_Month'.$r, $lastmonth) if ($newMonth);
readingsBulkUpdate($hash,'end_Year'.$r, $lastyear) if ($newYear);
weil die Auflösung vorn ist ja auch anders
wäre dann da nicht endDay_ logisch? (nach Schema startDay_)
Das werden für mich wohl immer Bömische Dörfer bleiben...
Zitat von: B.Stromberg am 09 November 2020, 19:15:23
wäre dann da nicht endDay_ logisch? (nach Schema startDay_)
wenn du das schöner findest tue dir keinen Zwang an, ich schrieb ja auch das diese Namen eine reine Geschmacksfrage sind.
Zitat von: Wzut am 09 November 2020, 19:30:08
wenn du das schöner findest tue dir keinen Zwang an, ich schrieb ja auch das diese Namen eine reine Geschmacksfrage sind.
Nö, nö.... Die Namen sind mir wurscht wenns funktioniert.
Tut es aber nicht, bekomme keine Readings, auch nicht nach 23:58h
Woran kann es liegen?
Internals:
COMMAND {calc_Midnight('Strom','zaehler_jetzt')}
DEF *23:58:00 {calc_Midnight('Strom','zaehler_jetzt')}
FUUID 5fa9716d-f33f-0855-2dd0-047eeac8cd36ef8b
NAME at_lastDay
NR 292
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 23:58:00
TIMESPEC 23:58:00
TRIGGERTIME 1605049080
TRIGGERTIME_FMT 2020-11-10 23:58:00
TYPE at
READINGS:
2020-11-09 23:58:00 state Next: 23:58:00
Attributes:
room Stromverbrauch
Evtl. noch einmal zum Verständnis:
zaehler_jetzt haut den aktuellen Zählerstand raus und ist ein Userreading.
zaehler_jetzt:StromverbrauchTag.* monotonic {ReadingsVal($name,'StromverbrauchTag',0)}
Der Stromverbrauch wird an einer S0 Schnittstelle vom Stromzähler mit einem Wemos D1 Mini ausgelesen.
Hier noch einmal mein gesamter Code:
define PulsStrom MQTT_DEVICE
setuuid PulsStrom 5ed317f0-f33f-0855-3a48-bca25ab19e05593f
attr PulsStrom IODev myBroker
attr PulsStrom room Stromverbrauch
attr PulsStrom stateFormat transmission-state
attr PulsStrom subscribeReading_Count Stromcount/Watt/Count
attr PulsStrom subscribeReading_Time Stromcount/Watt/Time
attr PulsStrom subscribeReading_Total Stromcount/Watt/Total
attr PulsStrom userReadings StromAktuell {sprintf("%.2f",(3600/(ReadingsVal($name,"Time",0))*1000))}
define Strom dummy
setuuid Strom 5edc1980-f33f-0855-fa44-917ad2b8c36a379e
attr Strom event-on-change-reading StromverbrauchStd,StromverbrauchTag,zaehler_jetzt
attr Strom readingList StromverbrauchStd StromverbrauchTag zaehler_vortag zaehler_jetzt
attr Strom room Stromverbrauch
attr Strom userReadings zaehler_jetzt:StromverbrauchTag.* monotonic {ReadingsVal($name,'StromverbrauchTag',0)}
define FileLog_Stromverbrauch FileLog ./log/Stromverbrauch-%Y-%m.log Strom:StromverbrauchStd:.*|Strom:StromverbrauchTag:.*|Strom:zaehler_jetzt:.*
setuuid FileLog_Stromverbrauch 5ed317f0-f33f-0855-7a59-e6d543aacb7e4a88
attr FileLog_Stromverbrauch room Stromverbrauch
define Stromverbrauch readingsGroup Strom:zaehler_jetzt Strom:StromverbrauchStd
setuuid Stromverbrauch 5ed317f0-f33f-0855-a676-a7a01522f2ce841a
attr Stromverbrauch mapping {"zaehler_jetzt" => "Zaehlerstand", "StromverbrauchStd" => "Momentanverbrauch"}
attr Stromverbrauch nameStyle style="font-weight:bold"
attr Stromverbrauch notime 1
attr Stromverbrauch room Stromverbrauch
attr Stromverbrauch style style="font-size:20px"
attr Stromverbrauch valueFormat {zaehler_jetzt => "%.3f KW/h", StromverbrauchStd => "%.3f KW/h"}
attr Stromverbrauch valueStyle style="text-align:right"
define ESP_reboot at *00:00:00 { system "wget -O /dev/null -q 192.168.2.70/tools?cmd=ResetPulseCounter";; }
setuuid ESP_reboot 5ed596c6-f33f-0855-e761-a6eacc6aab728ccc
attr ESP_reboot room Stromverbrauch
define StromverbrNoti notify PulsStrom {\
my $StromUmlaufzeit = ReadingsVal("PulsStrom","Time","0") / 1000;;\
my $StromProStd=3.6/$StromUmlaufzeit;;\
my $StromProStdRounded=int(1000 * $StromProStd + 0.5) / 1000;;\
my $StromProTag = ReadingsVal("PulsStrom","Total","0") / 1000;;\
fhem("set Strom StromverbrauchStd $StromProStdRounded");;;;\
fhem("set Strom StromverbrauchTag $StromProTag");;;;\
}
setuuid StromverbrNoti 5edc3eb5-f33f-0855-03df-1afa1c1e5549b7b2
attr StromverbrNoti room Stromverbrauch
es hat schon seinen Grund warum wir immer lists sehen wollen und keine DEF / RAW Zeilen oder Screenshots.
Anyway, zumindest sieht man das du dir in meinen Augen ein unnötig komplexes Konstrukt aus MQTT- > notify -> dummy + at zusammen gebaut hast, nicht ganz einfach zu lesen und halt noch schwerer ais Aussenstehnder nachzuvollziehen. Ganz gar unklar ist mir dieses Reboot at um Mitternacht.
Wäre es mir würden zuerst das notify und der blöde dummy in die ewigen Jagdgründe gehen. Das was dann noch übrig bleibt bekäme seinen Platz in einem userReading des MQTT Device. Aber das ist eine ganz andere Baustelle und hier OT.
Ok, ich habe heute morgen mein Posting mit dem Code der sub editiert. Lösche deine und nimm die neue Version.
Geändert habe ich die nackten return am Anfang so das nun direkte Rückmeldungen kommen wenn etwas nicht passt.
Du kannst dir zum testen das Leben etwas leichter machen wenn du localtime(time+600) änderst in localtime(time+86400), dann kannst du den ganzen Tag testen und musst nicht immer kurz vor Mitternacht am PC sitzen und 24 Stunden auf den nächsten Versuch warten.
Bitte denke auch noch daran dein FileLog_Stromverbrauch auf die neuen Events anpassen.
Zitat von: Wzut am 10 November 2020, 17:17:22
es hat schon seinen Grund warum wir immer lists sehen wollen und keine DEF / RAW Zeilen oder Screenshots.
Anyway, zumindest sieht man das du dir in meinen Augen ein unnötig komplexes Konstrukt aus MQTT- > notify -> dummy + at zusammen gebaut hast
Nun ja, also ein Großteil dieses Konstruktes hat Otto mir hier zusammengeklöppelt, somit prallt die Kritik voll bei mir ab ;D
Aber Spaß beiseite...
Leider gleicher Effekt wie gestern:
Internals:
CFGFN
COMMAND {calc_Midnight('Strom','zaehler_jetzt')}
DEF *23:58:00 {calc_Midnight('Strom','zaehler_jetzt')}
FUUID 5faadbb8-f33f-0855-f193-60ba67d7c428eab5
NAME at_lastDay
NR 426
PERIODIC yes
RELATIVE no
REP -1
STATE Next: 23:58:00
TIMESPEC 23:58:00
TRIGGERTIME 1605135480
TRIGGERTIME_FMT 2020-11-11 23:58:00
TYPE at
READINGS:
2020-11-10 23:58:00 state Next: 23:58:00
Attributes:
room Stromverbrauch
Es kommen keine Readings
Nicht im Strom dummy und ohne Meldung im Log ?
Hast es denn mal von Hand versucht mit execNow ? auch da landen Fehler im Log.
Zitat von: Wzut am 11 November 2020, 06:28:54
Nicht im Strom dummy und ohne Meldung im Log ?
Hast es denn mal von Hand versucht mit execNow ? auch da landen Fehler im Log.
Achsoooooooo
Die Readings landen im Strom Dummy. Sorry, das war für mich nicht so ersichtlich, dachte das müsste alles im at_lastDay landen.
Das Modul liest also "nur" die Zählerstände um 23:58h.
Eine weitere Auswertung findet nicht statt?
Internals:
FUUID 5edc1980-f33f-0855-fa44-917ad2b8c36a379e
NAME Strom
NR 278
STATE 0
TYPE dummy
READINGS:
2020-11-11 12:33:00 StromverbrauchStd 0.048
2020-11-11 12:33:00 StromverbrauchTag 3.015
[b]2020-11-10 23:58:00 endDay_zaehler_jetzt 0[/b]
[b]2020-11-10 23:58:00 startDay_zaehler_jetzt 306.156000000099[/b]
2020-05-30 23:17:16 state 0
[b]2020-11-11 12:32:20 zaehler_jetzt 309.172000000086[/b]
Attributes:
event-on-change-reading StromverbrauchStd,StromverbrauchTag,zaehler_jetzt
readingList StromverbrauchStd StromverbrauchTag zaehler_vortag zaehler_jetzt
room Stromverbrauch
userReadings zaehler_jetzt:StromverbrauchTag.* monotonic {ReadingsVal($name,'StromverbrauchTag',0)}
Müsste bei endDay_zaehler_jetzt nicht ein Wert stehen, nämlich der vom Vortag?
Die anderen Werte von Woche, Monat und Jahr erscheinen erst nach den jeweiligen Abläufen?
Du könntest mir einen riesen Gefallen tun : Wenn ich mir schon die Mühe mache so viel zu schreiben dann mach du dir bitte auch die Mühe es zu lesen ...
Zitat von: Wzut am 09 November 2020, 17:22:33
Beim ersten Durchlauf wird noch kein Endwert berechnet da es ja noch keinen Startwert gibt. Behelfen kann sich etwas in dem man die Startwert Readings zuvor von Hand setzt ( sofern man noch plausible Werte hat, gerade für das Jahr schön)
Bedeutet : dein erstes Tagesreading bekommst du heute Abend da es nun für heute einen Startwert gibt.
Naja, das Modul läuft ja bereits seit 2 Tagen. Hatte auch mit der Uhrzeit gespielt.
Aber OK, dann warte ich noch.
Eine Frage bleibt allerdings.
Werden die Daten bei jedem FHEM Start wieder zurückgesetzt?
Wenn FHEM ordenlich runter gefahren wird landen alle aktuellen Readings mit ihren Werten in log/fhem.save
Wird FHEM neu gestartet werden die Readings genau mit diesen Werten restauriert.
Aber in dem Zusammenhang ist viel wichtiger wie dein Reading zaehler_jetzt beschaffen ist, ich hoffe das ist ein echter Total Zähler der nie irgendwie auf Null gestellt wird.
Zitat von: Wzut am 11 November 2020, 14:46:07
Wenn FHEM ordenlich runter gefahren wird landen alle aktuellen Readings mit ihren Werten in log/fhem.save
Wird FHEM neu gestartet werden die Readings genau mit diesen Werten restauriert.
Aber in dem Zusammenhang ist viel wichtiger wie dein Reading zaehler_jetzt beschaffen ist, ich hoffe das ist ein echter Total Zähler der nie irgendwie auf Null gestellt wird.
Danke für die Info :)
Bis jetzt läuft das Ganze echt super!
Eine Frage hätte ich jetzt noch.
Muss ich nun für Woche, Monat, Jahr auch ein define anlegen?
Oder kommt das Reading dann automatisch?
Ich würde mir auch wie schon erwähnt das Statistics Modul anschauen.
Das ist genau für solche Spielchen da und ist somit auch die Antwort auf die Frage warum es sowas nicht out-of-te-Box gibt. 😉
Zitat von: B.Stromberg am 15 November 2020, 01:31:25
Muss ich nun für Woche, Monat, Jahr auch ein define anlegen?
Oder kommt das Reading dann automatisch?
Nein die kommen automatisch, allerdings hatte ich auch geschrieben das du die Startreadings setzen sollst sonst gibt es immer erst mit erheblicher Verzögerung die ersten Werte.
@Thyraz, ja das wäre eine Möglichkeit oder ElectricityCalculator die Andere vllt sogar für seine heutigen Anforderung die Bessere.
Aber dazu müsste man mal einen Schritt zurücktreten und diesen ganzen "Weasley Fuchsbau" auf sich wirken lassen.
Vllt käme dann die Einsicht das es besser wäre den kranken Ochsen zu schlachten statt ihm noch ein Pflaster aufzukleben.
Der Witz ist ja das man die beiden Module ganz leicht parallel dazu nehmen könnte und in Ruhe alles direkt miteinander vergleichen kann
und dann erst die Abrissbirne einsetzt :)
Zitat von: Wzut am 09 November 2020, 17:22:33
Beim ersten Durchlauf wird noch kein Endwert berechnet da es ja noch keinen Startwert gibt. Behelfen kann sich etwas in dem man die Startwert Readings zuvor von Hand setzt ( sofern man noch plausible Werte hat, gerade für das Jahr schön)
Hallo!
Ich bin jetzt mit FHEM auf eine andere Hardware umgezogen. Nach anfänglichen Problemen hat das jedoch mittlerweile ganz gut geklappt.
Da natürlich die Werte vom Zähler nicht mehr gestimmt haben möchte ich diese nun wieder von Hand setzen.
beim zaehler_jetzt ist dies mit
set Strom zaehler_jetzt xxx.xxx
Ohne Probleme möglich.
Ich stehe nur auf dem Schlauch, wie ich die anderen Werte setzen kann...
ein
set Strom endWeek_zaehler_jetzt xxx.xxx
brint lediglich ein state endWeek_zaehler_jetzt xxx.xxx jedoch wird bei endWeek_zaehler_jetzt nichts geändert, der steht weiter auf 0.
Sich nur wieder irgend so ein Verständnis Problem von mir :(
Kannst du mir auf die Sprünge helfen, wie der Aufruf korrekt lauten muss um die Werte zu setzen?
Danke!
setreading <device> <readingname> <wert>
setreading Strom endWeek_zaehler_jetzt 999.999
Zitat von: Wzut am 08 Dezember 2020, 06:02:05
setreading <device> <readingname> <wert>
setreading Strom endWeek_zaehler_jetzt 999.999
Vielen Dank!
wie bekomme ich denn nun das hier wieder weg?
Oder ist das nicht weiter von Relevanz?
state endWeek_zaehler_jetzt 555.000
Dieser Wert steht bei state seitdem ich ihn mit dem falschen set gesetzt habe :(
a. set Strom Willi
b. deletereading Strom state
Danke!
Jetzt steht allerdings "Willi" bei den Internals als STATE...
Denke aber das ist nicht weiter von Bedeutung, oder?
OMG, das mit dem Willi war ein Witz frei nach dem Motto "ich will das was jetzt ist nicht mehr haben" und sollte dir zeigen das man da setzen kann was man will.
Ich habe doch keine Ahnung wann dein Device sich sein STATE/state automatisch neu setzt
toller Witz!
Dachte du wolltest vorher etwas stetzen, das einen unnützen, unbekannten Wert schreibt und dann löschen...
Meine Glaskugel ist im Moment etwas vernebelt....
Bitte nicht vergessen, wir sind im Anfängerforum!