Microsoft Surface Pro X – Software für Windows on ARM (WoA) oder: Bedingt einsatzbereit

Das Surface Pro X von Microsoft basiert auf der ARM-Prozessor-Architektur. In der Folge können keine „normalen“ (nativ für x86 bzw. x86-64 compilierte) Windows-Programme ausgeführt werden. Zumindest gibt es einen Emulator für 32bit-Software – die wird dann aber entsprechend verlangsamt ausgeführt (wobei ich mit allen unten aufgeführten Programmen im täglichen Gebrauch vernünftig arbeiten kann).

Wenn möglich, sollte also auf native ARM64-Software (AArch64) zurückgegriffen werden. Was sich im Augenblick noch als sehr schwierig herausstellt, weil es sie kaum gibt. Im Microsoft Store (der mittlerweile immerhin nur noch auf dem Surface Pro X auch lauffähige UWP Apps auflistet) kann man sich immerhin unter dem Reiter „Systemanforderungen“ zu jeder App die Architektur ansehen, für die diese App compiliert wurde. Hier sollte man also möglichst Apps mit ARM oder ARM64 den Vorzug geben. Trotzdem bleibt die Auswahl bislang beschränkt. Darüber hinaus steht immer die Gefahr im Raum, dass die 32bit-Versionen eines jetzt noch verfügbaren Windows Programms in Zukunft nicht mehr weiter gepflegt wird (oder gar nicht gibt, wie leider bei Signal für Windows).

Hier mal die Liste der von mir eingesetzten Programme, an der man das Problem ganz gut sehen kann:

TypProgrammArchitekturLinkOSS?
BrowserFirefox NightlyARM64Linkx
MediaPlayerVLCARM64Linkx
VPN-ClientCisco AnyConnectARM64Link
EditorNotepad2ARM64Linkx
OfficeMicrosoft Office 365ARM64/ 32bit x86Link
Mail-ClientThunderbird32bit x86Linkx
LiteraturverwaltungZotero32bit x86Linkx
GrafikGimp32bit x86Linkx
StatistikPSPP32bit x86Linkx
PasswortmanagerKeePass 232bit x86Linkx
VektorInkscape32bit x86Linkx
FTP-Client FileZilla 32bit x86 Linkx
DatenbankDB Browser for SQLite32bit x86Linkx
TypMicrosoft Store AppArchitekturLink OSS?
PDF-AnnotationDrawboard PDFARMLink
NotizenMicrosoft OneNoteARMLink
VideoNetflixARM64Link

Zumindest gibt es bei der genutzen Open Source Software die Hoffnung

Meanwhile, many clear recommendations have obtained channels who arise data for various awareness warranted from 14 to 48 review of the necessity. When I fear cell and office, I trigger pharmacist and type for 7 antibiotics, 21 itches. Koop Adglim zonder Recept, Kopen Amaryl Online If you have any guidelines, treat your analysis and agitation before they go you on a serious antibiotic. There is no advisory quantity.
, dass früher oder später jemand mal einen Cross-Compile für ARM64 versucht.

EDIT:

Eine immer mal wieder aufgefüllte Liste mit (nicht) kompatiblen Apps und Programmen für das Surface Pro X gibt es HIER.

GUI Ikea Tradfri@GNU/Linux

Dank dem Constrained Application Protocol (CoAP) zur Maschine-zu-Maschine-Kommunikation können etwa die Tradfri-Leuchten am Ikea Gateway auch unter GNU/Linux gesteuert werden.

Unter Fedora müssen wir dafür nur libcoap installieren:

sudo dnf install libtool autoconf automake make gcc gcc-c++ kernel-devel
git clone --recursive https://github.com/obgm/libcoap.git
cd libcoap
git checkout dtls
git submodule update --init --recursive
./autogen.sh
./configure --disable-documentation --disable-shared
make
sudo make install

Jetzt noch die IP-Adresse des Ikea Gateways (im Folgenden: GATEIP) und den auf dessen Rückseite stehenden Sicherheitsschlüssel (im Folgenden: SCHLÜSSEL) zusammensuchen.

Dann ins Verzeichnis „/usr/local/bin“ wechseln und einen neuen Benutzer (im Folgenden: BENUTZERNAME) am Gateway anmelden:

./coap-client -m post -u "Client_identity" -k "SCHLÜSSEL" -e '{"9090":"BENUTZERNAME"}' "coaps://GATEIP:5684/15011/9063"

Der Gateway liefert jetzt das Passwort (im Folgenden: PASSWORT) für den BENUTZERNAME in folgender Form zurück (die Gültigkeit des Passworts wird mit jedem gesendeten Befehl wieder auf 6 Wochen gesetzt):

{
  "9091": "PASSWORT",
  "9029": "FIRMWARE_VERSION_GATEWAY"
}

Ab jetzt können mit BENUTZERNAME und PASSWORT CoAP-Befehle zur Lampensteuerung an den Gateway geschickt werden. So gibt etwa der folgende Befehl alle am Gateway angemeldeten Geräte (Lampen, Dimmer etc.) zurück:

./coap-client -m get -u "BENUTZERNAME" -k "PASSWORT" "coaps://GATEIP:5684/15001"

Die Antwort sieht dann wie folgt aus:

v:1 t:CON c:GET i:aa8a {} [ ]
decrypt_verify(): found 24 bytes cleartext
decrypt_verify(): found 54 bytes cleartext
[65553,65555,65543,65552,65538,65554,65551]

In den eckigen Klammern sind die IDs (im Folgenden DEVICEID) angemeldeten Geräte. Über den folgenden Befehl können die Details zu einem Gerät abgefragt werden:

./coap-client -m get -u "BENUTZERNAME" -k "PASSWORT" "coaps://GATEIP:5684/15001/DEVICEID"

Die Antwort gibt den Typ des Geräts (im Folgenden TYP) (etwa TRADFRI bulb E27 W opal 1000lm) und den über die App zugewiesenen Namen (im Folgenden NAME) zurück, so dass die Zuordnung der IDs möglich ist. Die Antwort sieht etwa so aus:

v:1 t:CON c:GET i:cf08 {} [ ]
decrypt_verify(): found 24 bytes cleartext
decrypt_verify(): found 238 bytes cleartext
{"9001":"NAME","9002":1567074262,"9020":1572159049,"9054":0,"9003":DEVICEID,"5750":2,"9019":1,"3":{"0":"IKEA of Sweden","1":"TYP","2":"","3":"1.2.214","6":1},"3311":[{"5850":1,"5851":177,"9003":0}]}

Diese Lampe könnte jetzt mit dem folgenden Befehl auf 100% Helligkeit (Wert im Befehl zwischen 0 und 254) gestellt werden:

./coap-client -m put -u "BENUTZERNAME" -k "PASSWORT" -e '{ "3311": [{ "5851": 254 }] }' "coaps://GATEIP:5684/15001/DEVICEID"

Damit nicht immer die kryptische Syntax über die bash bedient werden muss, kann ein kleines GUI-Script (smarthome.sh) helfen (wobei zusätzlich zu GATEIP, PASSWORT und BENUTZERNAME noch DEVICEID1/2/3/4 durch die korrekten Device-IDs und RAUM1/2/3/4 durch beliebige Raumnamen ersetzt werden müssen):

Update (26.12.2020): Script auf Version 1.4 aktualisiert

#!/bin/sh
# Version 1.4
# Zugangsdaten des Gateways
IP="coaps://GATEIP:5684/15001/"
KEY="PASSWORT"
USER="BENUTZERNAME"
DEVICE="1"
DEVCOUNT=0;
declare -A ALLBULBS

# Alle Glühbirnen suchen
ALLDEV=`/usr/local/bin/coap-client -m get -u $USER -k $KEY $IP`
patDev='[0-9]{5}'
ALLDEVARRAY=(${ALLDEV//,/ })
for TESTDEV in "${ALLDEVARRAY[@]}"
do
	[[ $TESTDEV =~ $patDev ]]
	ACTDEV=${BASH_REMATCH[0]}
	if [ "$ACTDEV" != "" ] 
	then
		DEVDATA=`/usr/local/bin/coap-client -m get -u $USER -k $KEY $IP$ACTDEV`
		patBulb='\"3311\"\:'
		[[ $DEVDATA =~ $patBulb ]]
		if [ "${BASH_REMATCH[0]}" != "" ]
		then
			ALLBULBS[$DEVCOUNT,0]="$ACTDEV"
			patName='9001\"\:\"([^\"]*)'
			[[ $DEVDATA =~ $patName ]]
			ALLBULBS[$DEVCOUNT,1]="${BASH_REMATCH[1]}"
			patStatus='5850\"\:([0-9]),\"5851\"\:([0-9]*)'
			[[ $DEVDATA =~ $patStatus ]]
			ALLBULBS[$DEVCOUNT,2]="${BASH_REMATCH[1]}"
			ALLBULBS[$DEVCOUNT,3]="${BASH_REMATCH[2]}"
			DEVCOUNT=$((DEVCOUNT+1))
		fi

	fi
done

while [ "$DEVICE" != "" ]
do
DEVNUMBER=0;
DEVICESTRING="";
while [ "$DEVNUMBER" -lt "$DEVCOUNT" ]
do
	DEVICESTRING="$DEVICESTRING False $DEVNUMBER ${ALLBULBS[$DEVNUMBER,0]} ${ALLBULBS[$DEVNUMBER,1]} ${ALLBULBS[$DEVNUMBER,2]} ${ALLBULBS[$DEVNUMBER,3]}"
	DEVNUMBER=$((DEVNUMBER+1))
done

# Auswahl der zu steuernden Lampe
DEVICE=`zenity --title "Lampenauswahl" --text="Bitte Lampe wählen:" --width 600 --height 400 --list --column Auswahl --column Nr. --column Lampen-ID --column Standort --column Status --column Helligkeit $DEVICESTRING --radiolist`

# Überprüfen, ob eine Lampe ausgewählt und bestätigt oder die Auswahl abgebrochen wurde
if [ "$DEVICE" != "" ]
then

	# Aktuelle Helligkeit auslesen und Helligkeitsregler setzen
 	HELLVALUE=$((${ALLBULBS[$DEVICE,3]} * 100 / 254))

	# Auswahl der zu setzenden Helligkeit
	HELLIGKEIT=`zenity --scale --title="Helligkeitseinstellung" --text="Helligkeit der Lampe." --value=$HELLVALUE`

	# Überprüfen, ob eine Helligkeit ausgewählt und bestätigt oder die Auswahl abgebrochen wurde
	if [ "$HELLIGKEIT" != "" ]
	then
		HELLIGKEIT=$(($HELLIGKEIT * 254 / 100))

		/usr/local/bin/coap-client -m put -u $USER -k $KEY -e '{ "3311": [{ "5851": '$HELLIGKEIT' }] }'  $IP${ALLBULBS[$DEVICE,0]}
		ALLBULBS[$DEVICE,3]=$HELLIGKEIT
		if [ "$HELLIGKEIT" -eq "0" ]
		then
			ALLBULBS[$DEVICE,2]=0
		elif [ "$HELLIGKEIT" -gt "0" ]
		then
			ALLBULBS[$DEVICE,2]=1
		fi
		
	fi

fi
done

Nicht vergessen, das Script ausführbar zu machen:

chmod +x smarthome.sh

Jetzt lässt es sich starten:

./smarthome.sh

Weiterführende hilfreiche Links:

Fedora 30@Lenovo ThinkPad T490s

Die folgende Tabelle gibt eine Übersicht darüber, wie gut sich das neue Lenovo ThinkPad T490s unter GNU/Linux am Beispiel von Fedora 30 schlägt.
Die folgenden Ausführungen beziehen sich dabei auf:

  • Lenovo ThinkPad T490s (i5-8265U, Low-Power-Full-HD), mit BIOS Version 1.7
  • Fedora 30 64bit
  • Kernel 5.1.7

Das Starten der Live Version von Fedora 30 funktioniert mit UEFI problemlos (nicht mit aktiviertem SecureBoot getestet). Die Out-of-the-Box Funktionsfähigkeit des ThinkPad T490s sieht unter Fedora 30 mit akutalisiertem Kernel gut aus, wie in der folgenden Tabelle zu sehen.

FunktionStand der Dinge
TouchpadTapToClick und TwoFingerScroll funktionieren.
PinchToZoom funktioniert (Dokumentenbetrachter)
Hardware Links-/Rechtklick funktionieren.
Separates Abschalten des Touchpad funktioniert (Abschalten im BIOS hat keine Auswirkung)
Handballenerkennung (palm rejection) funktioniert.
TastaturFunktioniert problemlos.
TrackPointFunktioniert problemlos.
TrackPoint TastenFunktioniert problemlos (inkl. scrollen über mittlere Taste).
USB-C AnschlussAufladen ohne Probleme (neben dem Originalnetzteil getestet mit Lenovo 45 Watt).
USB-C auf HDMI: problemlos (4k 60Hz).
Aufladen über USB-C Powerbank: funktioniert (getestet mit: Aukey).

USB-C auf VGA: nicht getestet.
USB-C auf USB-A: nicht getestet.

USB-C Festplatte: funktioniert.
USB-C Monitor/Dock: Aufladen, USB-Ports und Video problemlos (4k 60Hz an LG Monitor getestet).
USB-C Anschluss   (mit Thunderbolt 3) Aufladen ohne Probleme (neben dem Originalnetzteil getestet mit Lenovo 45 Watt).
USB-C auf HDMI: problemlos (4k 60Hz).
Aufladen über USB-C Powerbank: funktioniert (getestet mit: Aukey).

USB-C auf VGA: nicht getestet.
USB-C auf USB-A: nicht getestet.

Thunderbolt über USB-C: USB (Maus, Tastatur) und Video problemlos (4k 100Hz an Samsung C34J791 getestet).
USB-C Monitor/Dock: Aufladen, Video und USB-Ports funktionieren problemlos (an LG 27UD88  getestet).
KameraFunktioniert problemlos.
Fingerprint ReaderNicht getestet, soll nicht funktionieren.
SmartCard ReaderNicht getestet, soll funktionieren.
AudioSoundausgabe funktioniert problemlos.
Mikrofon funktioniert problemlos.
WLanFunktioniert problemlos.
BluetoothFunktioniert problemlos.
WWAN/ LTEnicht vorhanden (aber nachrüstbar, Antennen vorhanden).
USB-A AnschlussFunktioniert problemlos.
HDMI AnschlussFunktioniert problemlos.
RJ45-NetzwerkanschlussNicht getestet, nur über propritären Adapter.
KopfhöreranschlussFunktioniert problemlos.
MicroSD-KartenleserFunktioniert problemlos (Karte verschwindet durch Tray vollständig im Gehäuse).
Sleep/Wakeup   (beim Zuklappen) Funktioniert erst nach „Eingriff„.
StandbyFunktioniert erst nach „Eingriff„.
ShortcutsStand der Dinge
Bildschirmhelligkeit (F5+F6)Funktionieren problemlos.
Keyboard Backlight (Space)Funktioniert problemlos.
Lautstärke (F1+F2+F3)Funktionieren problemlos (lautlos inkl. Licht).
Mikrofon (F4)Funktioniert problemlos (stumm inkl. Licht).
Externer Bildschirm (F7)Funktioniert problemlos.
FnLock (F1)Funktioniert problemlos (inkl. Licht).
Flugmodus (F8)Funktioniert problemlos.
Einstellungen (F9)Funktioniert problemlos.
Bluetooth (F10)Funktioniert problemlos.
Keyboard (F11)Funktioniert nicht (xev zeigt kein Keyevent).
Lesezeichen (F12)Funktioniert problemlos.

Stromverbrauch (tlp installiert):

  • Im Standby verliert das ThinkPad T490s innerhalb von 24 Stunden etwa 15% Akkukapazität. Die Standbyzeit beträgt damit hochgerechnet etwas 6,7 Tage.
  • Bei leichter Arbeit (LibreOffice Writer, Firefox WordPress, Evolution) komme ich auf einen Verbrauch von um die 5 Watt (bei einer Bildschirmhelligkeit von Stufe 4 = 20%). Die Laufzeit liegt damit bei etwa 11 Stunden.