You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32压力传感器无法向HomeAssistant发布MQTT自动发现Payload

ESP32压力传感器HomeAssistant MQTT自动发现Payload发布失败

我用Lolin D32 Pro开发板制作支持HomeAssistant自动发现的ESP压力传感器,目前状态主题的MQTT Payload能正常发布,但publishDiscoveryMessage()函数中的自动发现Payload发布失败(返回值为0),之前尝试用ArduinoJson库生成Payload,结果一样。

完整代码

#include <WiFi.h>
#include <PubSubClient.h>
#include "HX710B.h"

const int DOUT = 21;
const int SCLK  = 22;
int prev = 0;
int pa = 0;

HX710B pressure_sensor;

const char *WIFI_SSID = "ssid";
const char *WIFI_PASSWORD = "pass";

const char* mqttServer = "192.168.1.xx";
const int mqttPort = 1883;
const char* mqttUser = "user";
const char* mqttPassword = "pass";

float pressure;

int sensorNumber = 1;
String mqttName = "prsensor " + String(sensorNumber);
String stateTopic = "prsensor_" + String(sensorNumber) + "/pressure/state";
String statusTopic = "prsensor_" + String(sensorNumber) + "/status";
String discoveryTopic = "homeassistant/sensor/prsensor/" + String(sensorNumber) + "/pressure/config";

WiFiClient wifiClient;
PubSubClient client(wifiClient);
void setup() {
  Serial.begin(115200);
  pressure_sensor.begin(DOUT, SCLK);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.println("Connecting to Wi-Fi");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);

  Serial.println("Connected to Wi-Fi");

  client.setServer(mqttServer, mqttPort);

  Serial.println("Connecting to MQTT");

}

void publishDiscoveryMessage() {

  String payload = "{";
  payload += "\"dev_cla\":\"pressure\",";
  payload += "\"unit_of_meas\":\"Pa\",";
  payload += "\"stat_cla\":\"measurement\",";
  payload += "\"name\":\"prsensor pressure\",";
  payload += "\"entity_category\":\"diagnostic\",";
  payload += "\"stat_t\":\"" + String(stateTopic) + "\",";
  payload += "\"avty_t\":\"" + String(statusTopic) + "\",";
  payload += "\"uniq_id\":\"prsensor_id\",";
  payload += "\"val_tpl\":\"{{ value_json.pressure|default(0) }}\",";
  payload += "\"dev\":{\"ids\":\"5ccf7f9b18a2\"}";
  payload += "}";

  // Publish MQTT discovery message
  bool published = client.publish(discoveryTopic.c_str(), payload.c_str(), true);

  Serial.print("published: ");
  Serial.print(published);
  Serial.printf(" Published %s to %s\n", payload.c_str(), discoveryTopic.c_str());
}


void loop() {

  while (!client.connected()) {
    Serial.print(".");

    if (client.connect(mqttName.c_str(), mqttUser, mqttPassword)) {

      Serial.println("Connected to MQTT");

    } else {

      Serial.println("failed with state ");
      Serial.print(client.state());
      delay(2000);

    }
  }

  client.loop();

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("===== Sending Data =====");

    pressure = pressure_sensor.pascal();

    if (isnan(pressure)) {
      pressure = 0;
    }
    String pl = "{";
    pl += "\"pressure\":\"" + String(pressure) + "\"";
    pl += "}";

    bool plpub = client.publish(stateTopic.c_str(), pl.c_str(), true);

    client.publish(statusTopic.c_str(), String("online").c_str(), true);

    Serial.print("111published: ");
    Serial.print(plpub);
    Serial.printf(" Published %s to %s\n", pl.c_str(), stateTopic.c_str());
    publishDiscoveryMessage();

    delay(2000);
    Serial.println("pressure: ");
    Serial.println(pressure);
  }
  else {
    Serial.println("WiFi Disconnected");
  }

}

发布日志

00:11:30.677 -> ===== Sending Data =====
00:11:30.677 -> 111published: 1 Published {"pressure":"462.10"} to prsensor_1/pressure/state
00:11:30.677 -> published: 0 Published {"dev_cla":"pressure","unit_of_meas":"Pa","stat_cla":"measurement","name":"prsensor pressure","entity_category":"diagnostic","stat_t":"prsensor_1/pressure/state","avty_t":"prsensor_1/status","uniq_id":"prsensor_id","val_tpl":"{{ value_json.pressure|default(0) }}","dev":{"ids":"5ccf7f9b18a2"}} to homeassistant/sensor/prsensor/1/pressure/config

尝试过的精简Payload

我尝试精简自动发现Payload为以下内容,此时Payload可以发布,但无法满足HomeAssistant的自动发现要求:

String payload = "{";
payload += "\"dev_cla\":\"signal_strength\",";
payload += "\"unit_of_meas\":\"Pa\",";
payload += "\"stat_cla\":\"measurement\",";
payload += "\"name\":\"prsensor pressure\",";
// payload += "\"entity_category\":\"diagnostic\",";
payload += "\"stat_t\":\"" + String(stateTopic) + "\",";
payload += "\"avty_t\":\"" + String(statusTopic) + "\",";
payload += "\"uniq_id\":\"prsensor_id\"";
// payload += "\"val_tpl\":\"{{ value_json.pressure|default(0) }}\",";

// payload += "\"dev\"";
// payload += ":{";
// payload += "\"ids\":\"5ccf7f9b18a2\"";
// payload += "}";

payload += "}";

内容的提问来源于stack exchange,提问作者Peter Asp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:18:09