Neuigkeiten:

Privates MODX und LINUX BLOG, User Registrierung ist deaktiviert! Fragen oder Tipps? Bitte per Matrix: @jolichter:tchncs.de

Hauptmenü

ioBroker auf Pi 4 mit Manjaro

Begonnen von Jo, 2023-11-12 | 13:24:16

« vorheriges - nächstes »

Jo

letzte Anpassung 2024-August: Nuki-Hub 9, Adapter admin 7.0.22, javascript 8.7.6 und js-controller 6.0.9 aktualisiert | 2024-Juli: nodejs-lts-iron

Prolog überspringen

Prolog

Derzeit hört man viel über ioBroker im Vergleich zu Home Assistant. Bezüglich Home Assistant kann ich nicht viel sagen, außer dass ioBroker dank seiner Blockly-Steuerungen in Kombination mit VIS, Datenpunkten und Alias mit Abstand meine Top-Features sind. Der Nachfolger von VIS, VIS2, ermöglicht außerdem Responsive Design. Dieses Feature würde ich in Home Assistant sehr vermissen, aber das ist natürlich rein meine persönliche Meinung.

Was den Matter und Thread Hype betrifft, es klingt vielversprechend, aber für mich scheint es noch in der Beta-Phase zu sein. Einige Hersteller bieten Matter bereits mit Bridges dafür an, obwohl sie eigentlich nicht notwendig wären. Daher werde ich bei WLAN-Geräten und Z-Wave-Geräten bleiben, insbesondere bei batteriebetriebenen Geräten. Dies entspricht im Prinzip Thread, allerdings verwendet Z-Wave für den Heimbereich die vorteilhaftere Frequenz von 868 MHz (EU) und zeichnet sich durch eine besonders hohe Energieeffizienz aus, die sogar geringeren Stromverbrauch als ZigBee-Geräte aufweist, was es besonders für batteriebetriebene Geräte geeignet macht.

Sowohl das Nuki Smart Lock 2/3 als auch das 4, sei es die Pro-Version oder die Standardvariante, integrieren sich nahtlos mit einem Nuki-Hub über einem ESP32 in dein eigenes Netzwerk mittels MQTT. Dadurch ist keine externe Cloud-Anbindung erforderlich. Matter oder WLAN ist daher nicht erforderlich, zudem hatte die WLAN Version bei mir den Stromverbrauch des Nukis drastich erhöht und deren MQTT wollte immer nach Hause telefonieren, obwohl MQTT KEIN Internet benötigt.

Hinweis zu Access Points wie dem FRITZ!Repeater: Diese führen alle 12 Stunden eine WPA3-Verschlüsselungsaktualisierung durch, um die WLAN-Sicherheit zu verbessern (AVM Wissensdokument #3570). Andere AP's könnten ebenfalls eine ähnliche Funktion haben. Dadurch kann es kurzzeitig zu Unterbrechungen kommen. Der ESP32 mit Nuki-Hub stellt die Verbindung jedoch automatisch und schnell wieder her (Restart on disconnect), ohne dass bisher Probleme aufgetreten sind. In Tests konnte ich den ESP32 auch direkt mit der FRITZ!Box verbinden, wodurch der Nuki-Hub ohne Neustarts verbunden bleibt (siehe Restart reason ESP). Getestet mit ESP32 StampS3 per Nuki-Hub 8.35 und 9.00.

Ich verstehe nicht, warum manche ioBroker auf Windows PCs (mein Beileid) oder Macs installieren möchten. Für einen stabilen Dauerbetrieb (24/7) ist ein headless Server unerlässlich. Er garantiert höhere Stabilität und Effizienz, da keine grafische Oberfläche Systemressourcen beansprucht. Deshalb sollte für optimalen Betrieb von ioBroker auf spezialisierte Serverlösungen zurückgegriffen werden.

Für ein stets aktuelles und sicheres SmartHome-System ist es wichtig, das Betriebssystem regelmäßig zu aktualisieren. Bei Diensten wie ioBroker, die auf Debian basieren, empfiehlt es sich, alle 2-4 Jahre ein Update des LTS Debian-Systems durchzuführen. Dies kann entweder durch eine komplette Neuinstallation oder durch den Wechsel zu einem Rolling-Release-Betriebssystem wie Manjaro, welches ich derzeit teste, erfolgen. Die regelmäßige Aktualisierung ist nicht nur für die Sicherheit essenziell, sondern auch für die Funktionsfähigkeit der SmartHome-Geräte.

SmartHome-Gadgets können zwar Spaß machen und potenziell zur Energieeinsparung beitragen, wie zum Beispiel durch Funk Heizkörperregler, aber sie können konventionelle Technik, die jahrzehntelang ohne Batteriewechsel und Updates funktioniert, nicht vollständig ersetzen. Zudem besteht das Risiko, dass Produkte minderer Qualität nach einigen Jahren ausfallen und durch inkompatible Nachfolgemodelle ersetzt werden müssen. Daher sollte stets die Frage nach der Sicherheit und der Zuverlässigkeit ohne SmartHome-Funktionen gestellt werden.

Unabhängig vom verwendeten SmartHome-System sind regelmäßige Updates, idealerweise monatlich oder mindestens nach 6 Monaten, unerlässlich. Bei Debian ist spätestens nach fünf Jahren ein Wechsel des LTS-Release erforderlich. Wer diese Aktualisierungen vernachlässigt, handelt grob fahrlässig. Der Grundsatz 'Never change a running system' ist in diesem Kontext nicht anwendbar.

Debian veröffentlicht seine Stable-Releases regelmäßig und bietet nach der Veröffentlichung drei Jahre vollständige Unterstützung, gefolgt von zwei weiteren Jahren LTS-Unterstützung. Derzeit ist das Debian 12 Bookworm (Oktober 2023) und ich nutze Debian 11 Bullseye mit ioBroker, was noch ca. 2 Jahre mit Sicherheitsupdates versorgt werden soll. Ehrlich gesagt, habe ich wenig Lust, zum dritten Mal ein Betriebssystem-Upgrade durchzuführen. Aus diesem Grund betreibe ich ioBroker auf einem zweiten Raspberry Pi 4 (Architektur: ARMv8 Cortex-A72) mit 8 GB RAM. Die Installation erfolgt unter Linux Manjaro in der ARM-Minimal-Version 64bit für Raspberry, speziell in der Headless-Variante ohne grafische Benutzeroberfläche (GUI). Als Speichermedium verwende ich eine externe SSD. Dieses Setup ermöglicht es mir, vom Rolling-Release-Prinzip zu profitieren, wodurch ich kontinuierlich volle Unterstützung sowie aktuelle Kernel und Pakete erhalte.

Ich möchte betonen, dass Debian als LTS ein äußerst solides und stabiles System ist. Bitte nehmt meinen Thread daher nicht falsch auf. Manjaro-ARM ist ebenfalls ein sehr solides und stabiles System, jedoch muss dieses in der Regel nur einmal installiert werden. Es ist wichtig zu beachten, dass ioBroker Manjaro nicht unterstützt. Wenn dies ein Problem darstellt, sollte man auf jeden Fall bei Debian bleiben.

Warum den Raspberry Pi 4 anstelle des Pi 5 wählen? Der Raspberry Pi 4 ist für einen "normalen" ioBroker Betrieb völlig ausreichend, selbst wenn du zusätzlich Pi-hole installierst und ihn als Fileserver nutzt. Du kannst ihn auch ohne Lüfter mit einem großem passiven Kühlkörper betreiben und dennoch eine gute Leistung bei unter 40 Grad Celsius CPU-Temperatur im Normalbetrieb erzielen. ioBroker mit einem Z-Wave Modul RaZberry7 und externer SDD T5 benötigt im normalen Betrieb bei mir unter 1 Ampere, und kurz 1,5 - 2,0 Ampere bei Schreibvorgängen oder höher CPU Last. Der Pi 5 hingegen verbraucht mehr Strom und sollte mit einem Lüfter betrieben werden. Ein leistungsstärkerer PC als der Pi 4 würde nur Sinn machen, wenn du mehr als nur ioBroker installieren möchtest, wie zum Beispiel NextCloud, Livestreaming oder kleinen Matrix Server.

Wer bereits Erfahrungen mit einer solchen Umsetzung hat oder ebenfalls Interesse an diesem Vorhaben zeigt, ist herzlich eingeladen, sich hier zu melden und seine Gedanken oder Tipps zu teilen. Ich freue mich auf einen regen Austausch via Matrix: #RPI-Manjaro-arm:tchncs.de



Leider existiert kein Installations-Skript von ioBroker für Linux Manjaro. Daher veröffentliche ich meine "experimentelle" Anleitung hier in meinem Blog, in der ich beschreibe, wie ich ioBroker mit dem Debian Installations-Skript installiert habe. Bitte beachte, dass diese Methode nicht für den produktiven Einsatz empfohlen wird. Ich selbst habe Manjaro erst eingesetzt, nachdem ich ausführliche Tests durchgeführt hatte.


Versuchsaufbau: Raspberry Pi 4 lüfterlos, der mit Manjaro-ARM (headless) installiert ist und zusätzlich Pi-hole mit Unbound, sowie ioBroker mit einem Z-Wave-Modul betreibt, angeschlossen an einer 12-Volt USV.



INHALT


1. Manjaro ARM auf einem Raspberry Pi 4 installieren

Hier beschreibe ich meine Methode, Manjaro ARM auf einem Raspberry Pi 4 mit einer SSD unter Verwendung eines Linux Manjaro-Systems zu installieren. Lade zuerst die Manjaro-ARM-minimal-rpi4-Datei von manjaro.org/download herunter. Im September 2023 war das die Version 23.02:

Choose Architecture: ARM -> DEVICE OPTIONS: "RASPBERRY PI 4B ..." -> Minimal -> Manjaro-ARM-minimal-rpi4-23.02.img.xz (ca. 430 MB)

Wichtig: Die Headless-Einrichtung über SSH ist nur mit dem Minimal-Image verfügbar.
Nach dem Herunterladen entpacke die Datei. Du erhältst dann die Datei "Manjaro-ARM-minimal-rpi4-23.02.img" (ungefähr 3 GB). Anschließend musst du dieses Image auf eine SD-Karte flashen. Dieser Prozess ist vergleichbar mit dem Flashen anderer Systeme, beispielsweise unter Verwendung von Tools wie Unetbootin oder SUSE Studio Imagewriter.

Ich habe das Image "Manjaro-ARM-minimal-rpi4-23.02.img" auf eine Samsung SSD T5 geschrieben, indem ich den SUSE Studio Imagewriter verwendet habe. Die Ethernet-Verbindung (LAN) in einem DHCP-Netzwerk funktioniert direkt und ist der beste Weg, um einen Internetzugang zu erhalten. Starte den Raspberry Pi mit dem angeschlossenen LAN-Kabel. Nach einigen Sekunden ist der Systemstart abgeschlossen.

Um die IP-Adresse deines Raspberry Pi in deinem lokalen Netzwerk zu finden, kannst du entweder in deinem Router nachsehen oder den Befehl
arp-scan --localauf einem Linux-Computer ausführen. Im Router habe ich diesem Netzwerkgerät immer die gleiche IPv4-Adresse zugewiesen.

Sobald du das Gerät gefunden hast, verwende SSH im Terminal, um eine Verbindung zum Raspberry Pi herzustellen:
ssh root@192.168.x.yBeim ersten Login wird ein neuer SHA256 Fingerprint erstellt, dann erscheint ein Assistent um die Manjaro ARM Installation abzuschließen, Beispiel:

Finish Manjaro ARM Install
  • Choose your keyboard layout: de
  • Enter disired username: pi4m
  • Enter additionale groups: keine weiteren (default ist vorerst ausreichend)
  • Enter disired Full Name: Manjaro
  • Enter new Password: xxxxxxxxxxxx
  • Enter new Root Password: xxxxxxxxxxxxxxxxxxx  -> ja, es ist ein Root-Benutzer vorhanden (su)
  • Choose you timezone: Europe/Berlin
  • Choose your locale: de_DE.UTF-8
  • Choose desired hostname: manjaro-arm

Versucht, keinen Punkt auszulasssen, denn jedes Mal, wenn die Angabe falsch ist, beginnt der Assistent wieder von vorne, was möglicherweise frustrierend sein kann.

Schließlich gibt der Assistent eine Bestätigungsliste aus. Überprüft, ob alles korrekt ist. Die Grundkonfiguration dauert nur wenige Sekunden. Danach wird das System die Größe der SSD anpassen und einen Neustart durchführen. Nach dem Neustart ist das System bereit und mit den von dir vorgenommenen Einstellungen einsatzbereit.

Mit dem von dir gewählten Benutzernamen und SSH kannst du dich nun anmelden und das System aktualisieren.
ssh pi4m@192.168.x.yBeim ersten Aktualisieren kannst du die Spiegelserver (Mirrors) für Pacman auf Server in Deutschland, Frankreich und Österreich beschränken, alles aktualisieren und nur die zwei neuesten Versionen jedes Pakets im Cache behalten. Hier ist der Befehl:
sudo pacman-mirrors --country Germany,France,Austria && sudo pacman -Syyuu && sudo paccache -rk2Wenn du aufgefordert wirst, "rpi-eeprom durch extra/rpi4-eeprom ersetzen? [J/n]" und du ein Raspberry Pi 4 verwendest, dann ist es in der Regel eine gute Idee, diese Frage mit "J" (default) für Ja zu beantworten und das rpi-eeprom-Paket durch das rpi4-eeprom-Paket zu ersetzen.

Bei "raspberrypi-utils und raspberrypi-userland-aarch64-git stehen miteinander in Konflikt (raspberrypi-firmware). raspberrypi-userland-aarch64-git entfernen? [j/N]" habe ich mit "J" beantwortet.

Für zukünftige Aktualisierungen:
sudo pacman -Syyuu && sudo paccache -rk2Der Befehl aktualisiert auch das linux-rpi4-Paket auf deinem Manjaro ARM-System und kann damit den Kernel auf eine neuere Version anheben, wenn eine solche in den Repositories verfügbar ist. Die Version eines Kernel-Pakets kann mit 'pacman -Si linux-rpi4' überprüft werden.

Diese Befehle aktualisieren dein System und behalten nur die zwei neuesten Versionen jedes Pakets im Cache, um Speicherplatz zu sparen. Verwaiste Pakete entfernen:
sudo pacman -Rsn $(pacman -Qdtq)Optional alle Pakete im Pacman Cache vollständig entfernen:
sudo pacman -Scc
Installiere die folgenden Pakete, falls sie auf deinem System noch nicht vorhanden sind, z.B.um das Build-Umfeld und zusätzliche Tools bereitzustellen:
sudo pacman -S --needed acl avahi base-devel cairo cmake curl gcc giflib git htop iftop libcap libjpeg-turbo librsvg lm_sensors make neofetch net-tools pam pango pkgconf systemd-libs unzip sqlite cifs-utils nfs-utils rsync polkit
Version prüfen:
lsb_release -a
ZitatLSB Version:    n/a
Distributor ID: Manjaro-ARM
Description:    Manjaro ARM Linux
Release:        23.02
Codename:      n/a
oder:
neofetch

htop

Den Raspberry Pi neu starten:
sudo rebootoder ausschalten:
sudo shutdown -h 0(seit systemd, kannst du auch einfach "poweroff" nutzen)


2. Manjaro ARM optimieren

Headless, prüfen, ob dein Manjaro-System im Headless-Modus (ohne grafische Benutzeroberfläche) betrieben wird:
systemctl get-defaultWenn das Ergebnis "graphical.target" liefert, bedeutet das, dass dein System standardmäßig in einer grafischen Umgebung (GUI) startet. Mit dem Befehl
sudo systemctl set-default multi-user.targetstellst du das System so ein, dass es im Headless-Modus startet, also ohne grafische Benutzeroberfläche (GUI). Dieser Modus eignet sich besonders für Server, da er weniger Ressourcen beansprucht, die sonst für die GUI benötigt würden. Ein weiterer Vorteil ist die erhöhte Stabilität, da weniger Komponenten vorhanden sind, die potenziell abstürzen oder Probleme verursachen könnten (zurück zur GUI: 'sudo systemctl set-default graphical.target').

Überprüfe, ob die Änderung erfolgreich war, indem du den folgenden Befehl ausführst:
systemctl get-defaultDieser Befehl sollte jetzt "multi-user.target" als Antwort geben. Starte das System neu:
sudo reboot
Im Headless-Modus, lassen sich spezifische Funktionen, die vorrangig für grafische Ausgaben oder Audio relevant sind, deaktivieren, um Systemressourcen zu schonen. Entsprechend habe ich solche Funktionen sowie WiFi und BT, was ich nicht benötige, in den Einstellungen deaktiviert:
sudo nano /boot/config.txt
Zitat# gpu_mem=64
auto_initramfs=1
kernel=kernel8.img
arm_64bit=1
disable_overscan=1
# dtparam=krnbt=on

# disable sound
dtparam=audio=off
# hdmi_drive=2

# disable vc4
# dtoverlay=vc4-kms-v3d
# max_framebuffers=2
disable_splash=1

[all]
dtoverlay=disable-wifi
dtoverlay=disable-bt

Der Eintrag kernel=kernel8.img ist notwendig, um den 64-Bit-Kernel zu verwenden, der für den Pi4 oder Pi5 optimiert ist und die 64-Bit-Architektur vollständig unterstützt.


NTP, als Zeitserver nutze ich den von der Fritz!Box, z.B.:
sudo nano /etc/systemd/timesyncd.conf
ZitatNTP=192.168.1.1

SSD, um die Lebensdauer deiner SSD zu verlängern, kannst du bei EXT4-Dateisystemen die Option "noatime" in die fstab-Datei einfügen. Ein Beispiel hierfür wäre:
sudo nano /etc/fstab
Zitat# <file system> <dir> <type> <options> <dump> <pass>
PARTUUID=d42a0555-01  /boot  vfat    defaults,noexec,nodev,showexec    0  0
PARTUUID=d42ba555-02  /  ext4    defaults,noatime    0  1
Dieser Eintrag verhindert, dass das System bei jedem Lesezugriff die Zugriffszeit (atime) aktualisiert, was die Anzahl der Schreibvorgänge auf der SSD reduziert. Starte das System neu:
sudo reboot
TMPFS, da Manjaro ARM auf systemd basiert und tmpfs zur Konfiguration von /tmp verwendet, entfällt die manuelle Einrichtung in der /etc/fstab-Datei. Du kannst dies kurz überprüfen, indem du
df -hausführst (tmpfs schont die SSD und erhöht die Geschwindigkeit).

TRIM, die Ausgabe des Befehls
sudo systemctl status fstrim.timerzeigt an, dass der TRIM-Timer aktiviert und eingerichtet ist. Der Timer ist so konfiguriert, dass er einmal pro Woche (standardmäßig) ausgeführt wird, um nicht mehr benötigte Blöcke auf der SSD freizugeben. Befehl um die SSD manuell zu trimmen:
sudo fstrim -a -v
LED (optional deaktivieren), auf einem Manjaro Arch-System mit systemd kannst du einen systemd-Service erstellen, um die rote LED (Power-LED = PWR) bei jedem Systemstart auszuschalten. Mit Root-Rechten (su) lässt sich die LED zwar mit dem Befehl "echo 0 > /sys/class/leds/PWR/brightness" ausschalten, jedoch wird sie nach einem Neustart des Systems wieder aktiviert. Um sicherzustellen, dass die rote LED bei jedem Systemstart deaktiviert wird, erstelle eine systemd-Service-Datei:
sudo nano /etc/systemd/system/disable-pwr-led.serviceFüge den Inhalt für den Service hinzu:
Zitat[Unit]
Description=Disable the PWR LED on Raspberry Pi

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo 0 > /sys/class/leds/PWR/brightness"

[Install]
WantedBy=multi-user.target

Speichere und schließe den Editor und aktiviere den Service:
sudo systemctl enable disable-pwr-led.serviceStarte den Service oder das System neu um zu testen, ob der Service funktioniert, kannst du ihn manuell starten oder einfach dein System neu starten. Um den Service zu starten, verwende:
sudo systemctl start disable-pwr-led.serviceOder starte dein System neu, um zu sehen, ob der Service beim Booten korrekt ausgeführt wird. Durch diesen systemd-Service wird sichergestellt, dass der Befehl zum Ausschalten der LED bei jedem Systemstart ausgeführt wird.

Bitte beachte, dass sich der Name für die LED in einem früheren Update geändert hat. Falls sich der Name in Zukunft wieder ändert, stell sicher, dass du den aktuellen Namen verwendest. Um die im System verfügbaren LEDs aufzulisten, verwende folgenden Befehl:
ls /sys/class/leds/
ZitatACT  default-on  mmc0  mmc0::  PWR

Update des Raspberry Pi EEPROM
sudo rpi-eeprom-update -aEs ist wichtig zu beachten, dass das Aktualisieren des EEPROMs ein kritisches Verfahren ist, da es die Firmware und Konfigurationseinstellungen ändern kann. Durch Hinzufügen der "-a" oder "--stable" Option wird sichergestellt, dass nur die stabile Version des EEPROMs heruntergeladen und aktualisiert wird, wenn eine solche verfügbar ist.

Protokolldaten von Pacman auslesen
sudo cat /var/log/pacman.logARL (Arch Rollback Machine) Fehlerprotokoll auslesen
sudo cat /var/log/pacman.log | grep "ARL"

Prüfen ob systemd-Dienste fehlgeschlagen sind
systemctl --failed
Fehler Protokoll seit gestern
journalctl -p err --since yesterday
Journal Protokoll von - bis
journalctl --since "20:30:00" --until "20:42:00"
Löschen aller Protokolldaten
sudo journalctl --rotate
sudo journalctl --vacuum-time=1s
Der erste Befehl dreht die Protokoll-Dateien und erstellt neue. Der zweite Befehl löscht alle Protokolldaten, die älter als eine Sekunde sind. Du kannst die Zeitspanne nach Bedarf anpassen.


3. Node.js installieren (github.com/nodejs/release)

2024-05-22: Ich habe das Update von Node.js 18.x auf 20.x (nodejs-lts-iron) problemlos durchgeführt.

Die Installation von ioBroker erfolgt in zwei Schritten, zuerst wird Node.js installiert, anschließend folgt die Installation von ioBroker selbst. Um auf einem Manjaro ARM-System eine bestimmte Version von Node.js, wie beispielsweise Version 18.x oder 20.x, zu installieren, wäre der Node Version Manager (NVM) eine praktische Wahl. Allerdings unterstützt ioBroker offiziell keine Verwendung von NVM. Daher entscheiden wir uns dafür, eine LTS-Version von Node.js aus den Manjaro-Paketquellen zu installieren.

Seit Mai 2024 empfiehlt ioBroker die LTS-Version von Node.js 20.x, die unter Manjaro als nodejs-lts-iron bekannt ist. Zum Zeitpunkt der ersten Beitragserstellung war Version 18 die aktuelle Version. Um Node.js 20.x zu installieren, kannst du den folgenden Befehl verwenden:

sudo pacman -S nodejs-lts-iron npm(V22: noch kein Codename vergeben, V20: nodejs-lts-iron, V18: nodejs-lts-hydrogen, V16: nodejs-lts-gallium, V14: nodejs-lts-fermium, V12: nodejs-lts-erbium)

Bei Bedarf kannst du folgenden Befehl verwenden, um Informationen über das installierte Paket zu erhalten:
pacman -Qi nodejs-lts-iron
Wenn du bereits Node.js (LTS-Iron) auf deinem System installiert hast und dann npm hinzufügst, sollte npm automatisch die richtige Version installieren (zumindest war das bei mir der Fall). Es ist jedoch nicht immer klar, wie Arch/Manjaro mit dieser Konfiguration umgeht, da sie nach den Node.js Previous Releases nicht immer kompatibel sind, insbesondere wenn eine LTS-Version verwendet wird. Nach mehr als acht Monaten kann ich sagen, dass es weder mit Version 18 noch mit Version 20 unter ioBroker Probleme gab.

Überprüfung, ob die richtigen Node.js- und npm-Versionen installiert sind sowie deren Pfade:
type -P nodejs node npm npx && nodejs -v && node -v && npm -v && npx -vAusgabe (Mai 2024):
Zitat/usr/bin/nodejs
/usr/bin/node
/usr/bin/npm
/usr/bin/npx
v20.11.1
v20.11.1
10.4.0
10.4.0

Falls in der Ausgabe 'Nodejs' fehlt, muss wahrscheinlich ein symbolischer Link (Symlink) erstellt werden (siehe unten Punkt 5).

HINWEIS Corepack (macht das nicht!)
Corepack ist ein Node.js-Tool zur Verwaltung unterschiedlicher Versionen von Paketmanagern. Bei meiner ersten Installation nutzte ich versehentlich npm aus Corepack. Wenn Corepack aktiv ist, stellt es eigene Shims (Wrapper-Skripte) für npm und npx bereit, die im Verzeichnis "/usr/lib/node_modules/corepack/shims/" zu finden sind. Corepack erstellt dafür einen symbolischen Link, der auf diese Shims verweist. Ich hatte Probleme, da mein ioBroker den npm-Pfad nicht finden konnte. Dieses Problem löste ich, indem ich den Pfad in der .bashrc für alle Benutzer ergänzte:
Zitat# Setze den PATH für npm
export PATH=/usr/lib/node_modules/corepack/shims:$PATH
Später konnte ich die Notwendigkeit dieses umständlichen Vorgehens nicht mehr nachvollziehen. Es funktioniert, war aber eindeutig nicht ideal und bei einem Update auf Node.js 20 habe ich die Pfadangabe in der .bashrc wieder entfernt und Corepack mit "corepack disable" deaktiviert.
Wenn du nodejs-lts-xxxx und npm über das Paketverwaltungssystem (pacman) installierst, sollten die Binaries (node, npm, npx) standardmäßig im Verzeichnis "/usr/bin" liegen, was sicherstellt, dass die Befehle systemweit verfügbar sind. Seit dem Update funktioniert dies problemlos, was durch den zuvor genannten Überprüfungsbefehl bestätigt wird.

UPDATE Node Version
Um beispielsweise von der LTS-Version Node.js 18.x auf Node.js 20.x zu aktualisieren, kannst du wie folgt vorgehen: Zuerst alle Updates durchführen, die alte Version deinstallieren, die neue Version installieren, die Versionsnummer überprüfen, dann sicherheitshalber ein "iob fix" ausführen und das System neu starten.
iob stop && iob update && iob upgrade self && iob upgrade
sudo pacman -Syyuu
sudo pacman -Rns nodejs-lts-hydrogen npm
sudo pacman -S nodejs-lts-iron npm
type -P nodejs node npm npx && nodejs -v && node -v && npm -v && npx -v
iob fix
sudo paccache -rk2
reboot


4. ioBroker installieren

Die Empfehlung, ioBroker nicht als root-Benutzer zu installieren, ist sehr wichtig, um Sicherheitsprobleme zu vermeiden! Das Ausführen der Installation muss als ein normaler User durchgeführt werden, durch diesen User wird auch das System zukünftig administriert. Der normale User sollte, nicht iobroker heißen, es sollte der bei der Basisinstallation, angelegte User sein. Der Hauptgrund für die Verwendung eines separaten Benutzers für ioBroker ist, dass dieser Benutzer eingeschränkte Rechte hat im Vergleich zum root-Benutzer oder deinem Hauptbenutzer. Dies verringert das Sicherheitsrisiko, falls es zu einem Einbruch in das System über ioBroker kommt.

Das Original-Installationsskript von ioBroker, setzt aktiv die Eigentümerschaft des ioBroker-Installationsverzeichnisses (/opt/iobroker) auf den Benutzer iobroker. Dies wird typischerweise mit dem Befehl "chown -R iobroker:iobroker /opt/iobroker" erreicht, um sicherzustellen, dass alle Dateien und Verzeichnisse korrekt dem iobroker-Benutzer zugewiesen sind.

Der effizienteste und schnellste Weg besteht darin, das Original-Installationsskript (Einzeiler) zur Installation von ioBroker zu verwenden. Sollte es unter Manjaro Probleme damit geben, kannst du ioBroker manuell installieren, wie ich im nächsten Thread (ioBroker manuell installieren, anstelle des Original-Installationsskripts) erläutern werde.
curl -sL https://iobroker.net/install.sh | bash -
Die Meldungen wie 'sudo: apt-get: Befehl nicht gefunden' im ersten Abschnitt kannst du ignorieren (Installing prerequisites 1/4), da sie nur unter Debian funktionieren und in diesem Fall nicht relevant sind. Falls benötigte Pakete fehlen, können sie stattdessen mit 'pacman' installiert werden. Wir haben bereits alle wichtigen Pakete im ersten Abschnitt installiert.

Am Ende kannst den Service-Status überprüfen:
sudo systemctl status iobroker.service(Beenden mit "Q")

Sollte dieser wider Erwarten nicht gestartet sein, starte den ioBroker-Service mit folgendem Befehl:
sudo systemctl start iobroker.service
ioBroker kann nun über die IP im Webbrowser aufgerufen werden http://<IP-Adresse>:8081 und eingerichtet werden:


Optional, die Zugriffsrechte anpassen:
sudo chmod -v 755 /home/iobroker(von 0700 in 0755)

:bounce:  :dance:


5. Solltest du Probleme mit ioBroker haben, könnte es hilfreich sein, diese Tools zu nutzen oder die Parameter zu überprüfen

Diese beiden ioBroker-Tools funktionieren auch unter Linux Manjaro-ARM. Die Fehlermeldungen am Anfang im "iob fix" entstehen aufgrund des speziell für Debian-Systeme entwickelten dpkg und können ignoriert werden, da wir die Pakete unter Manjaro manuell installiert haben.

Das Diagnoseskript von Thomas Braun für ioBroker dient dazu, benötigte Informationen in Threads im ioBroker-Forum strukturiert und kompakt zusammenzufassen. Das Skript liest nur Informationen und verändert nichts.
iob diag
Der ioBroker-Fixer überprüft und korrigiert Systemrechte sowie führt andere Aufgaben aus.
iob stop && iob fixAlternativ kannst du den ioBroker-Fixer auch aus dem Internet herunterladen und ausführen:
iob stop && curl -fsSL https://iobroker.net/fix.sh | bash -
Wenn eine Fritz!Box als NAS mit einer Firmware >= 7.21 verwendet wird, sollten in ioBroker.backitup die SMB-Einstellungen auf "3.1.1" eingestellt und die Option "noserverino" aktiviert werden (Quelle: github.com/simatec/ioBroker.backitup/wiki/ioBroker.backitup-Wiki-Deutsch)

############

Der Befehl systemctl status iobroker.service überprüft und zeigt den aktuellen Betriebsstatus des iobroker.service auf dem Linux-System an, das Systemd verwendet, z.B.:
sudo systemctl status iobroker.service
● iobroker.service - ioBroker Server
    Loaded: loaded (/usr/lib/systemd/system/iobroker.service; enabled; preset: disabled)
    Active: active (running) since Sun 2023-12-12 14:42:11 CET; 7h ago
      Docs: http://iobroker.net
  Main PID: 476 (iobroker.js-con)
      Tasks: 185 (limit: 9279)
        CPU: 2h 25min 24.513s
    CGroup: /system.slice/iobroker.service
            ├─ 476 iobroker.js-controller
            ├─ 560 io.admin.0
            ├─ 648 io.javascript.0
            ├─ 733 io.email.0
            ├─ 849 io.ping.0
            ├─ 878 io.shelly.0
            ├─ 896 io.tr-064.0
            ├─ 927 io.info.0
            ├─ 998 io.zwave2.0
            ├─1097 io.fullybrowser.0
            ├─1252 io.simple-api.0
            ├─1580 io.web.0
            ├─1591 io.yahka.0
            └─3790 io.backitup.0
(Beenden mit "Q")

############

Einige alte Skripte rufen nodejs anstelle von node auf. Da Node.js standardmäßig unter dem Namen node installiert wird, kannst du einen symbolischen Link (Symlink) erstellen, um diese Kompatibilitätsprobleme zu lösen.

a) Überprüfen, ob /usr/bin/nodejs existiert:
ls -l /usr/bin/nodejsb) Erstellen eines Symlinks (falls /usr/bin/nodejs nicht existiert):
sudo ln -s /usr/bin/node /usr/bin/nodejsDieser Befehl erstellt einen Symlink nodejs, der auf die node-Anwendung verweist. Damit wird jeder Aufruf von nodejs an node weitergeleitet. Test:
nodejs -v
############

Sentry dient der Fehleranalyse, indem es Echtzeit-Fehlerberichte bereitstellt und so Entwicklern hilft, Probleme in ihren Anwendungen zu erkennen und zu beheben. Das Reporting kannst du global deaktiviert werden:
iobroker plugin disable sentry
iobroker restart
Mit "iobroker plugin enable sentry" kann es wieder aktiviert werden. Bei den Instanzen sieht man mit aktiviertem Expertenmodus auch das Symbol, um Sentry pro Instanz ein- oder auszuschalten.




6. System Updates

Manjaro ARM hat eigene Repositories, die nicht immer synchron mit denen von Arch Linux ARM sind. Beispielsweise sehe ich, dass die Node.js- und npm-Versionen unter Manjaro ARM eine Verzögerung bei der Aktualisierung im Vergleich zum Arch Linux ARM Repository haben. Updates erscheinen hier etwa alle zwei Monate. Für mich läuft alles sehr stabil, und ich benötige nicht immer die neueste Version. Wichtig ist mir ein stabiles Rolling-Release-Betriebssystem als Server.

Die Stable-Updates von Manjaro ARM erfolgen moderat und werden laut forum.manjaro.org ungefähr alle 2 Monate veröffentlicht. Wenn du AUR-Quellen (Arch User Repository) verwendest, die von der Community gepflegt werden, ist es wichtig, diese regelmäßig zu überprüfen. Idealerweise solltest du deine Paketlisten mindestens alle 6 Monate, vorzugsweise jedoch monatlich, aktualisieren. Um in Manjaro zwischen den Repositories "stable", "testing" oder "unstable" zu wechseln, kannst du die Konfiguration der Paketquelle ändern und anschließend die Paketdatenbank aktualisieren (Link).

Um sowohl das gesamte System (Manjaro) als auch ioBroker in einer einzigen Zeile zu aktualisieren und deinen Raspberry Pi anschließend neu zu starten, führe diesen Befehl aus. Stelle sicher, dass du über vorhandene Backups verfügst.
iob stop && iob update && iob upgrade self && iob upgrade && sudo pacman -Syyuu && sudo paccache -rk2
Nach erfolgreichen Abschluss der Aktualisierung und Kernel Update, ist ein Neustart des Raspberry Pi wichtig:
reboot
Darüber hinaus kannst du dein Manjaro-System aufräumen, um nicht mehr benötigte Pakete zu entfernen, indem du die folgenden Befehle ausführst:
sudo pacman -Rsn $(pacman -Qdtq)
sudo pacman -Scc

Linux-Systemverwaltung: Prüfe mit df -h die Festplattenbelegung, den LAN-Datentransfer in Echtzeit mit sudo iftop und mit htop (Systemmonitoring-Tool) die Informationen zur Systemauslastung, zur Prozessverwaltung und zur Ressourcennutzung auf einem Linux-System.



Quellen:


Jo

#1
ioBroker manuell installieren, anstelle des Original-Installationsskripts

Falls du unter Manjaro-ARM unerwarteterweise Probleme mit dem Original-Installationsskript haben solltest (Punkt 4), kannst du alternativ diesen Installationsweg wählen.

a) Benutzer "iobroker" erstellen
Überprüfe, ob der Benutzer iobroker existiert und erstelle ihn, falls nicht:
id iobroker &>/dev/null || sudo useradd -m -s /usr/sbin/nologin iobrokerHinweis: Dieser Befehl erstellt einen Benutzer namens `iobroker` mit einem Home-Verzeichnis, aber ohne eine Login-Shell, was bedeutet, dass er sich nicht direkt anmelden kann. Prüfen mit:
id iobroker
Optional, die Zugriffsrechte anpassen:
sudo chmod -v 755 /home/iobroker(von 0700 in 0755)

Benutzer zur "iobroker"-Gruppe hinzufügen,um auf die ioBroker-Verzeichnisse zugreifen zu können:
sudo usermod -a -G iobroker $USERPrüfen mit:
id $USER
b) Installiere ioBroker

Das Original-Debian-Installationsskript von ioBroker setzt aktiv die Eigentümerschaft des ioBroker-Installationsverzeichnisses (/opt/iobroker) auf den Benutzer iobroker. Dies wird typischerweise mit dem Befehl "chown -R iobroker:iobroker /opt/iobroker" erreicht, um sicherzustellen, dass alle Dateien und Verzeichnisse korrekt dem iobroker-Benutzer zugewiesen sind.

In meinem alternativen Installationsansatz verwende ich eine temporäre Bash-Shell-Sitzung, die unter dem Benutzer iobroker läuft, um die Installationsbefehle auszuführen. Dadurch werden die Dateien von Beginn an unter dem korrekten Benutzer erstellt, was die nachträgliche Anpassung der Eigentümerschaft überflüssig macht. Installiere die Adapter nacheinander, um mögliche Probleme während der Installation leichter zu bewerkstelligen.

Wichtig: Nach erfolgreicher Installation von ioBroker sollten Befehle wie "npm install iobroker.zwave2", "iob stop", "iob fix" oder "reboot" ohne die Verwendung von sudo ausgeführt werden.

Installiere den ioBroker.js-Controller:
sudo su -s /bin/bash -c "cd /opt/iobroker && npm install iobroker.js-controller@stable --unsafe-perm --no-audit" iobroker

Admin-Adapter installieren:
sudo -u iobroker bash -c "cd /opt/iobroker && npm install iobroker.admin@stable --unsafe-perm --no-audit"(ja, diese kürzere Syntax funktioniert auch)

Web-Adapter installieren:
sudo -u iobroker bash -c "cd /opt/iobroker && npm install iobroker.web@stable --unsafe-perm --no-audit"
Backitup-Adapter installieren:
sudo -u iobroker bash -c "cd /opt/iobroker && npm install iobroker.backitup@stable --unsafe-perm --no-audit"
Discovery-Adapter installieren (nutze ich nicht):
sudo -u iobroker bash -c "cd /opt/iobroker && npm install iobroker.discovery@stable --unsafe-perm --no-audit"
Um ioBroker zu starten, kannst du den folgenden Befehl verwenden:
sudo -u iobroker /opt/iobroker/iobroker startErsteinrichtung von ioBroker durchzuführen:
sudo -u iobroker /opt/iobroker/iobroker setup first
Status des ioBroker-Controllers:
sudo -u iobroker /opt/iobroker/iobroker status
ioBroker Upgrade:
sudo -u iobroker /opt/iobroker/iobroker stop
sudo -u iobroker /opt/iobroker/iobroker update
sudo -u iobroker /opt/iobroker/iobroker upgrade self
sudo -u iobroker /opt/iobroker/iobroker upgrade
sudo -u iobroker /opt/iobroker/iobroker start

c) Systemstart ioBroker
Um ioBroker auf Manjaro so zu konfigurieren, dass es beim Systemstart automatisch startet, musst du einen systemd-Service manuell einrichten.

Service-Datei erstellen:
sudo nano /usr/lib/systemd/system/iobroker.serviceInhalt der Service-Datei:
Zitat[Unit]
Description=ioBroker Server
Documentation=http://iobroker.net
After=network.target redis.service influxdb.service mysql-server.service mariadb-server.service
Wants=redis.service influxdb.service mysql-server.service mariadb-server.service

[Service]
Type=simple
User=iobroker
Environment="NODE=$(which node)"
ExecStart=/usr/bin/bash -c '${NODE} /opt/iobroker/node_modules/iobroker.js-controller/controller.js'
Restart=on-failure
RestartSec=3s

[Install]
WantedBy=multi-user.target
Wichtig: Passe den 'ExecStart'-Pfad an deine Node.js-Installation an.

Berechtigungen setzen und Service aktivieren:
sudo chmod 644 /usr/lib/systemd/system/iobroker.service
sudo systemctl daemon-reload
sudo systemctl enable iobroker.service

Hinweis: Wenn du Änderungen an der Konfiguration vornehmen musst, kannst du die Service-Datei bearbeiten und danach "sudo systemctl daemon-reload" und "sudo systemctl restart iobroker.service" ausführen, um die Änderungen anzuwenden.

Erstelle den symbolischen Link:
sudo ln -s /usr/lib/systemd/system/iobroker.service /etc/systemd/system/multi-user.target.wants/iobroker.service
Überprüfe den Link:
ls -l /etc/systemd/system/multi-user.target.wants/iobroker.service

Starte den ioBroker-Dienst:
sudo systemctl start iobroker.service
Service-Status überprüfen:
sudo systemctl status iobroker.service(Beenden mit "Q")

Nachdem du diese Schritte abgeschlossen hast, sollte ioBroker automatisch starten, wenn dein System hochfährt. Wenn du Änderungen an der Konfiguration vornehmen musst, kannst du die Service-Datei bearbeiten und danach "sudo systemctl daemon-reload" und "sudo systemctl restart iobroker.service" ausführen, um die Änderungen anzuwenden.

d) Überprüfe oder passe die Sudo-Berechtigungen des ioBroker-Benutzers an:
sudo nano /etc/sudoers.d/iobrokerDiese sieht bei mir so aus:
Zitatiobroker ALL=(ALL) ALL
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/shutdown
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/halt
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/poweroff
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/reboot
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/systemctl start
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/systemctl stop
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/mount
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/umount
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/systemd-run
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/make
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/ping
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/setcap
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/vcgencmd
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/cat
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/df
iobroker ALL=(ALL) NOPASSWD: /usr/sbin/ldconfig
ALL ALL=NOPASSWD: /usr/sbin/systemctl start iobroker
ALL ALL=NOPASSWD: /usr/sbin/systemctl stop iobroker
ALL ALL=NOPASSWD: /usr/sbin/systemctl restart iobroker
ALL ALL=(iobroker) NOPASSWD: /usr/sbin/node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js *

Der iobroker-Benutzer hat ohne Passworteingabe weitreichende Berechtigungen, darunter das Herunterfahren, Neustarten, Starten von Diensten und Ausführen von Befehlen auf dem System sowie spezielle Berechtigungen für den iobroker-Dienst. Es ist wichtig, dass die Pfade in der sudoers-Konfiguration genau mit den tatsächlichen Installationspfaden der Befehle auf deinem System übereinstimmen. Diese Datei sollte mit chmod 440 gesichert werden.
sudo chmod 444 /etc/sudoers.d/iobrokerWenn du die Datei bearbeiten möchtest, kannst du die Berechtigungen kurz auf chmod 644 setzen:
sudo chmod 644 /etc/sudoers.d/iobrokerNachdem du die erforderlichen Bearbeitungen vorgenommen hast, solltest du die Berechtigungen jedoch erneut auf chmod 444 setzen, um die Sicherheit der Datei zu gewährleisten.

Du kannst den ioBroker-Fixer ausführen, falls auf deinem System irgendwo noch Berechtigungen oder Einstellungen nicht korrekt gesetzt sind. Die Meldungen wie 'sudo: apt-get: Befehl nicht gefunden' im Abschnitt 'Installing prerequisites (1/5)' kannst du ignorieren, da sie nur unter Debian funktionieren und in diesem Fall nicht relevant sind. Falls benötigte Pakete fehlen, können sie mit 'pacman' installiert werden:
iob stop
curl -fsSL https://iobroker.net/fix.sh | bash -
iob start

Hier mein Ergebnis am Ende, nachdem durch den ioBroker-Fixer die Autostart-Funktion für den ioBroker-Dienst aktiviert wurde - hatte ich vergessen (Created symlink /etc/systemd/system/multi-user.target.wants/iobroker.service → /usr/lib/systemd/system/iobroker.service):
ZitatYour installation was fixed successfully
Run iobroker start to start ioBroker again!

ioBroker kann nun über die IP im Webbrowser aufgerufen werden http://<IP-Adresse>:8081 und eingerichtet werden.


Jo

#2
Für mein Projekt nutze ich das Z-Wave Modul RaZberry 7 (ZME_RAZBERRY7)


Standardmäßig wird der UART des Raspberry Pi 4 vom integrierten Bluetooth-Modul belegt. Um den UART für die serielle Kommunikation über die GPIO-Pins – zum Beispiel für das Z-Wave Modul – freizugeben, sind spezifische Anpassungen in der Datei /boot/config.txt erforderlich. Durch diese Anpassungen wird das Bluetooth-Modul deaktiviert und der UART aktiviert:

sudo nano /boot/config.txt
Zitatdtoverlay=disable-bt
enable_uart=1
(Nachtrag: RPi5 benötigt nur 'dtoverlay=uart0')

Zusätzlich sind Änderungen in der Datei /boot/cmdline.txt notwendig, um die serielle Kommunikation für das Z-Wave Modul zu konfigurieren:
sudo nano /boot/cmdline.txtEntferne den Eintrag "console=serial0,115200". Diese Änderung verhindert, dass der Serial Port für Konsolenausgaben genutzt wird, was für die Verwendung des Z-Wave Moduls entscheidend ist.

Nach diesen Anpassungen aktualisiere die Systembibliotheken und füge den Benutzer iobroker zur Gruppe uucp hinzu, um Zugriff auf den Serial Port zu gewähren:
sudo ldconfig
sudo usermod -a -G uucp iobroker
sudo reboot
Nach dem Neustart sind die Änderungen aktiv und der Serial Port ist für die Nutzung mit dem Z-Wave Modul bereit.

Die Gruppenmitgliedschaft des Benutzers iobroker kannst du mit dem folgenden Befehl überprüfen:
groups iobroker
Den Serial Port des RaZberry 7 Moduls findest du mit diesem Befehl:
ls -l /dev/ttyA*In meinem Fall ist es /dev/ttyAMA0, den ich im zwave2 Adapter von ioBroker als "Serielle Schnittstelle auswählen" eingetragen habe.



Achtung! Im ioBroker Backup sind keine Z-Wave Geräte enthalten. Nur mit Z-Way kann ein Backup vom Gateway der inkludierten Z-Wave Geräte erstellt werden.

Da Z-Way nicht über das AUR (Arch User Repository) für Manjaro verfügbar ist, habe ich das Razberry-System auf einer SD-Karte unter Debian 11 (Bullseye) installiert. Für die Erstinstallation auf einem neuen Raspberry Pi habe ich die Anleitung von Z-Wave.Me genutzt.

Die SD-Karte nutze ich ausschließlich für spezielle Aufgaben wie Firmware-Updates (Stand April 2023: Version 7.38), Backups und Wiederherstellungsprozesse des Razberry-Moduls. Um sie zu verwenden, stecke ich einfach die SD-Karte ein und trenne die USB-SSD, damit das System von der SD-Karte bootet. Dieses Verfahren erlaubt es mir, gezielte Wartungs- und Update-Aktionen durchzuführen, ohne dabei meine primäre Installation auf Manjaro zu beeinflussen.

Ich habe erfolgreich eine Migration von meinem alten RaZberry2 Z-Wave-Modul zum neuen RaZberry7 durchgeführt, indem ich die Backup- und Restore-Funktionen genutzt habe.


Jo

#3
Linux Pi-System Monitor

Da für RPi-Monitor (rpi2) bereits seit geraumer Zeit keine Updates mehr verfügbar sind und es ausschließlich für Debian entwickelt wurde, verwende ich ein kleines JavaScript. Dieses überwacht die CPU-Temperatur und die Betriebszeit eines Raspberry Pi-Systems und speichert diese Informationen regelmäßig in ioBroker-Datenpunkten. Wer mehr Informationen benötigt, kann das gerne als Vorlage nutzen und erweitern.

// V24.05.003
// Linux Pi-System Monitor
// Bessere Fehlerbehandlung und optimierter Code verwendet nun async/await.
//
// Das Skript überwacht die CPU-Temperatur und die Uptime eines Raspberry Pi-Systems,
// und speichert diese Informationen regelmäßig in ioBroker-Datenpunkten,
// wobei die Temperatur auf eine Stelle und die Uptime auf zwei Stellen hinter dem Komma begrenzt wird.

const { exec } = require("child_process");
const util = require("util");
const execAsync = util.promisify(exec);

// Pfad für die Datenpunkte
const dataPath = "javascript.0.linux-pi-system";

// Funktion zur Aktualisierung oder Erstellung eines Zustands
async function updateOrCreateState(path, value) {
    try {
        const obj = await getObjectAsync(path);
        if (obj) {
            await setStateAsync(path, value, true);
        } else {
            await createStateAsync(path, value, true);
        }
    } catch (err) {
        log(`Fehler beim Aktualisieren oder Erstellen des Zustands: ${err}`);
    }
}

// Funktion zur Speicherung der CPU-Temperatur
async function saveCPUTemperature() {
    try {
        const { stdout } = await execAsync("cat /sys/class/thermal/thermal_zone0/temp");
        const millikelvin = parseFloat(stdout.trim());
        const celsius = (millikelvin / 1000).toFixed(1);
        await updateOrCreateState(`${dataPath}.temperature`, celsius);
    } catch (error) {
        log(`Fehler beim Abrufen der CPU-Temperatur: ${error}`);
    }
}

// Funktion zur Umrechnung und Speicherung der Uptime
async function saveUptime() {
    try {
        const { stdout } = await execAsync("cat /proc/uptime");
        const uptimeInSeconds = parseFloat(stdout.split(' ')[0]);
        const uptimeInHours = (uptimeInSeconds / 3600).toFixed(2);
        await updateOrCreateState(`${dataPath}.uptime`, uptimeInHours);
    } catch (error) {
        log(`Fehler beim Abrufen der Uptime: ${error}`);
    }
}

// Initialer Aufruf der Funktionen
saveCPUTemperature();
saveUptime();

// Zeitplan für die regelmäßige Ausführung
schedule("*/5 * * * *", saveCPUTemperature); // Alle 5 Minuten die CPU-Temperatur abrufen und speichern
schedule("*/10 * * * *", saveUptime); // Alle 10 Minuten die Uptime abrufen und speichern


PS: Inzwischen ist der Adapter ioBroker.info DEPRECATED und ich nutze diesen nicht mehr.