首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >将DHT11数据接入小爱

将DHT11数据接入小爱

作者头像
逍遥子大表哥
发布2025-07-28 20:57:46
发布2025-07-28 20:57:46
3990
举报
文章被收录于专栏:kali blogkali blog

在前期的文章中,我们讲到了如何将DHT11传感器的数据接入Homeassistant。但是数据却无法同步到小爱同学。本文,让我们一起来解决此问题。

DHT11数据接入HA
DHT11数据接入HA

DHT11数据接入HA

原因分析

目前,我是通过巴法云插件接入的小爱。通过阅读官方文档,得知我的数据格式不对。

即,数据格式需为#25#56这样的,而目前我们是json数据格式{"humi":53,"temp":21} 因此,我们需要对数据格式进行转换。

代码

代码语言:javascript
复制
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// 网络配置
const char* ssid = "PDCN";
const char* password = "1234567890";

// MQTT配置
const char* mqtt_server = "mqtt服务器IP";
const int mqtt_port = 1883;
const char* mqtt_user = "admin";
const char* mqtt_pass = "admin";
const char* topic = "xiaoyaozi";#订阅主题
const char* clientId = "biaoge666";#设备id

// DHT11配置
#define DHTPIN D3        // D3引脚连接DHT11
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

WiFiClient espClient;
PubSubClient client(espClient);

void setup_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(".");
  }
}

void reconnect() {
  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);
    }
  }
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  static unsigned long lastMsgTime = 0;
  unsigned long 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的配置文件进行修改。

代码语言:javascript
复制
 # 温度传感器
    - 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']

温度值位于索引1parts[1] = "21"

湿度值位于索引2parts[2] = "45"

  • float 将字符串转换为浮点数
注意格式
注意格式

注意格式

接下来,配置设备

同步到巴法云

同步完成后,在米家更新同步。最终效果如下:

BREAK AWAY

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kali笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原因分析
  • 代码
  • 配置HA
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档