Node-RED到家/离家提醒

Node-RED是一款非常好用的节点流式自动化应用。使用者可以方便的将设想中的复杂的自动化实现出来。

在安装HomeAssistantOS并初步学习Node-Red后,我就在想能不能做一个到家、离家提醒。在某些情况下记录家庭成员如年迈的长辈出行时间是非常有必要的。通过Node-Red及其一系列强大的plugin nodes,可以方便的实现一个可拓展的家庭成员离家提醒机制。

一、数据来源

首先需要从某种传感器获取家庭成员的状态,即 home、not_home。最开始我想到了以下几种:

  • RFID中短距离入户检查
  • 人体运动传感器
  • 入户智能门铃
  • 手机软件
    • Tasker类:设备自动化软件
    • HomeAssistant App:家庭自动化软件
  • 路由器ARP Table

RFID中短距离入户检查

首先由于经费有限,并且当前RFID设备价格昂贵,我只购买了一片商家号称5m识别范围的RFID读写模块并进行了测试。在使用5x5cm方形陶瓷增益天线28dbm功率输出时,在我的测试环境下是可以做到入户检测的。但需要将识别标签与天线发射面接近水平放置才能较远的读取距离。但由于我最开始使用RFID的目的是做室内定位,需要3-4片芯片,大大超出了我的预算,因此就放弃了使用RFID做室内定位。而RFID技术在本文使用场景下是非常有优势的,它可以非接触式、高效、多目标(标签)识别、读写目标标签。

人体运动传感器

人体运动传感器无法识别目标,只能做运动检测。即在入户门安装一个人体运动传感器,然后再安装一个摄像头进行人脸识别,将识别数据再存储分析。在有人经过门口时,即触发摄像头录像,并将结果进行分析,得出目标信息(姓名)、状态(离开、进入)。但由于需要花较多的时间成本,因此放弃这种方法。

入户智能门铃

没有接触过类型产品,暂时作为一种设想在这里。

手机软件

可以通过tasker、HomeAssistant等软件获取WIFI SSID名称,GPS等信息并回传服务器完成,这种方法类似于观察者模型,目标主动通知观察者状态变化。由于手机型号、系统、电池容量等原因,只有我的备用机使用该方法。

路由器ARP表

通过获取路由器中ARP列表,将其中连接对象的mac地址或静态ip进行分析,判断目标是否离开。我最后选取的也是这种成本最低,但不是特别稳定的方法。

我的环境下,iKuai作为主路由,OpenWrt作为旁路由。因为iKuai没有提供RPC接口,因此只有在OpenWrt上读取ARP表。

通过在HomeAssistant中安装openwrt-luci设备追踪器,可以直接监听OpenWrt中ARP表,而后将对应MAC地址添加到家庭成员device中就可以比较准确的得到家庭成员离家状态了。

二、 数据推送

数据推送暂时我只用到了以下几类:

  • 企业微信推送
  • pushdeer iOS推送(本文更新时,pushdeer只有iOS部分完成)
  • 小米小爱同学 语音播报
  • gotify消息推送
  • qq bot

通过以上几种推送渠道,我可以即时的知晓、存储各种消息来源的各种信息。

企业微信推送

企业微信推送需要创建在企业微信软件创建一个企业,而后在企业微信管理后台中创建一个企业微信应用,并且开通消息发送、接收功能。具体操作以后有时间写一篇博文。

PushDeer iOS信息推送

PushDeer (WIP)是以「易用」、「可控」和「渐进」为理念构建的推送体系,使用PushDeer团队提供的PushDeerOnline服务,用户可以方便快捷的将自己需要的信息以无APP的方式(快应用等)推送到多种平台上。截止本文撰写为止,PushDeer已完成iOS平台PushDeerOnline服务搭建。同时PushDeer也提供了方便的self-hosted方法,但自建服务比较大的问题就是各个平台推送权限的获取。以iOS为例,就需要加入Apple Developer,就一年的成员费用就不是非专业iOS开发人员可以承受的。其他平台,比如小米,则直接禁止了个人开发者获取推送权限。因此想要自建推送服务,还是需要有一定的经济基础同时设备平台开放个人开发者推送权限的前提。

小米小爱同学播报

在HomeAssistant中安装HACS后搜索Xiaomi MIoT集成。在Xiaomi MIoT集成中如果你是用的小爱音箱在支持列表中,就可以调用Xiaomi MIoT: speak_text服务,让小爱同学对文字进行播报。同时还可以使用Xiaomi MIoT: execute_text,执行诸如查询天气等内置应用。

Gotify消息推送

现在我的Android端基本都是使用Gotify接收家庭自动化系统中的各种消息。Gotify服务我使用了docker搭建。但是由于国内OEM厂商杀后台比较严重,有些时候Gotify APP后台会被杀掉导致消息无法即时送达。

Gotify也在接收我的Uptime-Kuma检测的网路、服务联通情况。

QQbot Mirai

QQ机器人是我整个推送体系中的后备环,如果其他推送服务都炸掉了,就需要我通过QQ机器人获取家庭自动化系统信息了。

QQ机器人库我选择的是Mirai,其他也有比较好的一些机器人框架,比如Koishi

Mirai机器人库直接被我挂在了群辉上,设置了个开机启动就ok了。

消息枢纽 Node-RED

整个系统的消息处理枢纽是HomeAssistantOS上的Node-RED加载项。Node-RED可以直接调用HomeAssistant上的各种entity、service用于数据输入。而在我的实现中,数据源就是HomeAssistant中各种device_tracker(luci-rpc引入)。而消息推送则需要安装一些node包:企业微信推送(node-red-contrib-bizwechat)、gotify推送(node-red-contrib-gotify),其他两种pushdeer、qqbot则可以通过http request节点完成。

在我的实现中,所有的push api都是有统一的msg.sendText存储需要推送的文字信息,暂时只考虑纯文本信息。所有的推送服务我都写成了http endpoint可以直接通过http请求进行消息推送。

微信企业推送

企业微信推送是最简单的只需要将msg.sendText设置为msg.payload 即可发送,默认使用”HomeAssistant推送“作为title。

PushDeer iOS 推送

PushDeer推送节点流比较简单,只有一个核心function节点把url给组装起来。

小爱同学语言播报

小爱同学语言播报节点流中我设置了三个http endpoint,对应两个音箱和所有音箱共三种执行范围。其中从上往下数第二第三条link为设置音量和恢复音量的简单函数封装,设置音量前先通过current_state获取volume_level并置msg.resumable_volume_level,然后在恢复音量里面读取其值即可。

Gotify推送

Gotify推送节点流也比较简单,就不在赘述。

Mirai QQ机器人

Mirai QQ机器人在这里我只使用了sendFriendMessageAPI,将需要推送的数据直接发送到我的QQ号上,而这里由于Mirai需要通过Verify获得Session,且Session半小时未使用即释放,因此我们需要通过Mirai的bind API判定是否需要重新获取Session,最上面的一条link就是这个过程。

组装系统

第一部分

从需要监控的person获取state_change,然后判断是离家还是回家,然后通过一个获取时间日期的函数和模板组装成“XXX X月XX日 XX:XX 左右 出门\回家了”的消息格式,然后可以直接将Gotify、PushDeer、QQbot发送出去。因为这三种方式即时性比较强,所以可以在任意时间段发送。

第二部分

如果在大半夜小爱同学突然播报离家、回家提醒,或者企业微信突然强提醒,打断了连续的睡眠也是糟糕的。因此我们需要一个延迟消息机制,即将夜晚到清晨这段时间的消息暂存起来,在某个特定事件统一发送。

首先左边有一个cron-plus节点,用来在早餐8点触发延迟消息统一推送。

然后右方有一个时段选择器,当在08:20~21:00时直接推送消息,而不在这个事件端则将数据存储变量中,以便可以推送的时候进行统一推送。而这些功能的大部分我是通过function节点完成的。

这样完成后,就可以将晚上十点半以后到早上八点二十时段的所有消息延迟到八点半由cron-plus节点自动触发推送,避免了夜间打扰。


v1.0 wep 基本内容编写,格式调整

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注