Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mqtt_publish not working for particular content - ESP32 #867

Open
sebcaps opened this issue May 22, 2021 · 2 comments
Open

mqtt_publish not working for particular content - ESP32 #867

sebcaps opened this issue May 22, 2021 · 2 comments

Comments

@sebcaps
Copy link

sebcaps commented May 22, 2021

Hello, based on example "mqtt_esp8266" adapted for ESP32 (see below) , depending on the message content, publish is OK (status code =1 and message received in mqtt client) or not...
In details when I add value_template:"{{value_json.low_batt}}" in the message publish returns 0, unfortunately I need this part in the message ;-)

Can you please help me ?
Thx

  Basic ESP8266 MQTT example

  This sketch demonstrates the capabilities of the pubsub library in combination
  with the ESP8266 board/library.

  It connects to an MQTT server then:
  - publishes "hello world" to the topic "outTopic" every two seconds
  - subscribes to the topic "inTopic", printing out any messages
    it receives. NB - it assumes the received payloads are strings not binary
  - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led,
    else switch it off

  It will reconnect to the server if the connection is lost using a blocking
  reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to
  achieve the same result without blocking the main loop.

  To install the ESP8266 board, (using Arduino 1.6.4+):
  - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs":
       http://arduino.esp8266.com/stable/package_esp8266com_index.json
  - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266"
  - Select your ESP8266 in "Tools -> Board"

*/

//#include <ESP8266WiFi.h>
#include <WiFi.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.

const char* ssid = "*****";
const char* password = "*****";
const char* mqtt_server = "192.168.1.32";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();


}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {

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

  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, 50, "hello world #%ld", value);
    Serial.println(msg);
    Serial.print("Publish {name: \"nom\", state_topic:\"homeassistant/AB/state\"} ==> ");
    Serial.println(client.publish("homeassistant/binary_sensor/statusAB/config", "{name: \"nom\", state_topic:\"homeassistant/AB/state\"}"));
    Serial.println("*********************************");
    Serial.print("Publish {name: \"nom\", state_topic:\"homeassistant/AB/state\", value_template:\"{{value_json.low_batt}}\"} ==> ");
    Serial.println(client.publish("homeassistant/binary_sensor/statusAB/config", "{name: \"nom\", state_topic:\"homeassistant/AB/state\", value_template:\"{{value_json.low_batt}}\"}"));
  }
}

Output :

09:23:15.659 -> IP address: 
09:23:15.659 -> 192.168.1.26
09:23:15.659 -> Attempting MQTT connection...connected
09:23:15.659 -> hello world #1
09:23:15.703 -> Publish {name: "nom", state_topic:"homeassistant/AB/state"} ==> 1
09:23:15.703 -> *********************************
09:23:15.703 -> Publish {name: "nom", state_topic:"homeassistant/AB/state", value_template:"{{value_json.low_batt}}"} ==> 0
09:23:17.681 -> hello world #2
09:23:17.681 -> Publish {name: "nom", state_topic:"homeassistant/AB/state"} ==> 1
09:23:17.681 -> *********************************
09:23:17.681 -> Publish {name: "nom", state_topic:"homeassistant/AB/state", value_template:"{{value_json.low_batt}}"} ==> 0
09:23:19.691 -> hello world #3
09:23:19.691 -> Publish {name: "nom", state_topic:"homeassistant/AB/state"} ==> 1
09:23:19.691 -> *********************************
09:23:19.691 -> Publish {name: "nom", state_topic:"homeassistant/AB/state", value_template:"{{value_json.low_batt}}"} ==> 0
@AmazingDreams
Copy link

In my case, it seemed that the PubSubClient message buffer was too small (default 256). I have included the following code which fixed it

void setupMqttClient() {
  mqttClient.setServer(mqttServer, mqttPort);
  mqttClient.setBufferSize(512);
}

Coincidentally I also just added the value_template, but it doesn't seem to be related.

@sebcaps
Copy link
Author

sebcaps commented May 30, 2021

@AmazingDreams thx for your response.
Indeed it was related to buffer size.
In other tries, the same message was not correctly send depending on the topic.

Looking more attentively the lib publish send false if size of topic+message exceed MQTT_MAX_PACKET_SIZE.
I found publish_P which does the job. I guess start_publish will (there is an example) as well, and ultimately your solution.
Anyway I found that publish_P allow me to send correctly the message not pretty sure this is the correct solution :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants