diff --git a/include/config.sample.h b/include/config.sample.h index 1c349b6..3111abd 100644 --- a/include/config.sample.h +++ b/include/config.sample.h @@ -37,6 +37,7 @@ #define MQTT_REPORT_METRICS // Whether to report metrics via MQTT. Disable if unwanted. #define MQTT_TOPIC_WEATHER "accuweather/pitrix/" // MQTT topic to listen for weather data. Must not start with a slash, but must end with one. #define MQTT_TOPIC_TIMER "alexa/timer" +#define MQTT_TOPIC_HOMEASSISTANT "homeassistant" #define HOSTNAME "pitrix-%08X" // Hostname of the ESP to use for OTA and MQTT client id. %08X will be replaced by the chip id. #define OTA_STARTUP_DELAY 10 // How many seconds to wait at startup. This is useful to prevent being unable to flash OTA by a bug in the code. Set to 0 to disable. diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 36baaaa..3e5f519 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -23,7 +23,7 @@ void mqtt_callback(char* original_topic, byte* pl, unsigned int length) { pl[length] = '\0'; String payload((char*)pl); String topic (original_topic); - if (topic.equals(MQTT_TOPIC "log") || topic.equals(MQTT_TOPIC "status") || topic.startsWith(MQTT_TOPIC "metrics")) { + if (topic.equals(MQTT_TOPIC "log") || topic.equals(MQTT_TOPIC "status") || topic.equals(MQTT_TOPIC "status_details") || topic.startsWith(MQTT_TOPIC "metrics")) { // Return our own messages return; } @@ -98,15 +98,33 @@ void mqtt_callback(char* original_topic, byte* pl, unsigned int length) { boolean mqtt_connect() { LOGln("MQTT * Connecting to MQTT server with client id %s", hostname); + mqtt_client.setBufferSize(350); if (mqtt_client.connect(hostname, MQTT_USER, MQTT_PASS, MQTT_TOPIC "status", 0, true, "OFFLINE", true)) { LOGln("MQTT * Connected."); LOGln("Core * Flash chip id: 0x%X. Size: %d bytes. 'Real' size: %d bytes.", ESP.getFlashChipId(), ESP.getFlashChipSize(), ESP.getFlashChipRealSize()); char buffer[40]; snprintf(buffer, 40, "ONLINE %s %s", hostname, WiFi.localIP().toString().c_str()); - mqtt_client.publish(MQTT_TOPIC "status", buffer, true); + mqtt_client.publish(MQTT_TOPIC "status", "ONLINE", true); + mqtt_client.publish(MQTT_TOPIC "status_details", buffer, true); mqtt_client.subscribe(MQTT_TOPIC "+"); mqtt_client.subscribe(MQTT_TOPIC_WEATHER "#"); mqtt_client.subscribe(MQTT_TOPIC_TIMER); + + #ifdef MQTT_TOPIC_HOMEASSISTANT + // Set MQTT values for homeassistant auto device discovery + String topic = MQTT_TOPIC_HOMEASSISTANT "/light/"; + topic += hostname; + topic += "/config"; + String message = "{\"~\":\"" MQTT_TOPIC "\",\"opt\":1,\"avty_t\":\"~status\",\"pl_avail\":\"ONLINE\",\"pl_not_avail\":\"OFFLINE\","; + message += "\"bri_cmd_t\": \"~brightness\",\"bri_scl\":255,\"fx_cmd_t\":\"~modus\",\"name\":\"Pitrix\",\"uniq_id\":\""; + message += hostname; + message += "\","; + message += "\"stat_t\":\"~modus\",\"cmd_t\":\"~modus\",\"pl_on\":\"cycle\",\"pl_off\":\"night_clock\"}"; + mqtt_client.publish(topic.c_str(), message.c_str(), true); + DBG("MQTT * Homeassistant data:"); + DBG("MQTT * Topic: %s", topic.c_str()); + DBG("MQTT * Data: %s", message.c_str()); + #endif } return mqtt_client.connected(); }