Category Archives: Techdocs
Lyrion Music Server
Als Sonos-User der allerersten Generation war ich begeistert von der Flexibilität und Einfachheit dieses Systems. Nach und nach haben sich die Wolken am Sonos-Himmel verdichtet (siehe Sonos: Gut zu wissen) . Deswegen habe ich mich nach einer Alternative ungeschaut und wurde bei Lyrion Music Server (ehem. Logitech Media Server) fündig.
Das Sonos-System war damals revolultionär. Die Kombination von „Software und Lautsprecher“ macht es unglaublich flexibel. Der grosse Vorteil ist aber geichzeitig auch ein Nachteil. Da sich die Software weiter entwickelt (aus firmenpolitischen Gründen oder auch tatsächlich für neue gute Funktionen), wird auch an die Hardware (in diesem Falle an Prozessor und Arbeitsspeicher) neue Anforderungen gestellt. Die Hardware kann dann irgendwann nicht mehr mithalten und muss ersetzt werden. Dazu kommt dann noch der Fakt, dass auch Sonos am Markt bestehen muss und auf neue Verkäufe angewiesen ist. Das alles ist nicht wirklich nachhaltig.
Meine 10 Sonos-Boxen habe ich deswegen verkauft und mit dem Erlös durch folgendes Setting ersetzt:
- 10x JBL Control ONE Boxen (passiv) mit Raspberry Pi 3 inkl. HifiBerry
- Auf den Raspis läuft bei mir Max2Play.
=> Für versiertere User kann auch einfach ein Squeezeplayer installiert werden. - 1x LMS auf einem Docker Container
=> Es kann aber auch gerne auf einem der Max2Play Installationen einfach ein Lyrion Music Server „per Mausklick“ gestartet werden.
=> Oder man nimmt sich einen weiteren Raspi und installiert einen dedizierten Lyrion Music Server darauf. Für Installation siehe weiter unten.
Im Prinzip habe ich mir einfach eine Squeezebox gebaut. Ich hätte mir auch einfach eine auf Ricardo besorgen können. Aber ich wollte etwas flexibleres. Der HifiBerry Amp2 liefert 60Watt Leistung. Also genügend um einfache passive Lautsprecher damit zu betreiben. Das ganze kann man als Stereo- oder auch als Mono-Setting konfigurieren.
Wie alle Lösungen hat auch mein Setting Vor- und Nachteile:
- + Super flexibel, Gruppierungen genau wie bei Sonos möglich
- + Dank OpenSource wird das System wird auch in 10 Jahren noch genauso lauffähig sein
- + Keine lästigen „Feature Updates“
- + Es kann jeder Music-Stream integriert werden. Meine Radio-Streams starten alle direkt ohne lästige Werbe-Jingles
- + Spotifiy integration
- + Sehr aktive Community
- – Initialaufwand und etwas technisches Flair nötig
Mein Setting sieht in „Real Life“ folgendermassen aus:


Noch ein Blick auf die Software Web-Oberfläche, welche auch als auch als App verfügbar ist:



Installation LMS auf einem Raspberry Pi
Für jene die den Lyrion Music Server nicht über eine Max2Play Installation betreiben möchten (wie ich) hier noch die Beschreibung, wie dieser auf einem weiteren Raspberry Pi installiert werden kann.
Voraussetzung:
- Raspberry Pi OS ist installiert
- SSH Zugang ist eingerichtet
OS aktualisieren
sudo apt-get update && sudo apt-get dist-upgrade
Audio-Formate installieren
sudo apt-get install libsox-fmt-all libflac-dev libfaad2 libmad0
Download LMS
Die Versionen gibt es hier. Für den Raspi 4 brauchen wir die ARM Verison.
cd wget http://downloads.slimdevices.com/nightly/8.3/lms/fe81659879fef1a51537fb579b8e57b6a7b987d9/logitechmediaserver_8.3.0~1630708871_arm.deb sudo apt install ./logitechmediaserver_8.3.0~1630708871_arm.deb
Log überprüfen, ob alles ok installiert wurde
tail -n 100 /var/log/squeezeboxserver/server.log
Links
- https://www.byteshark.de/index.php/home/technik/smarthome/logitech-media-server-und-clients-installieren
- https://homehack.nl/creating-a-raspberry-pi-squeezebox-server/
- https://homehack.nl/maintaining-the-raspberry-pi-squeezebox-server-aka-logitech-media-server/
- https://forums.slimdevices.com/showthread.php?98711-Logitech-Media-Server-Versions
ioBroker: Node.js Update / Reinstallation ioBroker
Update 20.2.2024
Neu ist das Update von node auf dem iobroker deutlich vereinfacht worden. Siehe auch hier und hier:
Siehe auch alle Consolen-Commands für iobroker hier.
iob stop ## für iob fix muss iobroker gestoppt sein
iob fix
iob nodejs-update xx ## (mit xx eine GERADE Major Node.js version - Ungerade Versionen sind Entwicklerversionen)
sudo reboot
iob upgrade ## bei Bedarf gleich alle Adapter mit aktualisieren
Wenn iobroker als lxc betrieben wird, muss das update-commando als iobroker ausgeführt werden:
su iobroker -s /bin/bash -c 'iob nodejs-update 20'
Auf dem LXC Container scheint das iobroker update-script nicht zu funktionieren. Also über die Pakete installieren:
NODE_MAJOR=20
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
apt update
apt upgrade
Deprecated:
Ich betreibe seit einigen Jahren ioBroker, welches auf nodejs basiert. Heute war es an der Zeit die Nodejs Version von 8 auf 12 anzuheben, was leider nicht ganz ohne Probleme funktionierte. Hier fasse ich kurz zusammen, welche Schritte bei meiner Installation nötig waren. Die Schritte basieren auf diesem Howto.
Die einzige, im Howto beschriebenen und für mich funktionierende Lösung für das Update war, die komplette Reinstallation des ioBrokers. Dabei wird zuerst die neue Node.js Version installiert. Dann ein Backup des iobroker-data Verzeichnisses gezogen, die ioBroker-Installation gelöscht, neu installiert und dann das Backup wieder zurück gespielt:
Installation neue Node.js Version 12
cd /opt/iobroker
iobroker stop
cd
# install nodejs
curl -sLf https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs
# install iobroker
curl -sLf https://iobroker.net/install.sh | bash -
Bei einer Aktualisierung von Node.js müssen bereits installierte JavaScript- Module im ioBroker-Ordner aktualisiert werden, da sonst Fehler bei deren Ausführung auftreten. Hier traten bei mir dann die Probleme auf. Die einzige bei mir funktionierende Lösung war, den ioBkoker neu zu installieren:
Backup und Neuinstallation ioBroker
- Backup des iobroker-data Verzeichnisses nach „Home“ ziehen
- Die alte Installation löschen
- ioBroker neu installieren
cp -r /opt/iobroker/iobroker-data ~/iobroker-data
sudo rm -r /opt/iobroker/
sudo mkdir /opt/iobroker
cd /opt/iobroker
curl -sL https://iobroker.net/install.sh | bash -
ioBroker wird nach der Installation wieder gestartet. Wir stoppen ioBroker deswegen wieder:
iobroker stop
Nun löschen wir das neu erstellte iobroker-data Verzeichnis und kopieren das Backup
rm -r /opt/iobroker/iobroker-data
cp -r ~/iobroker-data /opt/iobroker/iobroker-data
Während meinen Installations-Bemühungen habe ich festgestellt, dass die Berechtigungen immer wieder durcheinander gehen. Es existiert deswegen ein korrektur-Script, welches die Berechtigungen des ioBrokers wieder gerade zieht. Es ist ratsam dieses jetzt durchzuführen:
cd /opt/iobroker
curl -sL https://iobroker.net/fix.sh | bash -
Jetzt den ioBroker neu starten
iobroker start
Der Start kann jetzt sehr lange dauern. Der ioBroker merkt jetzt, dass die Adapter (gem. Backup) fehlen und installiert diese neu nach.
Um zu schauen, wo die Installation steht, kann man das log konsultieren
tail -f /opt/iobroker/log/iobroker.current.log
Ein Adapter (zigbee) liess sich jetzt immer noch nicht installieren. Diesen habe ich dann noch manuell installiert:
cd /opt/iobroker
iobroker stop
sudo -H npm install iobroker.zigbee --unsafe-perm
Ganz zum Schluss dann nochmals die Berechitigungen gerade ziehen, um sicher zu gehen…
cd /opt/iobroker
curl -sL https://iobroker.net/fix.sh | bash -
Das wars. Jetzt den Raspi neu booten und sich über die neue ioBroker-Installation freuen 🙂
sudo reboot
Rasperry Pi SD Karte klonen
Hier beschreibe ich, wie man eine SD Karte eines Raspberry PIs aus dem laufenden Betrieb heraus klonen kann
Klone aus dem laufenden Betrieb
Siehe dazu auch den Forum-Eintrag https://forums.raspberrypi.com
- Raspi mit angeschlossenem Card-Reader (inkl. darin enthaltener neuer SD Karte) starten
- Anschliessend https://github.com/framps/rpi-clone.git installieren
Original Repo war https://github.com/billw2/rpi-clone.git. Aber das wird nicht mehr unterhalten. $ git clone https://github.com/framps/rpi-clone.git
$ cd rpi-clone
Übersicht über die angeschlossenen Disks
lsblk -o NAME,FSTYPE,UUID,PARTUUID
In meinem Beispiel ist die im Raspi installierte SD-Karte „mmcblk0“ und die SD-Karte im USB Card-Reader „sdb“. Jetzt die SD Karte klonen
sudo ./rpi-clone -f sdb
Dies hat den schönen nebenefekt, dass man den Clone auch direkt auf eine kleinere Karte schreiben kann, sofern der genutzte Speicher im Ursprungslaufwerk die Kapazität des Ziellaufwerks nicht übersteigt.
Nun noch überprüfen ob die PARTUUIDs korrekt in cmdline und fstab gesetzt sind. Hierfür kann ein Tool verwendet werden
wget https://raw.githubusercontent.com/framps/raspberryTools/master/syncUUIDs.sh
chmod +x syncUUIDs.sh
sudo ./syncUUIDs.sh /dev/sdb
--- Root PARTUUID 8e8f4b9d-02 already used in /dev/sda1/cmdline.txt
--- Boot PARTUUID 8e8f4b9d-01 already used in /dev/sda2/etc/fstab
--- Root PARTUUID 8e8f4b9d-02 already used in /dev/sda2/etc/fstab
Hint Passwort
Beim letzten Clone hat es das Passwort des Sudo-Users „zerstört“ bzw. ich konnte mich auf der geklonten SD Karte nicht anmelden. Hiermit kann man das Passwort reseten (Ich habe Methode 3 benutzt): https://forums.raspberrypi.com/viewtopic.php?t=319398
Sonos: Gut zu wissen
Dieser Beitrag ist „Deprecated“. Sonos ist dabei das schöne Upnp mit ihrer neuen API abzulösen (siehe https://developer.sonos.com/). Es wird wohl zwei API-Versionen geben. Eine für private Developer, für welche eine Cloud-API zur Verfügung gestellt wird und eine für Firmen, welche ein „lokales“ API nutzen (und sich dafür zertifizieren) dürfen. Für Entwickler wie mich wäre also zukünftig das Ansteuern der Boxen nur noch über die Cloud möglich, was für mich nicht in Frage kommt. Ich hoffe Sonos bietet da dann doch noch etwas womit die Sonos Boxen über das LAN angesprochen werden können. Aktuell sieht es aber leider nicht so aus. Erste Funktionen, welche ich hier noch beschrieben habe, sind bereits durch Firmware-Updates herausgefallen (z.B. reboot). Wundert euch also nicht, wenn nicht mehr alle Upnp oder HTTP-Calls funktionieren.
Mittlerweile habe ich meine Sonos Boxen verkauft und bin auf eine OpenSource-Lösung, basierend auf Hifiberry und Max2Play umgestiegen. Damit ist es möglich, die gleiche Funktionalität von Sonos mit eigenen Boxen nachzubauen. Siehe hier.
Hints, Tips und Tricks rund um Sonos
Mein Sonos System umfasst insgesamt 7 Player (1 Sonos Soundbar und 6 Sonos Play:1). Sonos erstellt und unterhält sein eigenes Netz (Sonos-Net) selber. Grundsätzlich funktioniert das „out of the box“. Es kann aber doch manchmal nötig sein das Sonos-Net zu optimieren. Dazu anbei ein paar nützliche Infos:
Tools
Auf jeder Sonos-Box läuft ein Webserver, den man über den Browser ansprechen kann. Dabei können einige nützliche Infos eingesehen oder aber auch Einstellungen vorgenommen werden:
| http |
Übersicht über die Sonos Box. Hier kann auch die Network-Matrix aufgerufen werden |
| http://IP:1400/advconfig.htm | Einstellen der Root-Bridge (FirstZP und Priority auf „enabled“). |
| http://IP:1400/reboot | Reboot der Sonos Box |
| http://IP:1400/region.htm | WLAN Region sezten (bei uns EU – Europa) |
| http://IP:1400/tools.htm | Netzwerktools wie Ping, Traceroute, nslookup |
| http://IP:1400/status | Status-Seite |
| http://IP:1400/wifictrl?wifi=off | Stellt das WIFI bis zum nächsten Reboot ab |
| http://IP:1400/wifictrl?wifi=persist-off | Stellt das WIFI Interface komplett ab. Wenn man nur über Kabel arbeiten möchte |
| http://IP:1400/status/scanresults | Scanresults zeigt euch alle WLAN-Verbindungen an, welche von Sonos erreicht wurden. Kann je nachdem noch nützlich sein, für Android Smartphones gibt es da noch bessere Apps |
| http://<IP>:1400/status/tracks_summary | Mit diesem Befehl kannst Du dir die Anzahl der Tracks anzeigen lassen |
| http://<IP>:1400/status/topology | Zeigt die Sonos Topologie mit allen Sonos Playern und Media Servern |
Nützliche Links:
Odroid HC4 / NAS
Da sich mein Qnap NAS verabschiedet hat, war dies die Gelegenheit ein NAS selber zu bauen.
Anforderungen an Services
Ein NAS bietet heutzutage, nebst dem Speichern von Daten, diverse Services an. Folgendes möchte ich auch auf dem HC4 nutzen:
- Datenverwaltung (NAS Strategie)
- Samba-Shares
- FTP-Server
- Video Überwachung
- Bibliotheksverwaltung für eReader
NAS-Strategie
Als erstes ist es eine gute Idee zu klären, was man mit dem NAS überhaupt erreichen möchte. Hier meine Kriterien:
- Datenverlust: Die Daten sollen bestmöglich vor Verlust geschützt werden.
- Verfügbarkeit: Die Daten können auch mal 1-2 Tage nicht verfügbar sein. Mehr als 2 Tage Ausfall sollten es aber nicht sein.
Massnahmen Datenverlust
- Das NAS soll in einem RAID-1 Verbund laufen. Damit werden die Daten gespiegelt abgespeichert, so dass ein Festplatten-Ausfall einfach abgefedert werden kann.
- Gleichzeitig werden die „Core-Daten“ (alles ausser Musik, Filme etc.) regelmässig zusätzlich auf ein zweites Gerät gespeichert (rsync).
Massnahmen Verfügbarkeit
- RAID-1 hilft hier ebenfalls, die Daten bleiben bei einem Ausfall einer der beiden Festplatten weiterhin verfügbar.
- Es kann aber auch sein, dass die Hardware (SD-Karte oder HC4) ausfällt. Die SD-Karte klone ich zu diesem Zweck. So kann ich bei einem Ausfall die SD-Karte einfach austauschen. Beim HC4 wird es aber etwas schwieriger. Ich habe mir zwei HC4 Geräte besorgt. Bei einem Ausfall kann ich entsprechend auch den HC4 sofort ersetzen.
Hardware
- Odroid HC4 / Case: SBC Case Builder
- Power Supply
- 2x 8TB WD Red Pro
- 1x zusätzlicher Lüfter
- 1x Lüftungsregulierer
Ich habe bereits mit dem Odroid HC2 sehr gute Erfahrungen gemacht. HC4 ist der Nachfolger und bietet neu mehr CPU Leistung, einen 64Bit Prozessor, 4Gb RAM, etc.
Das HC4 Gehäuse
Update 2024: Sie scheinen mittlerweile verstanden zu haben, dass das Originale Case nix bringt. Es gibt mittlerweile von odroid ein HC4 Case Kit, mit welchem man sich ein vernünftiges Case selber zusammenschrauben kann.
Das Gehäuse vom HC4 ist meines Erachtens nicht gelungen. Die Festplatten werden vertikal in den SATA-Anschluss des HC4 eingeschoben. Das ganze ist mir viel zu wackelig. „Serverschrank-Ready“ ist dieses Ding so definitiv nicht. Auch frage ich mich, ob es sinnvoll ist, SATA Stecker so zu verwenden. Ich kann mir nicht vorstellen, dass die SATA Stecker des HC4 solide genug sind um häufiges wechseln von Festplatten zu überstehen:
Das SBC Case Builder Gehäuse
Ich drucke mir mit dem 3D Drucker, basierend auf dem Design von SBC Case Builder mein eigenes Gehäuse. Ziel soll es sein, ein Gehäuse zu produzieren, welches auch mit gutem Gewissen in einem Server- oder Netzwerkschrank platziert werden kann:
Der SBC-Build hat aber leider eine kleine Schwäche. Auf der einen Seite, wo sich das Board befindet, kann der Deckel nicht angeschraubt werden. Daraus resultiert, dass beim Stromanschluss ein Spalt von ca 2mm entsteht. Dem habe ich einfach mit einem Kabelbinder entgegengewirkt. Ist nicht schön, aber für den Serverschrankt tut es das allemal:
Alles in allem kann man den HC4 nun mit gutem Gewissen in den Serverschrank stellen:
- Die Festplatten sind sehr gut fixiert und es wackelt rein gar nichts.
- Der zweite Lüfter, den ich über den USB-Port betreibe, sorgt für zusätlich gute Belüftung.
- Der Stock-Lüfter befindet sich übrigens unterhalb des HC4-Boards. Ein Lüfter wurde so montiert, dass er die Luft nach aussen bläst und einer zieht die Luft an.
- Der Lüftungsregulierer erlaubt es die Touren des Lüfters einzustellen. Ich habe ihn auf ca. 50% eingestellt. Damit wird immer noch gut belüftet und der Lärmpegel hält sich in Grenzen. => Serverschrank-Ready.
- Ist es schön? => NEIN 😀
Betriebssystem
Der HC4 bietet neu (im Gegensatz noch zum HC2) die Möglichkeit das Betriebssystem auf der SATA-Disk zu installieren. Hardkernel hat dafür den Petitboot Bootloader vorinstalliert. Dieser Bootloader ermöglicht den HC4 Start ohne eingelegte Disk oder SD-Karte. Anschliessend kann über netboot ein Betriebssystem direkt auf einer Disk installiert werden. Ich habe aber für die Installation das Image auf die SD Karte geschreiben und dabei folgende zwei Images getestet:
Die Ubuntu-Version stammt von Hardkernel und ist mit Petitboot kompatibel. Das bedeutet, dass das Betriebssystem (nach 10s wartezeit) von Petitboot erkannt und gebootet wird. Dieses Ubuntu könnte damit z.B. auf einer SATA SSD Disk installiert werden. Das Betriebssystem wird damit dann direkt von der SSD betrieben und nicht auf der SD-Karte.
Armbian hingegen wird von Petitboot nicht erkannt. bei Armbian muss Petitboot komplett entfernt werden. Mit gelöschtem Petitboot versucht der HC4 auf der SD-Karte ein Betriebssystem zu finden und startet dieses dann direkt. Dies hat den Vorteil, dass der Start sofort durchgeführt wird (ohne 10s) Wartezeit. Dafür aber auch den Nachteil, dass das Betriebssystem auf der SD-Karte liegt. SD-Karten sind bekanntlich nicht dafür geeignet ein Betriebssystem (mit vielen writes) zu betreiben.
Ich entscheide mich für eine Installation mit Armbian. Armbian ist leichtgewichtiger als die Hardkernel Ubuntu-Version und auf den HC4 abgestimmt. Armbian ist mir deswegen etwas sympatischer – ist aber eher ein Bauchentscheid als wirklich mit harten Fakten begründet…
Installation Armbian
- Download Armbian: https://redirect.armbian.com/odroidhc4/Jammy_current
- Flash Image auf SD-Karte (z.B. mit Etcher)
- Löschen von Petitboot
- Starten HC4 ohne eingelegte SD Karte => Petitboot startet
- Wähle „Exit to shell“
- Führe aus:
# flash_eraseall /dev/mtd0 # flash_eraseall /dev/mtd1 # flash_eraseall /dev/mtd2 # flash_eraseall /dev/mtd3
-
- => Dadurch wird der SPI-Flash-Speicher gelöscht und der HC4 startet ab sofort direkt von der SD Karte.
- HC4 mit eingelegter Armbian SD-Karte starten
- Installations-Anweisungen befolgen
Grund-Installation Armbian ist damit abgeschlossen
Lüfter-Support aktivieren:
vi /etc/fancontrol
Inhalt einfügen:
INTERVAL=10 DEVPATH=hwmon0=devices/virtual/thermal/thermal_zone0 hwmon2=devices/platform/pwm-fan DEVNAME=hwmon0=cpu_thermal hwmon2=pwmfan FCTEMPS=hwmon2/pwm1=hwmon0/temp1_input FCFANS= hwmon2/pwm1=hwmon2/fan1_input MINTEMP=hwmon2/pwm1=50 MAXTEMP=hwmon2/pwm1=60 MINSTART=hwmon2/pwm1=20 MINSTOP=hwmon2/pwm1=28 MINPWM=hwmon2/pwm1=0 MAXPWM=hwmon2/pwm1=255
Restart fancontrol
sudo systemctl restart fancontrol
Wichtig: Wenn man den Kernel 5.15.x einsetzt, muss die Zeile FCFANS=hwmon2/pwm1=hwmon2/fan1_input entfernt werden.
Reboot Issue
Ein soft reboot (sudo reboot) funktionierte in diesem Zustand nicht. Die Lösung ist hier zu finden:
armbian-config ---> System -> Install -> Install/Update the bootloader on SPI/Flash
Danach bootet armbian sauber nach einem „sudo reboot“.
Wiederherstellen/Update Petitboot
Es besteht die Möglichkeit Petitboot zu aktualisieren bzw. über das gleiche Vorgehen, nach einer Löschung, wieder zu installieren.
Dafür stellt Hardkernel ein Image zur Vefügung:
- Download aktuelles spiupdate-image unter http://ppa.linuxfactory.or.kr/images/petitboot/odroidhc4/ => Die heute aktuelle Version ist „spiupdate_odroidhc4_20201112.img“
- Optional:
- Download letzte Firmware „spiboot-20220317.img„
- Auf der geflashten SD-Karte das File „spiboot.img“ durch die neue heruntergeladene Variante ersetzen. Das File muss natürlich nach spiboot.img umbenannt werden.
- Den HC4 mit dieser SD-Karte booten. Das Firmware-Update wird automatisch durchgeführt.
Hint: Boot ohne Petitboot
Gut zu Wissen ist, dass der HC4 auch ohne das entfernen von Petitboot die Möglichkeit bietet ohne Petitboot zu starten. Dafür muss man einfach den schwarzen Reset-Knopf drücken und gleichzeitig den Stromstecker einstecken. Dann warten, bis der HC4 blau zu blinken beginnt. Damit startet HC4 ohne Petitboot. => Das ist aber natürlich für den täglichen Gebrauch nicht wirklich zu empfehlen.
Installation Festplatten / RAID1
Partition erstellen
Als erstes schliesse ich eine der beiden 8TB Festplatten an und boote das System neu. Nun eine Partition erstellen:
sudo fdisk /dev/sda g
Dies erstellt eine gpt-Partitionstabelle und wir erhalten das Disk-Label (GUID) => Dieses notieren
- Nun mit n eine Partition erstellen und alle vorgeschlagenen Standardwerte übernehmen.
- Am Schluss mit w die Änderungen auf die Platte schreiben.
sudo fdisk -l
- Zeigt nun die partitionierte Festplatte an
-
Filesystem erstellen
- Wir erstellen ein Btrfs Filesystem, über welches dann Raid1 umgesetzt wird.
mkfs.btrfs /dev/sda1
Dies erstellt das Filesystem und weist eine UUID zu (UUID notieren).
Die notierten GUID und UUID habe ich mir mit einem P-Touch auf ein Label ausgedruckt und auf die Disk geklebt. Das ermöglicht im späteren Betrieb die Disk einwandfrei zu identifizieren.
Der Disk Identifier kann folgendermassen ermittelt werden
fdisk -l /dev/sda
Subvolumes einrichten
Btrfs unterstützt Subvolumes. Btrfs hat ein unabhängiges einhängbares Root-Verzeichnis für das Volume (Subvolume der obersten Ebene) und für jedes Subvolume. Ein Btrfs-Volume kann also mehr als einen einzelnen Dateibaum enthalten. Einen ganze Tree von Dateibäumen enthalten. Ein Btrfs-Subvolume kann man sich als POSIX-Dateinamensraum vorstellen.
Es ist zum empfehlen Subvolumes für voneinander unabhängige Datenablagen zu verwenden (z.B. Backup, Filme, Musik, etc.)
Als erstes hängen wir das Btrfs Root-Subvolume ein:
sudo mount /dev/sda1 /mnt
Ich erstelle für mich ein Subvolume, welches alle Multimedia-Daten beinhalten soll (Filme, Musik, Bücher, etc.):
btrfs subvolume create /mnt/@backup
Nun das Root-Subvolume wieder aushängen
sudo umount /dev/sda1
Jetzt kann man das erstellte Subvolume direkt in das Filesystem einhängen:
sudo mkdir /mnt/multimedia sudo vi /etc/fstab /dev/sda1 /mnt/multimedia btrfs defaults,nofail,noatime,compress=zstd,subvol=@multimedia 0 0
Dieser fstab Eintrag kann anschliessend über die CLI gemountet werden
sudo mount /mnt/multimedia
Komplette Rechte auf /mnt/multimedia setzen
chmod 0777 /mnt/multimedia
Auf diese Art und Weise kann man so viele Subvolumes erstellen wie man eben braucht.
Raid1
Bis jetzt haben wir nur eine HDD installiert. Nachdem das Filesystem angelegt ist funktioniert (an dieser Stelle habe ich auch bereits Samba eingerichtet und getestet), setzen wir die zweite Disk (nach einem shutdown und anschliessendem Neustart) ein und erstellen das Raid1.
Hinweis 1: An dieser Stelle habe ich festgestellt, dass ich die erste HDD in Slot2 des HC4 gesteckt habe. Der SATA-Slot, der sich näher am Stromanschluss/Netzwerkanschluss befindet ist offensichtlich Slot Nr. 2 – Nach dem Restart hat nämlich die zweite HDD /dev/sda zugewiesen bekommen und wodurch dann natürlich das vorhin erstellte Btrfs Filesystem nicht mehr verfügbar war. Nach einem erneuten Stopp, wechsel der Festplatten und Neustart war dieses Problem behoben.
Hinweis 2: Bei der Einrichtung von Raid1 habe ich mich gefragt, ob es denn möglich ist, den Raid-level je nach subvolume zu setzen. Das ist offenbar nicht möglich. Btrfs scheint dies als Feature offen zu haben, es ist aber offenbar seit fast 10 Jahren nichts mehr in diese Richtung gegangen. Also: Nein. 🙂
fdisk verrät mir, wie die neue Festplatte erkannt wurde:
sudo fdisk -l
In meinem Falle ist die neue HDD das Device /dev/sdb.
Nun wird für diese HDD (/dev/sdb) ebenfalls eine gpt-Partition und eine Partition über die gesamte Platte erstellt siehe hier.
Nun teilen wir btrfs mit, dass die neue Platte als Raid-1 Verbund zur ersten Platte verwendet werden soll. Dafür hängen wir alle gemounteten subvolumes erst aus.
sudo umount /mnt/<subvolumes>
Nun hängen wir die gesamte erste Festplatte ein
sudo mount /dev/sda1 /mnt
btrfs die neue Festplatte bekannt machen
sudo btrfs device add /dev/sdb1 /mnt
/dev/sdb in einen Raid1-Verbund aufnehmen. Erklärung:
- -mconvert= Option, ein neues Profil „raid1“ auf die Metadaten des Diskarrays anzuwenden
- -dconvert = Neues Profil „raid1“ auf die Nutzdaten des Diskarrays zu legen
# sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt # Done, had to relocate 5 out of 5 chunks
Damit wurde der Raid1 Verbund erstellt. Wenn die zweite HDD (wie bei mir zu Testzwecken) kleiner als die erste HDD ist, dann wird der Gesamtspeicherplatz neu maimal die Grösse der kleineren Festplatte betragen. Was bei mir auch so korrekt funktioniert hat.
Nun die ganze Festplatte wieder aushängen und die zuvor angelegten subvolumes einhängen (z.B. durch reboot, so dass die fstab Einträge geladen werden).
sudo umount /mnt sudo reboot
Test / weitere Befehle
Überblick über das Raid
# btrfs fi usage /mnt/<subvolume> Overall: Device size: 14.55TiB Device allocated: 10.06GiB Device unallocated: 14.54TiB Device missing: 0.00B Used: 4.51GiB Free (estimated): 7.27TiB (min: 7.27TiB) Free (statfs, df): 7.27TiB Data ratio: 2.00 Metadata ratio: 2.00 Global reserve: 6.11MiB (used: 0.00B) Multiple profiles: no Data,RAID1: Size:3.00GiB, Used:2.25GiB (74.92%) /dev/sda1 3.00GiB /dev/sdb1 3.00GiB Metadata,RAID1: Size:2.00GiB, Used:8.55MiB (0.42%) /dev/sda1 2.00GiB /dev/sdb1 2.00GiB System,RAID1: Size:32.00MiB, Used:16.00KiB (0.05%) /dev/sda1 32.00MiB /dev/sdb1 32.00MiB Unallocated: /dev/sda1 7.27TiB /dev/sdb1 7.27TiB
Prüfen der Devices
sudo btrfs fi show /mnt/<subvolume> Label: none uuid: 0edb47d3-ea4a-4667-b609-223212ec41b1 Total devices 2 FS bytes used 2.26GiB devid 1 size 7.28TiB used 5.03GiB path /dev/sda1 devid 2 size 7.28TiB used 5.03GiB path /dev/sdb1
Raid 1 – Festplattenwechel
Es ist eine Frage der Zeit, bis eine Festplatte den Geist aufgeben wird. Da wir ein Raid1 haben, sollte dies kein grossen Problem darstellen. Ob das aber funktioniert, muss getestet werden.
Das Vorgehen
- System herunterfahren
- Defekte HDD entfernen und stattdessen neue HDD in den Slot stecken.
Als Simulation ersetzte ich die zweite (kleinere) HDD nun mit einer neuen gleichgrossen HDD (8TB) - System hochfahren.
Nach dem reboot wurden die subvolumes, wie erwartet, nicht mehr gemountet. Ich habe aber auch nirgends einen Hinweis erhalten, dass es ein Problem mit BTRFS gibt (auch nicht in dmesg). An dieser Stelle kann man über fdisk die Devices identifizieren.sudo fdisk -l
Anhand der auf der HDD gekenntzeichneten GUID stelle ich fest, dass die noch funktionierende HDD als /dev/sda und die neue als /dev/sdb erkannt wurde.
- RAID im degraded mode mounten.
Damit die noch funktionierende Festplatte eingehängt werden kann, muss das Raid mit der Option -o degraded eingehängt werdensudo mkdir /mnt/temp sudo mount -o degraded /dev/sda1 /mnt/temp
Nun kann überprüft werden, welche Festplatte fehlt (in diesem Falle ID2):
# sudo btrfs device usage /mnt/temp /dev/sda1, ID: 1 Device size: 7.28TiB Device slack: 3.50KiB Data,RAID1: 3.00GiB Metadata,RAID1: 1.00GiB System,RAID1: 32.00MiB Unallocated: 7.27TiB missing, ID: 2 Device size: 0.00B Device slack: 0.00B Data,RAID1: 3.00GiB Metadata,RAID1: 1.00GiB System,RAID1: 32.00MiB Unallocated: 1.81TiB
- Die neue Festplatte partitionieren
Die neue Festplatte (hier /dev/sdb) muss nun wie her beschrieben partitioniert werden. - RAID wiederherstellen (`btrfs replace`).
Nun kann die neue Festtplatte in den Raid1 Verbund aufgenommen werden. Hier wird das vermisste Device mit der ID 2, welches sich an /dev/sdb1 in das Raid1, welches an /mnt/temp eingebunden wurde, aufgenommen (siehe auch btrfs Doku).sudo btrfs replace start 2 /dev/sdb1 /mnt/temp
Der replace-Prozess wird im Hintergrund durchgeführt. Das kann einige Stunden dauern. Der Status des replace kann folgendermassen abgerufen werden
sudo btrfs replace status /mnt/temp/
Sobald der replace-Prozess beendet wurde (zu überprüfen mit status) kann die neue disk angezeigt werden:
# sudo btrfs device usage /mnt/temp /dev/sda1, ID: 1 Device size: 7.28TiB Device slack: 3.50KiB Data,single: 3.00GiB Data,RAID1: 3.00GiB Metadata,single: 2.00GiB Metadata,RAID1: 1.00GiB System,single: 64.00MiB System,RAID1: 32.00MiB Unallocated: 7.27TiB /dev/sdb1, ID: 2 Device size: 7.28TiB Device slack: 5.46TiB Data,RAID1: 3.00GiB Metadata,RAID1: 1.00GiB System,RAID1: 32.00MiB Unallocated: 1.81TiB
- Jetzt die Redundaz wieder herstellen
# sudo btrfs balance start -dconvert=raid1,soft -mconvert=raid1,soft /mnt/temp # Done, had to relocate 7 out of 12 chunks
- System rebooten
Nach dem reboot ist das Raid1 mit der neuen Festplatte wieder hergestellt und alle subvolumes sollten wieder korrekt gemountet sein.
Raid1 vergrössern
Die alte Festplatte hatte in meinem Falle eine Grössen von 2TB, die neue Festplatte hat eine Grösse von 8TB. Damit habe ich 2x 8TB verbaut. Das Raid1 hat aber zu diesem Zeitpunkt immer noch die Grösse der früheren kleineren Festplatte. Wir müssen also nun noch die Grösse des Raids auf den maximal verfügbaren Speicher anheben. Dies geschieht über den resize Befehl:
Dazu muss das Raid wieder als gesamtes unter /mnt/temp gemountet werden und alle subvolumes ausgehängt sein.
sudo umount /mnt/<subvolumes> sudo mount /dev/sda1 /mnt/temp
Hier müssen wir nun Device ID 2 auf deren maximal verfügbare Grösse vergrössern
# sudo btrfs filesystem resize 2:max /mnt/temp Resize device id 2 (/dev/sdb1) from 1.82TiB to max
Nun zeigt btrfs device usage auch für das Device 2 die korrekte Grössen an (unallocated):
#sudo btrfs device usage /mnt/temp /dev/sda1, ID: 1 Device size: 7.28TiB Device slack: 3.50KiB Data,RAID1: 3.00GiB Metadata,RAID1: 2.00GiB System,RAID1: 32.00MiB Unallocated: 7.27TiB /dev/sdb1, ID: 2 Device size: 7.28TiB Device slack: 3.50KiB Data,RAID1: 3.00GiB Metadata,RAID1: 2.00GiB System,RAID1: 32.00MiB Unallocated: 7.27TiB
Damit stehen nun die gesamten 8TB als Raid zur Verfügung.
Über diesen Prozess kann übrigens das Raid durch neuere grössere Festplatten ersetzt werden. Der HC4 unterstütz bis zu 12 TB grosse Festplatten. Es besteht also noch Luft nach oben 🙂
Btrfs Wartung
Damit das Btrfs-Filesystem gut „in Schuss“ bleibt, ist es notwendig etwas in die Wartung dessen zu investieren. Wartungsaufgaben können mit dieser Script-Sammlung automatisiert werden (Scrubben, Ausbalancieren, Trimmen oder Defragmentieren).
Installation btrfsmaintenance
sudo apt-get update sudo apt-get install btrfsmaintenance
Dies installiert btrfsmaintenance
- Skripte unter /usr/share/btrfsmaintenance
- Konfig-File unter /etc/default/btrfsmaintenance
Anpassen Konfig-File
sudo vi /etc/default/btrfsmaintenance => Setze auto um alle btfrs subvolumes abzudecken. BTRFS_BALANCE_MOUNTPOINTS="auto" BTRFS_SCRUB_MOUNTPOINTS="auto"
Installieren der cron-job Skripte.
sudo /usr/share/btrfsmaintenance/btrfsmaintenance-refresh-cron.sh Refresh script btrfs-scrub.sh for monthly Refresh script btrfs-defrag.sh for none Refresh script btrfs-balance.sh for weekly Refresh script btrfs-trim.sh for none
Samba
Damit das NAS Files im Netzwerk bereitstellen kann, benötigt es natürlich den entsprechenden Dienst. Mit Armbian könnten wir hier natürlich aus den vollen schöpfen. Aber ich begnüge mich mit Samba:
sudo apt-get install samba
Die einzelnen subvolumes sollen mittles Samba im Netzwerk verfügbar gemacht werden. Pro Subvolume muss entsprechend ein Linux-User erstellt werden, der sich aber nicht am System selber anmelden kann:
sudo useradd -s /bin/false multimedia sudo smbpasswd -a multimedia
Gruppe erstellen und user multimedia zuweisen
sudo groupadd multimedia sudo usermod -a -G multimedia multimedia
Nun die Samba Konfiguration durchführen
sudo mv /etc/samba/smb.conf /etc/samba/smb.orig sudo vi /etc/samba/smb.conf
Inhalt
[global] workgroup = WORKGROUP server string = %h server (Samba, HC4_NAS) security = user map to guest = never [multimedia] path = /mnt/multimedia public = yes writable = yes comment = hc4 nas: multimedia share printable = no guest ok = no force group = multimedia valid users = multimedia create mask = 0660 directory mask = 0770
Nun Samba Dienste neu starten. Anschliessend steht das Sama-Share ‚multimedia‘ zur Verfügung:
sudo systemctl restart smbd.service sudo systemctl restart nmbd.service
Das Share kann nun z.B. unter Ubuntu in Dateibrowser mit
smb://<ip>/multimedia/
unter Verwendung des Users ‚multimedia‘ & Passwort verbunden werden.
FTP Server
HC4 soll auch einen FTP Server bereitstellen. Ich installier dafür PureFTPd. Die Installation habe ich hier bereits einmal beschrieben.
Video-Überwachung
Für die Video Überwachung setzte ich Shinoi ein. Die Installation wird hier beschrieben.
Bibliotheksverwaltung für eReader
Für die Bibliotheksverwaltung setze ich Calibre ein. Hier wird die Installation beschrieben.
Fazit
Wenig überraschend lassen sich alle Services eines Standard-NAS nachbauen.
Daten-Transfer Performance
Das Kopieren von sehr grossen Files (20 à ca. 10GB) oder auch gleichzeitig vielen kleineren Files ( 300 à 10MB) ergeben eine Durchschnittsgeschwindigkeit von 55-57MB/s. Damit befinden wir uns in dem, für die eingesetzten HDDs, erwarteten Rahmen. Hardkernel verspricht beim Einsatz von SSDs Werte von bis zu 100MB/s. Wer das notwendige Budget hat => go4it 😉
Festplattenwechsel
Ein Festplattenwechsel hat ohne Probleme und ohne Datenverlust funktioniert.
Performance allgemein
Die Performance des HC4 reicht für die von mir eingesetzten Services locker aus. Für die Video-Überwachung habe ich 4 Neztwerk-Kameras installiert, welche alle durchwegs im recording Modus laufen, also Daueraufnahmen machen und gleichzeitig den Stream auch noch an diverse Clients weiterleiten. Trotzdem läuft der HC4 ziemlich unbeeindruckt auf rund 5-10% CPU und ca 20% RAM-Auslastung. Die Temperaturen belaufen sich auf rund 55°C (CPU) und 45°C (Storage).
Systemd Startreihenfolge der Services
Nach einigen Monaten Laufzeit ist aufgefallen, dass das System öfters nach einem Reboot nicht mehr korrekt funktioniert hat. Zum einen musste ich die korrektur des „Reboot Issues“ wieder durchführen. Diese Anpassung ging wohl nach einem apt-get upgrade verloren.
Das andere Problem war dass das Mounten der btrfs Verzeichnisse teilweise länger dauerte, als das starten der systemd Services. Das führte zur unschönen Situation, dass das System nach einem Reboot im Status “degraded” hängen blieb, weil benötigte Verzeichnisse noch nicht gemountet waren. Hier habe ich beschrieben, wie ich diese Problematik gelöst habe.
Links
- https://gnulinux.ch/serie-nas-mit-odroid-hc4-teil-1-basis
- https://gnulinux.ch/nas-mit-odroid-hc4-nachlese
- https://forum.odroid.com/viewtopic.php?f=201&t=44315
- https://blog.bmarwell.de/2017/10/30/zwei-festplatten-in-einem-btrfs-raid1-zusammenfuehren.html
- https://github.com/kdave/btrfsmaintenance
- https://wiki.debianforum.de/Btrfs#btrfsmaintenance
Influxdb V2 Löschen von bestimmten Einträgen
Die Standard-Syntax von Influxdb V2 ist „Flux“. Um mit Flux bestimmte Einträge aus einem measurement (Tabelle) zu entfernen, muss man den Timestamp verwenden:
- Login auf Influx Host als root=> influx kann nun mit „influx <statement>“ angesprochen werden.
- Löschen von allen Einträgen aus
- dem Bucket iobroker
- Tabelle javascript.0.Solarpower.Huawei.Meter.ReverseActiveEnergy
- vom 7.2.2024 19:00 und 7.2.2024 19:15
influx delete --bucket iobroker --start 2024-02-07T19:00:00.000Z --stop 2024-02-07T19:15:00.000Z --predicate '_measurement="javascript.0.Solarpower.Huawei.Meter.ReverseActiveEnergy"'
Um sicherzustellen, dass auch die richtigen Einträge erwischt werden, bitte zuerst über den Data Exlorer die Daten anzeigen lassen:
from(bucket: "iobroker")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "javascript.0.Solarpower.Huawei.Meter.ReverseActiveEnergy")
|> filter(fn: (r) => r["_field"] == "value")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
Huawei Sun2000 Wechselrichter mit Telegraf und Grafana
Seit einigen Tagen werkelt bei mir eine PV-Anlage:
- 2 Wechselrichter SUN2000-10KTL-M1
- Bietet ein eigenes WLAN Netz (zwecks Konfiguration des Wechselrichters)
- Einen Dongle (SDongleA) auf dem Master Wechselrichter für FusionSolar App
- Bietet sowohl ein WLAN Adapter sowie
- direkter LAN-Anschluss
- Beides über DHCP
Ziel
Die Werte werden soweit ok auf das FusionSolar Portal von Huawei. Aber ich möchte gerne alle Werte direkt lokal beziehen und auf Grafana darstellen. Hier logge ich meine Erfahrungen und irgendwann hoffentlich auch eine Erfolgsmeldungen.
Good to know
- Der Wechselrichter selber erstellt ein eigenes WLAN zwecks Konfiguration des Geräts.
- Der Dongle am Wechselrichter ermöglicht es auf ein vorhandenes WLAN zu verbinden oder ein Netzwerkkabel auf einen Router anzuschliessen. Hauptziel dieses Dongels ist es wohl, die Daten auf FusionApp bzw. in die Cloud zu bringen. Der Dongle selber bietet auch die Möglichkeit Daten per „Modbus TCP“ abzufragen. Diese Schnittstelle ist aber sehr unausgereift. Erste Tests mit Telegraf (modbus plugin) haben gezeigt, dass regelmässige Abfragen (z.B. alle 5s) nicht gehen (i/o timeout). Grund dafür ist wahrscheinlich, dass nach der Modubs-Anmeldung 2s gewartet werden muss, bis die erste Register-Abfrage durchgeführt werden kann (eine Huawei Eigenheit). Ich gehe aktuell davon aus, dass Telegraf damit (wenig überraschend) nicht umgehen kann.
- Die Daten können auch per Modbus TCP am Wechselrichter selber abgefragt werden, sofern man sich mit dem WLAN des Wechselrichters verbunden hat.
Modbus TCP vs Huawei
Man könnte meinen, dass Huawei etwas auf „Kriegsfuss“ mit Modbus TCP ist. Regelmässige Abfragen mit Standard Modbus-Clients (z.B. Telegraf oder ioBroker Modbus) schlagen die meiste Zeit fehl. Hier wird davon berichtet, dass die Modbus-Ansteuerung vom Huawei Sun2000 Wechselrichter über TCP etwas speziell sei. Nach dem öffnen des TCP-Ports muss offenbar noch eine 2s Pause eingehalten werden, da sonst keine Daten zurück geliefert werden. Auch wird nicht jede Modbus-TCP-Anfrage mit den angeforderten Registern beantwortet. Huawei melden in diesem Falle „Slave device busy (retry request again later)“.
Modbus auf Wechselrichter aktivieren
Damit der Wechselrichter mit Modubs TCP kommuniziert, muss dies erstmal aktiviert werden. Das geht einerseits über die FusionSolar App (Menupunkt „ich>Inbetriebnahme des Geräts“). Hier einfach das Gerät auswählen. Anschliessend wird versucht auf das Gerät zuzugreifen. Auch wenn da steht „Inbetriebnahme des Geräts“ wird einfach nur das „Konfigurations-App“ gestartet. Ich vermute mal, dass in der FusionSolar App die App Sun2000 integriert ist. Also keine Angst haben, dass da ein zusätzliches Gerät in Betrieb genommen wird.
Die andere Variante ist, wie erwähnt, die Sun2000 App. Diese ermöglicht ebenfalls die Verbindung mit dem Wechselrichter-WLAN.
Beide Apps sind über den Huawei App Store erhältlich. Ich habe es leider nicht auf anderen Wegen geschafft die APKs zu beziehen. => Also Appstore Installieren, App beziehen und Appstore (hoffentlich für immer) wieder deinstallieren.
Wichtig:
Der Wechselrichter muss mindestens über Firmware Version V200R001C00SPC115 verfügen. Falls nicht, muss die Firmware aktualisiert werden. Das geht über die FusionSolar App. Hierfür braucht es aber explizit einen Installer-Account. Wenn ihr diesen nicht habt, muss dies der Installateur nachholen.
Wenn man über den Wechselrichter modbus verwendet, benötigt man den Port 6607 anstelle von 502!
DD-WRT
Routing von Port 6607 von 192.168.3.3 nach 192.168.200.1 („WAN“ Adresse des Routers nach Wechselrichter)
Routing auf dd-wrt um die IP-Adresse aus 192.168.3/24 als 192.168.200.2 (ip Adresse des WLAN-Clients) aussehen zu lassen
root@DD-WRT:~# iptables -I PREROUTING -t nat -p tcp -d 192.168.3.3 --dport 6607 -j DNAT --to-destination 192.168.200.1:6607 root@DD-WRT:~# iptables -I POSTROUTING -t nat -d 192.168.200.1 -s 192.168.3/24 -p tcp --dport 6607 -j SNAT --to 192.168.200.2
Damit sollte anschliessend ein Telnet Test aus dem 192.168.3./24 Netz nach 192.168.200.1 (Port 6607) erfolgreich sein:
telnet 192.168.3.3 6607
Damit diese Regeln auch nach Reboot überleben, kann man sie auf dd-wrt Command-Shell GUI (Administration – Commands) eintragen und Speichern. Danach sollten die Regeln auch nach einem Reboot aktiv sein.
Modbus auf SDongleA aktivieren
Auf die gleiche Art und Weise soll auch Modbus TCP auf dem Dongle aktiviert werden. Den Dongle kann man sowohl per WLAN als auch per LAN-Kabel anschliessen. Ich habe beide Varianten (versuchsweise) installiert. Der Dongle kann sowohl WLAN als auch LAN gleichzeitig betreiben.
Wenn der Dongle sich mit dem Heimnetz verbunden hat, war es für mich anschliessend aber nicht mehr möglich, das Dongle-Eigene WLAN zu sehen. Der Dongle scheint das eigene WLAN abzuschalten, sobald man sich per LAN verbindet.
Wichtige Attribute PV Anlage
| Kennzahlen | Bezeichnung | Modubs Register |
| Netzbezug (-) / Netzeinspeisung (+) | Der jeweils letzte Wert aus Huawei.Meter.ActivePower (W) | Meter.ActivePower 37113 (W) |
| PV – Aktuelle Produktion | Addition von – Huawei.Inverter.1.InputPower (kW), letzter Wert + – Huawei.Inverter.2.InputPower (kW), letzter Wert | Inverter.x.InputPower 32064 (kW) |
| Aktuelle Hauslast / Verbrauch Haus | Derived.HouseConsumption (W), letzter Wert Berechnet aus: (Huawei.Inverter.1.ActivePower (kW) * 1000 + Huawei.Inverter.2.ActivePower (kW) * 1000) – Huawei.Meter.ActivePower | Inverter.x.ActivePower 32080 (kW) Meter.ActivePower 37113 (W) |
| Aktuelle Leistung pro Inverter | Huawei.Inverter.x.ActivePower (kW) | Inverter.x.ActivePower 32080 (kW) |
| Produktion / PV Produktion pro Inverter | Huawei.Inverter.x.AccumulatedEnergyYield (kWh) | Huawei.Inverter.x.AccumulatedEnergyYield 32106 (kWh) |
| Netzeinspeisung | Huawei.Meter.PositiveActiveEnergy | Huawei.Meter.PositiveActiveEnergy 37119 (kWh) |
| Eigenverbrauch aus PV | Tagessummen aus Huawei.Inverter.x.AccumulatedEnergyYield – Tagessumme aus Huawei.Meter.PositiveActiveEnergy | Huawei.Inverter.x.AccumulatedEnergyYield 32106 (kWh) Huawei.Meter.PositiveActiveEnergy 37119 (kWh) |
| Eigenverbrauch aus PV in % | 100 * Eigenverbrauch aus PV / Produktion | |
| Netzeinspeisung in & | 100 * Heutige Netzeinspeisung / Produktion | |
| Netzbezug (akkumuliert) | Huawei.Meter.ReverseActiveEnergy (kWh) | 37121 (kWh) |
| Direktverbrauch aus PV | Tagessummen aus Huawei.Inverter.x.DailyEnergyYield – Tagessumme aus Huawei.Meter.PositiveActiveEnergy | Inverter.x.DailyEnergyYield 32114 (kWh) Huawei.Meter.PositiveActiveEnergy 37119 (kWh) |
| Verbrauch aus Netz in % | EigenverbrauchAusPV: Produktion PV: Tagessummen aus Huawei.Inverter.x.AccumulatedEnergyYield (kWh) – Netzeinspeisung Huawei.Meter.PositiveActiveEnergy Gesamtverbrauch: EigenverbrauchAusPV + Netzbezug Huawei.Meter.ReverseActiveEnergy) 100 * Gesamtverbrauch / EigenverbrauchAusPV | |
| Verbrauch aus PV in % (Autarkiegrad) | ||
| PV-Erzeugung | Active Power Inverter + Battery Power | |
| Aktueller PV-Ertrag Das was aktuell vom Dach kommt: | Input Power | 32064 |
| Aktuelle Leistung vom „Dach“ in Watt | Inverter.Input_Power | |
| PV-Gesamtertrag | Accumulated energy yield | 32106 |
| PV-Tagesertrag | Daily energy yield | 32114 |
| PV Tagesverbrauch – Wieviel kWh wurden heute direkt aus der PV Produktion bezogen (Autarkie) | Inverter.[1,2].DailyEnergyYield – GridExportToday | |
| PV Gesamteigenverbrauch / Direktverbrauch aus PV | Accumulated energy yield – abzüglich Gesamtexport ins Netz (Positive active electricity) | 32106 – 37119 |
| Heutiger Netzbezug | Solarpower.Derived.GridImportToday | |
| Netzbezug/Einspeisung Bezug oder Einspeisung vom/zum Versorger in Watt. Positive Werte = Bezug, negative Werte = Einspeisung | Meter.Active_Power | 37113 |
| Aktuelle Einspeisung des Inverters in das Hausnetz. Also die aktuelle „Leistung“ des Hauses in Watt Addition aus PV Erzeugung und ggf. Batterie-Entladung | Inverter.Active_Power | |
| Hauslast aktuell | Active Power Inverter – Meter.Active_Power | 32080 – 37113 |
| Gesamtexport ins Netz (verkauft) | Positive active energy | 37119 (kWh) |
| Gesamtimport aus dem Netz (gekauft) | Reverse Active Energy | 37121 (kWh) |
| Gesamtverbrauch Strom | PV-Gesamtertrag + Gesamtexport ins Netz + 37121 Reverse active Power (Ges.import aus Netz) | |
| PV1_Voltage und PV1_Current: | Aktuelle Spannung und Strom von String, U * I = P, somit ergibt sich daraus, wieviel Leistung der String aktuell liefert in Watt | |
| Akku-Ladestand: | Energy storage | 37004 |
| Akku-Ladung des Tages | current day charge capacity | 37015 |
| Akku-Entladung des Tages | current day discharge capacity | 37017 |
| Aktuelle Leistung an der Batterie in Watt, negative Zahlen = Batterie wird entladen, positive Zahlen = Batterie wird geladen | Battery_Power | |
| Ladezustand in % | Battery_SOC | |
Links
- https://skyboo.net/2022/02/huawei-sun2000-why-using-a-usb-dongle-for-monitoring-is-not-a-good-idea/
- https://skyboo.net/2021/07/how-to-connect-to-sun2000-from-dd-wrt/
- https://skyboo.net/2021/06/huawei-sun2000-monitoring/
- https://skyboo.net/2021/09/how-to-do-a-firmware-upgrade-using-fusionsolar/
- Huawei Modbus TCP Guide
- ioBroker Sun2000 mit Node-Red
- ioBroker Sun2000 mit Node-Red (Read and Write)
- ioBroker Sun2000 über JS & Github-Repo of Script
- Übersicht Terminologie
- Modbus Interface Definition (SDongleA)
- Modbus Interface Definition (Wechselrichter)
- Telegraf Konfiguration für 33KTL-A
- https://community.home-assistant.io/t/integration-solar-inverter-huawei-2000l/132350/2713
- https://github.com/wlcrs/huawei_solar/wiki/Connecting-to-the-inverter
- https://support.huawei.com/enterprise/en/doc/EDOC1100136173/8aa1f88a/resetting-password
- Youtube Resetting Password
- youtube Creating Account
- InverterDeviceStatus Map
- FusionSolar App Download / Download
HC2 Armbian und Logitech Media Server / OS auf HD
Hier beschreibe ich, wie man eine HC2 mit Armbian installiert und einem Logitech Media Server darauf betreibt.
HC2 Armbian Image & Installation HD
Die Installation von Armbian ist eigentlich „outofthebox“. Da die HC2 aber über eine SD Karte verfügt und die Lebensdauer entsprechend beschränkt ist, ist es von Vorteil, die in der HC2 eingebaute Disk als OS-Disk zu verwenden. Man kann leider die HC2 nicht über die HD Vollkommen boot-fähig machen. Fast nicht. Ich beschreibe hier, wie ich das gelöst habe:
Image / SD
- Download (Focal-Image) & Installation: https://www.armbian.com/odroid-xu4/
- SSH Standard Login: root Password: 1234
- Starte das Dienstprogramm armbian-config und
- gehe in den Bereich System -> DTB und
- wähle die optimierte Kartenkonfiguration für Odroid HC1. Die gleiche Konfiguration gilt auch für HC2 und MC1.
Disc / HD
- Erstelle auf der HD zwei Partitionen. Eine für das Betriebssystem (40G) und eine für die Daten (Rest)
- HD identifizieren
sudo fdisk -l
- Partitionen erstellen
sudo fdisk /dev/sda d= delete partition n= create partition w=write partition
- recheck
sudo fdisk -l
- Erstelle Formatierung
sudo mkfs.ext4 -L os /dev/sda1 sudo mkfs.ext4 -L data /dev/sda2
- Erstelle Mount-Verzeichnisse
sudo mkdir /osFiles sudo mkdir /mnt/files
- /etc/fstab anpassen: Mount Patitionen
#Mounts /dev/sda1 /osFiles ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1 /dev/sda2 /mnt/files ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1
- Reboot
- Files auf neue OS-Partition (/osFiles) kopieren.
Achtung: Alle Services (wie den logitechmediaserver) vorher beenden
sudo rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/osFiles"} / /osFiles
- SDA uuid (UUID) herausfinden:
sudo blkid /dev/sda1: LABEL="os" UUID="975a0396-5016-42b3-a66e-fe5276a36797" TYPE="ext4" PARTUUID="262deb28-e8fe-5d4d-b3a4-808b44571e85"
- Im boot.ini die neue UUID setzen bzw. ersetzen:
sudo vi /boot/boot.ini . setenv rootdev "UUID=975a0396-5016-42b3-a66e-fe5276a36797" .
- reboot.
- Wenn alles geklappt hat, sollte neu von sda1 gebootet werden. Check:
mount | grep '/ '
- sollte folgendes ausgeben
/dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro,commit=600,data=ordered)
- Über armbian-config können neue U-boot Versionen eingespielt werden. Diese müssen weiterhin auf die SD-Karte gespiehlt werden. Deswegen soll das /boot Verzeichnis weiterhin auf die SD-Karte zeigen:
- Microsd karte wieder einbinden.
- erstelle /mnt/microsd:
sudo mkdir /mnt/microsd
- fstab erweitern
-
Editiere /etc/fstab, und füge hinzu:
/dev/mmcblk0p1 /mnt/microsd auto defaults 0 0 /mnt/microsd/boot /boot none defaults,bind 0 0
- Mount durchführen und prüfen ob korrekt gemountet wird
sudo mount /mnt/microsd && sudo mount /boot
- Wenn Check:
mount | grep '/boot '
- sollte folgendes ausgeben
/dev/mmcblk0p1 on /boot type ext4 (rw,relatime)
- Wenn alles ok ist
sudo reboot
Damit läuft das System nun (grösstenteils 😉 ) auf der HD anstelle der SD. Das entlastet die SD enorm und führt zu einem längeren Leben der SD Karte.
lame installieren:
sudo apt-get install lame
ffmpeg installieren:
sudo apt-get install ffmpeg
RAM-Logging deaktivieren
Armbian installiert out-of-the-box ein RAM-Logging. Dabei wird 50MB Diskplatz als RAM verwendet und nach /var/log gemounted. Für kleine Systeme kann das Sinn machen. Ich verwende hier aber eine 2TB SSD und benötige damit keine RAM-Disk. Insbesondere, weil es immer mal wieder zu Problemen kam, welche in einem System-Freeze endeten. Dabei wurde die RAM-Disk bis 100% gefüllt was dann letzten Endes in einen System-Freeze mündete. Hier wird beschreiben, wie man diese RAM-Disk deaktiviert.
LMS Installation
LMS Download-Link: https://forums.slimdevices.com/showthread.php?98711-Logitech-Media-Server-Versions
Damit der LMS auf dem Armbian Focal läuft, müssen die Perl-Pakete selber kompiliert werden:
cd ~ sudo apt install nasm make gcc rsync patch g++ libc-bin zlib1g-dev libgd-dev libmodule-install-perl git clone https://github.com/Logitech/slimserver-vendor.git cd slimserver-vendor/CPAN/ ./buildme.sh
Jetzt LMS downloaden und installieren
cd ~ wget http://downloads.slimdevices.com/nightly/8.1/lms/c9adb5f63e54ec0d72e6266e75fb73989f4be345/logitechmediaserver_8.1.2~1614990085_arm.deb sudo apt install ./logitechmediaserver_8.1.2~1614990085_arm.deb
Den LMS stoppen, da er noch nicht läuft. siehe
tail -f /var/log/squeezeboxserver/server.log
sudo service logitechmediaserver stop
Nun die compilierten Perl-Binaries nach LMS kopieren:
sudo cp -r ~/slimserver-vendor/CPAN/build/arch/5.30/arm-linux-gnueabihf-thread-multi-64int /usr/share/squeezeboxserver/CPAN/arch/5.30/
Und den Logitech Media Server wieder starten
sudo service logitechmediaserver start
Das wars. Damit rennt der LMS auf einer HC2. Brower starten und link aufrufen:
http://ip-adresse:9000
Deezer-Plugin / Titel stoppen rund 50s vor Ende
Beim Einsatz des Deezer-Plugins ergab sich das Problem, dass die Songs rund 50s vor Ende des Titels stoppten und die Wiedergabe zum nächsten Titel spang. Dies kann behoben werden, indem beim LMS die AAC/AAC Wiedergabe deaktiviert wird:
Siehe auch: https://github.com/Logitech/slimserver/issues/130#issuecomment-1212912369
ZRAM – Speicher erhöhen
Bei einem System mit wenig RAM-Speicher kann es Sinn machen, den zram Speicher zu erhöhen (siehe https://forum.armbian.com/topic/5565-zram-vs-swap/page/2/#comment-61082)
sudo vi /etc/default/armbian-zram-confi
# configuration values for the armbian-zram-config service # # enable the armbian-zram-config service? ENABLED=true # Zram swap enabled by default, unless set to disabled # SWAP=false # percentage of zram used as swap compared to physically available DRAM. # Huge overcommitment (300) is possible and sometimes desirable. See # https://forum.armbian.com/topic/5565-zram-vs-swap/?do=findComment&comment=61082 # and don't forget to adjust $MEM_LIMIT_PERCENTAGE below too. # ZRAM_PERCENTAGE=50 ZRAM_PERCENTAGE=300 # percentage of DRAM available to zram. If this amount is exceeded the zram # devices used for swap simply behave as if the device is full. You need to # adjust/increase this value only if you want to work with massive memory # overcommitment (ZRAM_PERCENTAGE exceeding 150 for example) # MEM_LIMIT_PERCENTAGE=50 MEM_LIMIT_PERCENTAGE=300 # create how many zram devices max for swap # ZRAM_MAX_DEVICES=4 # Which algorithm for zram based swapping. Seems lzo is best choice on ARM: # https://forum.armbian.com/topic/8161-swap-on-sbc/?do=findComment&comment=61668 # SWAP_ALGORITHM=lzo # Which algorithm to choose for zram based ramlog partition # RAMLOG_ALGORITHM=zstd # Which algorithm to choose for zram based /tmp # TMP_ALGORITHM=zstd # Size for zram based /tmp, total memory / 2 by default # TMP_SIZE=500M # If defined a separate partition will be used as zram backing device. Be CAREFUL # which partition you assign and read starting from CONFIG_ZRAM_WRITEBACK in # https://www.kernel.org/doc/Documentation/blockdev/zram.txt # ZRAM_BACKING_DEV=/dev/nvme0n2
Links
- https://www.nexus0.net/pub/documents/LMS/lms-build/
- https://www.hardkernel.com/shop/odroid-hc2-home-cloud-two/
- Tutorial: https://www.reddit.com/r/ODroid/comments/7zwkrt/tutorial_how_to_boot_linux_from_an_ssdhdd_on_the/
- https://forum.odroid.com/viewtopic.php?t=23925
- Installation aus den Sourcen (Perl und LMS): https://www.nexus0.net/pub/documents/LMS/lms-build/
- https://forums.slimdevices.com/showthread.php?114165-Installation-LMS-8-1-2-auf-einem-HC2-mit-armbian
MySQL Verbindungen mit SSL verschlüsseln – Ubuntu 14.04 / 18.04 / Mysql 5.6.28
Hier wird erklärt, wie ein MySQL Client eine verschlüsselte Verbindung zu einem MySQL Server, der mit Ubuntu 14.04 und Mysql-Server 5.6.28 betrieben wird, aufgebaut werden kann.
SSL Zertifikate erstellen
Es werden Zertifikate mit 2048 Bits und einer Gültigkeit von 3650 Tagen erstellt. Nach diesem Zeitraum müssen die Zertifikate verlängert oder neu erstellt werden.
Bitte nicht vergessen, dass der Common Name (CN) vom Client und Server Zertifikat unterschiedlich ist. z.B. servername.intelli.ch und client.intelli.ch
cd /etc/mysql/
# Generate a CA key and certificate with SHA1 digest openssl genrsa 2048 > ca-key.pem openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem # Create server key and certficate with SHA1 digest, sign it and convert # the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem openssl rsa -in server-key.pem -out server-key.pem # Create client key and certificate with SHA digest, sign it and convert # the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem openssl rsa -in client-key.pem -out client-key.pem
chmod 400 /etc/mysql/*.pem chown mysql /etc/mysql/*.pem
SSL Konfiguration aktivieren
In der MySQL Konfiguration (/etc/mysql/my.cnf) muss SSL mit den zugehörigen Zertifikaten aktiviert werden.
ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
Nun MySql-Server neu starten
sudo service mysql restart
Es kann auf der DB überprüft werden, ob die Konfiguration richtig übernommen wurde:
mysql > show variables like '%ssl%'; +---------------+----------------------------------+ | Variable_name | Value | +---------------+----------------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mysql/ca-cert.pem | | ssl_capath | | | ssl_cert | /etc/mysql/server-cert.pem | | ssl_cipher | | | ssl_key | /etc/mysql/server-key.pem | +---------------+----------------------------------+
SSL Verschlüsselung für MySQL User aktivieren
Es gibt folgende Möglichkeiten bei der Rechtevergabe für Benutzer in Bezug auf SSL:
- REQUIRE X509: ein beliebiges gültiges SSL Client Zertifikat kann verwendet werden
- REQUIRE ISSUER / REQUIRE SUBJECT: ein beliebiges gültiges SSL Client Zertifikat reicht nicht aus, es muss von einer mit ISSUER spezifizierten CA kommen und/oder ein bestimmtes SUBJECT enthalten.
- REQUIRE SSL: die Verbindung muss über SSL verschlüsselt aufgebaut werden, die Authenfizierung kann sowohl via Passwort als auch über ein SSL Client Zertifikat erfolgen.
Im Folgenden Beispiel wird der User „ssluser“ erstellt der alle Rechte (ALL PRIVILEGES) auf alle Datenbanken (*.*) am „localhost“ hat und ein gültiges SSL Client Zertifikat vorweisen muss.
GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'topsecret' REQUIRE X509;
Client SSL erzwingen
grant all privileges on database.* to 'username'@'hostaddress' identified by 'password' require SSL; oder GRANT USAGE ON *.* TO 'ralph'@'%' REQUIRE SSL;
Verschlüsselte MySQL Verbindung testen
cd /etc/mysql/ mysql -ussluser -p -h127.0.0.1 --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
Hint: Auf Ubuntu 18.04 schlug dieser Befehl mit dem Feher „SSL connection error: SSL_CTX_set_default_verify_paths failed“ fehl. Das liegt daran, weil der lokale User mit dem dieser mysql-Befehl ausgeführt wird, keine Berechtigung auf die Zertifikate hat. Um den Test trotzdem machen zu können, kann der Befehl mit sudo ausgeführt werden.
Die SSL Keys müssen wenn der Zugriff von einem entfernten Host aus erfolgen soll natürlich vorher dorthin kopiert werden.
Mittels dem Befehl SHOW STATUS LIKE 'Ssl_cipher'; kann sich der Verschlüsselungsstatus des verbundenen MySQL Clients angezeigt werden lassen.
mysql > SHOW STATUS LIKE 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES256-SHA | +---------------+--------------------+ 1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Ssl_version'; +---------------+---------+ | Variable_name | Value | +---------------+---------+ | Ssl_version | TLSv1.1 | +---------------+---------+ 1 row in set (0.01 sec)
Überprüfe alle Server-Connections
Es kann auch überprüft werden ob ALLE Verbindungen zum Mysql-Server auch wirklich mit SSL Connecten.
Mit folgendem Befehl kann überprüft werden ob und welche User mit SSL mit dem Mysql-Server kommunizieren:
SELECT sbt.variable_value AS tls_version, t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host FROM performance_schema.status_by_thread AS sbt JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher' ORDER BY tls_version;
Links
- Bei diesem Beitrag handelt es sich um eine Erweiterung des Beitrags von Christoph Mitasch. Siehe auch https://www.thomas-krenn.com/de/wiki/MySQL_Verbindungen_mit_SSL_verschl%C3%BCsseln
- https://www.howtoforge.com/tutorial/how-to-enable-ssl-and-remote-connections-for-mysql-on-centos-7/
- https://www.percona.com/blog/2016/02/23/mysql-connection-using-ssl-or-not/