Problémás ioBroker Switchbot adapter alternatíva

Korábban a Switchbot-hub adaptert használtam a switchbot eszközeim iobrokerbe integrálásához, amely eleinte jól működött, de később jelentkezett a következő probléma, a csatlakoztatott eszközök adatpontjai nem frissültek.

A probléma megoldásához létrehoztam egy python scriptet, amely lekéri a switchbot eszközök adatait a Switchbot Utilities Switchbot API használatával, majd a Paho mqtt segítségével továbbküldi az MQTT szerverre.

SwitchBot Hub Mini Intelligens távirányító - IR adórendszer, WiFi csatlakozás, TV, légkondicionáló vezérlés, kompatibilis a következőkkel: Alexa, Google Home, Siri, IFTTT

SwitchBot Hub Mini

Intelligens távirányító – IR adórendszer, SwitchBot eszközök csatlakoztatása WiFi-hez, TV, légkondicionáló vezérlés, kompatibilis a következőkkel: Alexa, Google Home, Siri, IFTTT

SwitchBot Hub 2, WiFi hőmérő nedvességmérő, intelligens infravörös távirányító, légkondicionáló vezérlés, SwitchBot csatlakoztatása WiFi-hez (2,4 GHz támogatás), kompatibilis a következőkkel: Alexa, Google Assistant, Siri, Matter

SwitchBot Hub 2

WiFi hőmérő nedvességmérő, intelligens infravörös távirányító, légkondicionáló vezérlés, SwitchBot eszközök csatlakoztatása WiFi-hez (2,4 GHz támogatás), kompatibilis a következőkkel: Alexa, Google Assistant, Siri, Matter

hirdetés

Ez a projekt nálam az iobroker szervernek otthont adó Ubuntu 22.04 operációs rendszeren fut. Lássuk a részleteket.

Először is frissítsük a csomaglistát:

Bash
sudo apt-get update

Ellenőrizzük le, hogy a Python3 telepítve van-e a gépünkön. Írjuk be a parancssorba:

Bash
python3 --version

Ha visszaadja a verziószámot, a Python3 telepítve van, amennyiben hibaüzenetet kapunk „bash: python3: parancs nem található ” a Python3 nincs telepítve.

Bash
sudo apt-get install python3

Ha még nincs telepítve a pip, telepítsük azt is.

Bash
sudo apt-get install python3-pip

Készítsünk egy switchbot nevű mappát a projekthez.

Bash
mkdir switchbot

Majd navigáljunk a frissen elkészült switchbot mappába.

Bash
cd switchbot

Majd itt hozzzunk létre egy virtuális környezetet.

Bash
python3 -m venv venv

Ezután aktiváljuk a virtuális környezetet.

Bash
source venv/bin/activate

Majd telepítsük a szükséges könyvtárakat.

Switchbot Utility a Switchbot API.

Bash
python3 -m pip install switchbot-utility

Paho-mqtt kliens.

Bash
python3 -m pip install paho-mqtt

Hozzuk létre a switchbot-client.py nevű Python scriptet.

Bash
nano switchbot-client.py

A switchbot-client.py fájl tartalma.

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()

Hozzuk létre a settings.json fájlt.

Bash
nano settings.json

A settings.json fájlban tároljuk ‘token’ és ‘secret key’ kulcsokat, amelyeket a SwitchBot Applikációból nyerhetünk ki.

JSON
{
    "token": "b43a******************************************************************9a0",
    "secret": "840***********************1d2c86"
}

A fenti kulcsok megszerzéséhez nyissuk meg a SwitchBot alkalmazást a telefonunkon és érintsük meg az alsó menü „Profile” elemét. Itt válasszuk a „Preferences” almenüt. Most koppintsunk 10-szer az „App Version” menüelemre, ekkor megjelenik egy új menüelem, a „DeveloperOptions”. Ebben a menüelemben található a token és a secret key, amelyekre szükségünk van.

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 alkalmazás - Preferences almenüben megjelent új menüelem, a DeveloperOptions
SwitchBot alkalmazás - DeveloperOptions menüben található token az ioBroker SwitchBot-Hub adapter beállításához

Most el kell érni, hogy a projektünk automatikusan elinduljon a rendszer indításakor. Ehez egy újabb fájlra van szükségünk.

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

A fájlba másoljuk be az alábbi pár sort. Ne felejtsük el fájl elérési útját helyesen megadni!

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

Állítsuk be a jogosultságokat az alábbiak szerint.

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

Indítsuk újra a systemctl háttérszolgáltatást.

Bash
sudo systemctl daemon-reload

Engedélyezzük az switchbot-client.service szolgáltatást.

Bash
sudo systemctl enable switchbot-client.service

Igy már minden rendszerindításkor futni fog az switchbot-client.py és a kiolvasott adatokat elküldi az mqtt szervernek.

További SwitchBot eszközök

SwitchBot egygombos távirányító, Kompatibilis a SwitchBot Smart Switch billenőkapcsolóval, függönnymotorral, WiFi izzóval, LED szalaggal, reluxa mozgatóval, intelligens otthon könnyen kezelhető, Bluetooth hosszú hatótávolsággal

SwitchBot egygombos távirányító

Kompatibilis a SwitchBot Smart Switch billenőkapcsolóval, függönnymotorral, WiFi izzóval, LED szalaggal, reluxa mozgatóval, intelligens otthon könnyen kezelhető, Bluetooth hosszú hatótávolsággal

hirdetés

SwitchBot beltéri hőmérő higrométer Beltéri hőmérséklet páratartalom-érzékelő intelligens riasztással és 68 napos adattárolási lehetőséggel, Bluetooth szobahőmérővel, lakáshoz, garázshoz...

SwitchBot beltéri hőmérő higrométer

Beltéri hőmérséklet páratartalom-érzékelő intelligens riasztással és 68 napos adattárolási lehetőséggel, Bluetooth szobahőmérővel, lakáshoz, garázshoz…

hirdetés

SwitchBot IP65 hőmérő higrométer beltéri kültéri, 120m Bluetooth hatótáv, harmatpont/VPD/abszolút páratartalom érzékelő, hőmérséklet érzékelő, ingyenes adattárolás, 2 éves akkumulátor élettartam

SwitchBot IP65 hőmérő Higrométer beltéri kültéri használatra

120 méteres Bluetooth hatótáv, harmatpont/VPD/abszolút páratartalom érzékelő, hőmérséklet érzékelő, ingyenes adattárolás, 2 éves akkumulátor-élettartam

hirdetés

SwitchBot WiFi Smart Lock érintőgombos billentyűzettel, Intelligens ajtózár nyitáshoz, záráshoz ujjlenyomattal, kóddal, android vagy iOS telefonos alkalmazással...

SwitchBot WLAN Smart Lock Pro

Intelligens ajtózár nyitáshoz, záráshoz ujjlenyomattal, kóddal, android vagy iOS telefonos alkalmazással, Matter támogatással …

hirdetés

SwitchBot függönymotor, R-Rail intelligens motoros függönyelhúzó APP vezérléssel, könnyen használható, kompatibilis az Amazon Alexával (hub szükséges)

SwitchBot függönymotor

R-Rail intelligens motoros függönyelhúzó APP vezérléssel, könnyen használható, kompatibilis az Amazon Alexával (hub szükséges)

hirdetés

U-rail SwitchBot függönymotor, vezeték nélküli vezérlés alkalmazáson vagy automatizált időzítőn keresztül, Hub Mini szükséges, kompatibilis az Alexával, Google Home, IFTTT

SwitchBot függönymotor – fekete

U-rail SwitchBot függönymotor, vezeték nélküli vezérlés alkalmazáson vagy automatizált időzítőn keresztül, Hub Mini szükséges, kompatibilis az Alexával, Google Home, IFTTT

hirdetés

A SwitchBot motoros reluxa billentő segítségével intelligensen vezérelheti otthonában vagy irodájában a reluxákat – egyszerűen és költséghatékonyan.

SwitchBot motoros reluxa billentő

A SwitchBot motoros reluxa billentő segítségével intelligensen vezérelheti otthonában vagy irodájában a reluxákat – egyszerűen és költséghatékonyan.

hirdetés

SwitchBot ajtó/ablak érzékelő, Vezeték nélküli otthoni biztonsági rendszer, ajtó- és ablakkapcsoló érzékelő riasztóval, SwitchBot Hub Mini hozzáadásával Alexa kompatibilis

SwitchBot ajtó/ablak érzékelő

Vezeték nélküli otthoni biztonsági rendszer, ajtó- és ablakkapcsoló érzékelő riasztóval, SwitchBot Hub Mini hozzáadásával Alexa kompatibilis

hirdetés

SwitchBot WiFi RGBCW LED lámpa Színváltós, dimmelhető, WiFi&Bluetooth LED lámpa. Kompatibilis az Alexa és a Google Home aszisztensekkel, RGBCW Multicolor és melegfehér, 800lms, E27 10W. Hub nélkül működik

SwitchBot WiFi RGBCW LED lámpa

Színváltós, dimmelhető, WiFi&Bluetooth LED lámpa. Kompatibilis az Alexa és a Google Home aszisztensekkel, RGBCW Multicolor és melegfehér, 800lms, E27 10W.

Hub nélkül működik!

hirdetés

SwitchBot Smart Mozgásérzékelő, Mozgásérzékelő riasztóval, vezeték nélküli otthoni biztonsági rendszer, adjon hozzá Hub Minit, hogy Alexa kompatibilis legyen

SwitchBot Smart Mozgásérzékelő

Mozgásérzékelő riasztóval, vezeték nélküli otthoni biztonsági rendszer, adjon hozzá Hub Minit, hogy Alexa kompatibilis legyen

hirdetés

SwitchBot beltéri biztonsági kamera, Intelligens WiFi babafigyelő, biztonsági kamera 1080p, mozgásérzékelés, kisállat felismeréssel, éjszakai látással, kétirányú hanggal, Alexával működik

SwitchBot beltéri biztonsági kamera

Intelligens WiFi babafigyelő, biztonsági kamera 1080p, mozgásérzékelés, kisállat felismeréssel, éjszakai látással, kétirányú hanggal, Alexával működik

hirdetés

SwitchBot beltéri Pan/Tilt biztonsági kamera, 1080P WiFi kamera 360°/115°-os látómezővel, személyérzékeléssel, mozgáskövetéssel, kétirányú hanggal, IR éjszakai látással, Alexa kompatibilis

SwitchBot beltéri Pan/Tilt biztonsági kamera

1080P WiFi kamera 360°/115°-os látómezővel, személyérzékeléssel, mozgáskövetéssel, kétirányú hanggal, IR éjszakai látással, Alexa kompatibilis

hirdetés

Reolink 12MP-es vandálbiztos PoE biztonsági kamera 145°-os széles látószöggel, színes éjjellátóval, kétirányú hanggal, intelligens személy-/jármű-/kisállatérzékeléssel és IP67 időjárásállósággal, RLC-1240A

Reolink 12MP-es vandálbiztos PoE biztonsági kamera

145°-os széles látószöggel, színes éjjellátóval, kétirányú hanggal, intelligens személy-/jármű-/kisállatérzékeléssel és IP67 időjárásállósággal, RLC-1240A

hirdetés