[vz-dev] vzlogger - advanced Konfig

Thorben Thuermer r00t at constancy.org
Wed Mar 19 16:03:01 CET 2014


On Wed, 19 Mar 2014 10:33:25 +0100
Rainer Gauweiler <volkszaehler at moppl.inka.de> wrote:
> Am 18.03.2014 19:40, schrieb Thorben Thuermer:
> 
> > das betrifft den code fuer den custom format-string,
> > der scheint fehlerhaft zu sein.
> > einfach  den format-string weglassen, schon funktioniert es
> > mit dem temp-file.
> 
> Ok, danke fürs Nachgucken. Hab es unter 
> https://github.com/volkszaehler/vzlogger/issues/24 erfasst.
> 
> Es tut zwar besser aber noch nicht ausreichend:
> 
> [Mar 19 10:07:28][mtr1] Got 1 new readings from meter:
> [Mar 19 10:07:28][mtr1] Reading: id=/StringItentifier: value=32552.00 
> ts=1395220048.127
> [Mar 19 10:07:28][chn1] Buffer dump (size=0 keep=30): {}
> [Mar 19 10:07:28][mtr1] Next reading in 20 seconds
> [Mar 19 10:07:28][chn1] ==> number of tuples: 0
> [Mar 19 10:07:28][chn1] JSON request body is null. Nothing to send now.
> 
> -> er überträgt es nicht zur Middleware

von den "readings" die das meter erzeugt, wird keines deinem channel
zugeordnet, du musst da wohl noch einen identifier angeben.
das file-meter verwendet wenn man keinen format-string verwendet immer
den leeren string als identifier,
den musst du also wohl entsprechend fuer deinen channel angeben:
"channel" : { "identifier" : "", ...

> Mir ist auch nicht so klar, wie man sich von den Möglichkeiten die scanf 
> bietet auf den String schließt. Ist da nur die Position innerhalb eines 
> Strings möglich, oder auch die Formatieroptionen wie %2d die scanf kann?

ich denke der verweis auf scanf ist relativ sinnfrei...
der code macht folgende ersetzungen, um den format-string zu erzeugen:
case 'v': j += sprintf(scanf_format+j, "%%1$f"); break;
case 'i': j += sprintf(scanf_format+j, "%%2$ms"); break;
case 't': j += sprintf(scanf_format+j, "%%3$lf"); break;
(bachte, die verdoppelung der %-zeichen escaped sie von sprintf,
 es kommen dann einzelne im string an)
die format-strings sind also fest vorgegeben.
ausserdem werden im string angegebene %-zeichen escaped.
entsprechend kann man wohl nur die reihenfolge der parameter
und ggfs vorkommende fixed strings auf den zeilen konfigurieren.

desweiteren werden fuer nicht angegebene tokens keine defaults erzeugt.
deshalb bekommst du fuer timestamp und identifier muell, wenn du nur
$v im string hast.

> Und kann man da auch noch einfache Berechnungen machen? Ich müsste ja 
> eigentlich 39553 in 39.552 umrechnen.

nein.

> Würde ich das dann über die 
> Auflösung machen, oder geht das gleich in dem String? Und geht es 
> überhaupt über die Auflösung?
>
> Ich kann das alles natürlich trivial in bash/php lösen, versuche aber 
> gerade die Möglichkeiten vom vzlogger auszuloten.
> 
> >> Im Wiki (http://wiki.volkszaehler.org/software/controller/vzlogger)
> >> steht das Protocol file als Beispiel um den Load zu erfassen. Was nimmt
> >> man denn in der Middleware als Kanaltyp dazu?
> >
> > wie erwaehnt, einen beliebige sensorinterpreter-basierten typ.
> > (oder einen passenden selbst definieren, ich denke aber temperature
> 
> ok, ich habe Temperatur genommen, und habe das Beispiel um einen 
> entsprechenden channel-Eintrag ergänzt.
> Das Ergebnis ist auch hier:

wenn vzlogger nichts an die middleware sendet, ist voellig egal,
on der channel ueberhaupt existiert, oder wie er aussieht.
es wird nicht vorher beim server danach gefragt.

> [Mar 19 10:18:58][]     MeterFile::read: 32, 32
> [Mar 19 10:18:58][mtr2] Got 1 new readings from meter:
> [Mar 19 10:18:58][mtr2] Reading: id=/StringItentifier: value=0.13 
> ts=1395220738.833
> [Mar 19 10:18:58][chn2] ==> number of tuples: 0
> [Mar 19 10:18:58][chn2] JSON request body is null. Nothing to send now.
> [Mar 19 10:18:58][chn2] Buffer dump (size=0 keep=60): {}
> [Mar 19 10:18:58][mtr2] Next reading in 10 seconds
> 
> -> wieder kein Eintrag. Kaputt?
> 
> Ich habe auch noch ein bisschen mit aggtime/mode rumgespielt um zu sehen 
> ob es das inzwischen braucht. Hat aber auch kein wesentlicher 
> Unterschied - da läuft es dann einfach nur durch
> 
> Wer die Konfig braucht:
> 
>         {
>          "enabled" : true,
>          "protocol" : "file",
>          "path" : "/proc/loadavg",
> //      "format" : "$i $v $t",  /* a format string for parsing complex 
> logfiles */
>                                  /* arbitrary text and whitespaces are 
> allowed, see 'scanf()' */
>                                  /* at least $v has to be used */
>                                  /* $i => identifier, $v => value, $t => 
> timestamp */
>          "rewind" : true,        /* reset file pointer each interval to 
> the beginning of the file */
>          "interval" : 10,        /* of ommitted, we will try to listen 
> on changes with inotify */
>          "aggtime" : 300,        /* aggregate all signals and give one 
> update to middleware every 'aggtime' seconds */
>          "aggfixedinterval" : true, /* round all timestamps to 
> middleware to nearest aggtime */
>          "channel" : {
>                  "uuid" : "6b935420-af46-11e3-aea7-f7bf03375759",
>                  "middleware" : "http://localhost/middleware.php",
>                  "aggmode" : "MAX" /* add all s0 intervals in the 
> aggregation. Possible Modes: SUM, AVG, MAX  and NONE */
>                  } // channel
>          } // meter
> 
> Ich würde erwarten dass da nach 10 Sekunden eine Änderung im log ist - 
> ich sehe aber keine. Sieht so aus als wäre die Aggregation dafür 
> eventuell auch nicht in Ordnung.

es kann nichts aggregiert werden, da nie werte ankommen,
siehe identifier oben.

> Gruss
>       Rainer

- Thorben


More information about the volkszaehler-dev mailing list