Wie schon angekündigt hat mein letzter Raspberry mit meiner Zigbee-Steuerung seine SD-Karte zerlegt – was ja immer ein Damoklesschwert über dem Kopf eines jeden ist, der die kleinen PCs mit SD-Karte betreibt und dort auch Datenbanken o.ä. drauf laufen lässt.

Da die PIs ab Version 3 aber auch endlich (ordentlich) aus dem Netzwerk booten können, habe ich mich entschieden nach und nach allen PIs die SD-Karte weg zu nehmen und nur noch über das Netzwerk zu arbeiten. Hier ist die kleine Anleitung dazu:

Verwendet wurden:
– QNAP NAS
– Raspberry PI 3 B V1.2

Vorbereitung DHCP Server

  • Damit der PI aus dem Netzwerk booten kann habe ich meinen DHCP Server so konfiguriert, das er immer die gleiche IP vergibt
  • Außerdem habe ich noch folgende DHCP Optionen gesetzt:
  • “Vendor encapsulated options” = Raspberry Pi Boot
  • “TFTP Servername” = 192.168.x.y (das ist die IP vom NAS)
  • “Bootfile Name” = bootcode.bin

Vorbereitung Raspberry Pi

  • Wie üblich mit dem Raspberry Pi Imager eine (neue) SD-Karte beschrieben und das Betriebssystem “Raspberry Pi OS Lite” installiert (ohne grafische Oberfläche)
  • Dann das System hochgefahren und die grundlegende Installation abgeschlossen (raspi-config, usw.)
  • Damit der Pi über das Netzwerk booten kann, muss ein Eintrag in der /boot/config.txt geändert werden (ganz am Ende)
nano /boot/config.txt
program_usb_boot_mode=1
  • Anschließend den PI neu starten und die Zeile wieder entfernen. Die Einstellung bleibt dauerhaft erhalten.
  • Der Erfolg kann nach dem Neustart wie folgt überprüft werden
vcgencmd otp_dump | grep 17
Ergebniss: 17:3020000a

Einrichtung QNAP NAS

  • Als erstes habe ich die Freigabe “Public” per NFS freigegeben. Hier soll später das Root-Dateisystem liegen und auch die Dateien für den Bootvorgang werde ich hier ablegen. Dazu muss der NFS-Dienst ggf. vorher in der Systemsteuerung aktiviert werden.
  • Gastzugang per Samba/Windows wird für “Public” deaktiviert, bzw. auf “kein Zugriff” gestellt
  • Auf der Public-Freigabe erstellle ich einen Ordner “pxeboot”
  • In dem Ordner “pxeboot” erstelle ich dann pro Raspberry einen weiteren Unterordner. Hier z.b. “zigbee”
  • Und in dem Ordner “zigbee” erzeuge ich dann noch einen Ordner “boot”
  • Außerdem brauche ich für den Netzwerkboot noch einen TFTP Server, der auf den QNAP-NAS wie folgt konfiguriert wird
  • Nun starte ich den Pi einmal ohne die SD-Karte neu und schaue in die Log-Datei “Public\pxeroot\opentftpd.log”. Dort steht jetzt drin welche Dateien gefunden/nicht gefunden wurden. Bei der Datei “start.elf” ist auch ein Unterordner zu sehen, der die Seriennummer des PIs darstellt. Diese merke ich mir, denn ich muss im nächsten Schritt einen passenden Symlink anlegen
  • Darum melde ich mich auf der Console des NAS per SSH an und mittels “ln -s /share/Public/pxeroot/zigbee/boot /share/Public/pxeroot/<seriennummer>” erzeuge ich einen Symlink mit der passenden Seriennummer, der in das boot-Verzeichniss des entsprechenden PIs zeigt

Kopieren der Daten

  • Zunächst melde ich mich am Pi an und mounte die NFS-Freigabe. Anschließend kopiere die gesamte Root-Partition auf die NFS-Freigabe
sudo mount.nfs 192.168.X.Y:/Public/pxeroot/zigbee /mnt
sudo rsync -xa --exclude /mnt / /mnt/
  • Nachdem der Kopiervorgang abgeschlossen ist (kann etwas dauern) müssen noch ein paar Dateien angepasst werden.
  • Zunächst “nano /mnt/etc/fstab”. Es wird alles entfernt außer “proc” und die vier tmpfs sowie das NFS-Root werden hinzugefügt
proc /proc proc defaults 0 0
192.168.X.Y:/Public/pxeroot/zigbee	/ 	nfs 	defaults 	0 	0
tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0
tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0
  • Dann fahre ich den Pi herunter und lege die SD-Karte in meinen PC ein (da wo ich diese auch beschrieben habe). Ich kopiere den ganzen Inhalt, also die ganzen .elf-Dateien, config.txt usw. in den Boot-Ordner auf der Netzwerkfreigabe
  • Die Datei “bootcode.bin” jedoch kopiere ich direkt in den Ordner “pxeroot”
  • Dann wird noch die “cmdline.txt” im Boot-Ordner angepasst:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.X.Y:/Public/pxeroot/zigbee rw vers=3 ip=dhcp rootfstype=nfs smsc95xx.turbo_mode=N elevator=deadline rootwait

Neustart des Raspberry Pi

Jetzt müsste der Pi ohne SD-Karte neu gestartet werden können. Er wird nach ca. 5 Sekunden vom Netzwerk booten und das System wird bis auf eine Fehlermeldung bzgl. der SWAP-Datei ganz normal hoch fahren.

Dann sind noch folgende, abschließende Arbeiten zu tun:

  • Deinstallieren von “dphys-swapfile” und erstellen und einbinden einer manuell erzeugten SWAP-Datei
sudo apt-get remove --purge dphys-swapfile
sudo rm /var/swap
sudo update-rc.d dphys-swapfile remove
 
sudo dd if=/dev/zero of=/var/swap bs=1M count=1024
sudo losetup /dev/loop0 /var/swap
sudo mkswap /dev/loop0
sudo swapon /dev/loop0

vi /etc/rc.local
echo "Swap einbinden"
sleep 3
losetup /dev/loop0 /var/swap
mkswap /dev/loop0
swapon /dev/loop0
  • Außerdem mache ich noch ein bischen Tuning
vi /etc/default/rcS
ASYNCMOUNTNFS=no 

vi /etc/sysctl.conf
vm.min_free_kbytes=12288
  • Dann noch ein abschließender Neustart und die Konfiguration ist abgeschlossen.

Wie schon oft beschrieben statte ich meinen Garten mit einer Ambiente-Beleuchtung auf Zigbee Basis aus.

Hier habe ich den Grillpavillon und die Teichbeleuchtung beschrieben.

In diesem Beitrag soll es nun um die automatische Steuerung gehen, denn das was die deCONZ App so kann, reicht mir leider nicht.

Da ich ja schon einen Rasperry für deCONZ in Betrieb habe, werde ich eine Webseite auf diesem laufen lassen und dann über REST-API mit deCONZ sprechen.

Ziel ist es, das ich “Animationen” abspielen kann. Also Farbübergänge, Helligkeitsübergänge, usw. Hatte hier ja schon mal ein Video gepostet. Es ist ja immerhin Ambiente-Licht. 🙂

Licht Animationen

Ich habe mich also hingesetzt und ein kleines PHP-Projekt mit Symfony geschrieben. Die Bedienung ist aufs Handy ausgelegt und aktuell ist die Funktion nur ganz simpel (und die Oberfläche ist noch nicht wirklich schön).

  • Es können mehrere “Szenen” erstellt werden
  • Innerhalb einer Szene können beliebige Lampen sein
  • Jede Lampe in einer Szene kann verschiedene “Aktionen” ausführen
  • Zwischen den Aktionen können beliebige Zeitintervalle vergehen
  • Am Ende einer Szene wird diese wiederholt, oder zur nächsten Szene gewechselt

Und dann kam wieder mal alles anders, als geplant

Denn der Raspberry, der die deCONZ App ausführt hat seine SD-Karte zerlegt, und damit ist die ganze Arbeit dahin.
Da ich nicht wieder auf SD-Karten setzen will, bringe ich jetzt allen PIs bei vom Netzwerk zu booten (genauer von meinem QNAP NAS) und setze dann die deCONZ App wieder auf.

Meine Steuersoftware werde ich dann übrigens nochmal komplett neu machen, und zwar als Blazor Projekt. Also komplett in C# – doch das ist ein anderer Beitrag…