Inhaltsverzeichnis
Feststellung
Wird bei S0-Zählern jeder einzelne Impulse erfasst (keine Aggtime) kann es bei der Auswertung zu Problemen kommen, wenn nur ein Verbraucher angeschlossen ist und dieser nur Kurz eingeschaldet wird. Frontend und Virtuelle-Zähler ermitteln die Aktuelle Last aus den Werten im Betrachtungszeitraum. Wird eine Verbraucher von z.B. 300W kurz eingeschaldet und erkannt, dann ist die Aktuell Last 300W bis ein neuer Impuls kommt und eine Andere Last berechnet werdsen kann. Ist kein Verbraucher aktiv kommt aber kein neuer Impuls, und es wird eine „Falsche“ Last dargestellt.
vzlogger kann mit send_zero Null-Werte generieren, wenn nach 1s bzw. nach Ablauf von aggtime keine Impulse registriert wurden.
Wer wie ich keinen vzlogger benutzt muss die NULL-Werte also anders erzeugen.
Überlegungen
Zähler können den Verbrauch erst ab einer Bestimmten Last ermitteln. Elektrozähler geben einen Anlaufstrom, Volumenzähler haben eine Schleichmenge. Alles darunder ist für den Zähler nicht von NULL zu unterscheiden.
Zusammen mit der Auflösung kann man also sagen, das wenn ein Impuls länger X zurückliegt kein Messbarer Verbrauch vorliegt, oder die Last ist NULL.
Die Notwendigen Daten sind in der Datenbank oder mindestens Bekannt. Ein Script kann die NULL-Werte erstellen.
meine Lösung
Ich prüfe regelmäßig wieviel Zeit seid dem letzten Impulse vergangen ist. Für die Abfrage habe ich 60min zurück gewält.
Das Script läuft auf den selben Rechner wie VZ und heist:
/usr/local/bin/zero.php
Aufgereufen wird es mit folgende crontab:
1/5 * * * * php /usr/local/bin/zero.php >> <logfile>
Hier das Script:
- zero.php
<?php #!/usr/bin/php #Version 0.1 vom 28.07.2019 /* Nullwerte für S0-Zähler bei 0 Last Werte für eltako: 2000 Imp./kWh, min 20mA Pmin = 230V * 0,02A = 4,6W Qn = 1kWh/2000N = 1000*3600Ws/2000N = 1800Ws/N TNmax= Qn/Pmin = 1800Ws/N / 4,6W = 391,3s/N */ $uuid="<uuid>"; #UUID die Überwacht werden soll $TNmax=390; $vzc='/var/www/volkszaehler.org/bin/vzclient'; setlocale(LC_TIME, "de_DE.utf8"); $now=time(); $to=$now*1000; $from=$to-(60*60*1000); #die Zeit muss größer sein wie der 2x Abstand der Aufrufe $url = "http://localhost/api/data/".$uuid.".json?from=".$from."&to=".$to."&options=raw"; $contents = file_get_contents($url); $data=json_decode($contents,true); $last = end($data['data']['tuples']); print vztime($to)."\t"; if ( $last['0']<($to-($TNmax*1000)) and $last['1'] > 0){ $cmd=$vzc.' -u '.$uuid.' add data value=0'; # die aktuelle Zeit wird verwendet #print $cmd."\n"; print vztime($last['0'])."\t".$last['1']."\n"; $output = shell_exec($cmd); print $output."\n"; } #Funktionen function vztime($time){ $int=round($time/1000); return strftime ("%a %d.%m.%Y %H:%M",$int); } ?>