Normale Ansicht

Fedora Asahi Remix installieren

29. Januar 2024 um 20:21

Der »Fedora Asahi Remix« ist eine für moderne Macs (Apple Silicon) optimierte Version von Fedora 39. Ich habe mich mit Asahi Linux ja schon vor rund zwei Jahren beschäftigt. Seither hat sich viel getan. Zeit also für einen neuen Versuch! Dieser Beitrag beschreibt die Installation des Fedora Asahi Remix auf einem Mac Mini mit M1-CPU. In einem zweiten Artikel fasse ich die Konfiguration und meine praktischen Erfahrungen zusammen.

Installationsstart

Die Projektseite von Asahi Linux empfiehlt, die Installation von Asahi Linux in einem Terminal wie folgt zu starten:

curl https://alx.sh | sh

Ich habe bei solchen Dingen immer etwas Bauchweh, zumal das Script sofort nach dem sudo-Passwort fragt. Was, wenn irgendjemand alx.sh gekapert hat und mir ein Script unterjubelt, das einen Trojaner installiert? Daher:

curl https://alx.sh -o alx.sh
less alx.sh
sh alx.sh 

Die Kontrolle hilft auch nur bedingt. Das Script ist nur wenige Zeilen lang und lädt alle erdenklichen weiteren Tools herunter. Aber der Code sieht zumindest so aus, als würde er tatsächlich Asahi Linux installieren, keine Malware. Eine echte Garantie, dass das alles gefahrlos ist, gibt auch less nicht. Nun gut …

Zuerst aufräumen

Auf meinem Mac fristet eine uralte Asahi-Installation schon seit Jahren ein Schattendasein. Ich wollte das neue Asahi Linux einfach darüber installieren — aber das Installationsprogramm bietet dazu keine Möglichkeit. Die richtige Vorgehensweise sieht so aus: Zuerst müssen die drei damals eingerichteten Partitionen gelöscht werden. Dann kann das Installationsprogramm den partitionsfreien Platz auf der SSD für eine Neuinstallation nutzen.

Dankenswerterweise hat Asahi-Chefentwickler Hector Martin auf einer eigenen Seite eine Menge Know-how zur macOS-Partitionierung zusammengefasst. Dort gibt es auch gleich ein Script, mit dem alte Asahi-Linux-Installationen entfernt werden können. Gesagt, getan!

curl -L https://github.com/AsahiLinux/asahi-installer/raw/main/tools/wipe-linux.sh -o wipe-linux.sh
less wipe-linux.sh
sh wipe-linux.sh

THIS SCRIPT IS DANGEROUS!
DO NOT BLINDLY RUN IT IF SOMEONE JUST SENT YOU HERE.
IT WILL INDISCRIMINATELY WIPE A BUNCH OF PARTITIONS
THAT MAY OR MAY NOT BE THE ONES YOU WANT TO WIPE.

You are much better off reading and understanding this guide:
https://github.com/AsahiLinux/docs/wiki/Partitioning-cheatsheet

Press enter twice if you really want to continue.
Press Control-C to exit.

Started APFS operation on disk1
Deleting APFS Container with all of its APFS Volumes
Unmounting Volumes
Unmounting Volume "Asahi Linux - Data" on disk1s1
Unmounting Volume "Asahi Linux" on disk1s2
Unmounting Volume "Preboot" on disk1s3
Unmounting Volume "Recovery" on disk1s4
Unmounting Volume "Update" on disk1s5
...

Bei meinem Test hat das Script exakt getan, was es soll. Ein kurzer Test mit diskutil zeigt, dass sich zwischen Partition 2 und 3 eine Lücke von rund 200 GiB befindet. Dort war vorher Asahi Linux, und dorthin soll das neue Asahi Linux wieder installiert werden.

Zurück an den Start

Nach diesen Vorbereitungsarbeiten (natürlich habe ich vorher auch ein Backup aller wichtiger Daten erstellt, eh klar …) habe ich den zweiten Versuch gestartet.

sh alx.sh 

Bootstrapping installer:
  Checking version...
  Version: v0.7.1
  Downloading...
  Extracting...
  Initializing...

The installer needs to run as root.
Please enter your sudo password if prompted.
Password:*******

Welcome to the Asahi Linux installer!

This installer will guide you through the process of setting up
Asahi Linux on your Mac.

Please make sure you are familiar with our documentation at:
  https://alx.sh/w

Press enter to continue.

Collecting system information...
  Product name: Mac mini (M1, 2020)
  SoC: Apple M1
  Device class: j274ap
  Product type: Macmini9,1
  Board ID: 0x22
  Chip ID: 0x8103
  System firmware: iBoot-10151.81.1
  Boot UUID: 284E...
  Boot VGID: 284E...
  Default boot VGID: 284E...
  Boot mode: macOS
  OS version: 14.3 (23D56)
  OS restore version: 23.4.56.0.0,0
  Main firmware version: 14.3 (23D56)
  No Fallback System Firmware / rOS
  SFR version: 23.4.56.0.0,0
  SystemRecovery version: 22.7.74.0.0,0 (13.5 22G74)
  Login user: kofler

Collecting partition information...
  System disk: disk0

Collecting OS information...

Nach der Darstellung einiger Infos ermittelt das Script eine Partitionstabelle und bietet dann an, Asahi Linux im freien Bereich der Disk zu installieren (Option f).

Partitions in system disk (disk0):
  1: APFS [Macintosh HD] (795.73 GB, 6 volumes)
    OS: [B*] [Macintosh HD] macOS v14.3 [disk3s1s1, 284E...]
  2: (free space: 198.93 GB)
  3: APFS (System Recovery) (5.37 GB, 2 volumes)
    OS: [  ] recoveryOS v14.3 [Primary recoveryOS]

  [B ] = Booted OS, [R ] = Booted recovery, [? ] = Unknown
  [ *] = Default boot volume

Using OS 'Macintosh HD' (disk3s1s1) for machine authentication.

Choose what to do:
  f: Install an OS into free space
  r: Resize an existing partition to make space for a new OS
  q: Quit without doing anything

» Action (f): f

Im nächsten Schritt haben Sie die Wahl zwischen verschiedenen Fedora-Varianten. Ich habe mich für Gnome entschieden:

Choose an OS to install:
  1: Fedora Asahi Remix 39 with KDE Plasma
  2: Fedora Asahi Remix 39 with GNOME
  3: Fedora Asahi Remix 39 Server
  4: Fedora Asahi Remix 39 Minimal
  5: UEFI environment only (m1n1 + U-Boot + ESP)

» OS: 2

Jetzt beginnt die eigentliche Installation. Leider haben Sie keine Möglichkeit, auf die Partitionierung oder Verschlüsselung Einfluss zu nehmen. Es werden zwei kleine Partitionen für /boot (500 MiB) und /boot/efi eingerichtet (1 GiB). Den restlichen Platz füllt ein btrfs-Dateisystem ohne Verschlüsselung. Immerhin können Sie bei Bedarf festlegen, dass nicht der gesamte partitionsfreie Platz von Fedora Asahi Linux genutzt wird.

Downloading OS package info...
- 

Minimum required space for this OS: 14.94 GB

Available free space: 198.93 GB

How much space should be allocated to the new OS?
  You can enter a size such as '1GB', a fraction such as '50%',
  the word 'min' for the smallest allowable size, or
  the word 'max' to use all available space.

» New OS size (max): max

The new OS will be allocated 198.93 GB of space,
leaving 167.94 KB of free space.

Enter a name for your OS
» OS name (Fedora Linux with GNOME):  <return>

Using macOS 13.5 for OS firmware
Downloading macOS OS package info...
Creating new stub macOS named Fedora Linux with GNOME
Installing stub macOS into disk0s5 (Fedora Linux with GNOME)
Preparing target volumes...
Checking volumes...
Beginning stub OS install...
Setting up System volume...
Setting up Data volume...
Setting up Preboot volume...
Setting up Recovery volume...
Wrapping up...

Stub OS installation complete.

Adding partition EFI (524.29 MB)...
  Formatting as FAT...
Adding partition Boot (1.07 GB)...
Adding partition Root (194.83 GB)...
Collecting firmware...
Installing OS...
  Copying from esp into disk0s4 partition...
  Copying firmware into disk0s4 partition...
  Extracting boot.img into disk0s7 partition...
  Extracting root.img into disk0s6 partition...
Downloading extra files...
  Downloading gstreamer1-plugin-openh264-1.22.1-1.fc39.aarch64.rpm (1/3)...
  Downloading mozilla-openh264-2.3.1-2.fc39.aarch64.rpm (2/3)...
  Downloading openh264-2.3.1-2.fc39.aarch64.rpm (3/3)...
Preparing to finish installation...
Collecting installer data... 

To continue the installation, you will need to enter your macOS
admin credentials.

Password for kofler: **********

Setting the new OS as the default boot volume...
Installation successful!
Install information:
  APFS VGID: 0E76...
  EFI PARTUUID: 8d47...

Help us improve Asahi Linux!
We'd love to know how many people are installing Asahi and on what
kind of hardware. Would you mind sending a one-time installation
report to us?

This will only report what kind of machine you have, the OS you're
installing, basic version info, and the rough install size.
No personally identifiable information (such as serial numbers,
specific partition sizes, etc.) is included. You can view the
exact data that will be sent.

Report your install?
  y: Yes
  n: No
  d: View the data that will be sent

» Choice (y/n/d): y

Your install has been counted. Thank you! ❤

Zuletzt zeigt das Installations-Script genaue Anweisungen für den ersten Start von Asahi Linux an:

To be able to boot your new OS, you will need to complete one more step.
Please read the following instructions carefully. Failure to do so
will leave your new installation in an unbootable state.

Press enter to continue.

When the system shuts down, follow these steps:

1. Wait 25 seconds for the system to fully shut down.
2. Press and hold down the power button to power on the system.
   * It is important that the system be fully powered off before this step,
     and that you press and hold down the button once, not multiple times.
     This is required to put the machine into the right mode.
3. Release it once you see 'Loading startup options...' or a spinner.
4. Wait for the volume list to appear.
5. Choose 'Fedora Linux with GNOME'.
6. You will briefly see a 'macOS Recovery' dialog.
   * If you are asked to 'Select a volume to recover',
     then choose your normal macOS volume and click Next.
     You may need to authenticate yourself with your macOS credentials.
7. Once the 'Asahi Linux installer' screen appears, follow the prompts.

If you end up in a bootloop or get a message telling you that macOS needs to
be reinstalled, that means you didn't follow the steps above properly.
Fully shut down your system without doing anything, and try again.
If in trouble, hold down the power button to boot, select macOS, run
this installer again, and choose the 'p' option to retry the process.

Press enter to shut down the system.

Ich habe den Installationsprozess auch in Screenshots dokumentiert:

Asahi-Linux, Teil 1

Asahi-Installation, Teil 2

Reboot

Das Script fährt nun macOS herunter. Zum Neustart drücken Sie die Power-Taste und halten diese ca. 15 Sekunden lang gedrückt, bis ein Auswahlmenü erscheint. Dort wählen Sie Asahi Linux. Dieses wird allerdings nicht gleich gestartet, vielmehr muss nun die Bootkonfiguration fertiggestellt werden. Ich habe die folgenden Schritte mit Fotos dokumentiert.

Fedora Linux auswählen
Bootloader Installation
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Meldungen beim ersten »echten« Linux-Bootprozess. »Failed to load« klingt schlimm, aber unmittelbar danach geht es zum Glück weiter.
Geschafft! Jetzt muss nur noch die Fedora-Installation abgeschlossen werden.

Fedora-Installation abschließen

Fedora Linux läuft zum ersten Mal. Nun müssen Sie einige grundlegende Konfigurationsschritte erledigen (User-Name + Passwort, WLAN, Sprache, Tastaturlayout, Update).

Wechseln zwischen macOS und Fedora

Der Bootprozess ist jetzt so eingerichtet, dass bei jedem Neustart automatisch Fedora gestartet wird. Wenn Sie macOS verwenden möchten, müssen Sie den Rechner zuerst komplett herunterfahren. Dann drücken Sie wieder die Power-Taste, halten Sie ca. 15 Sekunden gedrückt, bis das OS-Menü erscheint, und wählen macOS.

Unter macOS können Sie das Default-OS voreinstellen. Es ist aber leider nicht möglich, den Mac so zu konfigurieren, dass bei jedem Bootprozess automatisch das Auswahlmenü erscheint. Sie müssen sich für eine Hauptvariante entscheiden. Jeder Bootprozess in ein anderes OS bleibt mühsam (Power-Taste 15 Sekunden drücken …).

Default-OS einstellen

Geekbench

Wie schnell ist Linux im Vergleich zu macOS? Ich habe auf meinem Mac Mini M1 Geekbench 6 jeweils unter macOS und unter Fedora Asahi ausgeführt. Das Ergebnis: im Rahmen der Messgenauigkeit etwa gleich schnell.

               Single     Multi Core
---------- ----------   ------------
macOS            2360           8050
Fedora           2357           7998

Quellen/Links

GPIO Reloaded III: Kamera

18. Januar 2024 um 20:30

Das ist der dritte Teil einer Mini-Serie zur GPIO-Nutzung am Raspberry Pi 5:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Genau genommen hat die Kamera-Nutzung nicht unmittelbar etwas mit GPIOs zu tun. Allerdings ist für die Kommunikation mit der Kamera ebenfalls der neu im Pi 5 integrierte RP1-Chip verantwortlich. Der Chip ist der Grund, weswegen alte Kamera-Tools auf dem Raspberry Pi 5 nicht mehr funktionieren. Bevor Sie zu schimpfen beginnen: Der RP1 hat viele Vorteile. Unter anderem können Sie nun zwei Kameras gleichzeitig anschließen und nutzen und höhere Datenmengen übertragen (wichtig für Videos).

Beachten Sie, dass Sie beim Raspberry Pi 5 zum Kamera-Anschluss ein neues, schmaleres Kabel benötigen!

Kamera-Modul 3 mit neuem, FPC-kompatiblen Kabel
Kamera-Modul 3 mit einem neuen Anschlusskabel mit schmaler Kontaktleiste

Veraltet: raspistill, raspivid, picamera2

Im Terminal bzw. in Bash-Scripts funktionieren raspistill, raspivid usw. nicht mehr. Sie müssen stattdessen rpicam-still, rpicam-vid etc. einsetzen.

In Python-Scripts müssen Sie Abschied vom picamera-Modul nehmen. Stattdessen gibt es das vollkommen neue Modul Picamera2. Es bietet (viel) mehr Funktionen, ist aber in der Programmierung komplett inkompatibel. Vorhandene Scripts können nicht portiert werden, sondern müssen neu entwickelt werden.

Sowohl die rpicam-xxx-Kommandos als auch das Picamera2-Modul greifen auf die ebenfalls neue Bibliothek libcamera2 zurück.

Im einfachsten Anwendungsfall erzeugen Sie ein Picamera2-Objekt, machen mit der Methode start_and_capture_file ein Foto und speichern dieses in eine Datei. Dabei kommt die volle Auflösung der Kamera zur Anwendung, beim Camera Module 3 immerhin fast 4600×2600 Pixel.

#!/usr/bin/env python3
# Beispieldatei camera.py
from picamera2 import Picamera2
cam = Picamera2()
# ein Foto machen und speichern
cam.start_and_capture_file("test.jpg")

Anstelle von start_and_capture_file gibt es zwei weitere Methoden, um ebenso unkompliziert Bilderfolgen bzw. Videos aufzunehmen:

# 10 Bilder im Abstand von 0,5 Sekunden aufnehmen
# mit Dateinamen in der Form series-0003.jpg
cam.start_and_capture_files("series-{:0>4d}.jpg", 
                            num_files=10, 
                            delay=0.5)
# Video über 10 Sekunden aufnehmen (640x480 @ 30 Hz, H.264/AVC1)
cam.start_and_record_video("test.mp4", duration=10)

rpicam-xxx-Kommandos

Zum Test der Kamera sowie zur Aufnahme von Bildern und Videos stehen die folgenden neuen Kommandos zur Auswahl:

  • rpicam-hello: zeigt für fünf Sekunden der Preview-Fenster mit dem Bild der Kamera an
  • rpicam-jpeg: nimmt ein Foto auf und speichert es als JPEG-Datei
  • rpicam-still: nimmt ein Foto auf und speichert es (mehr Optionen als rpicam-jpeg, Optionen etwas kompatibler zu raspistill)
  • rpicam-vid: nimmt ein Video auf und speichert es oder gibt den Video-Stream an externe Tools (livav/ffmpeg) weiter
  • rpicam-raw: speichert RAW-Videomaterial in einer Datei

Die Kommandos sind mit all ihren Optionen großartig dokumentiert. Es gibt zwar keine man-Seiten, aber dafür liefern die Kommandos mit der Option -h eine lange Liste aller Optionen (z.B. rpicam-still -h). Ich beschränke mich hier auf einige einfache Anwendungsbeispiele.

# fünf Sekunden lang ein Vorschaufenster anzeigen, dann 
# ein Foto aufnehmen und speichern
rpicam-jpeg -o image.jpg

# ohne Vorschau, Aufnahme nach einer Sekunde (1000 ms)
rpicam-jpeg -n -t 1000 -o image.jpg

# wie oben, aber Debugging-Ausgaben nicht anzeigen
rpicam-jpeg -n -t 1000 -v 0 -o image.jpg 

# Bildgröße 1280x800
rpicam-jpeg --width 1280 --height 800 -o image.jpg

# heller/dunkler (EV Exposure Compensation)
rpicam-jpeg --ev 0.5  -o brighter.jpg
rpicam-jpeg --ev -0.5 -o darker.jpg

# erstellt ein 10 Sekunden langes Video (10.000 ms) 
# 640x480@30Hz, H264-Codec
rpicam-vid -t 10000 -o test.mp4

# wie vorher, aber höhere Auflösung
rpicam-vid --width 1024 --height 768 -t 10000 -o test.mp4

Falls Sie mehr als eine Kamera angeschlossen haben, können Sie diese mit rpicam-hello --list-cameras auflisten. Die bei einer Aufnahme gewünschte Kamera können Sie mit der Option rpicam-xxx --camera <n> festlegen.

picamera2-Modul für Python-Scripts

picamera2 ist ein relativ neues Python-Modul. Es ersetzt das früher gebräuchliche Modul picamera. Der Hauptvorteil von picamera2 besteht darin, dass das Modul zu aktuellen Raspberry-Pi-Modellen kompatibel ist. Beim Raspberry Pi 5 kommt picamera2 auch mit dem Fall zurecht, dass Sie zwei Kameras gleichzeitig an Ihren Minicomputer angeschlossen haben.

Eine umfassende Referenz aller Klassen und Methoden finden Sie in der exzellenten Dokumentation (nur im PDF-Format verfügbar), die allerdings weit mehr technische Details behandelt, als Sie jemals brauchen werden. Eine Menge Beispiel-Scripts finden Sie auf GitHub.

Mit create_still_configuration können Sie in diversen optionalen Parametern Einstellungen vornehmen. Das resultierende Konfigurationsobjekt übergeben Sie dann an die configure-Methode. Wichtig ist, dass Sie das Foto nicht mit start_and_capture_file aufnehmen, sondern dass Sie die Methoden start und capture_file getrennt ausführen. Die folgenden Zeilen zeigen, wie Sie ein Bild in einer Auflösung von 1024×768 Pixel aufnehmen. Die sleep-Aufforderung verbessert die Qualität des Bilds. Sie gibt der Kamera-Software etwas Zeit, um die Aufnahme zu fokussieren und richtig zu belichten.

#!/usr/bin/env python3
from picamera2 import Picamera2, Preview
import time

# ein Foto in reduzierter Auflösung aufnehmen
cam = Picamera2()
myconfig = cam.create_still_configuration(
  main={"size": (1024, 768)} )
cam.configure(myconfig)
cam.start()
time.sleep(0.5)
cam.capture_file("1024x768.jpg")

Mit Transformationen können Sie das aufgenommene Bild vertikal und horizontal spiegeln. Falls Sie die Kamerakonfiguration während der Ausführung eines Scripts ändern möchten, müssen Sie die Kamera vorher stoppen und danach neu starten.

# (Fortsetzung des obigen Listings)
cam.stop()
from libcamera import Transform
mytrans = Transform(hflip=True)
myconfig = cam.create_still_configuration(
  main={"size": (1024, 768)},
  transform=mytrans)  
cam.configure(myconfig)
cam.start()
time.sleep(0.5)
cam.capture_file("1024x768-hflip.jpg")

Massive Video-Probleme

Bei der Aufnahme von Videos haben Sie die Wahl zwischen drei Encodern, die die aufgenommenen Bilder in Video-Dateien umzuwandeln:

  • H264Encoder (Hardware-Encoder für H.264, kommt per Default zum Einsatz, max. 1080p@30 Hz)
  • MJPEGEncoder (Hardware-Encoder für Motion JPEG = MJPEG)
  • JpegEncoder (Software-Encoder für MJPEG)

Hardware-Encoding steht nur auf dem Raspberry Pi 4 (H.264 und MJPEG) und dem Raspberry Pi 5 (nur H.264) zur Verfügung. Beim Raspberry Pi 5 läuft der MJPEGEncoder also per Software.

Das folgenden Script soll ein Video im Format 720p aufnehmen und gleichzeitig ein Vorschaubild anzeigen. Dabei soll der H.264-Codec eingesetzt werden.

#!/usr/bin/env python3
from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder, Quality
import time
cam = Picamera2()
myconfig = cam.create_video_configuration(
    main={"size": (1280, 720)})        # Auflösung 720p
myencoder = H264Encoder()
cam.configure(myconfig)
cam.start_preview(Preview.QTGL)
time.sleep(0.5)
cam.start_recording(myencoder, 
                    "test-720p.mp4", 
                    quality=Quality.MEDIUM)
time.sleep(10)
cam.stop_recording()
cam.stop_preview()

Das Script zeigt zwar keine Fehlermeldungen an, allerdings lässt sich die Video-Datei nicht abspielen, weder mit VLC am Raspberry Pi noch mit anderen Video-Playern auf anderen Rechnern. Ich habe tagelang mit den Video-Funktionen von Picamera2 experimentiert, aber die resultierenden Videos waren meist schwarz oder enthielten nur ein Bild, das am Beginn der Aufnahme entstanden ist. Auch die auf der folgenden Seite gesammelten Beispiel-Scripts zum Video-Recording funktionierten bei meinen Tests entweder gar nicht oder nur mit Einschränkungen:

https://github.com/raspberrypi/picamera2/tree/main/examples

Fazit: Die Video-Funktionen von Picamera2 sind aktuell (Anfang 2024) ebenso ambitioniert wie unausgereift. Es ist zu hoffen, dass neue Versionen von libcamera und Picamera2 und eine bessere Dokumentation der Grundfunktionen in Zukunft Abhilfe schaffen. Was nützen coole Spezial-Features, wenn es schon bei den einfachsten Grundfunktionen Probleme gibt?

Quellen/Links

Anteil erneuerbarer Energien bei der Stromerzeugung stark gestiegen

09. Januar 2024 um 19:54

Wärmepumpen sind ökologisch umso sinnvoller, je größer der Anteil erneuerbarer Energie bei der Stromerzeugung ist. In unserem Wärmepumpenbuch gibt es eine Tabelle mit Zahlen von 2021/2022. In den letzten Tagen wurden aktualisierte Zahlen für das vergangene Jahr 2023 veröffentlicht — und die sind sehr erfreulich!

Anteil erneuerbarer Energien an der Stromerzeugung

Quellen/Links

Anmerkung: Es gibt unterschiedliche Zahlen für den Anteil der erneuerbaren Energien (EE) am Strom, je nachdem, ob der Anteil relativ zur Erzeugung oder zur Nutzung des Stroms berechnet wird, ob Import/Export aus dem bzw. in das Ausland mit berücksichtigt wird und ob die betriebseigene Stromerzeugung durch eigene Kraftwerke in Bergbau, Industrie und Zugverkehr miteinberechnet wird oder nicht (dieser Strom zählt nicht zum offiziellen »Strommix«). Außerdem versorgen sich immer mehr Betriebe und Haushalte zumindest stundenweise selbst mit PV-Strom. Diese Strommengen können nicht genau erfasst werden, was eine korrekte Berechnung noch schwieriger macht. Dementsprechend variiert der EE-Anteil je nach Berechnungsmethode und Quelle ein wenig (ein bis zwei Prozent auf oder ab).

Für die Schweiz habe ich noch keine 2023er-Zahlen gefunden.

GPIO Reloaded II: Bash

06. Januar 2024 um 16:42

Das ist der zweite Teil einer Mini-Serie zur GPIO-Nutzung am Raspberry Pi 5:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Zu den wichtigsten Neuerungen beim Raspberry Pi 5 zählt nicht nur der viel schnellere SoC (System-on-a-Chip), sondern auch ein eigener I/O-Controller, der als eigener Chip realisiert ist (RP1). Dieser I/O-Chip bringt mit sich, dass etablierte Mechanismen zur GPIO-Steuerung nicht mehr funktionieren. Besonders stark betroffen sind Kommandos, die im Terminal oder in Bash-Scripts aufgerufen werden.

Veraltet: WiringPi, »gpio«, »raspi-gpio« und »pigpiod/pigs«

Im Verlauf eines Jahrzehnts haben sich diverse Kommandos etabliert, die mittlerweile veraltet sind. Dazu zählt das Kommando gpio aus dem WiringPi-Projekt, das bereits 2019 eingestellt wurde. Ebenfalls verabschieden müssen Sie sich von dessen Nachfolger-Kommando raspi-gpio: Das Kommando ist nicht mit dem neuen I/O-Chip RP1 kompatibel. Glücklicherweise lässt sich das Kommando relativ einfach durch pinctrl ersetzen.

Deutlich ärgerlicher ist, dass auch der beliebte Dämon pigpiod und das dazugehörende Kommando pigs der Kompatibilität zu RP1 zum Opfer gefallen ist. Absurderweise kann der Dienst Anfang 2024 im Raspberry-Pi-Konfigurationsprogramm als GPIO-Fernzugriff scheinbar weiterhin aktiviert werden.

Der »GPIO-Fernzugriff« kann scheinbar weiterhin aktiviert werden. Er ist aber inkompatibel zum Pi 5!

journalctl -u pigpiod beweist aber, dass der Dienst nicht funktioniert:

journalctl -u pigpiod

systemd[1]: Starting pigpiod.service - Daemon required to control GPIO pins via pigpio...
systemd[1]: Started pigpiod.service - Daemon required to control GPIO pins via pigpio.
pigpiod[88161]: 2023-12-29 11:02:24 gpioHardwareRevision: unknown rev code (d04170)
pigpiod[88161]: 2023-12-29 11:02:24 initCheckPermitted:
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: |Sorry, this system does not appear to be a raspberry pi. |
pigpiod[88161]: |aborting.                                                |
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: Can't initialise pigpio library
systemd[1]: pigpiod.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: pigpiod.service: Failed with result 'exit-code'.

Das Problem ist bekannt, aber es sieht nicht so aus, als könnte es behoben werden: https://github.com/joan2937/pigpio/issues/589

gpioget und gpioset

Welche Kommandos funktionieren dann noch? Sie haben die Wahl zwischen den gpioxxx-Kommandos aus dem Paket gpiod sowie pinctrl (siehe den folgenden Abschnitt). Das Paket gpiod ist standardmäßig installiert. Die darin enthaltenen Kommandos nutzen zur Kommunikation mit dem Kernel die Device-Dateien /dev/gpiochip<n> und die Bibliothek libgpiod2.

Der größte Nachteil der Kommandos gpioget, gpioset usw. besteht darin, dass Sie als ersten Parameter die GPIO-Chip-Nummer angeben müssen. Diese variiert je nach Raspberry-Pi-Modell. Bei den Modellen der Serie 1 bis 4 müssen Sie die Nummer 0 angeben, ab Modell 5 die Nummer 4.

# LED ein- und ausschalten, die über den GPIO 7 gesteuert wird
# (= Pin 26 des J8-Headers)

# gpioset auf dem Raspberry Pi 5
gpioset 4 7=1; sleep 3; gpioset 4 7=0

# gpioset auf dem Raspberry Pi 1 bis 4
gpioset 0 7=1; sleep 3; gpioset 0 7=0

Warum variiert die GPIO-Chip-Nummer? Weil beim Raspberry Pi 4 die Kernel-Schnittstelle /dev/gpiochip0 für die GPIO-Steuerung verantwortlich ist (das sind in den BCM 2711 integrierte Funktionen), beim Pi 5 aber der RP1 (ein externer Chip) mit der Kernel-Schnittstelle /dev/gpiochip4. Informationen darüber, welche GPIO-Schnittstellen es gibt und welche GPIO-Funktion wie »verdrahtet« ist, geben die Kommandos gpiodetect und gpioinfo. Die folgenden Ausgaben gelten für den Raspberry Pi 5:

gpiodetect  

  gpiochip0 [gpio-brcmstb@107d508500] (32 lines)
  gpiochip1 [gpio-brcmstb@107d508520] ( 4 lines)
  gpiochip2 [gpio-brcmstb@107d517c00] (17 lines)
  gpiochip3 [gpio-brcmstb@107d517c20] ( 6 lines)
  gpiochip4 [pinctrl-rp1]             (54 lines)


gpioinfo    

  gpiochip0 - 32 lines:
    line   0:   "-"              unused   input  active-high 
    line   1:   "2712_BOOT_CS_N" "spi10 CS0" output active-low
    line   2:   "2712_BOOT_MISO" unused   input active-high 
    ...
  gpiochip1 - 4 lines:
    line   0: "WIFI_SDIO_D0"     unused   input active-high 
    line   1: "WIFI_SDIO_D1"     unused   input active-high 
    ...
  gpiochip2 - 17 lines:
    line   0: "RP1_SDA"          unused   input  active-high 
    line   1: "RP1_SCL"          unused   input  active-high 
    line   2: "RP1_RUN" "RP1 RUN pin"     output active-high 
    ...
  gpiochip3 - 6 lines:
    line   0: "HDMI0_SCL"        unused   input  active-high 
    line   1: "HDMI0_SDA"        unused   input  active-high 
    ...
  gpiochip4 - 54 lines:
    line   0: "ID_SD"            unused   input  active-high 
    line   1: "ID_SC"            unused   input  active-high 
    line   2: "PIN3"             unused   input  active-high 
    line   3: "PIN5"             unused   input  active-high 
    line   4: "PIN7"        "onewire@0"   output active-high
    line   5: "PIN29"       "onewire@0"   output active-low
    line   6: "PIN31"            unused   input  active-high 
    line   7: "PIN26"            unused   input  active-high 
    line   8: "PIN24"            unused   input  active-high 
    line   9: "PIN21"            unused   input  active-high 
    line  10: "PIN19"            unused   input  active-high 
    ...
    line  28: "PCIE_RP1_WAKE"    unused   input  active-high 
    line  29: "FAN_TACH"         unused   input  active-high 
    line  30: "HOST_SDA"         unused   input  active-high 
    line  31: "HOST_SCL"         unused   input  active-high 
    line  32: "ETH_RST_N"   "phy-reset"  output  active-low 
    ...

Um Scripts zu programmieren, die universell funktionieren, können Sie die folgenden Zeilen in den Code einbauen:

# chip=4 für RPi5, chip=0 für ältere Modelle
if gpiodetect | grep -q "pinctrl-rp"; then
  chip=4
else
  chip=0
fi

In der einfachsten Form schalten Sie mit gpioset einen GPIO-Ausgang auf High oder Low. In den folgenden Beispielen bezieht sich der erste Parameter auf die gpiochip-Nummer. 7 gibt die GPIO-Nummer in BCM-Nomenklatur an, 1 oder 0 den gewünschten Zustand:

gpioset $chip 7=1   # GPIO 7 (Pin 26) auf High stellen
gpioset $chip 7=0   # GPIO 7 (Pin 26) auf Low stellen

Sie können auch mehrere Ausgänge auf einmal steuern (hier GPIO 7, 8 und 25):

gpioset $chip 7=0 8=1 25=0 

Durch diverse Optionen können Sie weitere Funktionen steuern (siehe auch man gpioset):

  • --bias=as-is|disable|pull-down|pull-up aktiviert die internen Pull-up- oder Pull-down-Widerstände.
  • --mode=exit|wait|time|signal gibt an, wie lange das Kommando laufen soll. Standardmäßig gilt exit, das Kommando wird also sofort beendet. Mit wait wartet das Programm, bis der Benutzer [Return] drückt. Bei der Einstellung time können Sie mit --sec=<n> oder --usec=<n> die gewünschte Wartezeit einstellen. signal bedeutet, dass das Programm weiterläuft, bis es mit [Strg]+[C] beendet wird.

  • --background führt das Kommando als Hintergrunddienst weiter.

gpioget funktioniert analog zu gpioset: Sie übergeben im ersten Parameter die gpiochip-Nummer (in aller Regel 0), im zweiten Parameter die BCM-Nummer des GPIOs, dessen Input Sie auswerten wollen. Das Ergebnis des Kommandos lautet 0 oder 1, je nachdem, welchen Zustand der Eingang hat.

gpioget $chip 9   # Zustand von GPIO 9 (Pin 21) auslesen
0

pinctrl

Auch mit pinctrl aus dem Paket raspi-utils können Sie GPIO-Funktionen steuern. Der Vorteil von pinctrl besteht darin, dass das Kommando zur Zeit mit allen Raspberry-Pi-Modellen kompatibel ist. Eine Fallunterscheidung, ob das Script auf einem alten oder neuen Modell mit RP1-Chip läuft, entfällt. Außerdem ist das Kommando syntaktisch weitestgehend zu raspi-gpio kompatibel.

Gegen den Einsatz des Kommandos spricht der Umstand, dass das Kommando laut pinctrl -h (der einzigen mir bekannten Dokumentation) nur für Debugging-Zwecke gedacht ist.

Die folgende Aufzählung fasst die wichtigsten Anwendungen des Kommandos zusammen:

  • pinctrl get [gpionr] ermittelt den aktuellen Status aller GPIOs bzw. des angegebenen GPIOs.
  • pinctrl funcs [gpionr] ermittelt, welche alternativen Funktionen der angegebene GPIO bzw. alle GPIOs erfüllen können.

  • pinctrl set gpionr options verändert den Status des angegeben GPIOs. Mögliche Optionen sind:

    • ip = Input
    • op = Output
    • dl = Zustand Low (Drive Low)
    • dh = Zustand High (Drive High)
    • pu = Pull-up-Widerstand aktiv
    • pd = Pull-down-Widerstand aktiv
    • pn = keine Pull-up/down-Funktion
    • a0 bis a7 = alternative Funktion n aktivieren
    • no = Deaktivieren (no function)

Soweit sich sinnvolle Kombinationen ergeben, dürfen mehrere der obigen Optionen auf einmal übergeben werden, jeweils getrennt durch Leerzeichen. Welche alternative Funktionen ein GPIO unterstützt und wie sie nummeriert sind, geht aus pinctrl funcs hervor.

Das folgende Kommando ermittelt, welche Funktionen der GPIO mit der BCM-Nummer 23 unterstützt. Auf dem Raspberry Pi ist dieser GPIO mit Pin 16 des J8-Headers verbunden. GPIO23 kann diverse Funktionen übernehmen:

pinctrl funcs 23

  23, PIN16/GPIO23, SD0_CMD, DPI_D19, I2S0_SDO1, SCL3, 
  I2S1_SDO1, SYS_RIO023, PROC_RIO023, PIO23

Wenn Sie über Pin 26 (BCM-Nummer 07) eine Leuchtdiode angeschlossen haben, dann können Sie die LED wie folgt ein- und ausschalten:

pinctrl set 7 op dh   # LED an Pin 26 ein
pinctrl set 7 op dl   # LED an Pin 26 aus

Quellen/Links

GPIO Reloaded I: Python

29. Dezember 2023 um 19:30

Dieser Artikel ist der Auftakt einer Mini-Serie, die sich mit der Script-Programmierung des Raspberry Pi 5 beschäftigt. Geplant sind drei Artikel:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Hinter den Kulissen hat sich mit der Vorstellung des Raspberry Pi 5 mehr geändert, als es in den ersten Testberichten den Anschein hatte. Schuld daran ist der neue I/O-Chip RP1, der unter anderem für die Kommunikation mit der GPIO-Leiste und der Kamera zuständig ist. Der RP1 bringt natürlich viele Vorteile mit sich (u.a. die Möglichkeit, zwei Kameras anzuschließen und größere Bild- bzw. Videomengen zu verarbeiten); er führt aber auch dazu, dass über Jahre etablierte Module und Kommandos nicht mehr funktionieren. Ja, die Raspberry Pi Foundation hat vorgearbeitet und empfiehlt schon eine Weile alternative Werkzeuge. Aber aus Bequemlichkeit blieben viele Programmierer bei langjährig bewährten Tools. Damit ist jetzt Schluss. Wer den Pi 5 als Maker-Tool nutzen will, muss umlernen.

Wo ist das Problem?

In der Vergangenheit gab es mehrere GPIO-Kommuniktionsmechanismen, z.B. das Lesen/Schreiben von sysfs-Dateien (sys/class/gpio) bzw. das direkte Verändern von Speicherbereichen. Diese Verfahren haben schon in der Vergangenheit oft Probleme bereitet. Beim Raspberry Pi 5 funktionieren sie schlicht nicht mehr. Neue Verfahren verwenden die lgpio-Bibliothek, die wiederum auf eine neue Kernel-Schnittstelle zurückgreift. Diese ist nach außen hin durch die Device-Dateien /dev/gpiochip* sichtbar.

Aus Python-Sicht ist insbesondere das Modul rpi.gpio betroffen. Es ist inkompatibel zum Pi 5 und es gibt anscheinend auch keine Pläne, den Code RP1-kompatibel zu reorganisieren.

Welche Alternativen gibt es?

Schon seit einiger Zeit empfiehlt die Raspberry Pi Foundation, das gpiozero-Modul zu verwenden. Es stellt für den Einstieg gut geeignete Klassen wie LED oder Button zur Verfügung, eignet sich aber auch für anspruchsvollere Maker-Aufgaben.

Wenn Sie sich partout nicht mit gpiozero anfreunden wollen, gibt es drei Alternativen: lgpio, gpiod und rpi-lgpio.

gpiozero

Das Python-Modul gpiozero macht die Steuerung von Hardware-Komponenten durch GPIOs besonders einfach. Für häufig benötigte Hardware-Komponenten gibt es eigene Klassen. Dazu zählen unter anderem:

  • LED (Leuchtdiode ein-/ausschalten)
  • PWMLED (Helligkeit einer Leuchtdiode mit Software Pulse Width Modulation steuern)
  • RGBLED (dreifarbige LED, die über drei GPIO-Ausgänge gesteuert wird)
  • TrafficLights (Kombination aus einer roten, gelben und grünen Leuchtdiode)
  • MotionSensor (für PIR-Bewegungssensoren)
  • LightSensor (Lichtdetektor)
  • Button (Taster)
  • Buzzer (Summer)
  • Motor (zur Steuerung von zwei GPIOs für Vorwärts- und Rückwärts-Signale)
  • Robot (zur Steuerung mehrerer Motoren)
  • MCP3008 (für den gleichnamigen A/D-Converter)

Das Modul gpiozero ist umfassend dokumentiert:

https://gpiozero.readthedocs.io/en/latest

Ein Hello-World-Beispiel sieht so aus:

#!/usr/bin/env python3
from gpiozero import LED
import time
myled = LED(7)    # BCM-Nummer 7 = Pin 26 des J8-Headers
print("LED ein")
myled.on()
time.sleep(1)
print("LED aus und Programmende")
myled.off()

Dieses Script setzt voraus, dass Pin 26 der GPIO-Leiste (intern BCM/GPIO 7) über einen Vorwiderstand mit einer Leuchtdiode verbunden ist. Anstelle der GPIO-Nummer gibt es einige alternative Adressierungsverfahren, wobei Sie den gewünschente GPIO-Kontakt als Zeichenkette angeben:

# alternative, gleichwertige Schreibweisen
myled = LED(7)          # GPIO 7 = BCM-Nummer 7
myled = LED("GPIO7")    # GPIO 7 (Achtung, nicht "GPIO07")
myled = LED("BCM7")     # BCM 7  (nicht "BCM07")
myled = LED("BOARD26")  # Pin 26 auf der GPIO-Leiste des Boards
myled = LED("J8:26")    # Pin 26 des J8-Headers (= GPIO-Leiste)

lgpio

lgpio (der Projektname lautet noch kürzer lg) ist eine C-Bibliothek zur lokalen Steuerung der GPIOs. Das gerade erwähnte Modul gpiozero verwendet intern seit Version 2.0 die lgpio-Bibliothek. Alternativ stellt das gleichnamige lgpio-Modul eine direkte Python-Schnittstelle zur lgpio-Bibliothek her. Deren Funktionen sind Hardware-näher implementiert. Der GPIO-Zugriff verbirgt sich also nicht hinter Klassen wie LED oder Button, vielmehr werden die GPIO-Schnittstellen direkt angesprochen.

Ein Hello-World-Beispiel mit lgpio sieht so aus:

#!/usr/bin/env python3
import lgpio, time

# Zugriff auf /dev/gpiochip4 für RP1-Chip
handle = lgpio.gpiochip_open(4)

# Raspberry Pi 4 und früher:
# handle = lgpio.gpiochip_open(0)

# GPIO 7 = Pin 26 als Output verwenden
led = 7
lgpio.gpio_claim_output(handle, led)  

# LED zehnmal ein- und ausschalten
for i in range(10):
    print("LED ein")
    lgpio.gpio_write(handle, led, 1)
    time.sleep(1)
    print("LED aus")
    lgpio.gpio_write(handle, led, 0)
    time.sleep(1)

# nichts blockieren
lgpio.gpiochip_close(handle)

Beachten Sie, dass die Initialisierung des Handles für den GPIO-Zugriff je nach Modell variiert! Bei den älteren Raspberry-Pi-Modellen bis einschließlich 4B/400 müssen Sie handle = lgpio.gpiochip_open(0) ausführen. Beim Raspberry Pi 5 ist für die GPIO-Steuerung dagegen der neue RP1-Chip zuständig, den Sie mit gpiochip_open(4) ansprechen. (Die richtige Chip-Nummer stellen Sie am einfachsten mit dem Kommando gpioinfo aus dem Paket gpiod fest. Der hier benötigte Kontakt GPIO7 heißt in gpioinfo ein wenig verwirrend PIN7.)

Wenn Sie mit Python ein lgpio-Script schreiben wollen, das auf allen Pi-Modellen funktioniert, müssen Sie Code zur Erkennung des Pi-Modells integrieren.

Weiterer Codebeispiele finden Sie hier:

rpi-lgpio

Was tun, wenn Sie Code für ältere Modelle entwickelt haben, den Sie nun für den Raspberry Pi 5 portieren möchten? Am schnellsten wird dies oft mit dem neuen Modul rpi-lgpio gelingen, das weitgehende Kompatibilität zu rpi.gpio verspricht.

Vor der Installation müssen Sie das in Raspberry Pi OS standardmäßig installierte Modul rpi.gpio installieren. Eine Parallelinstallation beider Module ist ausgeschlossen, weil rpi.gpio und rpi-lgpio den gleichen Modulnamen verwenden (import RPi.GPIO).

sudo apt remove python3-rpi.gpio

Da es in Raspberry Pi OS für rpi-lgpio kein fertiges Paket, installieren Sie dieses am einfachsten mit pip. Da es kein passendes Systempaket gibt, sind keine Konflikte zu erwarten. Wenn Sie die Option --break-system-packages dennoch vermeiden möchten, müssen Sie eine virtuelle Python-Umgebung einrichten.

pip install --break-system-packages rpi-lgpio

Das obige pip-Kommando installiert das Modul lokal, also nur für Ihren Account. Wenn Sie Ihr Script in einem anderen Account ausführen möchten (z.B. als Cron-Job), stellen Sie dem Kommando sudo voran und installieren so rpi-lgpio systemweit.

Nach diesen Vorbereitungsarbeiten sollten viele Ihre alten Scripts ohne Änderungen laufen. Einige Sonderfälle sind hier dokumentiert:

https://rpi-lgpio.readthedocs.io/en/release-0.4/differences.html

Die folgenden Zeilen zeigen einmal mehr eine Schleife zum Ein- und Ausschalten einer Leuchtdiode:

#!/usr/bin/env python3
# Das Script setzt voraus, dass vorher 
# rpi-lgpio installiert wurde!
import RPi.GPIO as gpio
import time

# BCM-GPIO-Nummern verwenden
gpio.setmode(gpio.BCM)

# LED an Pin 26 = GPIO 7 
gpio.setup(7, gpio.OUT)

# LED über Pin 26 fünf Mal ein- und ausschalten
for _ in range(5):
    print("LED ein")
    gpio.output(7, gpio.HIGH)
    time.sleep(1)
    print("LED aus")
    gpio.output(7, gpio.LOW)
    time.sleep(1)

# alle vom Script benutzten GPIOs/Pins wieder freigeben
gpio.cleanup()

gpiod

Das Python-Modul gpiod wird durch das Paket python3-libgpiod zur Verfügung gestellt, das unter Raspberry Pi OS standardmäßig installiert ist. Das Modul stellt eine Python-Schnittstelle zur Bibliothek libgpiod her. Diese Bibliothek ist wiederum eine Alternative zu der schon erwähnten lgpio-Bibliothek. Da es zum Python-Modul kaum Dokumentation gibt, ist gpiod nur für Entwickler von Interesse, die mit libgpiod bereits C-Programme entwickelt haben. Als Ausgangspunkt für eine eigene Recherche eignen sich die beiden folgenden Seiten:

Das folgende Minibeispiel zeigt, wie Sie eine LED an Pin 26 (GPIO 7) fünf mal ein- und ausschalten:

#!/usr/bin/env python3
import gpiod, time
chip = gpiod.Chip('gpiochip4')  # RP1 (Raspberry Pi 5)
led = chip.get_line(7)          # GPIO 7 = Pin 26 des J8-Headers
led.request(consumer="example", type=gpiod.LINE_REQ_DIR_OUT)

for _ in range(5):              # 5x ein- und ausschalten
    led.set_value(1)
    time.sleep(1)
    led.set_value(0)
    time.sleep(1)

Quellen/Links

MongoDB-Beispieldatenbanken für Docker einrichten

27. November 2023 um 07:51

Aktuell setze ich mich ein wenig mit MongoDB auseinander und habe mir lokal mit Docker eine Test-Installation eingerichtet:

docker run --name mongo -d mongodb/mongodb-community-server:latest

docker exec -it mongo mongosh

  Using MongoDB: 7.0.3
  Using Mongosh: 2.1.0

test> ...

Je nachdem, wie Sie Docker installiert haben, müssen Sie sudo vor jedes docker-Kommando stellen.

Zum Kennenlernen hätte ich nun gerne ein paar Beispieldatenbanken. Und tatsächlich stellt Mongo für sein Cloud-Angebot Atlas eine ganze Palette von Testdatenbanken zur Verfügung. Eine Kurzbeschreibung der Datenbanken finden Sie hier:

https://www.mongodb.com/docs/atlas/sample-data

Genau die Datenbanken hätte ich gerne in meiner lokalen Installation als »Spielwiese«. Leider ist die Installation dieser Beispieldatenbanken bei der lokalen Verwendung von MongoDB umständlich. Auf GitHub gibt es Dumps (Backups) der Beispieldateien im JSON-Format:

git clone https://github.com/mcampo2/mongodb-sample-databases.git
cd mongodb-sample-databases
lstree sample_*

  sample_airbnb/
    listingsAndReviews.json
  sample_analytics/
    accounts.json
    customers.json
    transactions.json
  sample_geospatial/
    shipwrecks.json
  ...

Jetzt geht es darum, die Datenbanken zu importieren. Unter Linux oder macOS führen Sie dazu für jede JSON-Datei aus samples_xxx ein Kommando nach dem folgenden Muster aus:

cat sample_airbnb/listingsAndReviews.json | \
  docker exec -i mongo mongoimport --db sample_airbnb --collection listingsAndReviews

Beachten Sie, dass Sie docker exec mit der Option -i ausführen müssen (nicht -it wie bisher für den interaktiven Betrieb), damit die Weitergabe von Daten über den Pipe-Operator | funktioniert.

Anstatt nun jede JSON-Datei einzeln zu importieren, bietet sich die Formulierung eines winzigen Scripts an. Er richtet für jedes DB-Verzeichnis sample_xxx eine gleichnamige Datenbank ein und importiert jedes JSON-Dokument als Collection. (Beachten Sie, dass die auf Atlas definierten Indize nicht eingerichtet werden. Wenn Sie zum Testen einen Index brauchen, müssen Sie diesen selbst einrichten.)

#!/bin/sh
for db in sample_*; do
  for file in $db/*.json; do
      collection="$(basename $file .json)"
      cat $file | docker exec -i mongo mongoimport --db $db --collection $collection
  done
done

Das Script muss in dem Verzeichnis ausgeführt werden, in dem sich die von GitHub heruntergeladenen sample_xxx-Verzeichnisse befinden.

Nach dem Import können Sie sich in der Mongo Shell überzeugen, dass alles geklappt hat:

docker exec -it mongo mongosh

test> show dbs

  admin                40.00 KiB
  config               72.00 KiB
  local                40.00 KiB
  sample_airbnb        52.09 MiB
  sample_analytics      9.39 MiB
  sample_geospatial   784.00 KiB
  sample_mflix         28.39 MiB
  sample_supplies     968.00 KiB
  sample_training      61.30 MiB
  sample_weatherdata    2.55 MiB
  samples_airbnb       52.09 MiB
  test                112.00 KiB

test> use sample_airbnb

sample_airbnb> show collections

  listingsAndReviews

sample_airbnb> db.listingsAndReviews.findOne()

 {
    _id: '10009999',
    listing_url: 'https://www.airbnb.com/rooms/10009999',
    name: 'Horto flat with small garden',
    ...
  }

Quellen/Links

📚 Das Buch »Wärmepumpen« ist erschienen

23. November 2023 um 15:25

Als letzte und vielleicht spannendste Veröffentlichung in diesem Jahr ist heute das Buch »Wärmempumpen« erschienen. Es beschreibt — fernab vom politischen Getöse — die Funktionsweise und die Vor- und Nachteile von Wärmepumpen. In diesem Buch, das ich zusammen mit dem Energieberater Tobias Otta verfasst habe, wollen wir Sie beraten, unter welchen Umständen der Einsatz von Wärmepumpen zweckmäßig ist und ob sich das auch finanziell lohnt.

Dabei belassen wir es natürlich nicht bei der Wärmepumpe an sich, sondern behandeln auch die vielen Detailfragen rund um die Integration mit der Heizung (Warmwasser, Hydraulik, Puffer usw.). Wir erklären Ihnen die Unterschiede zwischen verschiedenen Wärmepumpenarten (Luft-, Erdwärme- und Grundwasserwärmepumpen) und wie Sie die Wärmepumpe im Sommer auch zum Kühlen verwenden können. Außerdem erläutern wir, warum eine Kombination mit einer PV-Anlage oft sinnvoll ist, obwohl die Sonne gerade im Winter, wenn der größte Strombedarf besteht, am wenigsten scheint. Ein ausführliches Kapitel mit Beispielen aus der Praxis samt umfassenden Kostenkalkulationen zeigt, welche Kosten bei der Errichtung und der Verwendung zu erwarten sind (natürlich immer im Vergleich zu einer Gasheizung).

Weitere Informationen zum Inhalt des Buch sowie eine Leseprobe finden Sie hier.

Umfang: 236 Seiten
ISBN: 978-3-8362-9773-8
Preis: Euro 39,90 (in D inkl. MWSt.)

📚 Linux (18. Aufl.) und Photovoltaik (2. Aufl.) erschienen

27. Oktober 2023 um 09:26

Im Herbst-Doppelpack sind diese Woche die 18. Auflage meines Linux-Buchs und die 2. Auflage des Photovoltaik-Buchs erschienen, das ich zusammen mit Christian Ofenheusle verfasst habe:

Das Linux-Buch habe ich wie üblich vollständig aktualisiert. Es berücksichtigt jetzt alle bis Sommer 2023 aktuellen Linux-Distributionen. Sämtliche Anleitungen und Setups wurden damit getestet. Ausführliche Informationen zum Inhalt des Buchs finden Sie hier.

Beim Photovoltaik-Buch ergeben sich die meisten Neuerungen aus gesetzlichen Änderungen. Das Buch geht nun auf das »Photovoltaik-Paket I« ein, das in Deutschland diverse Erleichterung für den Betrieb von Balkonkraftwerken mit sich bringt. Gleichzeitig haben wir das Buch an einigen Stellen ergänzt und erweitert. Lesen Sie hier die vollständige Beschreibung des Buchs!

Remote Desktop und Raspberry Pi OS Bookworm

21. Oktober 2023 um 15:47

Die aktuelle Raspberry-Pi-Version verwendet auf den Raspberry-Pi-Modellen 4B, 400 sowie 5 Wayland als Default-Grafiksystem. Aus diesem Grund funktionieren viele Programme zur Fernwartung bzw. für Remote-Desktop-Funktionen nicht mehr wie gewohnt. Betroffen ist unter anderem RealVNC, bisher die Default-Lösung der Raspberry Pi Foundation. RealVNC verspricht etwas vage, im Verlauf des Jahres 2024 eine Wayland-kompatible Version ihrer Software zu veröffentlichen. An dieser Stelle erkläre ich Ihnen, was Sie tun können, wenn Sie nicht solange warten möchten.

Xorg versus Wayland

Das X Window System und der Xorg-Server bilden das traditionelle Grafiksystem von Linux. Es basiert auf einem Client/Server-Modell und hat sich jahrzehntelang bewährt. Allerdings ist der Xorg-Server mit vielen Altlasten und Sicherheitsproblemen verbunden. Die Software wird schon seit mehrere Jahren nicht mehr weiterentwickelt und kaum noch aktiv gewartet. Seine Zeit läuft ab.

Der Nachfolger von Xorg heißt Wayland ist dagegen »nur« ein neues Protokoll für die Kommunikation zwischen dem Wayland Compositor (einem Display-Server) und den Anwendungsprogrammen (Clients). Wayland bricht mit dem X Window System und verspricht ein System, das schlanker, sicherer und effizienter ist. Wayland gehört die Zukunft.

Zwar sind mittlerweile viele Programme Wayland-kompatibel, aber leider nicht alle. Besonders große Probleme gibt es bei Programmen, die den Bildschirminhalt auslesen wollen, also Tools für Screenshots, Screencasts, Screen Sharing und Remote Desktop. Derartige Funktionen sind auch unter Wayland möglich, müssen aber vollständig neu implementiert werden.

Aktuelles Grafiksystem ermitteln

Ob Ihr Raspberry Pi Wayland oder Xorg als Grafiksystem verwendet, stellen Sie am einfachsten mit einem Kommando im Terminal fest:

echo $XDG_SESSION_TYPE
  wayland

Im Desktop-Betrieb lauten die möglichen Antworten wayland oder x11. In einer SSH-Session im Textmodus lautet das Ergebnis dagegen tty.

Lösung 1: Xorg statt Wayland verwenden

Die bei weitem einfachste Lösung besteht darin, das Grafiksystem von Wayland zurück auf Xorg umzustellen. Dazu führen Sie in einem Terminal-Fenster sudo raspi-config aus und wählen zuerst den Menüpunkt Advanced Options, dann Wayland. Jetzt können Sie sich zwischen dem X11 Backend und dem Wayland Backend entscheiden. Gleichzeitig ändert sich auch der Window Manager (Openbox versus Wayfire). Optisch ergeben sich daraus aber nur geringe Unterschiede.

Die Einstellung wird in der Datei /etc/lightdm/lightdm.conf gespeichert:

# in der Datei /etc/lightdm/lightdm.conf
...
# für Wayland:
user-session=LXDE-pi-wayfire
# oder für X:
user-session=LXDE-pi-x

Die Umstellung des Grafiksystems wird erst nach einem Neustart wirksam. Die meisten Remote-Desktop-Tools inklusive RealVNC sollte nun wieder wie gewohnt funktionieren. Der RealVNC-Server ist standardmäßig installiert. Die Aktivierung kann aber nicht über das Raspberry-Pi-Konfigurationsprogramm erfolgen. Dessen VNC-Option gilt nur für wayvnc und muss deaktiviert (!) sein, sonst kommt es zu einem Port-Konflikt. Den RealVNC-Dienst aktivieren Sie anschließend wie folgt:

sudo systemctl enable --now vncserver-x11-serviced

Ein VNC-Icon im Panel zeigt an, dass der Start funktioniert hat, und gibt Aufschluss darüber, ob gerade eine Verbindung aktiv ist.

Allerdings gibt es auch hier eine Einschränkung: Der RealVNC-Server funktioniert nur in der 64-Bit-Version von Raspberry Pi OS Bookworm, nicht aber mit der 32-Bit-Version. Dieses Problem soll aber in naher Zukunft behoben werden.

Lösung 2: wayvnc

Wenn Sie bei Wayland bleiben, steht das neue Programm wayvnc zur Verfügung. Sie aktivieren es am einfachsten mit dem Programm Raspberry Pi-Konfiguration im Dialogblatt Schnittstellen, Option VNC.

Aktivierung des VNC-Servers im »Raspberry Pi-Konfigurationsprogramm«

Daraus resultiert die folgende Konfigurationsdatei /etc/xdg/autostart/wayvnc.desktop:

[Desktop Entry]
Type=Application
Name=wayvnc
Comment=Start wayvnc
NoDisplay=true
Exec=/usr/bin/wayvnc --render-cursor --keyboard=de
OnlyShowIn=wayfire

Jetzt brauchen Sie auf Ihrem Client-Rechner (auf dem Rechner, mit dem Sie Ihren Raspberry Pi steuern möchten), einen zu wayvnc kompatiblen VNC-Client. Der Raspberry-Pi-Blog empfiehlt das Programm vncviewer des Projekts TigerVNC. Die meisten Linux-Distributionen stellen ein entsprechendes Paket zur Verfügung. Für Windows und macOS (Intel) finden Sie hier Downloads.

Hier läuft der TigerVNC-Client auf meinem Notebook mit ArchLinux und ermöglicht die Fernsteuerung des Raspberry-Pi-Desktops

Bei meinen Tests unter Windows ist der Verbindungsaufbau mit dem Programm Remotedesktopverbindung gescheitert. Mit dem vncviewer von TigerVNC hat es dann aber funktioniert.

Sofern der Raspberry Pi mit einem eigenen Monitor verbunden ist, gilt für den Remote Desktop dieselbe Bildschirmauflösung. Wenn der Raspberry Pi dagegen »headless« läuft, können Sie die gewünschte Auflösung mit sudo raspi-config, Display Options, VNC Resolution einstellen (maximal 1920×1080, erfordert einen Reboot).

Quellen/Links

❌