就是这个小东西:
这个DEMO所用的就是安信可的Rd-01 人体存在雷达传感器,这个雷达传感器的特点参考资料:
https://docs.ai-thinker.com/rd-01
。
自带的WiFi 功能,可以接入任何云平台,这次接入的就是HomeAssistant,通过配置自动化检测,实现平板电脑或手机的弹窗提示,达到警告作用。
这次要讲的就是类似Rd-01 雷达传感器,这种
只有0和1
的二进制传感器如何使用HomeAssistant-C 库接入HomeAssistant。
binary Sensor 实体,中文名叫:
二进制传感器。
顾名思义
数据只有0和1两种状态
,
我们所用过的红外人体存在传感器、火焰传感器、Rd-01人体存在雷达、甚至是手扶梯的人体检测都属于二进制传感器。所以,这些传感器在HomeAssistant对它们的配置是最简单的。
好的,binary Sensor 就(实)
介
(在)
绍
(编)
完
(不)
了
(下去了)!
这一小节需要大家已经实现了“switch”实体的创建并完成点灯,如果你还没有是实现这个,
马上、立刻去看:
智能家居之旅,第三站:Ai-M61/M62 接入HomeAssistant 实现点灯
。
因为之后只介绍对应的实体怎么使用,不会继续介绍其他内容,为了方便测试,代码更不会重新建立工程。
打开之前创建的"
HomeAssistant_switch
"工程中"
main.c
"文件,在"
ha_event_cb
"回调函数中的
HA_EVENT_MQTT_CONNECED
事件下创建实体:
static ha_Bsensor_entity_t entity_binary_sensor = {
.name = "二进制传感器",
.unique_id = "binary_sensor1",
};
homeAssistant_device_add_entity(CONFIG_HA_ENTITY_BINARY_SENSOR, &entity_binary_sensor);
代码如下:
就
这样,一个二进制实体就创建好了,烧录验证一下:
可以看到,刚刚创建的"
二进制传感器
"已经在之前建立的设备当中了,但是它处于不可用状态,这个怎么办呢?
方法一:
复位一下开发板
方法二:
等我修复...........
binary Sensor 传感器已经创建好了,那下一步就是数据上传了。
其实
HomeAssistant-C 上传数据只需要一个函数:
homeAssistant_device_send_state。
上传binary sensor 数据:
homeAssistant_device_send_entity_state(CONFIG_HA_ENTITY_BINARY_SENSOR, <实体节点>, <0/1>);
比如:
烧录并且重新复位之后,能看到HomeAssistant中的 "
二进制传感器
"处于"
开启
"状态。
homeAssistant_device_send_state
函数的第二个,是一个实体的节点,为了大家能够在任何地方能够正确获取到需要的节点,HomeAssistant-C 库提供了一个函数:
homeAssistant_fine_entity(char* entity_type,const char* unique_id)
在使用这个函数的时候,只需要传递
实体的类型和unique id
,比如找
到
unique id=
binary_sensor1
的二进制实体:
ha_Bsensor_entity_t* entity_bs = homeAssistant_fine_entity(CONFIG_HA_ENTITY_BINARY_SENSOR, "binary_sensor1");
有了这个函数,可以在其他代码段使用
homeAssistant_device_send_entity_state
函数发送数据,像这样:
homeAssistant_device_send_entity_state(CONFIG_HA_ENTITY_BINARY_SENSOR,homeAssistant_fine_entity(CONFIG_HA_ENTITY_BINARY_SENSOR, "binary_sensor1"), 1);
延续上一节的问题:
三个开关怎么识别只有
开关1
能控制蓝灯?
答案:
通过unique id来识别。
可以通过
homeAssistant_fine_entity
,先找到需要判断的实体,然后再通过双方的unique id 来识别就能确认,下发的命令是否是"
开关1
",同时上传一下二进制传感器的状态:
ha_sw_entity_t* sw1_s = homeAssistant_fine_entity(CONFIG_HA_ENTITY_SWITCH, "sw1");
if (ha_dev->entity_switch->command_switch->unique_id==sw1_s->unique_id&&ha_dev->entity_switch->command_switch->switch_state) {
bflb_gpio_set(gpio, GPIO_PIN_15);
然后可以看到如下效果:
最后的最后