用于在局域网上使用asyncio与Yelight设备进行本地通信的API。

aioyeelight的Python项目详细描述


爱小米

aioxiaomi是一个Python3/asyncio库,用于在LAN上控制小米Yelight LED灯泡。在

PyPI version fury.ioMIT licenseGITHUB-BADGE

安装

我们在PyPi所以

 pip3 install aioxiaomi

或者 python3-m pip安装aioyeelight

加密密钥

此库使用MIHome二进制协议,如OpenMiHome所述 这意味着您必须获取在配置期间生成的envryption密钥。在

最简单的方法是给灯泡提供aioiotprov。在

如何使用

本质上,创建一个至少有两个方法的对象:

^{pr2}$

然后使用start_yelight_discovery来搜索带有回调函数的灯泡,该回调函数将创建和.activate()任何新灯泡。 与灯泡连接后,它将向父对象注册。所有与灯泡通讯的方法 可以传递一个回调函数来响应bulb响应。回调应采用1个参数:

- the response message

签出main.py查看其工作原理。在

本质上,测试程序是这样的

tokenlist = { <mac>: <secret token>}
class bulbs():
""" A simple class with a register and  unregister methods
"""
    def __init__(self):
        self.bulbs=[]
        self.pending_bulbs = []

    def register(self,bulb):
        self.bulbs.append(bulb)
        try:
            self.pending_bulbs.remove(bulb)
        except:
            pass

    def unregister(self,bulb):
        idx=0
        for x in list([ y.bulb_id for y in self.bulbs]):
            if x == bulb.bulb_id:
                del(self.bulbs[idx])
                break
            idx+=1

    def new_bulb(self, info):
        if "light" in info["name"] and info["mac"] in tokenlist:
            newbulb = aiox.YeelightBulb(
                aio.get_event_loop(),
                tokenlist[info["mac"]],
                info["address"],
                info["mac"],
                self,
                )
        found = False
        for x in self.bulbs:
            if x.bulb_id == newbulb.bulb_id:
                found = True
                break
        if not found:
            for x in self.pending_bulbs:
                if x.bulb_id == newbulb.bulb_id:
                    found = True
                    break
        if not found:
            newbulb.activate()
        else:
            del(newbulb)


def readin():
"""Reading from stdin and displaying menu"""

    selection = sys.stdin.readline().strip("\n")
    DoSomething()

MyBulbs= bulbs()
loop = aio.get_event_loop()
zc, browser = aiox.start_yeelight_discovery(MyBulbs.new_bulb)
try:
    loop.add_reader(sys.stdin,readin)
    loop.run_forever()
except:
    pass
finally:
    browser.cancel()
    loop.run_until_complete(zc.close())
    MyBulbs.close()
    loop.remove_reader(sys.stdin)
    loop.close()

其他值得注意的事项:

  • 使用aiozeroconf完成发现

  • 每个连接每秒只允许一个命令。为了解决这个问题,我们可以启动多个与灯泡的连接。每个灯泡有4个连接的限制,但是考虑到每个灯泡每分钟只能有144个命令,在不开始使灯泡过载的情况下,只能处理2个连接。在激活之前使用.set_connection(x)来设置连接数

  • aioyeelight确保每个连接每秒最多有一个命令。为此,它保留了一个消息缓冲区,并调整发送速度(如果有多个连接,则使用循环)。因此,缓冲区会变得相当大。在

  • AoyeeLight会向灯泡发出“你好”的信息。这似乎是灯泡保持响应所必需的。在

  • 我只有“彩色”型号,所以我不能测试其他类型的灯泡

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
由于测试失败,java testcontainers maven构建失败   java实现jacobi算法实现laplace方程   java中的多线程:如何在不等待所有线程使用ExecutorService完成任务的情况下终止所有线程的执行?   java Hello World不在Android Studio 3中工作   ubuntu Tomcat7的Java版本不正确   java Javafx内存泄漏   对于手动实现的Spring数据存储库方法,我应该使用Java8默认方法吗?   googleappengine中的java添加过滤查询   html当使用JSOUP库在Java中读取标签时,如何保留标签(如<br>、<ul>、<li>、<p>等)的含义?   编码为什么jasper生成的报告在Java中不显示西里尔语(保加利亚语)?   java有没有办法隐藏当前位置和jdk动作?   java找出编译原型文件的版本   有没有办法在运行时更改java方法的访问修饰符?   语法字符串。。。Java中的参数   java数组元素在添加其他元素时会相互覆盖   eclipse中的java GWT项目   java如何为spring rest模板请求将动态json属性名映射到jackson   java无法在Windows 10上找到特定的JDK   在xml字符串和java字符串之间提取正则表达式子字符串