跳转到主要内容

用于与运动窗帘接口的Python库

项目描述

motion-blinds

用于与运动窗帘接口的Python库

这个库允许您从Coulisse B.V.控制运动窗帘。这个库主要是为了与HomeAssistant一起使用而编写的,但也可以独立使用。

有关产品信息,请参阅https://motion-blinds.comhttps://coulisse.com/products/motion

销售这些窗帘的商店

其他窗帘品牌

这个Python库主要是为运动窗帘编写的,但一些其他制造商使用相同的API,因此这个库也可以与这些品牌一起使用。以下品牌已报告可以使用此Python库

安装

使用pip

$ pip install motionblinds

$ pip install --use-wheel motionblinds

检索密钥

运动窗帘API使用16个字符的密钥,可以从官方的"Ios"或"Android"版"运动窗帘"应用中获取。打开应用,点击右上角的三个点,进入"设置",然后进入"运动APP关于",请快速点击这个"运动APP关于"页面5次,将弹出一个包含密钥的窗口。

alt text alt text

请注意,在将密钥提供给此库时,需要包含"-"字符。密钥需要类似于"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枚举返回遮阳板的电压模式

项目详情


发布历史 发布通知 | RSS源

下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

motionblinds-0.6.25.tar.gz (25.4 kB 查看哈希值)

上传时间 源代码

构建分发

motionblinds-0.6.25-py3-none-any.whl (21.1 kB 查看哈希值)

上传时间 Python 3

支持