构建了自己的启用HomeKit的恒温器,因为Nest生态系统过于封闭

2020-12-28 03:47:45

我非常着迷于用手机控制家里的大部分电子设备。剩下的最后一个设备是恒温器。我不想要Nest,因为它不适用于HomeKit,并且我不能使用EcoBee,因为我没有中性线。所以我下定决心要建立自己的。

如果您要构建自己的恒温器或任何硬件,并希望获得帮助或只是想炫耀一下,请随时通过[email protected]向我发送电子邮件。另外,如果您想了解该注册到我的电子邮件列表中的消息,我还打算继续扩展该项目,使其具有一个屏幕和一些按钮,并在执行该操作时通知您。

因此,我发现我的加热器在一个非常简单的控制协议上运行。从加热器到当前的温控器只有两根电线,当您连接它们时,它会打开,而当您断开连接时,它会关闭。唯一不幸的是,电线是24vac,所以为了安全起见,我需要使用固态继电器进行开关。

我在esp32上构建了整个程序,并获得了onamazon prime的强大的过大继电器。我将在下面链接确切的部分。当前的温度计是我躺在的旧的tmp102 sparkfun板,但它偏离了大约6度,因此在v2中,我希望将其替换为更精确的温度计。

将所有组件连接在一起,然后将其固定在墙上一两天后,我对这些组件感到满意,并希望开始进行一些修饰。

恒温器控件在非常简单的状态机上运行。我非常喜欢提前画图,所以我在编码之前为自己画了这张图。在C语言中,这是作为两个枚举(动作,状态)和一堆switch casestatement实现的。

//枚举的:typedef枚举{TC_HEATER_MODE_OFF,TC_HEATER_MODE_ON,TC_HEATER_MODE_AUTO_ON,TC_HEATER_MODE_AUTO_OFF} tc_heater_mode_t; typedef的枚举{TC_HEATER_ACTIONS_SET_TO_AUTO,TC_HEATER_ACTIONS_SET_TO_OFF,TC_HEATER_ACTIONS_SET_TO_ON,TC_HEATER_ACTIONS_TEMPERATURE_CHANGE,TC_HEATER_ACTIONS_THRESHOLD_CHANGE} tc_heater_action_t; // ...别的地方:开关(s_current_heater_mode){情况TC_HEATER_MODE_OFF:开关( tc_action){case TC_HEATER_ACTIONS_SET_TO_AUTO:s_current_heater_mode = TC_HEATER_MODE_AUTO_OFF; s_current_heater_mode = tc_update_auto_mode(s_current_heater_mode);打破;情况TC_HEATER_ACTIONS_SET_TO_OFF:中断;情况TC_HEATER_ACTIONS_SET_TO_ON:s_current_heater_mode = TC_HEATER_MODE_ON;打破;情况TC_HEATER_ACTIONS_TEMPERATURE_CHANGE:休息;情况TC_HEATER_ACTIONS_THRESHOLD_CHANGE:休息; }; case TC_HEATER_MODE_ON:switch(tc_action){case TC_HEATER_ACTIONS_SET_TO_AUTO:s_current_heater_mode = TC_HEATER_MODE_AUTO_ON; s_current_heater_mode = tc_update_auto_mode(s_current_heater_mode);打破;情况TC_HEATER_ACTIONS_SET_TO_OFF:s_current_heater_mode = TC_HEATER_MODE_OFF;打破;情况TC_HEATER_ACTIONS_SET_TO_ON:中断;情况TC_HEATER_ACTIONS_TEMPERATURE_CHANGE:休息;情况TC_HEATER_ACTIONS_THRESHOLD_CHANGE:休息; }; case TC_HEATER_MODE_AUTO_ON:case TC_HEATER_MODE_AUTO_OFF:switch(tc_action){case TC_HEATER_ACTIONS_SET_TO_AUTO:break;情况TC_HEATER_ACTIONS_SET_TO_OFF:s_current_heater_mode = TC_HEATER_MODE_OFF;打破;情况TC_HEATER_ACTIONS_SET_TO_ON:s_current_heater_mode = TC_HEATER_MODE_ON;打破;情况TC_HEATER_ACTIONS_TEMPERATURE_CHANGE:s_current_heater_mode = tc_update_auto_mode(s_current_heater_mode);打破;情况TC_HEATER_ACTIONS_THRESHOLD_CHANGE:s_current_heater_mode = tc_update_auto_mode(s_current_heater_mode);打破; }休息;}

对我来说非常重要的是,恒温器可以在homekit上工作了,幸运的是,esp32已经有了不错的homekit(hap)资源。经过一番挖掘之后,我决定选择这个homekit软件包,因为它是将Expressif homekit库传递给arduino的干净端口。 arduino大约有15种不同的homekit框架,因此在某个时候我只需要选择一个框架并开始运行即可。

经过一堆他妈的工作后,我设法使esp32从手机显示为恒温器。

我在此过程中遇到的一些陷阱:(某些特定于该库,某些特定于homekit)

使用此HomeKit库,如果要恢复出厂设置,则必须在初始化后进行。另外,在工厂重置设备之前,请务必从手机上的Homekit中删除该设备

确保您的设备具有唯一的ID和配对代码,我的homekit中还有另一个esp32,并且它们一直在冲突

确保您的设备ID与您提供的服务相匹配,否则,您会从homekit获得令人讨厌的无声失败

将代码放到我喜欢的地方后,剩下的就是使它看起来不像绑在我客厅墙壁上的炸弹。我3d打印了一个外壳,并在正确的位置焊接了正确的电线。不幸的是,我的电路板需要恒定的5V micro-usb电源,因此,到目前为止,我已经用一个庞大的电池组供电了。也许在vN中(对于非常大的N值),我将使用内部LiPo和AC-DC转换器进行嵌套样式。

我已经为计划的v2购买了一些零件,请继续关注。 在v2中,我将添加: 谢谢阅读! 如果您想随时了解最新动态,请随时关注RSS feed,如果您有任何建议,请随时通过[email protected]给我发送电子邮件。