Problematische ioBroker-Switchbot-Adapter-Alternative

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.

SwitchBot Hub Mini Smart Fernbedienung - IR-Sendersystem, Verbindung zu WLAN, Klimaanlagensteuerung, kompatibel mit Alexa, Google Home, Siri, IFTTT

SwitchBot Hub Mini

Smart Fernbedienung – IR-Sendersystem, Verbindung zu WLAN, Klimaanlagensteuerung, kompatibel mit Alexa, Google Home, Siri, IFTTT

SwitchBot Hub 2, Wlan Thermometer Hygrometer, Smart IR Fernbedienung, Klimaanlagensteuerung, verbindet SwitchBot mit WLAN (unterstützt 2,4 GHz), kompatibel mit Alexa, Google Assistant, Siri, Matter

SwitchBot Hub 2

Wlan Thermometer Hygrometer, Smart IR Fernbedienung, Klimaanlagensteuerung, verbindet SwitchBot mit WLAN (unterstützt 2,4 GHz), kompatibel mit Alexa, Google Assistant, Siri, Matter

werbung

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:

Bash
sudo apt-get update

Schauen wir mal, ob Python3 auf unserem Computer installiert ist. Geben wir in der Befehlszeile Folgendes ein:

Bash
python3 --version

Wenn die Versionsnummer zurückgegeben wird, ist Python3 installiert. Wenn wir die Fehlermeldung „bash: python3: command not found“ erhalten, ist Python3 nicht installiert.

Bash
sudo apt-get install python3

Wenn pip noch nicht installiert, installieren wir es ebenfalls.

Bash
sudo apt-get install python3-pip

Erstellen wir für das Projekt einen Ordner namens „switchbot“.

Bash
mkdir switchbot

Dann navigieren wir zum neu erstellten Switchbot-Ordner.

Bash
cd switchbot

Hier erstellen wir eine virtuelle Umgebung.

Bash
python3 -m venv venv

Anschließend aktivieren wir die virtuelle Umgebung.

Bash
source venv/bin/activate

Anschließend installieren wir die notwendigen Bibliotheken.

Switchbot Utility die Switchbot-API.

Bash
python3 -m pip install switchbot-utility

Paho-mqtt client.

Bash
python3 -m pip install paho-mqtt

Erstellen wir ein Python-Skript namens switchbot-client.py.

Bash
nano switchbot-client.py

Inhalt der switchbot-client.py-Datei:

Python
#!/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.

Bash
nano settings.json

In der Datei „settings.json“ speichern wir „token“- und „secret key“-Schlüssel, die von der SwitchBot-Anwendung abgerufen werden können.

JSON
{
    "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.

SwitchBot alkalmazás - Profile menü - válasszuk a Preferences menüelemet
SwitchBot alkalmazás - Preferences almenü - 10x érintsük meg az App Version menüelemet
SwitchBot-Anwendung – Ein neuer Menüpunkt, DeveloperOptions, wurde im Untermenü „Einstellungen“ angezeigt
SwitchBot alkalmazás - DeveloperOptions menüben található token az ioBroker SwitchBot-Hub adapter beállításához

Jetzt müssen wir dafür sorgen, dass unser Projekt beim Systemstart automatisch startet. Dazu benötigen wir eine weitere Datei.

Bash
sudo nano /etc/systemd/system/switchbot-client.service

Kopieren wir die folgenden paar Zeilen in die Datei. Vergessen wir nicht, den Dateipfad korrekt einzugeben!

Bash
[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.target

Legen wir die Berechtigungen wie folgt fest.

Bash
sudo chmod 644 /etc/systemd/system/switchbot-client.service

Starten wir den Systemctl-Hintergrunddienst neu.

Bash
sudo systemctl daemon-reload

Aktivieren wir der switchbot-client.service.

Bash
sudo systemctl enable inverter.service

Daher 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

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 Hygrometer Innentemperatur-Feuchtigkeitssensor mit intelligenter Warnung und 68-Tage-Datenspeicherung, Bluetooth-Raumthermometer für Baby, Zuhause, Garage

SwitchBot Innen Thermometer Hygromete

Innentemperatur-Feuchtigkeitssensor mit intelligenter Warnung und 68-Tage-Datenspeicherung, Bluetooth-Raumthermometer für Baby, Zuhause, Garage

werbung

SwitchBot WLAN Smart Lock Pro mit Touchscreen-Tastatur, Türriegelschlösser, Smartes Türschloss, Elektronisches Türschloss, Türöffner per App, Fingerprint, Code, Alexa, Google, unterstützt Matter

SwitchBot WLAN Smart Lock Pro

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 3er, 120m Bluetooth Reichweite, Taupunkt/VPD/Absolute Feuchtigkeitssensor, Temperatursensor, Kostenloser Datenspeicherung, 2 Jahre Batterielebensdauer

SwitchBot IP65 Thermometer Hygrometer Innen Außen

120m Bluetooth Reichweite, Taupunkt/VPD/Absolute Feuchtigkeitssensor, Temperatursensor, Kostenloser Datenspeicherung, 2 Jahre Batterielebensdauer

werbung

SwitchBot Vorhangmotor - R-Rail Smart Curtain Pusher mit APP-Steuerung, Einfach zu Bedienen, Kompatibel mit Alexa (Hub erforderlich), Intelligenter Vorhangschalter (Curtain Rod2.0 Weiß)

SwitchBot Vorhangmotor

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)

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.

SwitchBot Blinde Neigung

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

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 Glühbirne E27 10W, Farbwechselnde dimmbare WiFi&Bluetooth LED Lampe funktioniert mit Alexa und Google Home, RGBCW Multicolor Warm White 800lms, nur 2.4GHz, kein Hub erforderlich

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

SwitchBot Smart Motion Sensor – Bewegungsmelder mit Alarm, drahtloses Haussicherheitssystem, fügen Hub Mini hinzu, um ihn Alexa-kompatibel zu Machen

SwitchBot Smart Motion Sensor

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)

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

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

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