PIP812 Daten in eine Influxdb schreiben

Ich habe einen PIP812 von MPPSolar und wollte die Daten vom Gerät in meiner InfluxDB speichern für eine Auswertung mit Grafana. Leider bietet die Hersteller Windows Software keine Möglichkeit die Daten weiterzuleiten. Alternativ zu dieser Software habe ich SolPipLog gefunden. Die Software läuft auf einem Raspberry PI mit einer UI. Leider bietet die Software aktuell keinen reinen Command Line Modus. Man kann die Daten aber an einen Server per UDP senden zu lassen.

Software:

SolPipLog

Hier die Konfiguration in der Software:

Das Script auf dem RPi was einen UDP Server bereitstellt.

Verzeichnis: /opt/mppsolar/

vi pip812_server.pl

#!/usr/bin/perl -w
## udpqotd - UDP message server
use strict;
use IO::Socket;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 1;

my($sock, $newmsg, $hishost, $MAXLEN, $PORTNO);
my $fldname;
my $fldvalue;
my $fldinfo;
my %fldinfo;

$MAXLEN = 2048;
$PORTNO = 1234;

$sock = IO::Socket::INET->new( LocalPort => $PORTNO, Proto => 'udp') or die "socket: $@";

#print "Awaiting UDP messages on port $PORTNO\n";

while ($sock->recv($newmsg, $MAXLEN)) {
	my($port, $ipaddr) = sockaddr_in($sock->peername);
	$hishost = gethostbyaddr($ipaddr, AF_INET);
	#   print "Client $hishost said $newmsg\n";
	$sock->send("CONFIRMED: $newmsg ");
	#   print Dumper($newmsg);

	foreach my $line (split(/\n/,$newmsg)) {
		if ($line =~ /^([\w\._]+)\s+([\d\.]+)/) {
			($fldname, $fldvalue) = ($1, $2);
#			print "$fldname: $fldvalue\n";
			system "curl --output /dev/null --silent -i -XPOST 'http://[INFLUXDB-SERVER]:8086/write?db=pip812_garage_solar' --data-binary '$fldname value=$fldvalue'";
		}
	}
}
die "recv: $!";

Init Script:

vi /etc/init.d/pip812_server

#! /bin/sh
### BEGIN INIT INFO
# Provides:          pip812_server
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts & Stops My Programm
# Description:       Starts & Stops My Programm
### END INIT INFO

#Switch case fuer den ersten Parameter
case "$1" in
    start)
	    nohup /opt/mppsolar/new_server.pl &
        ;;

    stop)
 	#Aktion wenn stop uebergeben wird
        echo "Stoppe pip812_server"
	pid=`ps -ef | grep pip812_server.pl | grep -v grep | awk '"\t" {print $2;}'`
	echo $pid
	kill -9 $pid
        ;;

    restart)
 	#Aktion wenn restart uebergeben wird
        echo "Restarte pip812_server"
	/etc/init.d/pip812_server stop
	/etc/init.d/pip812_server start
        ;;
 *)
 #Standard Aktion wenn start|stop|restart nicht passen
 echo "(start|stop|restart)"
 ;;
esac

exit 0

Ausführbar machen und Starten beim Booten:

chmod +x /etc/init.d/pip812_server
update-rc.d pip812_server defaults

Ergebnis:

Command line Version: Ich habe bei dem Entwickler eine Anfrage gestartet bzgl. ob es möglich wäre eine Kommandozeilen Option einzubauen. Wenn Ihr möchtet könnt Ihr dafür abstimmen. Kommandozeilen Option

Viel Spaß beim Nachbauen.