Neues Modul: GasCalculator

Begonnen von Sailor, 21 Januar 2016, 12:48:11

Vorheriges Thema - Nächstes Thema

gadget

Hab nach fhem update +restart  gestern extra mal den Zählkontakt abgeklemmt. Calculator Device hat Attribut ReadingDestination CounterDevice 
List von meinem Counterdevice gestern (gekürzt):


Internals:
Date: Wed, 03 Mar 2021 12:40:11 GMT
   READINGS:
     2021-03-03 13:40:11   Totalmonotonic  3121324
     2021-02-09 21:08:26   Totalmonotonic_CounterDay1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterDayLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMeter1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMeterLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMonth1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMonthLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterYear1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterYearLast 31101.070
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostDay 0.053
     2021-03-03 09:02:01   Totalmonotonic_EnergyCostDayLast 2.406
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostMeter 99.832
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostMonth 2.477
     2021-03-01 00:17:02   Totalmonotonic_EnergyCostMonthLast 97.329
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostYear 99.832
     2021-03-03 13:34:11   Totalmonotonic_EnergyDay 0.679
     2021-03-03 09:02:01   Totalmonotonic_EnergyDayLast 30.567
     2021-03-03 13:34:11   Totalmonotonic_EnergyMeter 1268.518
     2021-03-03 13:34:11   Totalmonotonic_EnergyMonth 31.472
     2021-03-01 00:17:02   Totalmonotonic_EnergyMonthLast 1236.706
     2021-03-03 13:34:11   Totalmonotonic_EnergyYear 1268.518
     2021-03-03 13:34:11   Totalmonotonic_FinanceReserve 381.108
     2021-03-03 13:34:11   Totalmonotonic_Meter 31213.240
     2021-03-03 13:34:11   Totalmonotonic_MonthMeterReading 7
     2021-03-03 13:34:11   Totalmonotonic_PowerCurrent 0.150
     2021-03-03 13:34:11   Totalmonotonic_PowerDayAver 0.078
     2021-03-03 13:34:11   Totalmonotonic_PowerDayMax 0.150
     2021-03-03 09:02:01   Totalmonotonic_PowerDayMin 0
     2021-03-03 09:02:01   Totalmonotonic_Vol1stDay 31213.18
     2021-02-09 21:12:32   Totalmonotonic_Vol1stMeter 31101.19
     2021-03-01 00:17:02   Totalmonotonic_Vol1stMonth 31210.460
     2021-02-09 21:12:32   Totalmonotonic_Vol1stYear 31101.19
     2021-03-03 09:02:01   Totalmonotonic_VolLastDay 31213.160
     2021-02-09 21:12:32   Totalmonotonic_VolLastMeter 31101.070
     2021-03-01 00:17:02   Totalmonotonic_VolLastMonth 31210.430
     2021-02-09 21:12:32   Totalmonotonic_VolLastYear 31101.070
     2021-02-09 21:08:26   Totalmonotonic_WFRDayMax 0
     2021-02-09 21:08:26   Totalmonotonic_WFRDayMin 0



und das gleiche nochmal von heute


Internals:
Date: Thu, 04 Mar 2021 14:23:43 GMT
  READINGS:
     2021-03-04 15:23:44   Totalmonotonic  3121324
     2021-02-09 21:08:26   Totalmonotonic_CounterDay1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterDayLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMeter1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMeterLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMonth1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterMonthLast 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterYear1st 31101.070
     2021-02-09 21:08:26   Totalmonotonic_CounterYearLast 31101.070
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostDay 0.053
     2021-03-03 09:02:01   Totalmonotonic_EnergyCostDayLast 2.406
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostMeter 99.832
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostMonth 2.477
     2021-03-01 00:17:02   Totalmonotonic_EnergyCostMonthLast 97.329
     2021-03-03 13:34:11   Totalmonotonic_EnergyCostYear 99.832
     2021-03-03 13:34:11   Totalmonotonic_EnergyDay 0.679
     2021-03-03 09:02:01   Totalmonotonic_EnergyDayLast 30.567
     2021-03-03 13:34:11   Totalmonotonic_EnergyMeter 1268.518
     2021-03-03 13:34:11   Totalmonotonic_EnergyMonth 31.472
     2021-03-01 00:17:02   Totalmonotonic_EnergyMonthLast 1236.706
     2021-03-03 13:34:11   Totalmonotonic_EnergyYear 1268.518
     2021-03-03 13:34:11   Totalmonotonic_FinanceReserve 381.108
     2021-03-03 13:34:11   Totalmonotonic_Meter 31213.240
     2021-03-03 13:34:11   Totalmonotonic_MonthMeterReading 7
     2021-03-03 13:34:11   Totalmonotonic_PowerCurrent 0.150
     2021-03-03 13:34:11   Totalmonotonic_PowerDayAver 0.078
     2021-03-03 13:34:11   Totalmonotonic_PowerDayMax 0.150
     2021-03-03 09:02:01   Totalmonotonic_PowerDayMin 0
     2021-03-03 09:02:01   Totalmonotonic_Vol1stDay 31213.18
     2021-02-09 21:12:32   Totalmonotonic_Vol1stMeter 31101.19
     2021-03-01 00:17:02   Totalmonotonic_Vol1stMonth 31210.460
     2021-02-09 21:12:32   Totalmonotonic_Vol1stYear 31101.19
     2021-03-03 09:02:01   Totalmonotonic_VolLastDay 31213.160
     2021-02-09 21:12:32   Totalmonotonic_VolLastMeter 31101.070
     2021-03-01 00:17:02   Totalmonotonic_VolLastMonth 31210.430
     2021-02-09 21:12:32   Totalmonotonic_VolLastYear 31101.070
     2021-02-09 21:08:26   Totalmonotonic_WFRDayMax 0
     2021-02-09 21:08:26   Totalmonotonic_WFRDayMin 0


Der Zähler hat sich also keinen Schritt bewegt.
Trotzdem steht zum Beispiel _EnergyDayLast immer noch auf dem gleichen Wert, auch der Timestamp des Readings hat sich nicht geändert. Falls da gegen Mitternacht eine Fortschreibung / Selsttriggerung erfolgen sollte, funktioniert die bei mir nicht. Beim Stromzähler fällt das nicht weiter auf, da ist ständig mehr oder weniger Verbrauch. Aber der Gaszähler kann auch mal länger komplett still stehen und dann sollten da IMHO trotzdem sinnvolle Werte stehen ...

Grüße,

gadget.


Sailor

Hi Gadget

Zitat von: gadget am 04 März 2021, 17:02:02
Hab nach fhem update +restart  gestern extra mal den Zählkontakt abgeklemmt. Calculator Device hat Attribut ReadingDestination CounterDevice 
List von meinem Counterdevice gestern (gekürzt):

Der Zähler hat sich also keinen Schritt bewegt.
Trotzdem steht zum Beispiel _EnergyDayLast immer noch auf dem gleichen Wert, auch der Timestamp des Readings hat sich nicht geändert. Falls da gegen Mitternacht eine Fortschreibung / Selsttriggerung erfolgen sollte, funktioniert die bei mir nicht. Beim Stromzähler fällt das nicht weiter auf, da ist ständig mehr oder weniger Verbrauch. Aber der Gaszähler kann auch mal länger komplett still stehen und dann sollten da IMHO trotzdem sinnvolle Werte stehen ...
Grüße,
gadget.

Mach mal bitte ein vollstaendiges list deines Calculators und deines Counters.
Ich vermisse die versteckten Readings (Die mit dem Punkt vorweg)

Gruß
    Sailor
******************************
Man wird immer besser...

gadget

mit list werden die "Punkt"-Readings nicht angezeigt. Die sehe ich nur, wenn ich mir mit "Raw Definition" die Device-Definition anschaue. Da tauchen die dann bei den setstate-Zeilen auf. Inzischen habe ich meinen Zählkontakt aber wieder angeschlossen und weiter ackern lassen und somit hat sich auch das _EnergyDayLast aktualisiert. Wenn Du es fürs debug brauchst klemme ich das nochmal 2 Tage lang ab.

dk3572

Wie müsste ich denn meine Fragen stellen bzw. was soll ich noch liefern damit auch mir geholfen wird?

gadget

#379
Zitat von: dk3572 am 23 Februar 2021, 14:54:37
Hallo,

ich habe den GasCalculator folgendermaßen eingerichtet:

DEF        GaszaehlerCounter:state.*

(...)



Diese Definition verstehe ich nicht. In welchem reading hast Du denn den aktuellen Zählerstand stehen ? Du verwendest ja offenbar einen HourCounter zum zählen der Impulse.
Der hat im state ja nur die Anzahl der Impulse am heutigen Tag drin (= Reading countsPerDay). Ich würde mir erst mal ein Userreading machen, das die Impulse fortlaufend zählt, also z.B.


attr GaszaehlerCounter userReadings Totalmonotonic monotonic {ReadingsVal($name,"countsOverall",0)}


Dann wäre die Frage, wie viele Counts einem Kubikmeter Gasverbrauch entsprechen. Das steht normalerweise auf dem Zähler drauf. Bei mir steht "1 imp entspricht 0,01 Kubikmeter". Um den Zählerstand in Kubikmeter zu bekommen muss ich also durch 100 teilen.

Um das reading "Totalmonotonic" mit dem Zähler zu synchronisieren, muss ich somit den Zählerstand nehmen und mit 100 multiplizieren und in das reading prügeln.
Beispiel:

Zählerstand: 12345,678 Kubikmeter
Zählerstand * 100 = 1234567,8
gerundet: 1234568

-> Komando in der fhem Befehls-Eingabezeile
setreading GaszaehlerCounter Totalmonotonic 1234568

Wenn Du jetzt Gas verbrauchst, läuft dein Gaszähler weiter und zeigt am nächsten Tag z.B. 12399,123 Kubikmeter an.
Wenn alles geklappt hat müsste das Userreading Totalmonotonic dann auf 1239912 stehen.

Da setzt Du dann den Gascalculator drauf an, also


defmod Gaszaehler GaszaehlerCounter:Totalmonotonic.*
attr Gaszaehler GasCubicPerCounts 0.01


und dann sollte kurz darauf im Meter-Reading fortlaufend der korrekte aktuelle Zählerstand stehen. Am nächsten Tag ist dann auch CounterDayLast richtig gefüllt und zum Monatswechsel CounterMonth1st usw. Wenn Dir die Zählerstände vom letzten Jahres/Monatswechsel bekannt sind, kannst Du die entsprechenden Readings manuell setzten statt zu warten bis der Monat / das Jahr einmal vorbei ist. Das ist mit dem von Dir zitierten Abschnitt in der commandref gemeint.



dk3572

Hallo gadget,

vielen Dank für die ausführliche Erklärung und die Beispiele.

Die Definition mit dem state war veraltet, die hatte ich bereits in GaszaehlerCounter:countsOverall.* geändert.

Ich dachte man gibt im Modul GasCalculator selbst den Zählerstand vor und der wird dann von meinem GaszaehlerCounter weiter hoch gezählt.
Aber gut, ich habe es jetzt so umgesetzt wie von dir beschrieben und bin auf morgen gespannt  ;)

So sollte Hilfe aussehen, vielen Dank noch mal und schönes Wochenende.
VG Dieter

gadget

Zitat von: dk3572 am 05 März 2021, 15:52:18
Ich dachte man gibt im Modul GasCalculator selbst den Zählerstand vor und der wird dann von meinem GaszaehlerCounter weiter hoch gezählt.
Das ist laut commandref wohl möglich, ich hab es aber nie probiert. Ich hab den Zählerständ schon immer direkt im Counterdevice per monotonic userreading gehabt, lange bevor es das GasCalculator-Modul gab.



dk3572

meinen Zählerstand * 100 hätte ich doch auch direkt mit set countOverall in Hourcounter setzen können.
Wozu dann eigentlich das userreading Totalmonotonic?
Ist Hourcounter nicht genau dafür gemacht?

gadget

Zitat von: dk3572 am 05 März 2021, 17:09:31
meinen Zählerstand * 100 hätte ich doch auch direkt mit set countOverall in Hourcounter setzen können.
Wozu dann eigentlich das userreading Totalmonotonic?
Ist Hourcounter nicht genau dafür gemacht?

Es gibt garantiert mehrere Wege. Ich habe keinen Hourcounter, sondern das monotonic Userreading direkt am Counterdevice. Mein Counterdevice übermitelt auch nicht jeden einzelnen Impuls, sondern regelmässig einen internen Zähler, der aber nach Reboot wieder bei Null anfängt.

(Ich wäre ehrlich gesagt gar nicht auf die Idee gekommen, hier einen Hourcounter zu verwenden, der ist ja in erster Linie dafür gedacht, die Betriebsdauer zu messen: "Wie lange ist die Pumpe / der Lüfter / der Mähroboter gelaufen ?" und das Zählen der Schaltvorgänge ist ja nur ein "Abfallprodukt".)

Sailor

Hallo Gadget

Zitat von: gadget am 05 März 2021, 16:05:54
Das ist laut commandref wohl möglich, ich hab es aber nie probiert. Ich hab den Zählerständ schon immer direkt im Counterdevice per monotonic userreading gehabt, lange bevor es das GasCalculator-Modul gab.

Das wäre mich als Modulprogrammierer neu.
Ich schau mir mal die commandref an. Das sollte da so nicht stehen.

Man braucht einen kontinuierlich wachsenden Zählerstand den man an den Calculator übergibt.

Gruß
    Sailor
******************************
Man wird immer besser...

gadget

#385
Zitat von: Sailor am 06 März 2021, 11:11:12
Ich schau mir mal die commandref an. Das sollte da so nicht stehen.
Man braucht einen kontinuierlich wachsenden Zählerstand den man an den Calculator übergibt.

"(...)benötigt eine Regular Expression (regex or regexp) um das Reading mit den Zähl-Impulse von einem oder mehreren Gaszählern zu finden."

könnte man IMHO so (falsch) verstehen, dass ein Reading ausreicht, das nur bei jedem Zählimpuls ein Event erzeugt. Und von kontinuierlich steht da auch nichts. Häufig hat man ja den Fall, dass nach einem Sensor-Neustart die Impulszählerei wieder bei 0 beginnt.

Also vielleicht tatsächlich explizit so rein schrieben:

Man braucht einen kontinuierlich wachsenden Zählerstand den man an den Calculator übergibt.

Sailor

Hi Gadget

Zitat von: gadget am 04 März 2021, 17:18:04
mit list werden die "Punkt"-Readings nicht angezeigt. Die sehe ich nur, wenn ich mir mit "Raw Definition" die Device-Definition anschaue. Da tauchen die dann bei den setstate-Zeilen auf. Inzischen habe ich meinen Zählkontakt aber wieder angeschlossen und weiter ackern lassen und somit hat sich auch das _EnergyDayLast aktualisiert. Wenn Du es fürs debug brauchst klemme ich das nochmal 2 Tage lang ab.

Entschuldige bitte. Du hast natürlich vollkommen recht!
Ich hatte vergessen, dass ich zu Debug - Zwecken bei mir das
attr global showInternalValues 1
eingerichtet hatte.

Wenn du das aktivierst, siehst du auch die versteckten Readings

Gruß
    Sailor
******************************
Man wird immer besser...

Sailor

#387
Hi Gadget

Zitat von: gadget am 06 März 2021, 11:16:58
Also vielleicht tatsächlich explizit so rein schrieben:
Man braucht einen kontinuierlich wachsenden Zählerstand den man an den Calculator übergibt.

OK, das schreibe ich um...

Danke

[Nachtrag: Eingecheckt]

Gruß
    Sailor
******************************
Man wird immer besser...

gadget

Ich hab das mit der Aktualisierung der Vortages-Werte nochmal näher beobachtet:
Ich habe ein

attr <counterdevice> event-on-change-reading <counter-reading>

d.h. des Calculator Device bekommt keine Events, wenn sich der Zählerstand nicht ändert. Dann aktualisiert sich auch EnergyDayLast um Mitternacht nicht.

Wenn ich ein

attr <counterdevice> event-on-update-reading <counter-reading>

dazu nehme (Event wird bei jedem Zähler-Auslesen erzeugt, auch wenn sich der Zählerstand gar nicht geändert hat) dann klappt das mitternächtliche Update von EnergyDayLast. Das reicht mir erstmal als Workaround.


Wolle02

Ich habe generell ein event-on-change-reading .* drinstehen, damit das Modul nicht so gesprächig ist und sich die Eventlast für das System reduziert. Damit erklärt sich vermutlich auch warum bei mir das mitternächtliche Rückstellen auf 0 auch nicht funktioniert.
Allerdings möchte ich das event-on-change-reading .* aus den o.g. Gründen eigentlich nicht rausnehmen.

Ist es eventuell möglich das irgendwie anders zu implementieren?