Hallo zusammen,
ich bin noch recht frisch im Umgang mit FHEM und hab bisher nur ein bisschen mit meinen Homematic-Steckdosen/Heizkörperventilen herum gespielt... Was das Programmieren angeht, bin ich noch dabei zu lernen. Das nur erst mal vorweg.
Was möchte ich umsetzenich bin gerade umgezogen und möchte meine Nebenkosten (Strom, Wasser, Wärmepumpe) etwas im Blick behalten. Ich lese dazu monatlich die Zähler ab und trage das ganze in eine Excel-Tabelle eine und berechnen dann darin den Verbrauch und die zugehörigen Kosten. Besser gefallen würde es mir aber das ganze mit FHEM umzusetzen, sodass ich den Zählerstand nur auf der Web-Oberfläche eintragen muss. Das ganze soll dann später auch um Plots oder andere Auswertungen erweitert werden.
Wie möchte ich das umsetzennachdem ich mich ein wenig durch die Einsteiger-pdf und das comandref gelesen hab kam mir folgende Idee: ich würde hierzu Dummys für die unterschiedlichen Zähler anlegen, in die ich die Zählerstände schreibe. Dazu wollte ich userReadings definieren, die dann den monatlichen Verbrauch (über den modifier "difference") und die Kosten berechnen.
Nun meine Fragen:
- Geht da so oder würdet ihr einen anderen (eleganteren) Weg empfehlen?
- Für die Kosten-Berechnung benötige ich noch ein paar weitere Werte, wie Bsp. den Strompreis/kWh oder die anteilige Grundgebühr. Diese würde ich gern veränderlich halten (Eingabefeld im WebIF) und als Unterpunkt an den jeweiligen Zähler anhängen. Wie kann ich das umsetzen?
Danke im voraus und beste Grüße,
Stephan
FHEM als Excel-upgrade ist eine neue Anwendung ;)
Nun gut der eleganteste Weg wäre sicherlich die Zähler von einem Sensor auszulesen und die Werte so automatisch in FHEM zu übertragen, aber das ist ein ganz anderes Thema. Das wäre aber mehr FHEM-artig, denn als manueller Werteerfasser gibt es vermutlich bessere Lösungen (z.B: Excel)
Grundsätzlich ist der Ansatz so machbar.
Die zusätzlichen Werte lassen sich über das Attribut readingList am Dummy auch direkt am Dummy ablegen
Also so etwas wie (preis ist 100€ pro kwh)
define strom dummy
attr strom readingList preis
set strom preis 100
Auch die Berechnung der Kosten kann dann als weiteres userreading definiert werden, dabei wird dann das andere Reading (preis) mit herangezogen werden
Danke für deine Antwort.
Sicher hat ein "manuelles" Eintragen nicht viel mit Automatisierung zu tun.... aber für mich hat es dennoch Vorteile das ganze nicht mit Excel zu machen:
- sollte ich später einen entsprechenden Sensor anschaffen, ist bereits alles vorbereitet ;-)
- FHEM läuft sowieso und ich muss zum eintragen der Werte nicht erst den Rechner anwerfen und die Excel suchen, sondern kann es bequem über das Web-IF an meinem Smartphone machen.
Die Variante mit der readingsList klappt soweit gut. Mit deinem Post und etwas weiterem Lesen und google habe ich mir folgende Befehle zusammengestrickt
define powermeter dummy
attr powermeter alias Stromzähler
attr powermeter setList kWh:textField
attr powermeter stateFormat {''}
attr powermeter webCmd kWh
attr powermeter readingList Strom.kWhPreis
attr powermeter readingList Strom.Grundpreis
attr powermeter userReadings Strom.Verbrauch difference {ReadingsVal("powermeter","state");;}
attr powermeter userReadings Strom.Kosten {ReadingsVal("powermeter","Strom.Verbrauch") * ReadingsVal("powermeter","Strom.kwhPreis") + ReadingsVal("powermeter","Strom.Grundpreis")/12;;}
Die Befehle werden alle angenommen aber die beiden userReadings werden leider nicht (richtig) ausgeführt. Ich bekomme da die Fehlermeldung:
ZitatError evaluating powermeter userReading xyz Not enough arguments for main::ReadingsVal at (eval 9556) line 1, near ""state")"
ich interpretiere es so, dass nicht genug werte vorhanden sind, um die Differenz zu bilden, richtig?!?
Was kann ich da machen? Ich habe schon versucht dem "state" des dummys verschiedene Werte zu zuweisen aber bisher ohne Erfolg.
Grüße
Zitat von: balli1187 am 08 März 2017, 22:13:08
ich interpretiere es so, dass nicht genug werte vorhanden sind, um die Differenz zu bilden, richtig?!?
Was kann ich da machen? Ich habe schon versucht dem "state" des dummys verschiedene Werte zu zuweisen aber bisher ohne Erfolg.
Grüße
Nein, der Fehler sagt nur, dass ReadingsVal einen dritten Parameter (Default) braucht. Sollte "state" - also das Reading mit dem in der Funktion angegebenen Namen nicht vorhanden sein, wird dieser Wert als Rückgabewert genommen.
Grüße
Ich finde dein Idee sehr interessant da ich genau vor dem gleichen Thema stehe.
Hab ebenfalls keine HW um den Zähler abzulesen.
Dein Reading muss so aussehen
Strom.Verbrauch difference {ReadingsVal("powermeter","state","");;}
,Strom.Kosten {ReadingsVal("powermeter","Strom.Verbrauch","") * ReadingsVal("powermeter","Strom.kwhPreis","") + ReadingsVal("powermeter","Strom.Grundpreis","")/12;;}
Wie berechnet du die Stromkosten deiner Wärmepumpe?
Guck dir mal ElectricityCalculator an.
Zitat von: alanblack am 08 März 2017, 22:24:59
Nein, der Fehler sagt nur, dass ReadingsVal einen dritten Parameter (Default) braucht. Sollte "state" - also das Reading mit dem in der Funktion angegebenen Namen nicht vorhanden sein, wird dieser Wert als Rückgabewert genommen.
Okay, danke für den Hinweis. Wenn ich also das Reading entsprechend anpasse, wird mir zunächst der Default-Wert zurückgegeben. Das Problem sollte doch aber ohnehin verschwinden sobald ich zwei oder mehr Wert eingegeben habe, oder?
Zitat von: Devender am 08 März 2017, 22:44:14
Ich finde dein Idee sehr interessant da ich genau vor dem gleichen Thema stehe.
Hab ebenfalls keine HW um den Zähler abzulesen.
Dein Reading muss so aussehen
Strom.Verbrauch difference {ReadingsVal("powermeter","state","");;}
,Strom.Kosten {ReadingsVal("powermeter","Strom.Verbrauch","") * ReadingsVal("powermeter","Strom.kwhPreis","") + ReadingsVal("powermeter","Strom.Grundpreis","")/12;;}
Wie berechnet du die Stromkosten deiner Wärmepumpe?
Danke für die Anpassung, ich werde es heute Abend mal testen und berichten.
Meine Wärmepumpe hat einen separaten Stromzähler (keine Ahnung ob das immer so sein muss?), sodass ich die Verbräuche getrennt ablesen kann. Wie genau ich dann die Kosten berechne, bringe ich gerade noch in Erfahrung. Ansich ist es ja ähnlich wie beim Stromverbrauch: Verbrauch * Preis/kWh + ggf. Grundgebühren. Am WE schaue ich mir mit einem Nachbarn mal eine Nebenkostenabrechnung an (ich selbst hatte ja noch keine) und werd dann sehen, was da alles mit einfließt.
Zitat von: igami am 09 März 2017, 05:47:33
Guck dir mal ElectricityCalculator an.
Hm... hätte ich das früher gewusst ;) Ich denke aber, dass ich jetzt dennoch bei meinem Ansatz bleibe, da ich jetzt mal damit angefangen habe und ja auch bisschen lernen will. ich will es ja dann auch auf den Wasserverbrauch übertragen und meine Gesamtnebenkosten (mit Gemeinschaftsanteilen, Straßenreinigung, bla, bla, bla) betrachten.
Grüße
Zitat von: balli1187 am 09 März 2017, 10:08:21
Hm... hätte ich das früher gewusst ;) Ich denke aber, dass ich jetzt dennoch bei meinem Ansatz bleibe, da ich jetzt mal damit angefangen habe und ja auch bisschen lernen will. ich will es ja dann auch auf den Wasserverbrauch übertragen und meine Gesamtnebenkosten (mit Gemeinschaftsanteilen, Straßenreinigung, bla, bla, bla) betrachten.
Es gibt auch noch Schwestermodule für Gas und Wasser, wobei letzteres noch inder Entwicklung ist.
Mahlzeit,
ich habe den Code mittlerweile um die Default-Einträge erweitert und bekomme nun keine Fehlermeldung mehr.
Ein paar Ungereimtheiten gibt es aber dennoch:
Meine userReadings werden leider nicht richtig ausgeführt - sprich es wird nicht berechnet, wenn ich werte eingebe. Mein erster Gedanke war, dass sie vielleicht nicht getriggert werden (da ich auch keine Trigger festgelegt habe) aber ich sehe ich in der Weboberfläche, dass die userReadings immer auf dem Stand des "state" sind, wenn ich diesen verändere.
Ich weiß nicht ob das von Belang ist, aber zum loggen habe ich eine sqlite-DB eingerichtet, welche mit der regexp .*:.* erst einmal alles aufnimmt. Bei den Plots meiner HM-Schaltsteckdose funktioniert das auch alles. Ich gehe also mal davon aus, dass die DB richtig funktioniert.
Ein weiterer Punkt, der mir noch eingefallen ist, ist der Zeitstempel.
Kann ich den Werten einen entsprechenden Zeitstempel zuweisen? Ich lese ja einmal im Monat ab und möchte nachher eigentlich nur wissen/plotten wie hoch der Verbrauch bzw. die Kosten im Monat xy war. Die einen Tag oder die Uhrzeit, wann abgelesen wurde interessiert mich dabei nicht. Außerdem habe ich ja bereits zwei Ablesungen, die ich rückwirkend übertragen möchte.
Beste Grüße, Stephan
N'abend,
Leider bin ich mit meinem Problem noch nicht weitergekommen, daher hole ich das Thema wieder hoch.
Meine userReadings werden nicht/nicht richtig berechnet. Hier mein Code
define powermeter dummy
attr powermeter alias Stromzähler
attr powermeter setList kWh:textField
attr powermeter stateFormat {''}
attr powermeter webCmd kWh
attr powermeter readingList Strom.kWhPreis,Strom.Grundpreis
attr powermeter userReadings Strom.Verbrauch difference {ReadingsVal("powermeter","state","");;},Strom.Kosten {ReadingsVal("powermeter","Strom.Verbrauch","") * ReadingsVal("powermeter","Strom.kwhPreis","") + ReadingsVal("powermeter","Strom.Grundpreis","")/12;;}
Mein erstes userReading (Strom.Verbrauch) wird aktualisiert, zumindest ändert sich der Zeitstempel, wenn ich ich den Wert des Stromzählers ändere. Allerdings wird nichts berechnet und das Reading steht immer auf "0".
Das zweite Reading (Strom.Kosten) wird nur einmalig (beim Neustart) ausgeführt und ändert sich danach nicht mehr, sprich auch der Zeitstempel ändert sich nicht mit dem Wert des Zählers.
Ich habe schon verschiedene Schreibweisen (mit einfachem Zeilenumbruch, zeilenumbruch + "\", zeilenumbruch + ";;\") wegen der Übersichtlichkeit im code probiert aber die Syntax scheint nicht das Problem zu sein.
Beste Grüße und Danke im Voraus,
Stephan
Wenn es sich um einen Ausschnitt aus der cfg handelt oder die Befehle, die Du in der Kommandozeile eingegeben hast, ist Dein Problem nicht das Zeilenende, sondern die Semikolons. Da müssten 4 fache (!) Semikolons stehen.
Mir ist nicht klar, was Du mit dem stateFormat erreichen willst?
Ich denke statt den einzelnen Attributen wäre ein list-kommando auf dem Device hilfreich, denn so ist der Kontext dessen was Du postet nicht klar
Hallo,
sorry für die verspätete Antwort - ich hatte deinen post irgendwie übersehen viegener :-(
ich bin deinem Aufruf gefolgt und habe ein list ausgeführt. Hier die Ergebnisse:
Internals:
CFGFN /opt/fhem/MyCfg/zaehler.cfg
NAME powermeter
NR 119
STATE
TYPE dummy
Helper:
Dblog:
State:
Db_logging:
TIME 1490297904.99682
VALUE kWh 200
Readings:
2017-03-23 19:41:15 Strom.Abschlag 62
2017-03-19 18:36:18 Strom.Grundpreis 56.99
2017-03-23 19:24:15 Strom.Kosten 4.74916666666667
2017-03-23 19:24:15 Strom.Verbrauch 0
2017-03-19 18:36:06 Strom.kWhPreis 0.26
2017-03-23 20:38:24 state kWh 200
Attributes:
alias Stromzähler
readingList Strom.kWhPreis,Strom.Grundpreis,Strom.Abschlag
setList kWh:textField
stateFormat {''}
userReadings Strom.Verbrauch difference {ReadingsVal("powermeter","state","");}
webCmd kWh
mich macht direkt stutzig, dass dort nur ein userReading auftaucht... Bei einem Klick auf das Device werden mir die anderen jedoch unter Readings angezeigt?!
Zum stateFormat... ganz ehrlich... ich habe es aus einem Beispiel, dass ich im Netz gefunden habe übernommen und erstmal nicht weiter in Frage gestellt. Es war mir wichtiger es erstmal ans Laufen zu bekommen.
Grüße, Stephan
Nur ein userreading im Attribut heisst es wird auch nur eins aktualisiert.
Dass die anderen da sind hängt einfach damit zusammen, dass sie wohl irgendwann einmal angelegt wurden - dann verschwinden sie nicht gleich wieder (kommando dazu wäre deletereading).
Aber ganz grundsätzlich ein Beispiel abzuschreiben, zu verändern ohne zu wissen was man tut ist nicht wirklich zielführend - schon gar nicht bei FHEM
Zitat von: viegener am 03 April 2017, 21:31:35
Nur ein userreading im Attribut heisst es wird auch nur eins aktualisiert.
okay, und genau hier liegt mein Problem. Für mich ist es leider nicht nachvollziehbar, weshalb das erste userReading zwar aktualisiert wird, sich aber gleichzeitig der Wert nicht ändert, also die simple Berechnung dahinter nicht ausgeführt wird...
Zitat von: viegener am 03 April 2017, 21:31:35
Dass die anderen da sind hängt einfach damit zusammen, dass sie wohl irgendwann einmal angelegt wurden - dann verschwinden sie nicht gleich wieder (kommando dazu wäre deletereading).
Aber ganz grundsätzlich ein Beispiel abzuschreiben, zu verändern ohne zu wissen was man tut ist nicht wirklich zielführend - schon gar nicht bei FHEM
Nunja... was soll ich sagen. Du hast natürlich Recht. Ich versuche halt mich anhand von Beispielen heran zu tasten und das stateFormat war für mich erstmal unkritisch.
Der Wert den Du im state reading hast ist "kwh 200", das ist ja nicht wirklich eine Zahl --> daraus ergibt sich wohl die 0.
Am besten wäre dann im state reading auch nur eine Zahl zu haben, wenn Du damit rechnen willst (sprich difference)
oder Du verwendest ReadingsNum statt ReadingsVal
ach Gott.... da hätte man auch selbst drauf kommen können. Strings lasen sich halt schlecht verrechnen.
Der Verbrauch wird nun mit ReadingsNum richtig berechnet, allerdings werden die Kosten nach Berechnung des neuen Verbrauchs nicht berechnet.... hier hat sich nichts geändert.
Noch eine Frage: Wie kann ich verhindern, dass die Readings automatisch bei Neustart aktualisiert werden? Meine kosten stehen von Beginn an auf 4,75€ (siehe list), was 1/12 des Grundpreises entspricht. Es wurde also initial einmalig berechnet obwohl kein Verbrauch vorhanden war. Meine Sorge ist, dass hier ständig neue Werte für Verbrauch und (wenn es dann klappt) Kosten berechnet werden, wenn ich FHEM mal neu starte. Ich möchte dies aber nur einmal pro Monat händisch eintragen.
@viegener: nochmal zum Zeilenumbruch und den 4-fachen Semikolon in der cfg... Wäre es dann so richtig:
define powermeter dummy
attr powermeter alias Stromzähler
attr powermeter setList kWh:textField
attr powermeter stateFormat {''}
attr powermeter webCmd kWh
attr powermeter readingList Strom.kWhPreis,;;;;
Strom.Grundpreis
attr powermeter userReadings Strom.Verbrauch difference {ReadingsNum("powermeter","state","");;},;;;;
Strom.Kosten {ReadingsNum("powermeter","Strom.Verbrauch","") * ReadingsNum("powermeter","Strom.kwhPreis","") + ReadingsNum("powermeter","Strom.Grundpreis","")/12;;}
Grüße, Stephan
@balli1187: Nein das ist definitiv so nicht richtig und einiges kommt darauf an, ob im Attributeditor oder als Kommando...
Grundsätzlich:
User readings werden durch Komma (!) abgetrennt nicht durch Semikolons
Wenn Semikolons innerhalb von Kommandos oder perl benötigt werden, dann müssen diese vervielfacht werden, denn einfache Semikolons trennen verschiedene FHEM-Befehle voneinander.
Innerhalb von perl werden Semikolons aber nur benötigt wenn mehrere perl-Befehle im Spiel sind. In Deinen user readings steht jeweils ein einzelner, also müssten eigentlich einfach alle Semikolons in diesem Fall weg
Zeilenumbrüche werden nicht durch Semikolon ermöglicht.
Empfehlung - verwende FHEMWeb und ändere das Attribut dort im Attribut-Texteditor - dann kannst Du einfach Zeilenumbrüche ohne irgendwelche Zeichen nutzen und musst auch keine virfachen Semikolons benutzen.
Okay. Hier habe ich offenbar noch einiges an Nachholbedarf...
Leider habe ich nach wie vor keine Lösung bezüglich der Berechnung gefunden. Meine Kosten werden einfach nicht berechnet.
Noch eine Frage zum modifier "differente": in der commandref ist zu lesen, dass dieser erst bei der zweiten Ausführung greift, was ja auch logisch ist. Aus einem Wert kann man halt keine Differenz bilden. ich bin allerdings davon ausgegangen, dass es, sobald es Vorgängerversion gibt, der modifier immer greift. Schließlich ist es ja dann möglich. Beim Raumproblemen musste ich allerdings nach jedem Neustart erst zwei werte eingeben. Der letzte werte vor dem Neustart würde also nicht mit dem ersten nach dem Neustart verrechnet. Woran kann das liegen?
Grüße, Stephan
Zu userreadings mit difference kann ich jetzt nicht sehr viel sagen. Grundsätzlich finde ich es aber normal, dass ein Neustart hier wie eine Neudefinition der userreadings wirkt (denn genau das passiert ja).
Solange Du deine Definition nicht aufräumst und korrigierst (wie oben angegeben) - Das gilt auch für readingList wird es nicht gehen.
Bei "Meine Kosten werden einfach nicht berechnet" ohne Angabe wie die Defs aussehen (sprich ein list des devices) kann ich nicht helfen.
Moin,
leider gab es in letzter Zeit andere, dringendere Dinge bei mir anzugehen, daher war es hier so lange ruhig....
Nun hatte ich mal wieder etwas Zeit mich mit dem Problem zu beschäftigen und will meine Erkenntnisse hier kundtun:
nachdem ich meine Def aufgeräumt habe und nun alles nur noch über das Webinterface eingebe, funktioniert es auch ;-) hier meine aktuelle Definition der userReadings:
attr powermeter userReadings Strom.Verbrauch difference {ReadingsNum("powermeter","state","");},Strom.Kosten {ReadingsNum("powermeter","Strom.Verbrauch","") * ReadingsNum("powermeter","Strom.kwhPreis","") + ReadingsNum("powermeter","Strom.Grundpreis","")/12;}
Mittlerweile werden auch die Kosten richtig berechnet. Der Fehler lag hier in der Eingabe der Zahlenwert. Ich hatte alles mit mit einem Komma statt Punkt als Dezimaltrennzeichen eingegeben. Da es keine Fehlermeldungen gab und die Werte auch in den Readings auftauchten, hat es etwas länger gedauert dies herauszufinden und zu bemerken, dass die Nachkommastellen quasi abgeschnitten werden. Dadurch kam immer eine Multiplikation mit 0 herein... Naja, jetzt funktioniert es jedenfalls :-)
Jetzt brauche ich nur noch eine Lösung für das Restart-Problem. userReadings difference benötigt logischerweise zwei Werte um die Differenz berechnen zu können. Das heißt ich müsste nach einem Restart immer erst den alten Wert nochmal eingeben und dann den neuen Wert.
Gibt es eine Möglichkeit dies zu automatisieren, sodass der letzte state aus dem Log gelesen und gesetzt und das userReadings difference wird?
Grüße, Stephan