Raspberry Pi 3 internen WLAN Adapter abstellen

Ich habe einen RPI 3 mit einem Realtek RTL8192CU 802.11n WLAN Adapter mit externer Stab Antenne der beim einrichten des RPI tadelos lief, aber irgendwann hatte ich nur noch Ärger mit dem Wlan und wußte nicht weiter.
Egal wo und wie ich den Adapter hingestellt hatte, die Verbindung war mies.
Gestern hab ich dann mal das ganze Geraffel aus der Moppedwerkstatt mit in die „Guut Stuub“ genommen, um das System zu sezieren….

Hmmm obwohl der Kasten 1 Meter neben dem Router steht ist die Link Quality nur mit 32 von 70 angegeben und der Signal level lag irgendwo bei 20 von 70?
Moment 70 – hatte der externe Adapter nicht ursprünglich 100 ???

Lange rede kurzer Sinn, obwohl ich den internen WLAN Adapter des RPI3 ausgeschaltet hatte, hat der sich (über ein upgrade?) wieder aktiv gestellt und sich die Einstellungen vom externen Adapter geschnappt.

Also diesmal eine andere Taktik gewählt, um den internen WLAN Adapter auszuknipsen.

Über lsusb meldet der sich als „Bus 001 Device 005: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter
Unter Raspbian GNU/Linux 9 (stretch) meldet er sich als wlxmacaddress.
In der /etc/network/interfaces habe ich nun zusätzlich zum Adapter wlan0 (der interne) diesen Adapter eingebunden und Ihm eine statische Adresse aus meinem Netz gegeben.

/etc/network/interfaces:
auto wlx2cafe4django
allow-hotplug wlx2cafe4django
iface wlx2cafe4django inet dhcp
wpa-ap-scan 1
wpa-scan-ssid 1
wpa-ssid "myssid"
wpa-psk "mypskey"

Nun kommt der Kniff:

/usr/local/bin/wlan0_off.sh

#! /bin/sh

#no internal wlan
sleep 10
lsusb|grep "0bda:8178" && ifdown wlan0

Dieses Script wird über einen Dienst gestartet:

/etc/systemd/system/wlan.service

[Unit]
Description=disable internal wlan
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/wlan0_off.sh

[Install]
WantedBy=multi-user.target

Der Trick (Idee dahinter) ist anstatt den internen WLAN Adapter wie vorher über
blacklist brcmfmac
blacklist brcmutil

zu hart abzuschalten und damit den externen WLAN Adapter zu wlan0 zu machen, diesen im System zu belassen, aber ihn zu deaktivieren, wenn der externe Adapter erkannt wird.

Mal sehen, wie stabil das ganze (upgrade Thematik) bleibt.

bpmcounter.sh Beats per minute

Meine Audiodateien liegen auf einem Debian System und ich stand vor der Thematik das TBPM Tag meiner mp3 Dateien zu pflegen.

Nach längerer Recherche bin ich auf das Paket bpm-tools gestossen, mit dem das zählen der Beats sehr gut funktioniert.

Es würde diesen Beitrag nicht geben, wenn auch das schreiben der Tags funktionieren würde.

bpm-tag hat bei meinen Dateien (idv2.3/2.4) nicht nur das TBPM Feld beschrieben, sondern die Inhalte aller anderen (Ausnahme APIC) Tags gelöscht.

Daher der gute Rat – wer das script nutzen möchte – probiert vorher mit Kopien und nicht mit den einzigen originalen, ob es Nebenwirkungen gibt.

Die Problematik mit den gelöschten Feldern und der Tatsache, dass bpm-tag (nicht der spezifikation entsprechend) kommawerte in die Tags schreibt habe ich also mit dem folgenden Script/wrapper gelöst.

Aus den anderen Beiträgen weiß ich um die Problematik der Zeilenumbrüche – daher das Script als gezipter Anhang.

Folgende Pakete werden (mindestens) vorausgesetzt:


python
eyeD3
sudo apt-get install sox
sudo apt-get install lame
sudo apt-get install libsox-fmt-mp3
sudo apt-get install bpm-tools

Auch wenn es anders in der Hilfe von bpm-tag beschrieben ist – die beiden Schalter bpm-tag -f -n sind nötig, damit bpm-tag nur die bpm zählt und nicht in den Tag schreibt.

Da das zählen etwas Zeitaufwendig ist, wird zuerst mittels eyeD3 nachgesehen, ob das TBPM Feld beschrieben ist, bevor die bpm gezählt werden.
EyeD3 nutze ich (und damit der Wrapper/ das Script) auch zum schreiben der Tags.

Das Script geht rekursiv durch alle Unterordner.
Wem das Script gefällt, sollte den untenstehenden Anhang benutzen und nicht via copy & paste die Zeilen übernehmen, da alle Browser die Zeilen parsen und verarbeiten.


#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
VERSION=0.1

if (( $# < 1 )) ; then
cd "$1"
fi

header() {
# echo ----------------------------------------------------------
echo bpm.sh - adding bpm tag, version $VERSION
echo ----------------------------------------------------------
echo -ne "\n"
}

check_bpm-tools() {
local bpmtagok=$(which bpm-tag)
if [ -z "$bpmtagok" ]; then
echo "you need bpm-tag to run this script"
echo "apt-get install bpm-tools"
exit 1
fi
# checking for eyeD3 ...
local eyed3ok=$(which eyeD3)

if [ -z "$eyed3ok" ]; then
echo "you need eyeD3 (http://eyed3.nicfit.net/) to run this script"
exit 1
fi
}
echo " all tools found."

header
while [ "$1" ]; do
case $1 in
-v) exit 0;;
-c) check_bpm-tools; exit 0;;
-i) cover_img; exit 0;;
esac
shift
done

for d in */ ; do
echo cleaning up $d
cd "$d"
for file in $(find -iname '*.mp3' | sort); do
echo checking "$file"
bpmset=$(eyeD3 "$file" |grep BPM |cut -f2 -d':'|cut -f2 -d ' ')
if [ -z "$bpmset" ]; then
echo -n "no bpm tag "
bpm=$(bpm-tag -f -n "$file" 2>&1 | cut -f2 -d':' | cut -f1 -d '.')
echo "- set bpm to$bpm"
eyeD3 --preserve-file-times "$file" --bpm=$bpm &> /dev/null
else
echo bpm tag is set to $bpmset
fi
echo -ne "\n"
done
cd ..
done
IFS=$SAVEIFS

bpmcounter.sh

Playercheck.sh

Triodes Squeeliteplayer hat ein kleineres Problem, wenn längere Zeit kein Stream gesendet wird. Daher habe ich diesen Workaround geschrieben, der mittels netcat-traditional den LMS Server ausliesst und die Player bei Bedarf ausschaltet.

Werden danach Tracks an den Player gesendet, schaltet dieser sich automatisch wieder ein (LMS standard).

  • chmod +x nicht vergessen 😉

Leider werden die Einrückungen (Tabs) aus dem Script hier nicht übernommen 🙁


#!/bin/bash
## check if any player is playing
## and restart squeezelite if timetoplay is equal on both checks
##vars
port=9090
server=localhost

# use a fresh logfile
mv /tmp/playercheck.log /tmp/playercheck.txt
echo "$(date)">/tmp/playercheck.log
sensors|grep 'Core 0' |awk '{print $3}'|cut -b2,3,4,5,7>>/tmp/playercheck.log

# get number of known players
players=$(printf "player count ?\nexit\n" | nc $server $port | cut -d ' ' -f 3)

## check all known players
for((i=0; i<$players; i++))
do
playerID=$(printf "player id $i ?\nexit\n" | nc $server $port | cut -d ' ' -f 4 | sed 's/%/%%/g')
playermodel=$(printf "player model $i ? \nexit\n" | nc 127.0.0.1 9090 |cut -d ' ' -f 3)

if [ !$playermodel = squeezelite ]
   then
echo Player Nr. $i is not a squeezelite Session>>/tmp/playercheck.log
else
playername=$(printf "$playerID name ?\nexit\n" | nc $server $port | cut -d ' ' -f 3)
playermode=$(printf "$playerID mode ? \nexit\n" | nc 127.0.0.1 9090 |cut -d ' ' -f 3)
if [ $playermode = pause ]
then
grep $playername:$playermode /tmp/playercheck.txt && printf "$playerID power 0 \nexit\n" | nc $server $port
echo $playername:$playermode>>/tmp/playercheck.log
else
timetoplay1=$(printf "$playerID time ?\nexit\n" | nc $server $port | cut -d ' ' -f 3)
echo "$playername:Playtime:$timetoplay1">>/tmp/playercheck.log
timetoplay2=$(printf "$playerID time ?\nexit\n" | nc $server $port | cut -d ' ' -f 3)
if [ $timetoplay1 = $timetoplay2 ]
then
echo no difference between 1st and 2.nd check
timetoplay3=$(printf "$playerID time ?\nexit\n" | nc $server $port | cut -d ' ' -f 3)
if [ $timetoplay1 = $timetoplay3 ]
then
printf "$playerID power 0 \nexit\n" | nc $server $port
fi
else
echo "$playername is playing nothing 2do 4me">>/tmp/playercheck.log
fi
fi
fi
done

Raspi und Edimax EW-7811Un

Beim Versuch einen  Edimax EW-7811Un mit dem Pi zu verheiraten hab ich „mal eben“ 4 Stunden verballert..
Hatte ich via eth0 eine Verbindung zum Router, funktionierte auch das Wlan?
Dabei hatte ich dann so vielsagende Meldungen wie: „ifup wlan0 ioctl[SIOCSIWAP]: Operation not permitted“ bekommen.

Die dazugehörige /etc/network/interfaces sieht so aus:

## loopback
auto lo
iface lo inet loopback

## wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "Acesspoint ssid"
wpa-psk "passphraseimklartext"
dns-nameservers ip.des.routers

## eth0
iface eth0 inet dhcp

Also bis auf das Wlan0 zuerst, dann eth0 eigentlich ganz normal – trotzdem lief es erst nach Trick 17.
Zwei Scripte lösten das ganze Problem. Auch wenn der Edimax sich mit ID 7392:7811 meldet, diesmal keine udev Regel.

joe /etc/network/if-down.d/start.wlan
#!/bin/sh
# lo is configured aint nobody got time for that
[ "$IFACE" = lo ] && exit 0

# Only run from ifdown
[ "$MODE" != stop ] && exit 0

# start wlan0 interface
/sbin/ifup wlan0
exit 0

Nicht vergessen – das Script muss auch ausführbar sein.

chmod +x /etc/network/if-down.d/start.wlan

Und noch eines für den anderen Fall:
joe /etc/network/if-up.d/stop.wlan
#!/bin/sh
# lo is configured aint nobody got time for that
[ "$IFACE" = lo ] && exit 0
# Only run from ifup
[ "$MODE" != start ] && exit 0
# stop wlan0 interface
/sbin/ifdown wlan0
exit 0

chmod +x/etc/network/if-up.d/stop.wlan

squeezelitechecker.sh

Ich benutze squeezelite unter Debian und hab (bin wohl nicht ganz alleine damit) ein paar Probleme, wenn squeezelite ein paar minuten/Stunden nur auf einen Stream wartet und nichts abspielt.

Dann stürzt es einfach ab.

Dieses Script war im Betastatus, die elegantere Variante findet sich Hier
und auch im slimdevices Forum

Rasbpi meets Mini

„meine“ beiden Hobbys auf einem BildTisch 🙂

Der Raspberry Pi ist der „innoffizielle Nachfolger“ des Sinclair ZX81, so einen hatte ich (als Bausatz) in ganz jungen Jahren – der Modellmini steht stellvertretend für meine beiden großen, die ich knapp ein Jahrzehnt später gekauft, restauriert/modifiziert und immer noch im Besitz habe. Aber warum sind die nun zusammen auf einem Bild?

Ein Pi und ein Modellmini
Ein Pi und ein Modellmini

Ganz einfach, wurde der ZX-81 Bausatz mit einem Gehäuse ausgeliefert, der Pi kommt „ohne“….

hobbys_fitting_test
Ein Pi in einem Modellmini

Wenn sich die beiden im echten Leben nicht vertragen (ok – der Mini hat seit ~20 Jahren eine optoelektronische Zündung) als Miniaturen vertragen sich die beiden als Modelle ganz gut.

sitz passt wackelt (nicht) und hat Luft
sitz passt wackelt (nicht) und hat Luft

Ein erster Funktionstest – noch ohne Seiten & Heckscheibe – funktionierte ganz gut.
Ich brauche „nur“ noch einen Wlanstick mit Antenne, denn die Mini Karosse ist aus Zink – da kommt nicht viel rein/raus.

Leider ist die Heckklappe (Zugang für das externe Handschuhfach beim echten Mini) hier nur angedeutet, da werde ich wohl  einen Abdruck des Hecks machen, die Klappe im Mini aussägen und falls ich zu viel feilen muß (und damit englische Spaltmasse herauskommen) wohl nachbauen um sowohl an die USB Ports zu kommen ohne das dass Modell zu sehr darunter leiden muss.

In wie weit ich das Interieur verändern muß um es wieder montieren zu können, muss ich noch herausfinden.
Nachtrag: Der Pi hatte nach Feindkontakt mit einem Blödkolben nur noch seine USB Buchse. Bis auf die beiden herausgeführten Kabel ist der Modellmini unscheinbar geblieben und hat sein Interieur behalten 😉
ein paar Glasfasern (überbleibsel von der Neuverkabelung meines Arbeitgebers) hab ich schon gekürzt und damit werden die LEDs vom Pi an üblichen Stellen wie Blinker herausgeführt. Die LEDs leuchten zu schwach um die
Blinker anzusteuern (ohne LAN blinkt er eh nicht mehr)

Der Pi läuft Headless (nur via putty) und über udev Regeln.
Steckt ein DAC drin startet squeezelite, ein Softwareplayer für den Logitechmediaserver.
Ist eine Webcam mit Ihm verbunden, startet mjpg-streamer.
Die Webcam (eine Logitech C210) wird noch zerlegt, bekommt einen Schalter an die +5V Strecke und die Optik wird anstelle eines Hauptscheinwerfers montiert, denn Haupteinsatz des kleinen Rackers ist die Heimautomation, nicht die überwachung unserer Bude oder der Bewohner.

Das ist eine der udev regeln: (Logitech C210 Webcam) Bitte daran denken, dass sind zwei Zeilen, die jeweils mit ACTION beginnen und müssen auch (eine Befehlskette – eine Zeile) so übernomen werden.

/etc/udev/rules.d/70-usb-cam.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0819", RUN+="/usr/local/bin/mjpg-streamer.sh start"
ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0819", RUN+="/usr/local/bin/mjpg-streamer.sh stop"

Raspberry Bilderrahmen

Die 1.024 Neuauflage der Idee, einen Raspberry mit einem digitalen Bilderrahmen zu vereinen… (oder doch nicht?)

Man(n) nehme einen Raspberry und einen Bilderrahmen – so weit so alt die Thematik, aber diesmal wird alles anders.

Anstatt wie im anderen Projekt den Pi unsichtbar zu verstecken wird dieser diesmal „offensichtlich“ versteckt 😉

Sowas hatte ich vor gefühlten 20 Jahren schon mal gemacht, mir ging der damalige Kabelverhau von TAE Dose zu DSL Konverter zu DSL Modem (und so weiter) so tierisch auf den senkel, dass ich das ganze mal auf ein gerahmtes Holzbrett als funktionierendes beschriftetes Schaubild an die Wand gehängt hatte. Damals haben fast alle Freunde zuerst das Kunstwerk angesehen, sich dann (meistens) schmuzelnd über die kranke Kunst ausgelassen, aber das es sich dabei um tatsächlich funktionierende Technik handelte dauerte immer etwas länger 😉
Ok – damals war ich wirklich „krank“ – die ganzen Kabel unterputz in Leerrohren verlegt und das in einer Mietswohnung – würd ich heute nieeeeee mehr machen…

Dieser wird wohl nach ausgiebiger Väterlicher Testphase im Kinderzimmer als „Conni mit der Schleife im Haar Spüler in der Endlosschleife“ enden 😉

Zurück zum Thema:
Fast Ideal ist der Bilderrahmen Ribba von Ikea – Kostenpunkt fümpf maak T€uro – hat aber leider ein Echtglas.

Ikea Bilderrahmen ribba
Ikea Bilderrahmen ribba

Ausser dem Rahmen brauchts noch 2 M3 Schrauben in ~30 mm länge (ich hab erstmal 40 mm genommen – immer frei nach dem Motto schon 3* abgesägt und immer noch zu kurz) und wers mag noch ein paar Kupfer Hutmuttern.

Der Pi läuft als squeezelite Player ein vcgencmd measure_temp liefert im laufenden Betrieb (ohne Kühlkörper und oder Lüftungslöcher im Rahmen in beheizter Umgebung) zwischen 42.8’C und 46.4’C. Währen einer ssh Session steigt die Temperatur etwas an – aber als reiner Softwareplayer passt das.

Was noch auf der 2do Liste stehtand:
Wlan ist etwas eingeschränkt (gegenüber offen ~5 Meter weniger – also in der Wohnung knapp die Hälfte der vorher möglichen Distanz verloren) – wird entweder

  • über ein Plexiglasscheibe
  • über einen Wlan Adapter mit externer Antenne
  • verlegen eines USB Ports nach „aussen“

oder durch Idee #4 gelöst.

Ein 20*4 Zeichen HD44780 kompatibles Display mit blauen LEDs (hat leider bisher den Weg noch nicht zu mir gefunden – geistert seit Wochen durch die div. Packetstationen). Wenn vorhanden (und montiert) gibts ein Update.
Jedoch bin ich mir noch nicht sicher, wie sich das Display und die höhere Prozessorlast um es mit aktuellen Daten zu füttern auf das unbelüftete Gehäuse auswirkt. Vielleicht muß ich dann einen Rahmen um das Passepartout bauen, um die beiden thermisch voneinander zu trennen.
Auch bin ich mir noch nicht ganz sicher, ob ich das Display sichtbar über die Steckleisten der GPIOs oder auf der Rückseite der Platine unsichtbar…

  • evtl ein zweiter identischer Bilderrahmen und die Boxen Lautsprecher noch „hybsch“ zu verstecken. (Ohne Witz – die Soundbar hat gute Küchenradio qualität und ist auch ohne zusätzliche Stromversorgung direkt am Pi betrieben ziemlich laut)

Als Bauteile habe ich bisher diese verwendet:

  • Ikea RIBBA Bilderrahmen
  • Raspberry Pi Rev2 512
  • Raspbian (/var/log und /tmp auf Ramdisk gemountet) auf einer (gekürzten) Sandisk 8 Gb
  • Squeezeliteplayer (mit ein paar Scripten)
  • Cabstone USB Soundbar (USB DAC mit 6 Watt Miniverstärker und zwei Lautsprechern)
  • EDIMAX EW-7811UN Wlan Adapter
  • „Original“ Iphone G2 Ladegerät – Sowohl das WLAN als auch der DAC ziehen kräftig – hier gilt – bloss nix sparen (ausser Ärger) und wenn nicht vorhanden – lieber im Apfelschuppen kaufen, als ohnlein.
  • 2 Schrauben M3x 40mm (gekürzt) mit Hutmuttern
  • 2 Messing Abstandshülsen mit Innen und Aussengewinde (waren früher bei jedem Leer Computergehäuse dabei)
Raspberry Bilderrahmen Fertig
einfach und schlicht
Raspberry Bilderrahmen
Raspberry Bilderrahmen

Die Bilder aus der Digicam….

Diese Batch kopiert alle Bilder aus einer SD Karte in das Laufwerk e:\!pix und ist (trotz @echo off) eine Eigenentwicklung.  😉 Man findet die in mindestens einem großen Forum und wer die findet, weiß unter welcher Flagge ich schreibe.

Viel Spass damit.
Die Kamera wechselt den Bilderordner entweder in DCIM\100_PANA oder DCIM\101_PANA oder DCIM\103_PANA
Deshalb die drei Abfragen. Das könnte man zwar auch mir einer führenden for /l absaugen, aber noch mehr „Spaghetticode“ wollte ich dann doch nicht.

:start
@echo off

set „quelldir=F:\PRIVATE1“
set „zieldir=e:\!pix\“
if exist %quelldir%\*.jpg call :import2

set „quelldir=f:\DCIM\100_PANA“
set „zieldir=e:\!pix“
if exist %quelldir%\*.jpg call :import

set „quelldir=f:\DCIM\101_PANA“
if exist %quelldir%\*.jpg call :import

set „quelldir=f:\DCIM\102_PANA“
if exist %quelldir%\*.jpg call :import

cls
@color cf
@echo keine Karte gefunden
@echo Bitte Karte in das Laufwerk legen.
@echo …und eine Taste drcken
pause
goto start

:import2
color fc
for /f „delims=“ %%i in (‚dir /a-d /b „%quelldir%“‚) do for /f „tokens=1-3 delims=. “ %%a in (‚dir /tc „%quelldir%\%%i“^|findstr /c:“%%i“‚) do (
dir „%zieldir%\%%c\%%b-%%a\“ >NUL 2>NUL || md „%zieldir%\%%c\%%b-%%a\“ >NUL
if not exist „%zieldir%\%%c\%%b-%%a\%%c%%b%%a\%%~nxi“ title %%i && copy „%quelldir%\%%i“ „%zieldir%\%%c\%%b-%%a\%%~nxi“
)
goto :eof

:import
color fc
for /f „delims=“ %%i in (‚dir /a-d /b „%quelldir%“‚) do for /f „tokens=1-3 delims=. “ %%a in (‚dir /tc „%quelldir%\%%i“^|findstr /c:“%%i“‚) do (
dir „%zieldir%\%%c\%%b-%%a\“ >NUL 2>NUL || md „%zieldir%\%%c\%%b-%%a\“ >NUL
if not exist „%zieldir%\%%c\%%b-%%a\%%c%%b%%a\%%~nxi“ title %%i && move „%quelldir%\%%i“ „%zieldir%\%%c\%%b-%%a\%%~nxi“
)
:end