LMS auf Raspberry Pi

Hier wird beschrieben, wie man den LMS Server auf einem Raspberry Pi 4 installiert.

Voraussetzung

  • Raspberry Pi OS ist installiert
  • SSH Zugang ist eingerichtet

Installation

OS aktualisieren

sudo apt-get update && sudo apt-get dist-upgrade

Audio-Formate installieren

sudo apt-get install libsox-fmt-all libflac-dev libfaad2 libmad0

Download LMS

Die Versionen gibt es hier. Für den Raspi 4 brauchen wir die ARM Verison.

cd 
wget http://downloads.slimdevices.com/nightly/8.3/lms/fe81659879fef1a51537fb579b8e57b6a7b987d9/logitechmediaserver_8.3.0~1630708871_arm.deb
sudo apt install ./logitechmediaserver_8.3.0~1630708871_arm.deb

Log überprüfen, ob alles ok installiert wurde

tail -n 100 /var/log/squeezeboxserver/server.log

Links

 

 

Octopi über Spacelynk (lua) ausschalten

Ich betreibe meinen 3D Drucker über einen Octopi. Die ganze Printlandschaft kann ich über einen Shelly-Switch einschalten. Das ausschalten ist aber etwas kniffliger, weil Octopi zuerst sauber ausgeschaltet (shutdown) werden muss, bevor der Shelly-Switch den Strom komplett ausschalten kann.

 

Dazu verwende ich die API, welche von Octopi zu verfügung gestellt wird:

  • API CORS muss aktiviert sein
  • User muss über System rechte verfügen
  • API-Key muss unter dem User erstellt werden. Dieser kann dann für den Post-Request verwendet werden

Folgender Postrequest restartet den server:

curl --location --request POST 'http://octopi.home.arpa/api/system/commands/core/reboot?Host=spacelynk.home.arpa' \

--header 'X-Api-Key: xxxxxxxxxx'

 

Opnsense: VPN Client wechseln

Ich betreibe auf der Opnsense einen OpnVPN Client, der sich mit einem VPN-Anbieter verbindet. Der VPN-Anbieter bietet mehrere Server an, auf welche man connecten kann. Diese können hier definiert werden:

Der VPN-Anbieter ist als Gateway konfiguriert. Um sicherzustellen, dass das Gateway den korrekten Client verwendet, muss dieser in den Assignments zugewiesen werden. Wobei das System pro konfigurierten Client automatisch ein “Network-Port” erstellt. In diesem Beispiel ist mit “ovpnc3” die “ExpressVPNClient Switzerland1” gemeit. Das muss man leider wissen:

  • “ovpn” = es handelt sich um openvpn
  • c = es handelt sich um einen client (s wäre server)
  • 3 = fortlaufende Nummer.

Grafana und Influxdb

Installation auf einem Armbian, 21.02.3 Focal

Installation Influxdb

Installation wird auch hier beschrieben: https://docs.influxdata.com/influxdb/v1.8/introduction/install/

sudo wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc) 
sudo echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" > sudo /etc/apt/sources.list.d/influxdb.list

Influxdb installieren

sudo apt-get update && sudo apt-get install influxdb 
sudo service influxdb start

Nun kann auf die Influx-Shell zugegriffen werden

influx

Benutzer anlegen

CREATE USER "admin" WITH PASSWORD '<adminpassword>' WITH ALL PRIVILEGES
CREATE USER "spacelynk" WITH PASSWORD '<userpassword>'

Datenbank anlegen und Berechtigung erteilen

CREATE DATABASE "knxdb"
GRANT ALL ON "knxdb" TO "user"

Influxdb konfigurieren

Das Konfig-File der Influx-DB liegt unter /etc/influxdb/…

sudo vi /etc/influxdb/influxdb.conf

Sicherstellen, dass folgende Punkte gesetzt sind:

[http] 
enabled = true 
bind-address = ":8086" 
auth-enabled = true
log-enabled = true 
write-tracing = false 
pprof-enabled = true 
https-enabled = false 
https-certificate = "/etc/ssl/influxdb.pem"

Service restarten

sudo service influxdb restart

Grafana installieren

Installation

Installation wird hier beschrieben: https://grafana.com/docs/grafana/latest/installation/debian/

Konfiguration

Die Configuration von Grafana findet man hier

sudo vi /etc/grafana/grafana.ini
# Grafana soll als eingebettetes Frame angezeigt werden können:
allow_embedding = true
[auth.anonymous]
# enable anonymous access
enabled = true

# specify organization name that should be used for unauthenticated users
org_name = Home

# specify role for unauthenticated users
org_role = Viewer

# mask the Grafana version number for unauthenticated users
hide_version = false
[date_formats]
# For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/

# Default system date format used in time range picker and other places where full time is displayed
full_date = DD-MM-YYYY HH:mm:ss

# Used by graph and other places where we only show small intervals
interval_second = HH:mm:ss
interval_minute = HH:mm
interval_hour = DD/MM HH:mm
interval_day = DD/MM
interval_month = MM-YYYY
interval_year = YYYY

 

Telegraf installieren

Telegraf wird benutzt um die Modbus-Daten abzufragen und nach influxdb zu senden.

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install telegraf
sudo service telegraf start

Influxdb als output plugin konfigurieren

DB und User auf influxdb erstellen

CREATE DATABASE "telegraf"
CREATE USER "telegraf" WITH PASSWORD "<userpassword>"
GRANT ALL ON "telegraf" TO "telegraf"

Konfig anpassen

sudo vi /etc/telegraf/telegraf.conf
[[outputs.influxdb]]
urls = ["http://127.0.0.1:8086"] #influxdb und telegraf laufen auf dem selben server
database = "telegraf"
## HTTP Basic Auth
username = "telegraf"
password = "<password>"

Modbus als input plugin konfigurieren

sudo vi /etc/telegraf/telegraf.conf

Alle input Plugins (CPU, etc.) deaktivieren. Anschliessend Modubs konfigrieren:

[[inputs.modbus]]
name = "SE_PowerTagLink_F21"
slave_id = 150
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Garage - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]}
]
[[inputs.modbus]]
name = "SE_PowerTagLink_Hauszuleitung"
slave_id = 154
timeout = "5s"
controller = "tcp://<ip>:502"
holding_registers = [
{ name = "PowerTag_Hauszuleitung - Current A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [2999,3000]},
{ name = "PowerTag_Hauszuleitung - Current B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3001,3002]},
{ name = "PowerTag_Hauszuleitung - Current C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3003,3004]},
{ name = "PowerTag_Hauszuleitung - Voltage A-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3027,3028]},
{ name = "PowerTag_Hauszuleitung - Voltage B-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3029,3030]},
{ name = "PowerTag_Hauszuleitung - Voltage C-N", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3031,3032]},
{ name = "PowerTag_Hauszuleitung - Voltage A-B", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3019,3020]},
{ name = "PowerTag_Hauszuleitung - Voltage B-C", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3021,3022]},
{ name = "PowerTag_Hauszuleitung - Voltage C-A", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3023,3024]},
{ name = "PowerTag_Hauszuleitung - Active Power", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3059,3060]},
{ name = "PowerTag_Hauszuleitung - Power Factor", byte_order = "ABCD", data_type = "FLOAT32-IEEE", scale=1.0, address = [3083,3084]},
{ name = "PowerTag_Hauszuleitung - Active Energy No reset", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3203,3204,3205,3206]},
{ name = "PowerTag_Hauszuleitung - Active Energy Resetable", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3255,3256,3257,3258]},
{ name = "PowerTag_Hauszuleitung - Active Energy Write Value", byte_order = "ABCDEFGH", data_type = "INT64", scale=1.0, address = [3259,3260,3261,3262]}
]

Commands

Login

influx -username <username> -password <password>

Benutzer anzeigen

show users

Zeige alle DBs

show databases

Zeitserie löschen (Beispiel)

DROP SERIES FROM "rawdata" WHERE "name" = 'XTH_U01-01 humidity'

 

 

HC2 Armbian und Logitech Media Server / OS auf HD

Hier beschreibe ich, wie man eine HC2 mit Armbian installiert und einem Logitech Media Server darauf betreibt.

HC2 Armbian Image & Installation HD

Die Installation von Armbian ist eigentlich “outofthebox”. Da die HC2 aber über eine SD Karte verfügt und die Lebensdauer entsprechend beschränkt ist, ist es von Vorteil, die in der HC2 eingebaute Disk als OS-Disk zu verwenden. Man kann leider die HC2 nicht über die HD Vollkommen boot-fähig machen. Fast nicht. Ich beschreibe hier, wie ich das gelöst habe:

Image / SD

  • Download (Focal-Image) & Installation: https://www.armbian.com/odroid-hc1/
  • SSH Standard Login: root  Password: 1234
    • Starte  das Dienstprogramm armbian-config und
    • gehe in den Bereich System -> DTB und
    • wähle die optimierte Kartenkonfiguration für Odroid HC1. Die gleiche Konfiguration gilt auch für HC2 und MC1.

Disc / HD

  • Erstelle auf der HD zwei Partitionen. Eine für das Betriebssystem (20G) und eine für die Daten (Rest)
  • HD identifizieren
sudo fdisk -l
  • Partitionen erstellen
sudo fdisk /dev/sda
d= delete partition
n= create partition
w=write partition
  • recheck
sudo fdisk -l
  • Erstelle Formatierung
sudo mkfs.ext4 -L os /dev/sda1
sudo mkfs.ext4 -L data /dev/sda2
  • Erstelle Mount-Verzeichnisse
sudo mkdir /osFiles
sudo mkdir /mnt/files
  • /etc/fstab anpassen: Mount Patitionen
#Mounts
/dev/sda1 /osFiles ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1
/dev/sda2 /mnt/files ext4 defaults,noatime,nodiratime,commit=600,errors=remount-ro 0 1
  • Reboot
  • Files auf neue OS-Partition (/osFiles) kopieren.
    Achtung: Alle Services (wie den logitechmediaserver) vorher beenden
sudo rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/osFiles"} / /osFiles
  • SDA uuid (UUID) herausfinden:
sudo blkid

/dev/sda1: LABEL="os" UUID="975a0396-5016-42b3-a66e-fe5276a36797" TYPE="ext4" PARTUUID="262deb28-e8fe-5d4d-b3a4-808b44571e85"
  • Im boot.ini die neue UUID setzen bzw. ersetzen:
sudo vi /boot/boot.ini
.
setenv rootdev "UUID=975a0396-5016-42b3-a66e-fe5276a36797"
.
  • reboot.
  • Wenn alles geklappt hat, sollte neu von sda1 gebootet werden. Check:
mount | grep '/ '
  • sollte folgendes ausgeben
/dev/sda1 on / type ext4 (rw,noatime,errors=remount-ro,commit=600,data=ordered)
  • Über armbian-config können neue U-boot Versionen eingespielt werden. Diese müssen weiterhin auf die SD-Karte gespiehlt werden. Deswegen soll das /boot Verzeichnis weiterhin auf die SD-Karte zeigen:
  • Microsd karte wieder einbinden.
  • erstelle  /mnt/microsd:
sudo mkdir /mnt/microsd
  • fstab erweitern
  • Editiere /etc/fstab, und füge hinzu:

/dev/mmcblk0p1 /mnt/microsd auto defaults 0 0 
/mnt/microsd/boot /boot none defaults,bind 0 0
  • Mount durchführen und prüfen ob korrekt gemountet wird
sudo mount /mnt/microsd && sudo mount /boot
  • Wenn alles ok ist

sudo reboot

Damit läuft das System nun (grösstenteils 😉 ) auf der HD anstelle der SD. Das entlastet die SD enorm und führt zu einem längeren Leben der SD Karte.

LMS Installation

LMS Download-Link: https://forums.slimdevices.com/showthread.php?98711-Logitech-Media-Server-Versions

Damit der LMS auf dem Armbian Focal läuft, müssen die Perl-Pakete selber kompiliert werden:

cd ~
sudo apt install nasm make gcc rsync patch g++ libc-bin zlib1g-dev libgd-dev libmodule-install-perl
git clone https://github.com/Logitech/slimserver-vendor.git
cd slimserver-vendor/CPAN/
./buildme.sh

Jetzt LMS downloaden und installieren

cd ~
wget http://downloads.slimdevices.com/nightly/8.1/lms/c9adb5f63e54ec0d72e6266e75fb73989f4be345/logitechmediaserver_8.1.2~1614990085_arm.deb
sudo dpkg -i logitechmediaserver_8.1.2~1614990085_arm.deb

Den LMS stoppen, da er noch nicht läuft. siehe

tail -f /var/log/squeezeboxserver/server.log
sudo service logitechmediaserver stop

Nun die compilierten Perl-Binaries nach LMS kopieren:

sudo cp -r ~/slimserver-vendor/CPAN/build/arch/5.30/arm-linux-gnueabihf-thread-multi-64int /usr/share/squeezeboxserver/CPAN/arch/5.30/

Und den Logitech Media Server wieder starten

sudo service logitechmediaserver start

Das wars. Damit rennt der LMS auf einer HC2. Brower starten und link aufrufen:

http://ip-adresse:9000

Links

SL SSH-Zugang

Hier beschreibe ich, wie man Root Zugriff auf einen SL bekommt:

  • Auf dem SL läuft ein SSH-Server, basierend auf dropbear. Um Zugriff zu erlangen, kann die SD-Karte entnommen und in einem Linux gemountet werden.
  • Anschliessend ein Zertifikat erstellen
  • ssh-keygen -b 4096
  • Das Public-Zertifikat, welches gerade erstellt wurde, unter authorized_keys abspeichern
  • tee -a /media/ralwet/73a6c7bb-21a8-49e2-af43-04dd5942473e/etc/dropbear/authorized_keys < ~/.ssh/id_rsa.pub
  • SD-Karte wieder einbauen
  • nun über SSH zugreifen
  • ssh root@<IP>

Sinn und zweck war es, zusätzliche ipk-Pakete  (luaMysql-IPK ) für eine mysql Verbindung per Lua zu installieren:

  • Login auf SL
  • Installieren der drei Pakete
  • opkg install zlib_1.2.11-1_imx6.ipk
    opkg install liblua-mysql_2.2.0-6_imx6.ipk
    opkg install libmysqlclient_5.1.73-1_imx6.ipk

     

 

Links

  • https://oldwiki.archive.openwrt.org/doc/howto/dropbear.public-key.auth
  • https://linux.die.net/man/8/dropbear
  • https://www.systutorials.com/how-to-passwordless-ssh-to-an-openwrt-router/
  • https://openwrt.org/docs/guide-user/additional-software/opkg

ioBroker: Node.js Update / Reinstallation ioBroker

Ich betreibe seit einigen Jahren ioBroker, welches auf nodejs basiert. Heute war es an der Zeit die Nodejs Version von 8 auf 12 anzuheben, was leider nicht ganz ohne Probleme funktionierte. Hier fasse ich kurz zusammen, welche Schritte bei meiner Installation nötig waren. Die Schritte basieren auf diesem Howto.

Die einzige, im Howto beschriebenen und für mich funktionierende Lösung für das Update war, die komplette Reinstallation des ioBrokers. Dabei wird zuerst die neue Node.js Version installiert. Dann ein Backup des iobroker-data Verzeichnisses gezogen, die ioBroker-Installation gelöscht, neu installiert und dann das Backup wieder zurück gespielt:

Installation neue Node.js Version 12

cd /opt/iobroker
iobroker stop
cd

# install nodejs
curl -sLf https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt-get install -y nodejs

# install iobroker
curl -sLf https://iobroker.net/install.sh | bash -

Bei einer Aktualisierung von Node.js müssen bereits installierte JavaScript- Module im ioBroker-Ordner aktualisiert werden, da sonst Fehler bei deren Ausführung auftreten. Hier traten bei mir dann die Probleme auf. Die einzige bei mir funktionierende Lösung war, den ioBkoker neu zu installieren:

Backup und Neuinstallation ioBroker

  • Backup des iobroker-data Verzeichnisses nach “Home” ziehen
  • Die alte Installation löschen
  • ioBroker neu installieren
cp -r /opt/iobroker/iobroker-data ~/iobroker-data 
sudo rm -r /opt/iobroker/ 
sudo mkdir /opt/iobroker
cd /opt/iobroker
curl -sL https://iobroker.net/install.sh | bash -

ioBroker wird nach der Installation wieder gestartet. Wir stoppen ioBroker deswegen wieder:

iobroker stop

Nun löschen wir das neu erstellte iobroker-data Verzeichnis und kopieren das Backup

rm -r /opt/iobroker/iobroker-data
cp -r ~/iobroker-data /opt/iobroker/iobroker-data

Während meinen Installations-Bemühungen habe ich festgestellt, dass die Berechtigungen immer wieder durcheinander gehen. Es existiert deswegen ein korrektur-Script, welches die Berechtigungen des ioBrokers wieder gerade zieht. Es ist ratsam dieses jetzt durchzuführen:

cd /opt/iobroker
curl -sL https://iobroker.net/fix.sh | bash -

Jetzt den ioBroker neu starten

iobroker start

Der Start kann jetzt sehr lange dauern. Der ioBroker merkt jetzt, dass die Adapter (gem. Backup) fehlen und installiert diese neu nach.

Um zu schauen, wo die Installation steht, kann man das log konsultieren

tail -f /opt/iobroker/log/iobroker.current.log

Ein Adapter (zigbee) liess sich jetzt immer noch nicht installieren. Diesen habe ich dann noch manuell installiert:

cd /opt/iobroker
iobroker stop
sudo -H npm install iobroker.zigbee --unsafe-perm

Ganz zum Schluss dann nochmals die Berechitigungen gerade ziehen, um sicher zu gehen…

cd /opt/iobroker
curl -sL https://iobroker.net/fix.sh | bash -

Das wars. Jetzt den Raspi neu booten und sich über die neue ioBroker-Installation freuen 🙂

sudo reboot

 

Raspberry Images komprimieren/verkleinern

Hier beschreibe ich, wie man Images einer ganzen HD/SD ziehen kann. DD erstellt 1:1 Kopien und die daraus resultierenden Images sind entsprechend gleich gross wie die ursprüngliche HD/SD. Wenn man nun ein Image eines Raspberry Pis auf eine kleinere SD kopieren möchte, gibt es ein schönes Tool dazu: Pishrink

Hier wird schön beschrieben, wie man das Tool installieren und nutzen kann.

Linux Referenz Card

Hilfe

man cmdLesen des Manualeintrags zu cmd
man -k printfDurchsucht den Index der Manpages (Whatis-Datenbank) nach Stichworten (hier printf)
type cmdAnzeigen der Art, resp. des Typs von cmd
file fileAnzeigen der Art, resp. des Typs von file
whereis cmdSuchen des Speicherortes von cmd

Allgemeine Commands

dateAusgabe der Zeit und des Datums
echo [-n][Argumente]Ausgabe der Argumente (-n keine NewLine am Ende)

File/Directory Commands

pwdAnzeigen des aktuellen Datums
cd [directory]Wechseln des aktuellen Directories zu directory
ls [files(s)/director(ies)]Anzeigen von Files / Directories
cp source(s) targetKopieren von Files / Directories
rm file(s) / director(ies)Löschen von Files / Directories
mv file(s) / director(ies)Verschieben (auch Umbenennen) von Files / Directories
mkdir [-p] directory(ies)Erstellen eines leeren Directories (-p ganze Trees)
ln [-s] source targetErstellen eines Links (-s symbolischer Link)

File Commands

Wenn kein file(s) Parameter => Lesen von StdIn

cat [file(s)]Ausgeben / Zusammenhängen von Files
more, less file(s)Seitenweises Lesen von Files
cmp, diff file1 file2Vergleichen zweier Files
touch file(s)/directory(ies)Aktualisieren des Datums von Files/Directory(ies)

File Filter Commands

Wenn kein file(s) Parameter => Lesen von StdIn

grep [-cinrv] pattern [file(s)]Suchen nach Mustern (z.B. Grep -i “user” ~/.profile)
head [-n count] [file(s)]Ausgabe der ersten n Zeilen (Ohne Parameter n: n=10)
tail [-f] [-n count] [file(s)]Ausgabe der letzten n Zeilen (Ohne Parameter n: n=10)
cut -crange [file(s)]Ausschneiden von Textblöcken (z.B. cut -c10-20 index.html)
sort [file(s)]Sortieren (Mehrere Files werden gesamthaft sortiert
wc [-lwc] [file(s)]Zählen von Zeilen (-l), Wörtern (-w), Zeichen (-c)
tr char-old char-newErsetzen von Zeichen (z.B.: tr a A < index.html)
sed cmd [file(s)]Stream-Editor (z.B. sed s/test/TEST/g index.html)
awk cmd [file(s)]Tabellenstream-Editor (z.B.: awk ‘{print $2}’ /etc/fstab)

User & Zugriffsrechte

id, fingerAnzeigen der persönlichen Identifikation
passwdÄndern des Passwortes
who, rwhoAnzeigen der eingeloggten Benutzer
who: localhost, rwho: remotehosts
chmod mode target
mode: u=rwx,g=rwx,o=rwx
mode (oktal): r=4,w=2,x=1
Umdefinieren der Zugriffsrechte von Files/Directory(ies)
u: User (owner), g: Gropu, o: Others (world)
z.B. mode o=rwx, g=rx, o= – ergibt 750
umask [mode]Zeigen/Setzen der Defaultrechte beim erstellen von Files/Directories

Prozesse, Job-Control

ps [-alf]Anzeigen der aktuellen Prozesse
jobsAnzeigen der Prozesse im Hintergrund (BIC)
bg [%job-nummer]Starten eines gestoppten Prozesses im Hintergrund (BIC)
fg [%job-nummer]Starten eines Prozesses im Vordergrund (BIC)
kill [-signal] processs-idSenden eines Signals an einen Prozess
<ctrl> CAbbrechen/Beenden eines Prozesses im Vordergrund
<ctrl> ZStoppen eines Prozesses im Vordergrund und Verschieben in den Hintergrund;
=> muss mit bg/fg gestartet werden.

Shell Commands

.scriptScript wird in aktueller Shell abgearbeitet (kein Subprozess)
historyAusgabe der Commandhistory
exitTerminieren der Shell; Logout auf Terminal
alias name=defDefinition eines alias
alias [name]Ausgabe eines definierten Alias; Ohne Parameter [name] alle
unalias nameLöschen eines Alias
(set) var=defZuweisen eines Wertes an eine lokale Variable (z.B. myvar=’test’)
(set) var=$(cmd)Zuweisen der Ausgabe eines Commands an eine lokale Variable
unset varLöschen einer Variable
$varZugriff auf Variable var (z.B. echo $myvar)
export var=valueDefinition einer globalen Umgebungsvariablen (exportieren)
set, export, env, printenvAusgabe aller definierten Variablen
set -oAusgabe der Shell Optionen
set (-/+)o optionSetzen (-)/Löschen(+) einer Shell Option
<crtl> DEnd-Of-File (Abschluss Standard Input)

Shell-Sonderzeichen

~Home-Directory
*Beliebige Folge von Zeichen (Ohne Folgen mit führendem Punkt)
?Beliebiges Zeichen
[abc]Zeichen a, b oder c
[0-9]Zeichen 0 bis 9
[!abc]Nicht a, b oder C
cmd > fileUmlenken (Redirection) von Standard-Out in ein File
cmd >> fileAnhängen von Standard-Out an ein File
cmd < fileLesen von Standard-In von einem File
cmd 2> file Umlenken von Standard-Err in ein File
cmd >fle 2>&1Umlenken von Standard-Out, Standard-Err nach Standard-Out
cmd | tee fileZeigt Ausgaben am Bildschirm an und speichert gleichzeitig in einem file
\Quoting (Ausmaskieren) des folgenden Zeichens
‘…’Quoting aller eingeschlossenen Zeichen
“…”Quoting aller eingeschlossenen Zeichen ausser $,’,”,\
cmd &Ausführen eines Befehls als Hintergrundprozess
cmd_1; cmd_2; …;Sequentielle Abarbeitung mehrerer Befehle
( cmd_1; cmd_2; .. )Befehlsgruppe in Subshell ausführen
cmd_1 $(cmd_2)Ausgabe des zweiten Commands wird als Argument an den ersten Command übergeben
cmd_1 | cmd_2 | … | cmd_nPipeing (Fliessbandverarbeitung von mehreren Commands

Spezielle Shell Variablen

$?Exit Status des letzten Commands
$#Anzahl Argumente von cmd
$nn-tes Argument von cmd
$ENVVariable für persönliches Shell-Profile
$PATHAktueller Suchpfad für Utilities
$PS1Variable mit Inhalt des primären Prompts
$RANDOMGeneriert einen Random Integer
$SHELLName/Pfad der aktuellen Shell
$HOMEPfad zu Home-Directory

Spezielle Files/Directories

.(Punkt) aktuelles Directory
..(Punkt-Punkt) übergeordnetes Directory
/Root-Directory (Basis des File-Systems)
/etcDirectory für globale Konfigurationen (Schreibgeschützt)
/etc/profile, /etc/profile.dGlobale User-Environment Scripte
/tmpDirectory für temporäre Files (nicht schreibgeschützt)
/devDirectory für alle Devices (z.B. /dev/cdrom, /dev/hda, …)
/dev/nullNull-File (unendliche Senke für nicht erwünschten Output)
~/.profilePersönliches Profile-Script für alle Shells
{x,yz,ww}Brace Expansion
z.B. ls sand{x,yz,ww}wich => sandxwich, …

Sonos: Gut zu wissen

Dieser Beitrag ist “Deprecated”. Sonos ist dabei das schöne Upnp mit ihrer neuen API abzulösen (siehe https://developer.sonos.com/). Es wird wohl zwei API-Versionen geben. Eine für private Developer, für welche eine Cloud-API zur Verfügung gestellt wird und eine für Firmen, welche ein “lokales” API nutzen (und sich dafür zertifizieren) dürfen. Für Entwickler wie mich wäre also zukünftig das Ansteuern der Boxen nur noch über die Cloud möglich, was für mich nicht in Frage kommt. Ich hoffe Sonos bietet da dann doch noch etwas womit die Sonos Boxen über das LAN angesprochen werden können. Aktuell sieht es aber leider nicht so aus. Erste Funktionen, welche ich hier noch beschrieben habe, sind bereits durch Firmware-Updates herausgefallen (z.B. reboot). Wundert euch also nicht, wenn nicht mehr alle Upnp oder HTTP-Calls funktionieren.

Mittlerweile habe ich meine Sonos Boxen verkauft und bin auf eine OpenSource-Lösung, basierend auf Hifiberry und Max2Play umgestiegen. Damit ist es möglich, die gleiche Funktionalität von Sonos mit eigenen Boxen nachzubauen. Wie ich das gemacht habe, werde ich hier dokumentieren – sobald ich Zeit dafür habe.

Hints, Tips und Tricks rund um Sonos

Mein Sonos System umfasst insgesamt 7 Player (1 Sonos Soundbar und 6 Sonos Play:1). Sonos erstellt und unterhält sein eigenes Netz (Sonos-Net) selber. Grundsätzlich funktioniert das “out of the box”. Es kann aber doch manchmal nötig sein das Sonos-Net zu optimieren. Dazu anbei ein paar nützliche Infos:

Tools

Auf jeder Sonos-Box läuft ein Webserver, den man über den Browser ansprechen kann. Dabei können einige nützliche Infos eingesehen oder aber auch Einstellungen vorgenommen werden:

http://IP:1400/support/review Übersicht über die Sonos Box. Hier kann auch die Network-Matrix aufgerufen werden
http://IP:1400/advconfig.htm Einstellen der Root-Bridge (FirstZP und Priority auf „enabled“).
http://IP:1400/reboot Reboot der Sonos Box
http://IP:1400/region.htm WLAN Region sezten  (bei uns EU – Europa)
http://IP:1400/tools.htm Netzwerktools wie Ping, Traceroute, nslookup
http://IP:1400/status Status-Seite
http://IP:1400/wifictrl?wifi=off Stellt das WIFI bis zum nächsten Reboot ab
http://IP:1400/wifictrl?wifi=persist-off Stellt das WIFI Interface komplett ab. Wenn man nur über Kabel arbeiten möchte
http://IP:1400/status/scanresults Scanresults zeigt euch alle WLAN-Verbindungen an, welche von Sonos erreicht wurden. Kann je nachdem noch nützlich sein, für Android Smartphones gibt es da noch bessere Apps
http://<IP>:1400/status/tracks_summary Mit diesem Befehl kannst Du dir die Anzahl der Tracks anzeigen lassen
http://<IP>:1400/status/topology Zeigt die Sonos Topologie mit allen Sonos Playern und Media Servern

Nützliche Links: