[vz-users] vzlogger exec maximal 32 Zeilen

Andreas Brus abrus.de at gmail.com
Mi Jan 12 09:51:37 CET 2022


Moin,

seit Jahren lese ich mit, habe mich aber schon lange nicht mehr 
beteiligt. U.a. weil die technische Hürde zu hoch war meine Adresse 
googlemail ->gmail zu ändern, damit ich wieder schreiben darf. Die 
uralten Links (mailman) von damals zum Ändern funktionierten nicht etc. 
Aber jetzt habe ich es geschafft. Sorry an den Admin für die Fehlversuche.

meine Herausforderung: Ich habe mir ein PHP-Script geschrieben, das die 
Daten meiner Fritzbox-Aktoren ausgibt.

Das funktionierte seit Jahren mit dem Exec-Meter problemlos. Nun habe 
ich festgestellt, daß einige Werte in letzter Zeit immer wieder nicht 
richtig eingelesen wurden.

Nach einiger Sucherei bin ich auf die Ursache gestoßen: Der Exec-Meter 
oder womöglich alle Meter? können nur 32 Werte auf einmal verarbeiten. 
Da mit der Zeit immer mehr Geräte dazu kamen sind es nun eben >40 Werte 
und je nach Reihenfolge der Ausgabe werden eben nur die ersten 32 davon 
verarbeitet.

Aus dem vzlogger:

src/protocols/MeterExec.cpp

Das wird in der Funktion MeterExec::read gleich zweimal sichergestellt:

                 while (i < n && !feof(_pipe)) {
                         while (i < n && fgets(buffer, 256, _pipe)) {

Ich nehme an, daß n irgendwo hardcoded auf 32 steht.

Allerdings wenn man die Abfrage auf i < n wegnimmt und so nur prüft, ob 
noch was in der pipe steht oder fgets Daten bekommt, kann man zwar bis 
zu zwei weitere Werte (laut debug log) lesen, aber dann stürzt der 
komplette Prozess ab. Ich nehme also an, daß es dann an anderer Stelle 
zu einem Überlauf kommt.

Leider bin ich kein cpp-Profi bzw. habe auch keine passende IDE um dem 
schnell auf die Schliche kommen zu können.

Ich habe als Workaround jetzt alle Temperaturen und alle Leistungsdaten 
in einen separaten MeterExec gepackt und bekomme jetzt wenigstens wieder 
alle Werte eingelesen. Dafür muss ich aber zweimal kurz hintereinander 
die Fritzbox abrufen und das scheint die auch nicht immer so toll zu 
finden, d.h. manchmal gibt es beim zweiten Aufruf einen Timeout.

Nun die Frage an die Profis:

1.) ist die Begrenzung auf 32 so tief im System, daß es schwierig wird 
diese Grenze z.B. zu verdoppeln?

2.) gibt es eine bessere Möglichkeit?

2a) Früher konnte der ExecMeter auch Logfiles mehr oder weniger 
kontinuierlich lesen, wenn ich mich richtig erinnere. Im Code habe ich 
dazu aber nichts gesehen. Es wird aktuell ein Command ausgeführt und die 
Ausgabe als pipe eingelesen.

Die Parameter rewind bzw: "we will try to listen on changes with 
inotify" scheint es nicht mehr zu geben?
Oder welches Protocol müsste man dafür nehmen?

Falls das gehen würde könnte ich natürlich prinzipiell die Abfrage per 
cron machen, in ein Logfile schreiben und vzlogger wartet halt bis neue 
Zeilen ins Logfile geschrieben werden. Wobei es mir schon gut gefallen 
hat nur einen Prozess prüfen und überwachen zu müssen, statt dann cron, 
Logfile und vzlogger und ausserdem dafür sorgen daß das Logfile nicht zu 
groß wird.

Grüße aus Tübingen

Andreas Brus



Mehr Informationen über die Mailingliste volkszaehler-users