用 Python 玩转 Worcester Wave 恒温器 第三部分

发布于 2025-01-02 00:32:09 字数 3304 浏览 5 评论 0

所以, 前面 我们找出了通信是如何被加密的,并且设法读取到了加热系统的当前状态(热水器是否开启,当前温度,等等)。这很棒 —— 但是如何我们能实际地用 Python 控制恒温器,这将会更棒,例如,设置温度,由定时器模式修改到手动模式,等等。这就是我们今天要关注的。

所以,使用相同的‘中间人’方法,在我修改多项设置的同时,我监控来来自应用的通信。当修改温度的时候,我得到了一个像这样的消息:

<message id="lj8Vq-31" 
to="rrcgateway_458921440@wa2-mz36-qrmzh6.bosch.de" 
type="chat"><subject>/heatingCircuits/hc1/manualTempOverride/temperature</subject><body>PUT
 /heatingCircuits/hc1/manualTempOverride/temperature 
HTTP:/1.0\nContent-Type: application/json\nContent-Length: 
25\nUser-Agent: 
NefitEasy\n\n\n\nXmuIR7wCfDZpPrPkrb/CqQ==\n</body></message>

再次,整理一下它,并且移除 XMPP 头部,我们看到消息体如下:

PUT /heatingCircuits/hc1/manualTempOverride/temperature
HTTP:/1.0
 Content-Type: application/json
 Content-Length: 25
 User-Agent: NefitEasy
XmuIR7wCfDZpPrPkrb/CqQ==

如果我们解码底部的文本,那么可以发现它解码为: <{"value":16}\x00\x00\x00\x00

这看起来像 JSON,并在最后有一个位的空填充(大概是这样的,长度按一定数可整除的数据被提供给加密例程) - 它是有意义的,因为我设置了恒温器为 16 度。

所以,如果我们发送这条短信(但使用不同的号码),那么假设温度会改变?嗯...有可能!

你看,改变温度取决于你在什么模式。有两种模式,而状态消息的 UMD 部分告诉你,你是其中哪一个:手动(manual) 或时钟(clock)。如果你在手动模式下,则可以简单发送一个 PUT 消息(像上面那个)给 /heatingCircuits/hc1/temperatureRoomManual ,并带上 JSON 数据 {"value":21} (或任何你想要的温度)来更改温度。

但是,如果在时钟模式下,那么你必须设置“覆盖温度(override temperature)”(一个到 /heatingCircuits/hc1/manualTempOverride/temperature 的 PUT 消息),并且带上与上面相同的 JSON,然后你必须打开”温度覆盖功能(temperature override function)'(一个到 /heatingCircuits/hc1/manualTempOverride/status 的带有 JSON 数据 {"value": "on"} 的 PUT 消息)。

哦,如果你想改变模式,那么你可以只发送一个到 /heatingCircuits/hc1/usermode 的 PUT 消息,并携带 JSON 数据 {"value": "clock"}{"value":"manual"}

你可能想知道是否从这些消息获得了响应:你可以这样做,但它们不是很有趣的。除非出现了一个错误,你得到的会是:

No Content

Content-Type: application/json

connection: close

你还可以发送许多其他的消息来做各种复杂的事情(如改变定时程序),但我还没有尝试去调查这些呢。我知道它们会使用与这些消息相同的格式,它们只是由稍微复杂一点的 JSON 有效载荷,并可能需要发送多个消息。我很高兴,因为我可以读取我的恒温器状态,并控制基本设置(模式和温度)!

所以,迄今为止,在这个系列中我并没有真正那么多提到 Python(对不起!)—— 尽管,事实上,我的大部分'试错'工作是通过使用 Python 中棒棒哒的 sleekxmpp 库 来完成的。在这里,我必须承认,我没有如我应该做的那样编写代码:我真的本应该设计它来实现一个适当的有限状态机,并且在适当的时间里发送和接收相应的消息,同时在 Python 类中更新内部信息......但我没有!对不起 —— 应对所有这一切,异步工作,这都太像繁重的工作了。

所以,我写了一个 BaseWaveMessageBot 类,它实现连接,发送消息,编码和解码消息负载和一点简单的错误处理。这个类拥有所有复杂的东西,所以后来我写了几个非常简单的类( StatusBotSetBot ),它们发送适当的消息并处理响应。然后,我在一个漂亮的名为 WaveThermo 的类中将它们组合在一起。目前,WaveThermo 还没有很多方法,但因为我需要它,所以我会逐渐添加更多的功能。

该代码可 在 Github 上找到,并且它是相当容易使用:

当然,我只是用我的恒温器测试了一下它 —— 所以,如果它对你无效,那么请让我知道!

所以,目前就是这样了 - 下一次,我将谈论我完成的温度和恒温状态自动监控所做的一点工作,以及我发现的一些有趣的模式。

原文: Hacking the Worcester Wave thermostat in Python – Part 3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

水溶

暂无简介

文章
评论
28 人气
更多

推荐作者

笑脸一如从前

文章 0 评论 0

mnbvcxz

文章 0 评论 0

真是无聊啊

文章 0 评论 0

旧城空念

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文