Powerinterface für Nedap Powerrouter

image_pdfimage_print

Wer eine Solaranlage auf dem Dach hat und zufällig vor ein paar Jahren einen Powerrouter der Firma Nedap gekauft hat, kennt das Problem: Die Firma ist pleite gegangen und seitdem ist der Support irgendwo zwischen katastrophal und nicht vorhanden. Am schlimmsten ist, dass die Nedap Powerrouter ihre aktuellen Produktionsdaten nur an eine spezielle Internetseite unter www.mypowerrouter.com senden und per se keine Möglichkeit bieten, diese lokal zu empfangen, bzw. einzusehen. Zu allem Übel scheint es sich seit Januar 2021 abzuzeichnen, dass auch diese Internetseite früher oder später den Betrieb ganz einstellen wird, womit die ehemaligen Kunden der Firma Nedap vollends im Regen stehen.

In Anbetracht dieser Umstände, haben sich seit einiger Zeit Betroffene intensiv Gedanken gemacht, wie man die Daten lokal abfangen, in einer Datenbank aufzeichnen und über ein passendes Interface graphisch darstellen kann. Es gibt auf photovoltaikforum.com einen längeren Thread zu diesem Thema, in dem der aktuelle Stand der Erkenntnisse verfolgt werden kann.

Nicklas Grießer (ngrie) hat einen Webdienst entwickelt, der in der Lage ist, die Daten des Powerrouters lokal zu empfangen und anzuzeigen. Dave Mallou hat darum herum ein fertiges Image für den Raspberry Pi gebaut hat, das die Daten in einer InfluxDB speichert und mit Grafana anzeigt. Aufbauend auf dieser hervorragenden Vorarbeit habe ich hier eine Weiterentwicklung dieses Ansatzes zusammengestellt, bei dem ich im wesentlichen 2 Dinge geändert habe:

  1. Keine zusätzliche externe USB-Netzwerkkarte nötig
  2. AdGuard ist durch Pi-Hole ersetzt. Dies ist meine subjektive Präferenz, da ich Pi-Hole schon lange im Einsatz habe und einfach kenne und liebe. Soweit ich das überblicke, gibt es kaum echte objektive Argumente, die AdGuard hinter Pi-Hole zurückfallen lassen. Ist wohl eher frei nach dem Motto “Was der Bauer net kennt, …” 😉
  3. Ich stelle (bisher) kein fertiges Image zur Verfügung, da ich der Meinung bin, dass die Schritte zur Installation nicht weiter kompliziert sind. Außerdem hat man durch das Selbermachen den großes Vorteil, dass man sein System genau kennt und leicht in einzelnen Details an seine Bedürfnisse/sein Umfeld anpassen kann.

Grundkonzept

Im lokalen LAN wird ein eigener DNS-Server eingerichtet (z.B. Pi-Hole, AdGuard, dnsmasq, bind9, o.ä.), der für die Webadresse “logging1.powerrouter.com” (an die der Nedap Powerrouter seine Daten schicken möchte) eine lokale IP-Adresse ausgibt, unter der der Webdienst von Niklas läuft, der die Daten des Powerrouters entgegennimmt und in eine Datenbank (InfluxDB) schreibt. Auf diese DB kann dann ein graphisches Anzeigesystem (Grafana) zugreifen, um die Daten wieder im lokalen LAN als Webpage zur Verfügung zu stellen. All diese Dienste können auf einem einzigen kleinen Linux-Rechner (z.B. ein Raspberry Pi, oder eine VM) laufen.

Im folgenden führe ich Schritt für Schritt durch die Installation.

Installation und Einrichtunbg

Raspberry OS installieren

Das kleinste Image, ohne Desktop reicht völlig aus, der Server läuft eh im Prinzip “headless”, d.h. ohne Monitor, Maus und Tastatur. Sollte SSH aber nicht auf Anhieb funktionieren, dann ist zur Installation ein Monitor und eine Tastatur extrem hilfreich! In meinem Fall war der Raspi etwas wählerisch mit dem Netzwerkkabel…🥴

  • aktuelles RaspberryOS-Image installieren
    • am besten mit dem “Raspberry Pi Imager” die SD-Karte/USB-Stick vorbereiten
    • Das Image kann über das verstecktes Menü (Shift+Cmd+X) vorkonfiguriert werden:
      • WLAN und SSH-Passwort ändern bzw. anpassen
      • Rechnername auf “powerinterface” setzen
    • Dann Image auf die SD-Karte schreiben
  • Raspi booten und aktualisieren
    • apt update
    • apt full-install
  • feste LAN-IP-Adresse vergeben
    • Entweder im Router-DHCP die IP fest auf die MAC-Adresse des Raspi eintragen
    • Oder DHCP im Router komplett deaktivieren und den DHCP-Dienst im Pi-Hole aktivieren (s.u.)
      • In diesem Fall dann hier eine feste IP für die MAC des Raspi eintragen
    • Oder dem Raspi selbst über /etc/interfaces eine feste IP-Adresse geben
    • Auf jeden fall sicherstellen, dass keine IP-Adresse doppelt vorkommen kann, das wäre absolut tödlich für das ganze LAN!!!
      • => Die feste IP-Adresse darf nicht im Adressbereich liegen, den der DHCP an Clients verteilt!!!

Pi-Hole

Pi-Hole ist ein DNS-Server, der eigentlich zum filtern von Werbung im ganzen LAN gebaut ist. Er kann über den DHCP-Service auch die Verteilung der IP-Adressen übernehmen.

Details siehe hier: https://pi-hole.net

installieren

curl -sSL https://install.pi-hole.net | bash

..und den Anweisungen folgen.

konfigurieren:

  1. Passwort für Pi-Hole Admin-Site löschen: pihole -a -p
  2. Unter “Local DNS” die Domain “logging1.powerrouter.com” auf die IP des Raspi setzen
  3. Dafür sorgen, dass der Pi-Hole als DNS-Server im LAN per DHCP verteilt wird:
    1. Entweder in den DHCP-Einstellungen des Routers die IP des Raspi als lokalen DNS-Server eintragen
    2. Oder DHCP im Router deaktivieren und im Pi-Hole aktivieren.

Pi-Hole Port 80 ändern

Standardmäßig läuft die Admin-Seite des Pi-Hole auf Port 80. Da aber unter diesem Port das Webinterface für den Nedap Powerrouter laufen muss (der schickt die Daten nämlich nur an Port 80), müssen wir das Admin-Interface des Pi-Hole auf was anderes legen. Glücklicherweise installiert der Pi-Hole mit lighttpd einen vollwertigen Web-Server. Über den bieten sich gleich mehrere Lösungen:

  1. Gesamten lighttpd server auf einem anderen Port laufen lassen, z.B. 8080
    • nano /etc/lighttpd/lighttpd.conf
    • Zeile “server.port = 80” ändern auf z.B. 8080
    • systemctl restart lighttpd
      • Die Pi-Hole Admin-Seite wird damit somit so aufgerufen: http://<ip-vom-Raspi>:8080/admin
  2. Für die Admin-Seite einen Vhost mit Subdomäne einrichten, in der Form “http://pihole.powerinterface”
    • (bitte separat googeln)

Am Schluß muss der Nedap Powerrouter neu gestartet werden, damit er sich den geänderten DNS-Server per DHCP holt. Über das lokale Menü am Gerät sicherstellen, dass der DNS-Server jetzt die IP-Adresse des powerinterface ist.

InfluxDB installieren

  • Repository einbinden
    • wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
    • source /etc/os-release
    • echo "deb https://repos.influxdata.com/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
  • Influx installieren
    • apt update
    • apt install influxdb
    • systemctl unmask influxdb.service
    • systemctl start influxdb.service
    • systemctl enable influxdb.service
  • Datenbank vorbereiten (jede Zeile ein neuer Befehl)
    • influx
      create database home
      use home
      create user grafana with password '<eigenes Passwort vergeben>'
      grant all on home to grafana


      show databases
      show users
      show grants for grafana

      quit

Webdienst (ngrie)

Node.js installieren

RaspberryOS kommt entweder mit gar keinem Node.js installiert, oder mit einer alten Version, die man erst deinstallieren muss.

apt remove node nodejs

  • Repository einbinden (alternativ kann auch gleich die neue Version 16 genommen werden mit “…/setup_16.x
    • curl -sSL https://deb.nodesource.com/setup_14.x | sudo bash -
  • Node.js installieren
    • apt install nodejs
    • node -v
    • npm -v

installieren

cd /srv
git clone https://github.com/ngrie/powerinterface.git
cd powerinterface
npm install

Konfiguration

nano config.yml

Folgenden Inhalt in die Datei kopieren, danach speichern und schließen:

forwardRequests: true
actions:
  - type: influxdb
    host: 127.0.0.1
    database: home
    username: grafana
    password: <Passwort von oben eintragen>
    port: 8086

Autostart-Dienst erstellen

nano /etc/systemd/system/powerinterface.service

folgenden Inhalt in die Datei kopieren:

[Unit]
Description=Powerinterface
Documentation=https://github.com/ngrie/powerinterface
After=network.target [Service]
Type=simple
User=root
WorkingDirectory=/srv/powerinterface
ExecStart=/usr/bin/node /srv/powerinterface/server.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

Datei speichern und schließen.

systemctl daemon-reload
systemctl enable powerinterface
systemctl start powerinterface

Grafana

installieren

  • Repository hinzufügen
    • wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
    • echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
  • installieren
    • sudo apt update
    • sudo apt install grafana
    • systemctl enable grafana-server

konfigurieren

Im Browser aufrufen: (Port 3000 auf der IP-Adresse des Raspi)
http://powerinterface.local:3000

Benutzer: admin
Passwort: admin

Man wird aufgefordert, das Passwort zu ändern.

Configuration -> Add Datasource -> InfluxDB
HTTP -> URL: http://powerinterface:8086/

Database: home
User: grafana
Password: <siehe oben>

Dashboards importieren

Die drei Dashboards von Dave Mallou runterladen und entpacken.

Aktuelle Daten
Powerrouterdaten
Statistik

Unter Dashboards -> Manage Dashboards -> Import die drei json-Dateien importieren.

Anwendung

Interface

Es gibt zwei Interfaces, die von Interesse sind. Das native Webinterface von ngrie, sowie die Diagramme, die über Grafana angezeigt werden.

natives Webinterface von ngrie

Hier werden die wichtigesten Live-Daten angezeigt, ähnlich wie auf der Übersichtsseite von mypowerrouter.com.

Aufruf über:

http://powerinterface.local/
http://<ip-vom-Raspi>:80/

Port 80 kann auch weggelassen werden.

Im Hintergrund schreibt das Interface die Daten auch in die Influx-Datenbank.

Grafana-Interface

Auf diesem Interface werden die angespeicherten Daten aus der Datenbank dargestellt.

Aufruf über:

http://powerinterface.local:3000/
http://<ip-vom-Raspi>:3000/

Troubleshooting

Bitte der Versuchung widerstehen, das ganze Setup in einem anderen LAN als dem endgültigen vorzubereiten, da u.a. der Pi-Hole bei der Installation sich die aktuelle IP-Adresse Raspberry Pi in die Konfiguration schreibt.

Wenn dennoch etwas nicht funktioniert, am besten schrittweise den Fehler eingrenzen:

Sicherstellen, dass die Dienste laufen

service pihole-FTL status
service influxdb status
service powerinterface status
service grafana-server status

Der Status sollte jeweils grün sein und die Dienste sollten laufen. Wenn nicht, genau die Fehlermeldungen lesen und die entsprechenden Probleme beheben. Mit tail -fn1000 /var/log/syslog sieht man ev. mehr Details.

Sicherstellen, dass der Powerrouter den Pi-Hole als DNS-Server verwendet

Dazu lokal am Gerät über das Menü Wartung -> Status -> Internetanschluß -> DNS-Server prüfen, ob die IP des Raspi angezeigt wird.

Sicherstellen, dass der Powerrouter den Pi-Hole als DNS-Server verwendet

Dazu im Admin-Webinterface vom Pi-Hole im Menü “Query Log” prüfen, ob es ca. 1 mal pro Minute eine DNS-Anfrage vom Client “PowerRouter” an die Domäne “logging1.powerrouter.com” gibt.

Außerdem in einer Dos-box mit ping logging1.powerrouter.com prüfen, ob der Pi-Hole die “richtige” IP-Adresse ausliefert – nämlich seine eigene!

Prüfen, ob der Webdienst Daten bekommt

Dazu den Webdienst im Browser aufrufen http://powerinterface, er sollte die live-Daten des Powerrouter anzeigen.

Prüfen, ob die Daten in die InfluxDB gespeichert werden

influx
use home

show series
show measurements

Bei den letzten beiden Befehlen sollte jeweils eine längere Liste von Daten angezeigt werden.

Prüfen, ob Grafana auf die richtigen Daten zugreift

Unter http://powerinterface:3000 -> Configuration -> Datasource -> InfluxDB alle Werte genauestens prüfen, insbesondere den Datenbank-Namen, Benutzer und Passwort.

Ausblick

Ihr dürft gerne in den Kommentaren schreiben, wenn irgend etwas nicht gut beschrieben ist, oder nicht funktioniert. Ich kann zwar keinen echten Support für jeden liefern, aber ich versuche schon, die Anleitung aktuell zu halten.


[print-me]

Dieser Beitrag hat 6 Kommentare

  1. Reinhard

    Hallo Tom,
    super Danke.
    ich hab leider ein Problem. hab alles schon 3 mal neu gemacht in bekomme immer den gleichen Fehler.
    pi@powerinterface:~ $ service powerinterface status
    ● powerinterface.service – Powerinterface
    Loaded: loaded (/etc/systemd/system/powerinterface.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Wed 2021-06-02 07:28:40 BST; 1h 8min ago
    Docs: https://github.com/ngrie/powerinterface
    Main PID: 2039 (code=exited, status=200/CHDIR)

    Jun 02 07:28:40 powerinterface systemd[1]: powerinterface.service: Service RestartSec=100ms expired, scheduling restart.
    Jun 02 07:28:40 powerinterface systemd[1]: powerinterface.service: Scheduled restart job, restart counter is at 5.
    Jun 02 07:28:40 powerinterface systemd[1]: Stopped Powerinterface.
    Jun 02 07:28:40 powerinterface systemd[1]: powerinterface.service: Start request repeated too quickly.
    Jun 02 07:28:40 powerinterface systemd[1]: powerinterface.service: Failed with result ‘exit-code’.
    Jun 02 07:28:40 powerinterface systemd[1]: Failed to start Powerinterface.

    könnten sie mir da weiterhlefen?
    danke.
    mfg
    Reinhard

    1. tom

      Was sagt denn das Logfile (tail -fn100 /var/log/syslog)?

  2. Dave

    Bei einer Fritzbox kann man nur einen DNS-Server angeben. Wer also eine Fritzbox hat und der Pi ist Zeitraum X nicht erreichbar, hat keine Namensauflösung was in nicht funktionellem Datenverkehr resultiert, wo man nicht explizit die IP kennt. Die Daten gehen nirgendwo hin, wenn keine DNS-Auflösung stattgefunden hat 😉

    Ein weiterer single-point-of-failure weniger ist es mir mit 10€ für eine USB-Netzwerkkarte allemal wert, aber ich glaube das ist einfach persönliche Präferenz!

    1. tom

      Das ist richtig, das ist eine Limitation der Fritzboxen. Aber dafür kann man ja den Pi-Hole nehmen, dessen DHCP-Dienst kann das ohne Probleme. Abgesehen davon kann man den Clients auch manuell einen 2. DNS-Server geben, das geht auch auf jedem Handy.
      Ganz allgemein kann natürlich immer irgend etwas ausfallen, angefangen von der DSL-Leitung, über den Router, das WLAN, etc… Und klar, auch ein Raspi hat kein ewiges Leben, schon gar nicht die normalerweise verwendete SD-Karte… Wenn halt irgendwo was ausfällt, muss man tätig werden, aber was da jetzt für jeden Einzelnen der beste Kompromiss ist, muss am Ende jeder für sich selbst entscheiden. Das war auch einer der Gründe, warum ich lieber eine ausführliche Anleitung geschrieben habe, denn wenn man die einzelnen Bestandteile selbst aufgesetzt hat und dabei halbwegs versteht, was man tut, ist ein Ausfall einer einzelnen Komponente kein Weltuntergang.
      Aber völlig richtig, das kann man so oder so sehen…

  3. Dave

    Hallo Tom,

    super Sache eine so detaillierte Anleitung 🙂

    Ich möchte hier kurz zwei Sachen anmerken.

    Zum einen deckt mein Image einen anderen Anwendungsfall ab. Mit einem Raspberry Pi, einem USB-Netzwerkadapter und dem Image von mir, hat man ein Gerät, dass einfach zwischen Powerrouter und Internet klemmt werden kann und sonst keinen Einfluss auf irgendwas anderes hat. Wenn dieser Pi ausfällt, weil der Bootloader kaputt ist, ein Kernel Update ein Problem verursacht, die SD-Karte gestorben ist, oder ich 10 Minuten lang die SD-Karte aus dem Pi nehme um ein Backup zu machen, dann können alle Computer an denen gearbeitet, gesurft oder gespielt werden, die gar nichts mit dem Powerrouter zu tun haben wollen, trotzdem ins Internet.
    Bei deiner Lösung wird sämtlicher Datenverkehr, aller PC’s und Geräte über den Pi laufen und alle im Netzwerk sind darauf angewiesen, dass der Pi läuft. Ist der Pi nicht erreichbar, dann funktioniert die DNS-Auflösung nicht und DHCP möglicherweise auch nicht. Die wenigsten Router unterstützen die Vergabe mehrerer DNS-Server-IP’s und DHCP-Server schon mal gar nicht.
    Das war mir wichtig anzumerken.

    Zum anderen muss man bei pihole aufpassen, wenn man den Standard Port ändert ein Update durchführt, denn dann ändert sich der Port wieder auf 80 zurück und entweder pihole oder das powerinterface kann nicht gestartet werden. Wäre interessant zu wissen ob der DNS-Dienst funktioniert wenn der Webserver nicht gestartet werden kann… wo wir wieder bei dem Internet- bzw. Netzwerkausfall wären von oben.

    Viele Grüße
    Dave

    1. tom

      Hallo Dave,
      ja, Dein Einwand ist grundsätzlich richtig, wenngleich ich es nicht so dramatisch sehe: Im DHCP-Server kann man normalerweise zwei DNS-Server angeben und verteilen lassen, d.h. als 2. DNS-Server gibt man dann halt den Router an. Bei mir läuft DHCP auch weiterhin auf dem Router, weshalb beim Ausfall vom Pi-Hole nicht viel passiert. Aber grundsätzlich ist es schon richtig, dass bei diesem Aufbau die Dinge etwas mehr miteinander “verwoben” sind. Andererseits spart man sich die 2. Netzwerkkarte, was mir wichtig war. Allerdings wird nicht der gesamte Datenverkehr über den Raspi geleitet, nur die DNS-Anfragen. Die eigentlichen Daten laufen direkt über den Router/Gateway ins Internet, bzw. zu den beteiligten Rechnern.
      Zu dem anderen Punkt, das war mir bisher nicht bewusst, das werde ich mal beobachten beim nächsten Update vom Pi-Hole. Da Pi-Hole im Hintergrund dnsmasq verwendet, sollte DNS aber weiterhin laufen, auch wenn lighttpd wegen belegtem Port 80 nicht hochkommt. Dann ist halt lediglich die Admin-Seite weg.

Schreibe einen Kommentar