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.

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
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:
sudo apt-get updateEllenőrizzük le, hogy a Python3 telepítve van-e a gépünkön. Írjuk be a parancssorba:
python3 --versionHa 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.
sudo apt-get install python3Ha még nincs telepítve a pip, telepítsük azt is.
sudo apt-get install python3-pipKészítsünk egy switchbot nevű mappát a projekthez.
mkdir switchbotMajd navigáljunk a frissen elkészült switchbot mappába.
cd switchbotMajd itt hozzzunk létre egy virtuális környezetet.
python3 -m venv venvEzután aktiváljuk a virtuális környezetet.
source venv/bin/activateMajd telepítsük a szükséges könyvtárakat.
Switchbot Utility a Switchbot API.
python3 -m pip install switchbot-utilityPaho-mqtt kliens.
python3 -m pip install paho-mqttHozzuk létre a switchbot-client.py nevű Python scriptet.
nano switchbot-client.pyA switchbot-client.py fájl tartalma.
#!/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.
nano settings.jsonA settings.json fájlban tároljuk ‘token’ és ‘secret key’ kulcsokat, amelyeket a SwitchBot Applikációból nyerhetünk ki.
{
"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.




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.
sudo nano /etc/systemd/system/switchbot-client.serviceA fájlba másoljuk be az alábbi pár sort. Ne felejtsük el fájl elérési útját helyesen megadni!
[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.
sudo chmod 644 /etc/systemd/system/switchbot-client.serviceIndítsuk újra a systemctl háttérszolgáltatást.
sudo systemctl daemon-reloadEngedélyezzük az switchbot-client.service szolgáltatást.
sudo systemctl enable switchbot-client.serviceIgy 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
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…
hirdetés
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
Intelligens ajtózár nyitáshoz, záráshoz ujjlenyomattal, kóddal, android vagy iOS telefonos alkalmazással, Matter támogatással …
hirdetés
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
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
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
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!
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
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
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
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
hirdetés