Hallo,
ich hab schon fleißig gesucht, aber entweder nicht die richtigen Suchbegriffe verwendet oder die Problemstellung wurde noch nicht aufgegriffen:
Ich habe einen Stromzähler mit S0-Schnittstelle (500 Pulse/kWh). Daran habe ich ein selbst gebautes CAN-Modul, das aber die Daten wie ein FS20-Gerät anliefert, d.h. es kommen bei einem Puls ON und kurze Zeit später wieder ein OFF.
Mit einem notify addiere ich die Pulse auf und berechne den Zählerstand und Kosten:
FS20_611601:on {
readingsBeginUpdate($main::defs{FS20_611601});
readingsBulkUpdate($main::defs{FS20_611601}, "count", ReadingsVal("FS20_611601","count",0)+0.002);
readingsBulkUpdate($main::defs{FS20_611601}, "cost", ReadingsVal("FS20_611601","count",0)*0.265);
readingsEndUpdate($main::defs{FS20_611601}, 1);
}
Jetzt würde ich noch gerne die momentane Leistung berechnen und zwar anhand der Zeit zwischen zwei Impulsen.
Dazu müsste ich aber wissen wie lange der letzte Puls her ist. Irgendwie will finde ich da keinen Ansatz...
Alternativ hab ich schon daran gedacht einen at-Job anzulegen, der jede Minute den aktuellen Wert in ein zusätzliches Reading schreibt und dann vor jedem Schreiben aus dem alten und dem neuen Wert den Momentanverbrauch für die letzte Minute berechnet. Das finde ich aber nicht so schön... ich würde gerne stets den aktuellen Leistungswert vom letzten Puls haben.
Hat dazu jemand eine Idee oder einen Vorschlag?
Vermutlich ist es wieder so trivial, dass ich zu kompliziert gedacht habe... ::) :-\
Gruß
Holger
Ich würde den Pulsabstand schon gleich am S0 messen und eventuell auch die Momentanleistung berechnen (Habe ich hier auf einem ATmega gemacht).
So bist Du sicher dass Du keine Messfehler durch die Übertragung zu FHEM bekommst. Kann mir vorstellen dass die Übertragungszeiten zwischen den Pulsen deutlich schwankt, je nach dem was gerade auf dem Funkkanal los ist und wie beschäftigt fhem ist.
Garry
Hallo,
dank zunächst für die Antwort. Irgendwann löse ich das mal so, aber momentan muss das "quick'n dirty" gehen.
Hab jetzt doch noch die Erleuchtung gehabt. Habe es wie folgt gelöst:
FS20_611601:on {
readingsBeginUpdate($main::defs{FS20_611601});
readingsBulkUpdate($main::defs{FS20_611601}, "count", ReadingsVal("FS20_611601","count",0)+0.002);
readingsBulkUpdate($main::defs{FS20_611601}, "cost", ReadingsVal("FS20_611601","count",0)*0.265);
readingsBulkUpdate($main::defs{FS20_611601}, "interval", gettimeofday()-ReadingsVal("FS20_611601","lastpulse",0));
readingsBulkUpdate($main::defs{FS20_611601}, "power", 3600/ReadingsVal("FS20_611601","interval",0)*2);
readingsBulkUpdate($main::defs{FS20_611601}, "lastpulse", gettimeofday());
readingsEndUpdate($main::defs{FS20_611601}, 1);
}
Mit der Ungenauigkeit kann ich leben, soll ja nur ein Indiz sein.
Gruß
Holger
schau dir mal HourCounter an: http://www.fhemwiki.de/wiki/HourCounter (http://www.fhemwiki.de/wiki/HourCounter)
gruss
andre
Danke für den Hinweis... habs mal probiert.
Internals:
CFGFN
DEF FS20_611601.on
NAME TESTzaehler
NR 65487
NTFY_ORDER 50-TESTzaehler
STATE 314
TYPE HourCounter
Readings:
2014-01-15 13:10:01 clearDate 2014-01-15 13:10:01
2014-01-15 14:59:45 countsOverall 314
2014-01-15 14:59:45 countsPerDay 314
2014-01-15 13:10:01 pauseTimeIncrement 0
2014-01-15 13:10:01 pauseTimeOverall 0
2014-01-15 13:10:01 pauseTimePerDay 0
2014-01-15 13:10:01 pulseTimeIncrement 0
2014-01-15 13:10:01 pulseTimeOverall 0
2014-01-15 13:10:01 pulseTimePerDay 0
2014-01-15 14:59:45 state 314
2014-01-15 14:00:00 tickHour 1
2014-01-15 14:59:45 value 1
Helper:
OFF_Regexp
ON_Regexp FS20_611601.on
calledByEvent
changedTimestamp 2014-01-15 14:59:45
forceClear
forceDayChange
isFirstRun
sdRoundHourLast 1389790800
value 1
Attributes:
room VerbrauchsZ
Ganz nett, zählt schon mal, aber die Anzahl der Pulse muss ich immer ja auch noch
umrechnen in von Pulse in Arbeit [kWh] und von der Zeit zwischen den Pulsen noch in Leistung [W].
Und die Impulslänge zwischen ON und ON bekomme ich irgendwie nicht angezeigt?
Trotzdem Danke für den Tipp... wieder mal was ausprobiert.
Gruß
Holger
schau dir mal den zugehörige thread im forum an.
gruss
andre