[gelöst]benötige Hilfe bei Umrechnung Impulse/min in leistung

Begonnen von dirk.k, 04 März 2020, 20:22:18

Vorheriges Thema - Nächstes Thema

dirk.k

Hallo zusammen,
ich steh auf dem Schlauch.
Ich versuche die Impulse vom Gaszähler in die "aktuelle Leistungsaufnahme" umzusetzen.
Mit dem Statistik-Modul und Gas-Counter bin ich nicht weitergekommen.
Ich dachte, so etwas müsse mit Impulsen/Minute oder den Sekunden zwischen 2 Impulsen zu lösen sein ...
Aber wenn es keine Impulse mehr gibt, muss der Wert halt auf 0 ... bei mir wurde immer der letzte für längere Zeit angegeben.
Damit bekomme ich einfach keine brauchbaren Kurven hin.
Das hat doch bestimmt schon mal jemand gebaut ...?
Habt ihr Tips ... oder eine Lösung?
Danke.

Damian

eine von vermutlich tausend Möglichkeiten:

defmod di_leistung DOIF init{$_count=0}\
{[+00:01];;set_Reading ("Leistung",$_count,1);;$_count=0;;}\
{[counter];;$_count++}


Bedeutet: Zähle Events vom Device "counter" und schreibe nach einer Minute die Anzahl der Events (Impulse) in das Reading "Leistung" des Moduls di_leistung. Das Reading kannst du loggen, da es ein Event generiert.

Das Programm läuft komplett in Perl ab und ist daher resourcenschonend.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

crusader

Ich mache das so:

define S0proc DOIF ([S0count:?Counter])
    (
     setreading S0proc Counter [S0count:Counter]              ##initialize power differentiation
     setreading S0proc Counter [S0count:Counter]              ##dummy power differentiation
    )


mit

attr S0proc wait 0,360
attr S0proc do resetwait
attr S0proc userReadings energy:Counter.* {ReadingsVal($name,"Counter",0)/2},
power:Counter.* differential {ReadingsVal($name,"Counter",0)*1800},


Das DOIF übernimmt den Counter-Wert aus dem eigentlichen Count-Modul und generiert nach einem Timeout einen Dummy-Schreibvorgang, der den power-Wert auf Null setzt.
Die Konstanten in energy und power müssen an die Impulsrate des Zählers angepasst werden.

Sailor

Hallo Dirk

Zitat von: dirk.k am 04 März 2020, 20:22:18
ich steh auf dem Schlauch.
Ich versuche die Impulse vom Gaszähler in die "aktuelle Leistungsaufnahme" umzusetzen.
Das hat doch bestimmt schon mal jemand gebaut ...?
Habt ihr Tips ... oder eine Lösung?

Habe ich! Probier mal
define myGasCalculator GasCalculator myGasCounterDevice:CounterReading

Gruss
    Sailor
******************************
Man wird immer besser...

eki

#4
Ich habe bei mir eine Homematic Taster Schnittstelle und einen alten Fahrrad Reed Sensor im Einsatz. Damit zähle ich die Impulse, die jeweils beim Durchlaufen des Zählers kommen (man muss noch ein bisschen tricksen, weil das Homematic Device teilweise den Zähler wieder zurücksetzt, prellt etc.). Damit habe ich dann einen Wert, den ich in Kubikmeter umrechnen kann (basierend auf dem aktuellen Zählerstand und der Entsprechung einer Umdrehung sprich eines Impulses des Zählers in Kubikmeter), der Gaszähler zählt ja nur die Gasmenge.
Aus diesen Kubikmetern kann man sich dann über eine Art Faustformel (zumindest ungefär, weil da ja auch so Dinge wie die Qualität des Gases eingehen, da hilft ein Blick in die letzte Gasrechnung um zu sehen was bei Dir bezüglich Brennwert und Zustandszahl angenommen wird) die verbrauchte Energie ausrechnen und auch die aktuelle Leistung, wenn man das will, über die Zeit zwischen den Impulsen. Im Detail sieht das bei mir so aus ("trigger_even" werden die eigentlichen Impulse erfasst (entsprechend den Eigenschaften des Sensors repariert, entprellt etc.) in "basecnt" ist dann ein Zähler, der die Impulse aufsummiert, in "counter" steht der Zählerstand des Gaszählers in Kubikmeter, in power die aktuelle Leistung in Watt):


attr Haus_Gasverbrauch userReadings basecnt:trigger_even.* {\
  (ReadingsVal($name,"basecnt",0)+1);;\
}, \
power:basecnt.* differential {\
  ReadingsVal($name,"basecnt",0)*11.0*0.95*3600.0*10.0;;\
}, \
counter:basecnt.* {\
  (ReadingsVal($name,"basecnt",0)-AttrVal($name,"triggerOffset",0))*0.01+AttrVal($name,"offset",0);;\
}


Über das Statistikmodul kann man dann noch Mittelwerte über Stunde/Tag/Monat etc. bilden und daraus dann die mittlere verbrauchte Energie in kWh bestimmen.

crusader

Das "differential"-Userreading zur power-Berechnung kann man natürlich direkt ins Zähler-Device schreiben.
Das Problem des Fragestellers besteht jedoch darin, dass beim Ausschalten des Gasverbrauchers der letzte power-Wert unverändert stehen bleibt und nicht -wie es physikalisch korrekt wäre- auf Null geht.

Man benötigt daher einen Timeout-Mechanismus, der bei ausbleibenden Impulsen den Wert auf Null setzt, entweder durch einen Watchdog oder ein entsprechendes DOIF.

Damian

Zitat von: crusader am 06 März 2020, 11:47:58
Das "differential"-Userreading zur power-Berechnung kann man natürlich direkt ins Zähler-Device schreiben.
Das Problem des Fragestellers besteht jedoch darin, dass beim Ausschalten des Gasverbrauchers der letzte power-Wert unverändert stehen bleibt und nicht -wie es physikalisch korrekt wäre- auf Null geht.

Man benötigt daher einen Timeout-Mechanismus, der bei ausbleibenden Impulsen den Wert auf Null setzt, entweder durch einen Watchdog oder ein entsprechendes DOIF.

Meine gepostete Lösung im zweiten Post generiert auch Events mit Null, wenn nichts kommt. Natürlich kann man sie mit event-on-change-reading unterbinden, wenn man keine überflüssigen Nullen haben will.

Ohne weitere Definitionen lässt sich innerhalb des Moduls auch der momentaner Verbrauch in m³ bzw. der kumulierter Verbrauch errechnen und in entsprechenden Readings ablegen. 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

crusader

Das Problem bei Deiner Lösung ist die schlechte Messwert-Auflösung.
Innerhalb der Messzeit von einer Minute trudeln bei üblichen Gaszählern maximal so etwa 3 bis 5 Impulse ein. Man müsste die Messzeit auf 20 bis 30 Minuten ausdehnen, um brauchbare Messgenauigkeiten zu erreichen.

Bei niedrigen Frequenzen eignet sich eine Zeitmessung besser und die wird für "differential"-userreadings ja herangezogen.

dirk.k

Vielen Dank an alle.
Ich habe alle Varianten durchprobiert und alle bringen erkennbare Ergebnisse.
Die Heizung Moduliert aber nicht nur, sondern pulst auch (heizen-pause-heizen-pause...)
Die "schönsten" Kurven kommen da mit der Lösung von Damian zustande ... evtl. genau wegen der geringeren Auflösung.