在前期的文章中,我们讲到了如何将DHT11传感器的数据接入Homeassistant。但是数据却无法同步到小爱同学。本文,让我们一起来解决此问题。
原因分析
目前,我是通过巴法云插件接入的小爱。通过阅读官方文档,得知我的数据格式不对。
即,数据格式需为
#25#56
这样的,而目前我们是json数据格式{"humi":53,"temp":21}
因此,我们需要对数据格式进行转换。
代码
#include<ESP8266WiFi.h>
#include<PubSubClient.h>
#include<DHT.h>
// 网络配置
constchar* ssid = "PDCN";
constchar* password = "1234567890";
// MQTT配置
constchar* mqtt_server = "mqtt服务器IP";
constint mqtt_port = 1883;
constchar* mqtt_user = "admin";
constchar* mqtt_pass = "admin";
constchar* topic = "xiaoyaozi";#订阅主题
constchar* clientId = "biaoge666";#设备id
// DHT11配置
#define DHTPIN D3 // D3引脚连接DHT11
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
voidsetup_wifi(){
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
voidreconnect(){
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266Client", mqtt_user, mqtt_pass)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
voidsetup(){
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
voidloop(){
if (!client.connected()) {
reconnect();
}
client.loop();
staticunsignedlong lastMsgTime = 0;
unsignedlong now = millis();
// 每2秒读取一次数据
if (now - lastMsgTime > 2000) {
lastMsgTime = now;
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// 创建数据格式 #温度#湿度
char msg[20];
snprintf(msg, sizeof(msg), "#%d#%d", (int)t, (int)h);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish(topic, msg);
}
}
完成后,发送数据效果如下:
配置HA
接下来,我们需要对HA的配置文件进行修改。
# 温度传感器
- unique_id: dht11_temperature
name: "Living Room Temperature"
state_topic: "xiaoyaozi" # 与Arduino代码中的主题一致
unit_of_measurement: "℃"
value_template: >
{% set parts = value.split('#') %}
{{ parts[1] | float }}
device_class: temperature
suggested_display_precision: 1
# 湿度传感器
- unique_id: dht11_humidity
name: "Living Room Humidity"
state_topic: "xiaoyaozi" # 与Arduino代码中的主题一致
unit_of_measurement: "%"
value_template: >
{% set parts = value.split('#') %}
{{ parts[2] | float }}
device_class: humidity
suggested_display_precision: 1
代码说明:
对于输入数据#21#45
:
-
value.split('#')
将字符串分割为数组:['', '21', '45']
温度值位于索引1
:parts[1] = "21"
湿度值位于索引2
:parts[2] = "45"
-
float 将字符串转换为浮点数
接下来,配置设备
同步到巴法云
同步完成后,在米家更新同步。最终效果如下:
原文始发于微信公众号(kali笔记):将DHT11数据接入小爱
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论