我如何使用Node-RED自动化公寓的故事。第二部分

关于公寓自动化的职位期待已久的延续在这一部分中,我将讨论照明,多媒体系统和安全传感器。



灯光


为了控制照明,使用了几个组件:

  • 电动窗帘
  • 可调光照明。

闪耀


房间的灯光分为两个区域。我使用ikeev LED可调光灯。我使用三个模块进行控制:
内置调光器FIBARO Dimmer 2
内置调光器FIBARO Dimmer 2

内置双继电器FIBARO双开关2x1.5kW
内置双继电器FIBARO双开关2x1.5kW

内置继电器FIBARO单开关2.5kW
内置继电器FIBARO单开关2.5kW

调光器可以自动选择调光方法(在相位的前缘和后缘)并进行校准以实现最小和最大亮度。由于我预先为所有插座配备了三线系统,因此不必使用旁路。没有电压时,LED灯不会闪烁,也不亮。对于可调光模块,我使用铃声开关,以便您可以调节亮度。


三线调光器接线图

运作方式如下:

  • - , ( ).
  • - , — . . , .
  • , , . — .
  • , . , 1% .
  • , 15 .
  • , .














如我先前所写,我公寓的所有窗户都俯瞰繁华的街道,光线明亮。为了解决夜间或夏季从明亮的太阳发出的灯发出的强光的问题,我使用了电动卷帘。

起初我想购买现成的工具包,但价格很高,而且我不喜欢配色方案。这个想法必须舍弃,并自行组装几套。

在220 V发动机中,选择很小:法国的尚飞或中国的Dooya。尚飞更安静,但也更昂贵,因此选择使用Dooya DM35S发动机。我在“ Aliexpress”上订购了它们以及紧固件。发动机有两个限位开关,可调节最大和最小位置。


带座发动机

下一个问题是用于缠绕窗帘的管道。根据邮件的规则,您可以发送不超过180厘米的包裹,我拥有的窗户之一超过2米。在最近的建筑市场上,我发现了所需直径的铝管-50 mm。将发动机安装在管道中后,仍然可以找到遮光窗帘。在与卖方达成协议后,我从“ Aliexpress”订购了我的尺码的面料,他只向我发送了面料,没有任何机制。


固定组装窗帘的

帘使用控制FIBARO卷帘2 Z-波盲控制模块。百叶窗


控制模块

该模块内置在插槽中。对于此类模块,建议立即放置深插座以推动模块,电线和开关。该模块具有足够的设置,包括对警报的响应,功耗的计算,限位开关的校准。


组装好的开关

窗帘安装在每个房间和厨房中。您可以通过窗帘旁边的开关或使用界面或脚本来控制窗帘。

当黄昏开始并且路灯打开时,窗帘会自动降低。它们根据工作日和周末每个房间的编程时间上升。如果外面是黑暗的,则在放下窗帘的房间里,光线开始平稳开启。

根据下载的生产日历计算工作日和周末。您可以使用telegram命令为每个房间重新配置第二天的时间。在按照“闹钟”折叠窗帘之前,会收到一条电报消息,其中包含确认,取消和重新安排30分钟的功能。如果没有采取措施,窗帘将自动折叠。在晴朗的日子里,窗帘会根据房间的灯光和一天中的时间自动设置位置,并检查灯光是否打开。收到“度假”命令后,所有房间的所有窗帘均被放下。窗帘管理方案窗帘管理方案








工作实例

多媒体系统


我在客厅里有许多带各种遥控器的多媒体设备,我想用一个按钮控制它们。

在互联网上,我发现了用于打开和关闭放大器,电视和HDMI分配器的单独的IR代码。使用pronto_broadlink Python脚本,将它们转码为base64,然后转换为字节数组并写入IR代码库。因此,现在不必知道设备现在处于什么状态:您只需再次发送信号即可。

由于我的放大器很旧,并且不知道如何通过HDMI处理4K图像,因此我购买了HDMI分配器。它使您可以将视频和音频信号分成两个单独的HDMI:其中一个连接到放大器,第二个连接到电视。


放大器和其他设备

目前,我有两个音频和视频源:一台台式计算机和一台服务器。在界面上,您可以使用一个按钮打开所有设备进行播放,仅在一种情况下,将在服务器上的分配器上配置信号接收,在第二种情况下,将通过计算机配置信号接收。将来,计划将游戏机连接到拆分器。

如果所有人都离开家,则所有多媒体设备都将关闭。媒体控制现场




存在系统在6个运动传感器和一个前门打开传感器上运行。如果在打开和关闭门后没有触发任何一个占用传感器,则会在一定间隔内将消息发送给Telegram进行确认。如果两分钟内未执行任何操作或按下“确定”按钮,则系统将切换到“外出”模式。如果此时发生移动,则取消命令并删除消息。

我尝试使用BLE,但就我而言,它不能非常稳定地工作,并且严重依赖电话发送器。自动存在检测




安全传感器


Gidrolock 锁定装置安装在水管上当控制线短路相时,执行器将关闭分接头;当断开控制线时,它将打开。两个驱动器都连接到干式触点Philio内置继电器

Gidrolock
Gidrolock

继电器驱动器由位于潜在泄漏区域的NEO Coolcam Z-Wave传感器控制所有传感器都直接与继电器相关联,因此无需控制器参与即可关闭水。为防止水龙头变酸,晚上每两周自动将其打开和关闭。Philio抽烟传感器 时的驱动器自动化图




关闭通风,以免引起火灾。同时,一条消息被发送到电报聊天室,传感器发出令人作呕的尖叫声。

其他传感器和设备



授权服务器


该模块是授权服务的简单实现。
有两种http方法:一种将检查请求是否来自内部网络,如果是,它将通过向用户颁发JWT令牌来授权用户。JWT令牌使用RSA 256加密,必须在其旁边的文件中注册私钥。如果请求不是来自内部网络,则该用户将被重定向到登录页面,该用户必须在其中输入登录名和密码并登录。由于不应该划分为用户,因此加密文件(SHA 512)形式的登录文件和密码位于配置文件中。

MQTT服务器


MQTT服务器是使用aedes组件实现的

服务器位于两个端口上:内部(用于未经授权与服务器通信)和外部(用于实现WebSocket)。所有前端客户端都通过套接字连接,并在授权,订阅主题和发布任何消息期间通过身份验证。从授权服务器收到的JWT令牌进来,并使用公共密钥进行了验证。对于来自服务器的请求,不会进行验证。

自定义节点-RED节点


在编写自动化程序时,需要实现一个额外的节点和两个节点来完成。

我必须修改node-red-contrib-openzwave,因为我的请求仅在7个月后才被接受,但是现在您可以使用npm中的库了。改进包括抛出节点删除事件。



MQTT节点也已完成。实际上,它的主要改进是提取已连接客户端的ID,并在将其发送到队列时将其写回。在这里,您可以使用子流功能。还应该将任何数据传输到MQTT节点的输入,但是它没有用。



为了控制窗帘和水龙头,需要一个调度节点。当时库中可用的功能过于丰富,不支持使用CRON的简单实现。我的实现非常简单:可以在节点的输入处制定时间表,也可以在内部设置时间表。可以取消时间表。在幕后,使用了节点计划



面前


该公寓的每个活动组件都由自动化组成,位于前端。每个模块都是独立的,包含用于渲染的所有必要组件。模块分为两个集合:静态和Z-Wave。模块必须实现一个接口。

接口
export interface INode {
    id: string;
    type: NodeTypes;
    name: string;
    addWidget: ComponentClass<AddProps> | StatelessComponent<AddProps>;
    model: INodeModelConstructor;
    service?: INodeServiceConstructor;
    smallComponent: ComponentClass<WidgetProps<any>> | StatelessComponent<WidgetProps<any>>;
    bigComponent: ComponentClass<WidgetProps<any>> | StatelessComponent<WidgetProps<any>>;
    dialogEditComponent: ComponentClass<WidgetProps<any>> | StatelessComponent<WidgetProps<any>>;
    dialogViewComponent: ComponentClass<WidgetProps<any>> | StatelessComponent<WidgetProps<any>>;
}


实施实例
class Widget extends BaseWidget implements INode {
    model: INodeModelConstructor = Model;
    manufacturerid: string = '0x0086';
    producttype: string = '0x1a02';
    productid: string = '0x0064';
    addWidget: StatelessComponent<AddProps> = AddWidget;
    service: INodeServiceConstructor = Service;
    smallComponent: StatelessComponent<WidgetProps<Model>> = SmallComponent;
    bigComponent: StatelessComponent<WidgetProps<Model>> = BigComponent;
    dialogEditComponent: ComponentClass<WidgetProps<Model>> = DialogEditComponent;
    dialogViewComponent: ComponentClass<WidgetProps<Model>> = DialogViewComponent;
}
export default Widget;


对于静态模块(例如,空调),您需要在前端实现数据仓库。这种实现很不方便,需要很好地将其更改为一个存储库,

对于Z-Wave模块,我组织了一个公共存储库并跟踪了所有更改。

该模块通过两种方式实现显示:

  • 用于“大”屏幕(平板电脑,计算机);
  • 用于电话。

根据设备的类型,将选择触摸或鼠标控制。

该应用程序是使用webpack + babel构建的:根据当前设置,它是为Firefox,Chrome,Chrome Android的最后两个版本组装的。

源代码的功能


Source

All Flow禁用,以免在日志中引发错误。Z-Wave的配置节点被删除:如果找不到Z-Wave控制器,则该节点有问题,并丢弃整个Node-RED。它看起来应该像这样:


为了使工作日历加载器正常工作,您需要在data.gov.ru上注册,在其中获取令牌并在access_token之后输入它:


每15分钟darksky.net下载一次天气预报他还需要一个令牌,您需要注册并在预测后输入令牌到坐标:


要发送电报通知,您需要获取您的机器人,将其输入到“电报”配置节点中,并在必要时编写聊天ID。在我的流程的情况下,这是子流程:



源分为正面和反面。在后面的部分是:

  • 授权服务器。
  • MQTT服务器。
  • 自定义Node-RED模块。
  • 将导出的流保存在一个文件中,该文件可以上传到您自己的帐户或单独的实例中进行测试。
  • Node-RED的项目,您需要在其中安装模块,然后仅加载导出的Flow(模块已在项目中)。
  • 备份Mongo-base。

您可以在github存储库中的自述文件中找到更多详细的安装信息

计划


计划将使用智能手机或壁挂式平板电脑的麦克风进行语音控制。我计划将开放源代码系统部署在基于CMU Sphinx的服务器上

我还计划组装一个模块,以获取和传输管道和电表的读数。

还值得考虑使用各种参数的累积统计信息来优化自动化。

结论


目前,我已经实现了房屋几乎完全自动化以满足我的需要-保持房屋内舒适的气候和照明。由于有些自动化,可以从加热元件一侧和从照明一侧减少电力消耗(与没有自动化的相同设备相比,冬天减少1,500₽)。

当然,算法中仍然存在错误,但总有一天我会抓住它们,至少我朝这个方向发展。该系统运行稳定,尽管Z-Wave协议的速度非常低,但我看不到任何刹车。

当然,系统不会以节省成本为代价来收回成本,还有更多的舒适性问题。这样的自动化在诸如关闭和打开窗帘,控制光之类的小事情上非常潮湿。当您在普通公寓中时,有时会忘记打开或关闭灯,而根本不会打开窗帘。

我很少用手调节气候系统,但有时您需要打开或关闭空调或调节电池温度。总的来说,我对最终的系统感到满意:它减少了花在任何调整上的时间。控制器发生故障时,所有功能都将保留在原处(仅自动化会下降)。断水功能也将保留。如果我决定出售公寓,那么我将轻松删除所有自动化设备。或将其放置在适当的位置,但可以增加销量。

All Articles