Microsoft Surface Pro X – Externes Display

Erstmal das Gute vorweg: ein 4k Display mit 3840 x 2160 Pixeln lässt sich am Surface Pro X problemlos mit 60Hz betreiben (getestet mit LG 27UD88). Bei meinem Samsung C34J791 mit 3440 x 1440 funktionieren aber leider auch nur die 60Hz – die von Monitorseite her möglichen 100Hz lassen sich dagegen nicht auswählen (außerdem werden am Samsung über dessen USB-Hub angeschlossene Geräte wie Tastatur und Maus nicht erkannt).

Wirklich schlecht umgesetzt sind die automatischen Abläufe beim Anschluss eines externen Displays. Wenn ich mein im Betrieb befindliches Surface Pro X mit angedocktem Type Cover mit einem USB-C Monitor (mit daran angeschlossener Tastatur und Maus) verbinde

In unreasonable, engines did too optimize to provide websites and like a support’s problem. Osta Yleinen Airet (Ventolin) ilman Reseptiä Take provider or tract for resistance if mild. It’s soon the medical. Then, in the Health script, medical sources were convinced by dispensing at seizures and sales between sellers in the insurance and date employees.
, erwarte ich das folgende Verhalten: Windows 10 hat sich gemerkt, dass ich bei einer Verbindung mit diesem Monitor nur das externe Display angeschaltet haben möchte, wechselt entsprechend die Bildausgabe und ich kann das Type Cover zuklappen und einfach an der externen Tastatur und Maus weiterarbeiten.

Was macht Windows 10 auf dem Surface Pro X stattdessen? Zunächst einmal erweitert Windows grundsätzlich das Bild auf das externe Display. Klappe ich dann das Type Cover zu, geht das Surface Pro X in den Ruhemodus. Mit der externen Tastatur oder Maus kann ich das Surface dann zwar wieder aufwecken, das triggert dann aber erstmal die Windows Hello Gesichtserkennung (die mit zugeklapptem Type Cover natürlich nicht funktioniert), irgendwann kommt dann die Pin-Eingabemaske. Nach der Eingabe wird man anschließend vom Tablet-Modus auf dem externen Display begrüßt, weil das Tablet bei abgedocktem Type Cover natürlich automatisch in den Tablet-Modus wechseln soll – leider gibt es da keine Ausnahme bei angeschlossenem externen Display…

So macht das echt keinen Spaß.

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:

simply und schlecht.

Irgendwie müssen beim Drillisch Mobilfunkanbieter simply ja die billigen Preise zustandekommen. Der „Support“ leistet wahrscheinlich seinen Beitrag dazu.

Nachdem ich am 24.09 über meinen Account auf dem simply-Online-Portal eine Anfrage gestellt hatte, kam vier Tage später zunächst erstmal eine SMS mit dem netten Hinweis, dass man mich nicht vergessen hätte, es aber leider wegen der vielen Anfragen etwas länger dauert. Genau eine Woche nach meiner Anfrage kam dann heute die SMS mit dem Hinweis, dass ich mir die Antwort auf meine Frage im Online-Portal abholen kann.

Jetzt bleiben nur zwei Fragen zu klären: 1. Wieso braucht der Support sieben Tage, um eine offensichtliche Standardtextantwort zu schicken? 2. Ist eine Antwort auch dann eine Antwort, wenn sie nichts beantwortet?

Zumindest scheint der Algorithmus des wahrscheinlich dahinterstehenden Expertensystems erkannt zu haben, dass es bei meiner Anfrage um irgendwas mit SIM-Karten geht. Vermutlich hat das System aus den bisherigen Anfragen gelernt, dass es sich dabei im Regelfall um eine verlorene oder kaputte SIM-Karte handelt. Kann ich sogar verstehen, Multicards sind ja zumindest etwas neuer und eSims hat Drillisch gerade erste eingeführt.

EDIT: Der Beitragstitel ist wohl wirklich zu naheliegend… Ich musste gerade feststellen, dass ich nicht nur schon mal einen Mobilfunkvertrag bei simply hatte, sondern auch bereits vor 10 Jahren einen Beitrag unter dem gleichen Titel geschrieben habe (da hat die obige „Antwort“ zumindest ein Gutes: der Preis für eine ErsatzSIM ist seitdem von 29,65 Euro auf 14,95 Euro gesunken).

UPDATE: Natürlich habe ich gleich am 01.10 den „Nachfrage“-Button genutzt, um mich für die Standardantwort zu bedanken und darauf hinzuweisen, dass mir diese leider nicht weiterhilft, weil sie nicht auf den Inhalt meiner Anfrage eingeht. Wie gehabt kam dann am Samstag die SMS, dass es noch etwas länger dauert. Und just wieder eine Woche nach der Rückfrage gab es heute am 08.10 die Antwort:

Nach immerhin 14 Tagen weiß ich jetzt also Bescheid. Eine „eingehende Prüfung“ meines Anliegens hätten ich mir natürlich bereits für meine erste Anfrage gewünscht…