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: