[vz-dev] null-tupel vom MeterInterpreter

Jakob Hirsch jh at plonk.de
Mon Feb 11 00:56:38 CET 2013


On 10.02.2013 22:00, Thorben Thuermer wrote:
> folgendes problem:
> der 'hack' einen aktuellen leistungswert aus einem kanal auszulesen,
> in dem man daten mit "from=X seconds ago" anfordert,
> und dann den letzten wert nimmt, funktioniert wohl nicht mit s0-zaehlern,
> weil der MeterInterpreter immer ein tupel mit value=null ans ende haengt.

Das ist leider wirklich ein übler hack. Ich hatte das mal eingebaut,
damit das Frontend die letzte bekannte Leistung bis zur zugehörigen
End-Zeit zeichnet (ansonsten gibt's da nur einen vertikalen Strich).

Wie schon in der commit-message von damals geschrieben, gehört das
eigentlich überhaupt nicht in die middleware, sondern ins frontend,
zumindest das null-Tuple. Werd ich mal entsprechend umbauen. (Das
null-Tupel ist ein Hack damit flot weiß, daß dort die Kurve fertig ist.)

Bei (teil-)duplizieren Tupel ist es nicht ganz so einfach. In der
Ausgabe der middleware gibt es ja keine Intervalle, sondern nur tupel
mit timestamp und Wert, das Intervallende ist einfach der timestamp vom
nächsten Interval. Das wurde wohl mal so gewählt, weil Flot das genau so
erwartet. Beim letzten Interval klappt das aber nicht, da fehlt dann das
Intervallende, obwohl die Middleware das ja kennt. Der Trick war dann
eben, die selbe Leistung mit der Start-Zeit des nächsten Intervalls
einzufügen.

Ja, nicht schön. Für Vorschläge, wie man's besser machen könnte, bin ich
offen. Mir fallen spontan drei Möglichkeiten ein:
1) statt der Start-Zeit die End-Zeit in den Tupel ausgeben. O.g. Problem
würde dann nur beim allerersten bekannten Intervall auftreten, das
könnte man wohl verschmerzen. Allerdings müßte das Frontend dann ein
neues Array mit der jeweiligen End-Zeit zusammenbauen und den momentan
benutzten Trick selbst benutzen. Nicht so toll.
2) Die middleware könnte die rohen Impulse ausgeben, dann müßte eben das
Frontend die Leistungen selbst berechnen. Kein Hexenwerk, aber der von
dir angesprochene Hack zum aktuellen Leistungswert auslesen würde dann
auch nicht einfach so gehen. Könnte man mit einem zusätzlichen Parameter
lösen (rawData=1 oder so), aber dann hätte man Code doppelt und auch
noch in zwei verschiedenen Programmiersprachen. Also auch nix.
3) die Endzeit vom letzten Interval nicht in "tuples" ausgeben, sondern
mit einem eigenen key. Wie ich gerade gesehen habe, machen wir das sogar
schon, from und to sind ja nicht die Werte aus dem request, sondern die
der tatsächlcih betrachteten Daten. Das frontend müßte das also nur
entsprechend auswerten...

Hm, 3) erscheint mir jetzt als noch am geschicktesten. Wenn nix dagegen
spricht, würde ich das einfach mal so einbauen.

> da wird erst das letzte tupel dupliziert(?) ohne den callback dafuer aufzurufen,

Ja, weil der callback für das tupel, das kopiert wird, schon aufgerufen
wurde. Der callback gibt eh nur das tupel mit ggf. geändertem Wert
zurück (siehe addData() in den View-Klassen).

> kann jemand mit durchblick in der middleware (herr hirsch?) aufklaeren,
> wozu das dient?

HTH. Und danke für den (impliziten) Anstoß, daß endlich mal geradezuziehen.



More information about the volkszaehler-dev mailing list