Zuvor habe ich den Switchbot-Hub-Adapter verwendet, um meine Switchbot-Geräte in iobroker zu integrieren, was zunächst gut funktionierte, später trat jedoch folgendes Problem auf, die Datenpunkte der angeschlossenen Geräte wurden nicht aktualisiert.
Um dieses Problem zu lösen, habe ich ein Python-Skript erstellt, das Switchbot-Gerätedaten mithilfe der Switchbot Utilities Switchbot-API abruft und diese dann mithilfe von Paho mqtt an den MQTT-Server weiterleitet.

Smart Fernbedienung – IR-Sendersystem, Verbindung zu WLAN, Klimaanlagensteuerung, kompatibel mit Alexa, Google Home, Siri, IFTTT
Dieses Projekt läuft auf dem Betriebssystem Ubuntu 22.04, das den iobroker-Server hostet. Schauen wir uns die Details an.
Aktualisieren wir zunächst die Paketliste:
sudo apt-get updateSchauen wir mal, ob Python3 auf unserem Computer installiert ist. Geben wir in der Befehlszeile Folgendes ein:
python3 --versionWenn die Versionsnummer zurückgegeben wird, ist Python3 installiert. Wenn wir die Fehlermeldung „bash: python3: command not found“ erhalten, ist Python3 nicht installiert.
sudo apt-get install python3Wenn pip noch nicht installiert, installieren wir es ebenfalls.
sudo apt-get install python3-pipErstellen wir für das Projekt einen Ordner namens „switchbot“.
mkdir switchbotDann navigieren wir zum neu erstellten Switchbot-Ordner.
cd switchbotHier erstellen wir eine virtuelle Umgebung.
python3 -m venv venvAnschließend aktivieren wir die virtuelle Umgebung.
source venv/bin/activateAnschließend installieren wir die notwendigen Bibliotheken.
Switchbot Utility die Switchbot-API.
python3 -m pip install switchbot-utilityPaho-mqtt client.
python3 -m pip install paho-mqttErstellen wir ein Python-Skript namens switchbot-client.py.
nano switchbot-client.pyInhalt der switchbot-client.py-Datei:
#!/usr/bin/python3
import time
import subprocess
import json
from paho.mqtt import client as mqtt_client
from switchbot_utility.switchbot import Switchbot
from switchbot_utility.switchbot_meter import SwitchbotMeter
from switchbot_utility.battery_mixin import BatteryMixin
from switchbot_utility.switchbot_ir_air_conditioner import IrAirConditioner
from switchbot_utility.switchbot_ir_others import IrOthers
delay = 1 # sec
broker = '192.168.1.20'
port = 1883
username = ''
password = ''
client_id = 'SwitchbotPyClient'
apiCallsTopic = 'Switchbot/Settings/APIcalls'
discoverTopic = 'Switchbot/Settings/Discover'
tempSensorList = []
IrAirConditionerList = []
IrOthersList = []
IrAirConditionerTopicList = []
IrOthersTopicList = []
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to ioBroker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(mqtt_client.CallbackAPIVersion.VERSION1, client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client, topic, payload):
result = client.publish(topic, payload)
status = result[0]
if status == 0:
print(f"Send `{payload}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
def on_message(client, userdata, message):
global apiCalls
global discover
message_payload = str(message.payload.decode("utf-8"))
message_topic = message.topic
if message_topic == apiCallsTopic:
apiCalls = message_payload
print("apiCalls: ", message_payload)
if message_topic == discoverTopic:
discover = message_payload
print("discover: " , message_payload)
a = 0
while a < len(IrAirConditionerTopicList):
if message_topic == IrAirConditionerTopicList[a]:
print(message_topic + ": " + message_payload)
message_json = json.loads(message_payload)
temp = (message_json["temperature"])
mode = (message_json["mode"])
fan = (message_json["fan_speed"])
power = (message_json["power_state"])
klimaDeviceId = message_topic.replace("Switchbot/Devices/","")
klimaDeviceId = klimaDeviceId.replace("/Command","")
klima = IrAirConditioner(klimaDeviceId)
klima.set_all(temp, mode, fan, power)
a += 1
a = 0
while a < len(IrOthersTopicList):
if message_topic == IrOthersTopicList[a]:
print(message_topic + ": " + message_payload)
otherDeviceId = message_topic.replace("Switchbot/Devices/","")
otherDeviceId = otherDeviceId.replace("/Command","")
otherDevice = IrOthers(otherDeviceId)
otherDevice.customize(message_payload)
publish(client,"Switchbot/Devices/" + otherDeviceId + "/Command", "null")
a += 1
a = 0
def run():
global apiCalls
global discover
switchbot = Switchbot()
switchbot.devicelist()
client = connect_mqtt()
client.on_message = on_message
client.loop_start()
client.subscribe('Switchbot/Settings/APIcalls')
client.subscribe('Switchbot/Settings/Discover')
f = open("deviceList.txt", "r")
for x in f:
devicesList = x.rsplit(", ")
if devicesList[2] == "WoIOSensor":
tempSensorList.append(devicesList[0]) # WoIOSensors ID list
elif devicesList[2] == "Air Conditioner":
IrAirConditionerList.append(devicesList[0])
elif devicesList[2] == "Others": # Others
IrOthersList.append(devicesList[0])
publish(client,"Switchbot/Devices/" + devicesList[0] + "/Name", devicesList[1])
time.sleep(delay)
publish(client,"Switchbot/Devices/" + devicesList[0] + "/Type", devicesList[2])
time.sleep(delay)
f.close()
IrAirConditionerIndex = 0
while IrAirConditionerIndex < len(IrAirConditionerList):
client.subscribe("Switchbot/Devices/" + IrAirConditionerList[IrAirConditionerIndex] + "/Command")
IrAirConditionerTopicList.append("Switchbot/Devices/" + IrAirConditionerList[IrAirConditionerIndex] + "/Command")
IrAirConditionerIndex += 1
IrOthersIndex = 0
while IrOthersIndex < len(IrOthersList):
client.subscribe("Switchbot/Devices/" + IrOthersList[IrOthersIndex] + "/Command")
IrOthersTopicList.append("Switchbot/Devices/" + IrOthersList[IrOthersIndex] + "/Command")
IrOthersIndex += 1
i = int(apiCalls)
while(1):
if(discover == "true"):
f = open("deviceList.txt", "r")
for x in f:
devicesList = x.rsplit(", ")
if devicesList[2] == "WoIOSensor":
tempSensorList.append(devicesList[0]) # WoIOSensors ID list
elif devicesList[2] == "Air Conditioner":
IrAirConditionerList.append(devicesList[0])
elif devicesList[2] == "Others": # Others
IrOthersList.append(devicesList[0])
publish(client,"Switchbot/Devices/" + devicesList[0] + "/Name", devicesList[1])
time.sleep(delay)
publish(client,"Switchbot/Devices/" + devicesList[0] + "/Type", devicesList[2])
time.sleep(delay)
f.close()
IrAirConditionerIndex = 0
while IrAirConditionerIndex < len(IrAirConditionerList):
client.subscribe("Switchbot/Devices/" + IrAirConditionerList[IrAirConditionerIndex] + "/Command")
IrAirConditionerTopicList.append("Switchbot/Devices/" + IrAirConditionerList[IrAirConditionerIndex] + "/Command")
IrAirConditionerIndex += 1
IrOthersIndex = 0
while IrOthersIndex < len(IrOthersList):
client.subscribe("Switchbot/Devices/" + IrOthersList[IrOthersIndex] + "/Command")
IrOthersTopicList.append("Switchbot/Devices/" + IrOthersList[IrOthersIndex] + "/Command")
IrOthersIndex += 1
discover = "false"
publish(client, "Switchbot/Settings/Discover", "false")
time.sleep(delay)
i += 1
time.sleep(delay)
if i > int(apiCalls):
i = 0
tempSensorIndex = 0
while tempSensorIndex < len(tempSensorList):
meter = SwitchbotMeter(tempSensorList[tempSensorIndex])
publish(client,"Switchbot/Devices/" + tempSensorList[tempSensorIndex] + "/Temperature", meter.get_temperature())
time.sleep(delay)
publish(client,"Switchbot/Devices/" + tempSensorList[tempSensorIndex] + "/Humidity", meter.get_humidity())
time.sleep(delay)
publish(client,"Switchbot/Devices/" + tempSensorList[tempSensorIndex] + "/Battery", meter.get_battery())
time.sleep(delay)
tempSensorIndex += 1
client.loop_stop()
if __name__ == '__main__':
run()Erstellen wir die Datei Settings.json.
nano settings.jsonIn der Datei „settings.json“ speichern wir „token“- und „secret key“-Schlüssel, die von der SwitchBot-Anwendung abgerufen werden können.
{
"token": "b43a******************************************************************9a0",
"secret": "840***********************1d2c86"
}Um die oben genannten Schlüssel zu erhalten, öffnen wir die SwitchBot-Anwendung auf unserem Handy und tippen wir im unteren Menü auf den Eintrag „Profil“. Wählen wir hier das Untermenü „Einstellungen“. Tippen wir nun 10 Mal auf den Menüpunkt „App-Version“, dann erscheint ein neuer Menüpunkt „DeveloperOptions“. Dieser Menüpunkt enthält den „token“ und den „secret key“, den wir benötigen.




Jetzt müssen wir dafür sorgen, dass unser Projekt beim Systemstart automatisch startet. Dazu benötigen wir eine weitere Datei.
sudo nano /etc/systemd/system/switchbot-client.serviceKopieren wir die folgenden paar Zeilen in die Datei. Vergessen wir nicht, den Dateipfad korrekt einzugeben!
[Unit]
Description="switchbot-client-service"
After=network.target network-online.target
[Service]
Restart=always
WorkingDirectory=/home/[USER]/switchbot/
ExecStart=/home/[USER]/switchbot/venv/bin/python3 /home/[USER]/switchbot/switchbot-client.py
ExecStop=deactivate
[Install]
WantedBy=multi-user.targetLegen wir die Berechtigungen wie folgt fest.
sudo chmod 644 /etc/systemd/system/switchbot-client.serviceStarten wir den Systemctl-Hintergrunddienst neu.
sudo systemctl daemon-reloadAktivieren wir der switchbot-client.service.
sudo systemctl enable inverter.serviceDaher wird switchbot-client.py bei jedem Systemstart ausgeführt und die gelesenen Daten werden an den MQTT-Server gesendet.
Weitere SwitchBot-Geräte
SwitchBot Fernbedienung mit einer Taste
kompatibel mit SwitchBot Smart Switch Toggle, Curtain, WLAN Glühbirne, LED Streifen, Blind Tilt, Smart Home einfach zu steuern, Bluetooth Long Range
werbung
SwitchBot Innen Thermometer Hygromete
Innentemperatur-Feuchtigkeitssensor mit intelligenter Warnung und 68-Tage-Datenspeicherung, Bluetooth-Raumthermometer für Baby, Zuhause, Garage
werbung
Touchscreen-Tastatur, Türriegelschlösser, Smartes Türschloss, Elektronisches Türschloss, Türöffner per App, Fingerprint, Code, Alexa, Google, unterstützt Matter
werbung
SwitchBot IP65 Thermometer Hygrometer Innen Außen
120m Bluetooth Reichweite, Taupunkt/VPD/Absolute Feuchtigkeitssensor, Temperatursensor, Kostenloser Datenspeicherung, 2 Jahre Batterielebensdauer
werbung
R-Rail Smart Curtain Pusher mit APP-Steuerung, Einfach zu Bedienen, Kompatibel mit Alexa (Hub erforderlich), Intelligenter Vorhangschalter, Curtain Rod2.0 Weiß
werbung
SwitchBot, Smart-Elektromotor für Vorhänge
Kabellose Steuerung über App oder automatisierte Timer, Hub Mini erforderlich, kompatibel mit Alexa, Google Home, IFTTT, U-Schiene, Schwarz
werbung
Mit SwitchBot Blind Tilt können Sie die Rollläden in Ihrem Haus oder Büro auf intelligente Weise steuern – einfach und kosteneffizient.
werbung
SwitchBot Tür Fensterkontakt Sensor
Drahtloses Haussicherheitssystem, Tür- und Fensterschalter-Detektor mit Alarm, fügen Sie SwitchBot Hub Mini hinzu, um es Alexa-kompatibel zu Machen
werbung
SwitchBot WLAN RGBCW Glühbirne
Farbwechselnde dimmbare WiFi&Bluetooth LED Lampe funktioniert mit Alexa und Google Home, RGBCW Multicolor Warm White 800lms, E27 10W, nur 2.4GHz, kein Hub erforderlich
werbung
Bewegungsmelder mit Alarm, drahtloses Haussicherheitssystem, fügen Hub Mini hinzu, um ihn Alexa-kompatibel zu Machen
werbung
SwitchBot Überwachungskamera Innen
WLAN Kamera mit 360°/115° Sichtfeldabdeckung, Personenerkennung, Bewegungsverfolgung, 2-Wege-Audio, IR-Nachtsicht, kompatibel mit Alexa, nur 2,4Ghz (1080P)
werbung
SwitchBot Sicherheits-Innenkamera
Bewegungserkennung für Babyphone 1080p Smart WLAN-Überwachungskamera für Haustiere für Heimsicherheit mit Nachtsicht, Zwei-Wege-Audio, funktioniert mit Alexa
werbung
SwitchBot Überwachungskamera Aussen 1080P
Outdoor Kamera 2,4G WLAN Überwachung Akku mit 10000mAh Batterie, AI Personenerkennung, Farbnachtsicht, Kompatibel zu Alexa und Google Home, 256G SD-Speicher
werbung