用于与运动窗帘接口的Python库
项目描述
motion-blinds
用于与运动窗帘接口的Python库
这个库允许您从Coulisse B.V.控制运动窗帘。这个库主要是为了与HomeAssistant一起使用而编写的,但也可以独立使用。
有关产品信息,请参阅https://motion-blinds.com或https://coulisse.com/products/motion。
销售这些窗帘的商店
其他窗帘品牌
这个Python库主要是为运动窗帘编写的,但一些其他制造商使用相同的API,因此这个库也可以与这些品牌一起使用。以下品牌已报告可以使用此Python库
- 运动窗帘
- 智能窗帘
- Dooya
- Brel Home
- Bloc Blinds
- Acomax
- AMP Motorization
- Bliss Automation - Alta Window Fashions
- 3 Day Blinds
- Diaz
- Gaviota
- Havana Shade
- Hurrican Shutters Wholesale
- Inspired Shades
- iSmartWindow
- Krispol
- Madeco
- Martec
- Raven Rock MFG
- ScreenAway
- 智能家居
- Uprise Smart Shades
安装
使用pip
$ pip install motionblinds
或
$ pip install --use-wheel motionblinds
检索密钥
运动窗帘API使用16个字符的密钥,可以从官方的"Ios"或"Android"版"运动窗帘"应用中获取。打开应用,点击右上角的三个点,进入"设置",然后进入"运动APP关于",请快速点击这个"运动APP关于"页面5次,将弹出一个包含密钥的窗口。
请注意,在将密钥提供给此库时,需要包含"-"字符。密钥需要类似于"12ab345c-d67e-8f"。
用法
要创建设备,可以使用以下代码行(使用网关的正确IP和从应用中获取的密钥)
from motionblinds import MotionGateway
m = MotionGateway(ip = "192.168.1.100", key = "12ab345c-d67e-8f")
此库不会轮询。因此,您需要使用GetDeviceList方法填充连接的窗帘,并使用Update方法更新设备信息。注意,网关的多播推送可以进行处理以检索即时状态更新(请参阅多播推送部分)
m.GetDeviceList()
m.Update()
请注意,在使用Update之前需要运行GetDeviceList,因为device_type、mac和token是通过GetDeviceList方法获取的。一旦使用GetDeviceList方法发现连接的窗帘,就可以通过device_list属性列出它们。
m.device_list
这将返回一个字典,以mac_adress为键,以可用于检索该窗帘信息和控制该窗帘的MotionBlind设备为值。
以下示例代码将打印网关和所有连接窗帘的信息
>>> from motionblinds import MotionGateway
>>> m = MotionGateway(ip = "192.168.1.100", key = "12ab345c-d67e-8f")
>>> m.GetDeviceList()
{'abcdefghujkl0001': <MotionBlind mac: abcdefghujkl0001, type: None, status: None, position: None %, angle: None, limit: None, battery: None, RSSI: None dBm>}
>>> m.Update()
>>> print(m)
<MotionGateway ip: 192.168.1.100, mac: abcdefghujkl, protocol: 0.9, N_devices: 1, status: Working, RSSI: -71 dBm>
>>> for blind in m.device_list.values():
>>> blind.Update()
>>> print(blind)
<MotionBlind mac: abcdefghujkl0001, type: RollerBlind, status: Stopped, position: 0 %, angle: 0, limit: Limits, battery: 1195, RSSI: -82 dBm>
要打开窗帘,可以使用以下示例代码
>>> from motionblinds import MotionGateway
>>> m = MotionGateway(ip = "192.168.1.100", key = "12ab345c-d67e-8f")
>>> m.GetDeviceList()
>>> m.Update()
>>> blind_1 = list(m.device_list.values())[0]
>>> blind_1.Update()
>>> blind_1.Open()
除了blind_1.Open()之外,您还可以使用blind_1.Close()、blind_1.Stop()、blind_1.Set_position(50)或blind_1.Set_angle(90)
多播推送
此库允许监听网关的多播推送(在并行线程或使用asyncio中)并处理这些推送以获取网关和连接窗帘的即时状态更新。要使用并行推送处理,需要初始化MotionMulticast/AsyncMotionMulticast类对象。然后可以使用MotionMulticast.Start_listen()/AsyncMotionMulticast.Start_listen()和MotionMulticast.Stop_listen()/AsyncMotionMulticast.Stop_listen()来启动和停止监听传入推送的并行线程。可以将MotionMulticast/AsyncMotionMulticast类对象提供给MotionGateway类,以便更新该网关及其连接的窗帘。可以为网关设备和窗帘设备注册外部回调(请参阅下表)。如果UDP多播消息没有通过,请尝试使用运行代码的主机的IP地址作为接口而不是"any"。
并行线程
以下示例代码将监听30秒的推送,并在推送到来时(当窗帘完成移动时)使用并行线程打印网关或窗帘信息
import time
from motionblinds import MotionMulticast, MotionGateway
def callback_func_gateway():
print(m)
def callback_func_blind():
for blind in m.device_list.values():
print(blind)
motion_multicast = MotionMulticast(interface = "any")
motion_multicast.Start_listen()
m = MotionGateway(ip="192.168.1.100", key="12ab345c-d67e-8f", multicast = motion_multicast)
m.GetDeviceList()
m.Update()
m.Register_callback("1", callback_func_gateway)
for blind in m.device_list.values():
blind.Register_callback("1", callback_func_blind)
time.sleep(30)
motion_multicast.Stop_listen()
Asyncio
以下示例代码将监听30秒的推送,并在推送到来时(当窗帘完成移动时)使用asyncio打印网关或窗帘信息
import asyncio
from motionblinds import AsyncMotionMulticast, MotionGateway
async def asyncio_demo(loop):
def callback_func_gateway():
print(m)
def callback_func_blind():
for blind in m.device_list.values():
print(blind)
motion_multicast = AsyncMotionMulticast(interface = "any")
await motion_multicast.Start_listen()
m = MotionGateway(ip="192.168.1.100", key="12ab345c-d67e-8f", multicast = motion_multicast)
await loop.run_in_executor(None, m.GetDeviceList)
await loop.run_in_executor(None, m.Update)
m.Register_callback("1", callback_func_gateway)
for blind in m.device_list.values():
blind.Register_callback("1", callback_func_blind)
await asyncio.sleep(30)
motion_multicast.Stop_listen()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio_demo(loop))
发现
可以使用MotionDiscovery类在您的网络中发现运动网关。以下示例将尝试发现网关10秒,然后打印包含发现的网关及其连接窗帘的字典。
>>> from motionblinds import MotionDiscovery
>>> d = MotionDiscovery()
>>> motion_gateways = d.discover()
>>> print(motion_gateways)
{'192.168.1.100': {
'msgType': 'GetDeviceListAck',
'mac': 'abcdefghujkl',
'deviceType': '02000002',
'ProtocolVersion': '0.9',
'token': '12345A678B9CDEFG',
'data': [
{'mac': 'abcdefghujkl', 'deviceType': '02000002'},
{'mac': 'abcdefghujkl0001', 'deviceType': '10000000'},
{'mac': 'abcdefghujkl0002', 'deviceType': '10000000'}
]
}}
网关设备
分配给变量'm'的网关设备具有以下方法和属性
方法 | 参数 | 参数类型 | 说明 |
---|---|---|---|
"m.GetDeviceList()" | - | - | 从运动网关获取设备列表并更新以下属性 |
"m.Update()" | - | - | 获取运动网关的状态并更新以下属性 |
"m.Check_gateway_multicast()" | - | - | 检查是否可以接收配置的多播监听器收到的多播消息 |
"m.Register_callback("1", func) | id, 回调 | 字符串,函数 | 为网关的更新注册外部回调函数 |
"m.Remove_callback("1") | id | 字符串 | 使用其id删除外部回调 |
"m.Clear_callbacks() | - | - | 移除所有外部注册的网关更新回调 |
属性 | 值类型 | 说明 |
---|---|---|
"m.available" | 布尔值 | 返回网关是否可用 |
"m.status" | 字符串 | 返回网关状态:从GatewayStatus枚举中获取 |
"m.N_devices" | 整数 | 返回连接的子设备数量 |
"m.RSSI" | 整数 | 返回网关的Wi-Fi连接强度(dBm) |
"m.token" | 字符串 | 返回Token |
"m.access_token" | 字符串 | 返回AccessToken |
"m.mac" | 字符串 | 返回网关的MAC地址 |
"m.device_type" | 字符串 | 返回网关的设备类型 |
"m.protocol" | 字符串 | 返回网关的协议版本 |
"m.firmware" | 字符串 | 返回网关的固件版本 |
"m.device_list" | 字典 | 返回一个字典,包含连接到网关的所有窗帘,字典的键是窗帘的MAC地址。 |
窗帘设备
窗帘设备(分配给变量'blind_1')具有以下方法和属性,括号中的参数是可选的
方法 | 参数 | 参数类型 | 说明 |
---|---|---|---|
"blind_1.Update_from_cache()" | - | - | 从运动网关的缓存中获取窗帘的状态,不与窗帘进行433MHz无线电通信 |
"blind_1.Update_trigger()" | - | - | 从运动网关的缓存中获取窗帘的状态,并请求与窗帘进行433MHz无线电通信以获取新的状态(不等待) |
"blind_1.Update()" | - | - | 通过运动网关(WiFi)使用网关和窗帘之间的433MHz无线电通信从窗帘获取窗帘的状态 |
"blind_1.Stop()" | - | - | 停止窗帘的运动 |
"blind_1.Open()" | - | - | 打开窗帘/向上移动窗帘 |
"blind_1.Close()" | - | - | 关闭窗帘/向下移动窗帘 |
"blind_1.Set_position(50)" | 位置(角度),(恢复角度) | int (0-100),int (0-180),boolean | 设置窗帘的位置,可选设置角度或恢复当前角度 |
"blind_1.Set_angle(90)" | 角度 | int (0-180) | 设置窗帘的角度/旋转 |
"blind_1.Jog_up()" | - | - | 打开窗帘/向上移动窗帘一步 |
"blind_1.Jog_down()" | - | - | 关闭窗帘/向下移动窗帘一步 |
"blind_1.Go_favorite_position()" | - | - | 将窗帘移动到收藏位置 |
"blind_1.Set_favorite_position()" | - | - | 将当前位置设置为收藏位置,首先需要通过短按重置按钮将窗帘置于配置模式 |
"blind_1.Register_callback("1", func)" | id, 回调 | 字符串,函数 | 为窗帘的更新注册外部回调函数 |
"blind_1.Remove_callback("1")" | id | 字符串 | 使用其id删除外部回调 |
"blind_1.Clear_callbacks()" | - | - | 移除所有外部注册的窗帘更新回调 |
属性 | 值类型 | 说明 |
---|---|---|
"blind_1.device_type" | 字符串 | 返回设备类型,为8位数字 |
"blind_1.blind_type" | 字符串 | 返回窗帘的类型,从BlindType枚举中获取 |
"blind_1.type" | 枚举 | 以BlindType枚举返回窗帘的类型 |
"blind_1.mac" | 字符串 | 返回窗帘的MAC地址 |
"blind_1.available" | 布尔值 | 返回窗帘是否可用 |
"blind_1.status" | 字符串 | 返回窗帘的当前状态,从BlindStatus枚举中获取 |
"blind_1.limit_status" | 字符串 | 返回窗帘的当前限位检测状态,从LimitStatus枚举中获取 |
"blind_1.position" | 整数 | 返回窗帘的当前位置(%)(0-100) |
"blind_1.angle" | 整数 | 返回窗帘的当前角度(0-180) |
"blind_1.battery_voltage" | double | 返回窗帘的当前电池电压(V) |
"blind_1.battery_level" | double | 返回窗帘的当前电池电平(%) |
"blind_1.is_charging" | 布尔值 | 返回窗帘是否正在为其电池充电 |
"blind_1.RSSI" | 整数 | 返回窗帘与网关之间的无线电连接强度(dBm) |
"blind_1.wireless_mode" | 枚举 | 返回窗帘的无线模式,作为WirelessMode枚举 |
"blind_1.wireless_name" | 字符串 | 返回窗帘的无线模式,从WirelessMode枚举中获取 |
"blind_1.voltage_mode" | 枚举 | 将遮阳板的电压模式作为VoltageMode枚举返回 |
"blind_1.voltage_name" | 字符串 | 从VoltageMode枚举返回遮阳板的电压模式 |
上下翻转(TDBU)设备
上下翻转(TDBU)遮阳板设备有两个电机,分别由"T" = 顶部和"B" = 底部指定来控制遮阳板的两个部分。两部分可以使用"C" = 合并作为电机一起控制。分配给变量'blind_1'的TDBU设备有以下方法和属性
方法 | 参数 | 参数类型 | 说明 |
---|---|---|---|
"blind_1.Update()" | - | - | 从运动网关获取遮阳板的状态 |
"blind_1.Stop(motor = 'B')" | 电机 | 'B'、'T'或'C' | 停止遮阳板底部或顶部电机的运动 |
"blind_1.Open(motor = 'B')" | 电机 | 'B'、'T'或'C' | 将遮阳板底部或顶部电机向上移动 |
"blind_1.Close(motor = 'B')" | 电机 | 'B'、'T'或'C' | 将遮阳板底部或顶部电机向下移动 |
"blind_1.Set_position(50, motor = 'B', width = 20)" | 位置、电机、宽度 | int (0-100),'B'、'T'或'C',int (0-100) | 设置遮阳板底部或顶部电机的位置,可选指定宽度 |
"blind_1.Set_scaled_position(50, motor = 'B')" | 位置、电机 | int (0-100),'B'、'T'或'C' | 设置遮阳板电机在允许移动空间内的位置 |
"blind_1.Set_angle(90, motor = 'B')" | 角度、电机 | int (0-180),'B'、'T'或'C' | 设置遮阳板底部或顶部电机的角度/旋转 |
"blind_1.Jog_up(motor = 'B')" | 电机 | 'B'、'T'或'C' | 将遮阳板底部或顶部电机向上移动一步 |
"blind_1.Jog_down(motor = 'B')" | 电机 | 'B'、'T'或'C' | 将遮阳板底部或顶部电机向下移动一步 |
"blind_1.Go_favorite_position()" | - | - | 将窗帘移动到收藏位置 |
"blind_1.Set_favorite_position()" | - | - | 将当前位置设置为收藏位置,首先需要通过短按重置按钮将窗帘置于配置模式 |
"blind_1.Register_callback("1", func)" | id, 回调 | 字符串,函数 | 为窗帘的更新注册外部回调函数 |
"blind_1.Remove_callback("1")" | id | 字符串 | 使用其id删除外部回调 |
"blind_1.Clear_callbacks()" | - | - | 移除所有外部注册的窗帘更新回调 |
属性 | 值类型 | 说明 |
---|---|---|
"blind_1.device_type" | 字符串 | 返回设备类型,为8位数字 |
"blind_1.blind_type" | 字符串 | 返回窗帘的类型,从BlindType枚举中获取 |
"blind_1.type" | 枚举 | 以BlindType枚举返回窗帘的类型 |
"blind_1.mac" | 字符串 | 返回窗帘的MAC地址 |
"blind_1.available" | 布尔值 | 返回窗帘是否可用 |
"blind_1.status" | {"T": string, "B": string} | 返回窗帘的当前状态,从BlindStatus枚举中获取 |
"blind_1.limit_status" | {"T": string, "B": string} | 返回窗帘的当前限位检测状态,从LimitStatus枚举中获取 |
"blind_1.position" | {"T": int, "B": int, "C": double} | 返回窗帘的当前位置(%)(0-100) |
"blind_1.scaled_position" | {"T": double, "B": double, "C": double} | 返回遮阳板的当前位置,按允许移动空间缩放,单位为%(0-100) |
"blind_1.width" | 整数 | 返回遮阳板覆盖的面积,单位为%(0-100) |
"blind_1.angle" | {"T": int, "B": int} | 返回窗帘的当前角度(0-180) |
"blind_1.battery_voltage" | {"T": double, "B": double} | 返回窗帘的当前电池电压(V) |
"blind_1.battery_level" | {"T": double, "B": double} | 返回窗帘的当前电池电平(%) |
"blind_1.is_charging" | 布尔值 | 返回窗帘是否正在为其电池充电 |
"blind_1.RSSI" | 整数 | 返回窗帘与网关之间的无线电连接强度(dBm) |
"blind_1.wireless_mode" | 枚举 | 返回窗帘的无线模式,作为WirelessMode枚举 |
"blind_1.wireless_name" | 字符串 | 返回窗帘的无线模式,从WirelessMode枚举中获取 |
"blind_1.voltage_mode" | 枚举 | 将遮阳板的电压模式作为VoltageMode枚举返回 |
"blind_1.voltage_name" | 字符串 | 从VoltageMode枚举返回遮阳板的电压模式 |
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
motionblinds-0.6.25.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 07d16f13fb88e13178650ae53a4fbd2711961d69dc939e9adccbcfce5f6a30f8 |
|
MD5 | 43917d25e52f6239d0bddca2a6221724 |
|
BLAKE2b-256 | 5d27a585132b34ed1c5cde463c9353726917f667571a3a38606e404894c6c3f6 |
motionblinds-0.6.25-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cfe39b20873d0bbf3412e0b6039fa12ab4d44af750c3443e906cda1fe732b4de |
|
MD5 | 5d8c8a7a69515581ed1401f42339f94e |
|
BLAKE2b-256 | 2fc56738c3faf85155844ddebb9ce5ba44b4490c8f7d874b68216c596e200107 |