Version 1.5

Changed SDK version for 3.0.5 for ESP8266.
Changed config message for ESP-NOW switch.
Changed config message for ESP-NOW light/led strip controller.
Fixed minor bugs.
This commit is contained in:
Alexey Zholtikov 2023-03-04 08:07:32 +03:00
parent 894eed59f1
commit 0038361bb5
2 changed files with 42 additions and 36 deletions

View File

@ -2,6 +2,7 @@
platform = espressif8266 platform = espressif8266
board = esp12e board = esp12e
framework = arduino framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs board_build.filesystem = littlefs
lib_deps = lib_deps =
https://github.com/aZholtikov/ZHNetwork https://github.com/aZholtikov/ZHNetwork
@ -16,6 +17,7 @@ lib_deps =
platform = espressif8266 platform = espressif8266
board = esp12e board = esp12e
framework = arduino framework = arduino
build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
board_build.filesystem = littlefs board_build.filesystem = littlefs
upload_port = 192.168.4.1 upload_port = 192.168.4.1
upload_protocol = espota upload_protocol = espota

View File

@ -42,7 +42,7 @@ typedef enum : uint8_t
ESP_NOW_LAN ESP_NOW_LAN
} work_mode_t; } work_mode_t;
const String firmware{"1.43"}; const String firmware{"1.5"};
String espnowNetName{"DEFAULT"}; String espnowNetName{"DEFAULT"};
@ -193,12 +193,12 @@ void setup()
void loop() void loop()
{ {
if (mqttAvailabilityCheckTimerSemaphore)
checkMqttAvailability();
if (keepAliveMessageTimerSemaphore) if (keepAliveMessageTimerSemaphore)
sendKeepAliveMessage(); sendKeepAliveMessage();
if (attributesMessageTimerSemaphore) if (attributesMessageTimerSemaphore)
sendAttributesMessage(); sendAttributesMessage();
if (mqttAvailabilityCheckTimerSemaphore)
checkMqttAvailability();
if (workMode == ESP_NOW_WIFI) if (workMode == ESP_NOW_WIFI)
mqttWifiClient.loop(); mqttWifiClient.loop();
if (workMode == ESP_NOW_LAN) if (workMode == ESP_NOW_LAN)
@ -227,24 +227,26 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message));
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
deserializeJson(json, configData.message); deserializeJson(json, configData.message);
uint8_t unit = json["unit"].as<uint8_t>(); uint8_t unit = json[MCMT_DEVICE_UNIT].as<uint8_t>();
StaticJsonDocument<2048> jsonConfig; StaticJsonDocument<2048> jsonConfig;
jsonConfig["platform"] = "mqtt"; jsonConfig["platform"] = "mqtt";
jsonConfig["name"] = json["name"]; jsonConfig["name"] = json[MCMT_DEVICE_NAME];
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
jsonConfig["device_class"] = getValueName(json["class"].as<ha_switch_device_class_t>()); jsonConfig["device_class"] = getValueName(json[MCMT_DEVICE_CLASS].as<ha_switch_device_class_t>());
jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state"; jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
jsonConfig["value_template"] = "{{ value_json." + json["template"].as<String>() + " }}"; jsonConfig["value_template"] = "{{ value_json." + json[MCMT_VALUE_TEMPLATE].as<String>() + " }}";
jsonConfig["command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/set"; jsonConfig["command_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/set";
jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes"; jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes";
jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status"; jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status";
jsonConfig["payload_on"] = json["payload_on"]; if (json[MCMT_PAYLOAD_ON])
jsonConfig["payload_off"] = json["payload_off"]; jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON];
if (json[MCMT_PAYLOAD_OFF])
jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF];
jsonConfig["optimistic"] = "false"; jsonConfig["optimistic"] = "false";
jsonConfig["retain"] = "true"; jsonConfig["retain"] = "true";
char buffer[2048]{0}; char buffer[2048]{0};
serializeJsonPretty(jsonConfig, buffer); serializeJsonPretty(jsonConfig, buffer);
mqttPublish((topicPrefix + "/" + getValueName(json["type"].as<ha_component_type_t>()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); mqttPublish((topicPrefix + "/" + getValueName(json[MCMT_COMPONENT_TYPE].as<ha_component_type_t>()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true);
} }
if (incomingData.deviceType == ENDT_LED) if (incomingData.deviceType == ENDT_LED)
{ {
@ -252,11 +254,11 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message));
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
deserializeJson(json, configData.message); deserializeJson(json, configData.message);
uint8_t unit = json["unit"].as<uint8_t>(); uint8_t unit = json[MCMT_DEVICE_UNIT].as<uint8_t>();
esp_now_led_type_t ledClass = json["class"]; esp_now_led_type_t ledClass = json[MCMT_DEVICE_CLASS];
StaticJsonDocument<2048> jsonConfig; StaticJsonDocument<2048> jsonConfig;
jsonConfig["platform"] = "mqtt"; jsonConfig["platform"] = "mqtt";
jsonConfig["name"] = json["name"]; jsonConfig["name"] = json[MCMT_DEVICE_NAME];
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state"; jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
jsonConfig["state_value_template"] = "{{ value_json.state }}"; jsonConfig["state_value_template"] = "{{ value_json.state }}";
@ -278,13 +280,15 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
} }
jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes"; jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes";
jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status"; jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status";
jsonConfig["payload_on"] = json["payload_on"]; if (json[MCMT_PAYLOAD_ON])
jsonConfig["payload_off"] = json["payload_off"]; jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON];
if (json[MCMT_PAYLOAD_OFF])
jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF];
jsonConfig["optimistic"] = "false"; jsonConfig["optimistic"] = "false";
jsonConfig["retain"] = "true"; jsonConfig["retain"] = "true";
char buffer[2048]{0}; char buffer[2048]{0};
serializeJsonPretty(jsonConfig, buffer); serializeJsonPretty(jsonConfig, buffer);
mqttPublish((topicPrefix + "/" + getValueName(json["type"].as<ha_component_type_t>()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); mqttPublish((topicPrefix + "/" + getValueName(json[MCMT_COMPONENT_TYPE].as<ha_component_type_t>()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true);
} }
if (incomingData.deviceType == ENDT_SENSOR) if (incomingData.deviceType == ENDT_SENSOR)
{ {
@ -292,33 +296,32 @@ void onEspnowMessage(const char *data, const uint8_t *sender)
memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message));
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
deserializeJson(json, configData.message); deserializeJson(json, configData.message);
uint8_t unit = json["unit"].as<uint8_t>(); uint8_t unit = json[MCMT_DEVICE_UNIT].as<uint8_t>();
ha_component_type_t type = json["type"].as<ha_component_type_t>(); ha_component_type_t type = json[MCMT_COMPONENT_TYPE].as<ha_component_type_t>();
StaticJsonDocument<2048> jsonConfig; StaticJsonDocument<2048> jsonConfig;
jsonConfig["platform"] = "mqtt"; jsonConfig["platform"] = "mqtt";
jsonConfig["name"] = json["name"]; jsonConfig["name"] = json[MCMT_DEVICE_NAME];
jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit;
jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state"; jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/state";
jsonConfig["value_template"] = "{{ value_json." + json["template"].as<String>() + " }}"; jsonConfig["value_template"] = "{{ value_json." + json[MCMT_VALUE_TEMPLATE].as<String>() + " }}";
jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes"; jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes";
jsonConfig["force_update"] = "true"; jsonConfig["force_update"] = "true";
jsonConfig["retain"] = "true"; jsonConfig["retain"] = "true";
if (type == HACT_SENSOR) if (type == HACT_SENSOR)
{ {
jsonConfig["device_class"] = getValueName(json["class"].as<ha_sensor_device_class_t>()); jsonConfig["device_class"] = getValueName(json[MCMT_DEVICE_CLASS].as<ha_sensor_device_class_t>());
jsonConfig["unit_of_measurement"] = json["meas"]; jsonConfig["unit_of_measurement"] = json[MCMT_UNIT_OF_MEASUREMENT];
jsonConfig["expire_after"] = json["time"];
} }
if (type == HACT_BINARY_SENSOR) if (type == HACT_BINARY_SENSOR)
{ jsonConfig["device_class"] = getValueName(json[MCMT_DEVICE_CLASS].as<ha_binary_sensor_device_class_t>());
ha_binary_sensor_device_class_t deviceClass = json["class"].as<ha_binary_sensor_device_class_t>(); if (json[MCMT_EXPIRE_AFTER])
if (deviceClass == HABSDC_BATTERY || deviceClass == HABSDC_WINDOW || deviceClass == HABSDC_DOOR) jsonConfig["expire_after"] = json[MCMT_EXPIRE_AFTER];
jsonConfig["payload_off"] = json["payload_off"]; if (json[MCMT_OFF_DELAY])
if (deviceClass == HABSDC_CONNECTIVITY) jsonConfig["off_delay"] = json[MCMT_OFF_DELAY];
jsonConfig["expire_after"] = json["expire_after"]; if (json[MCMT_PAYLOAD_ON])
jsonConfig["device_class"] = getValueName(deviceClass); jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON];
jsonConfig["payload_on"] = json["payload_on"]; if (json[MCMT_PAYLOAD_OFF])
} jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF];
char buffer[2048]{0}; char buffer[2048]{0};
serializeJsonPretty(jsonConfig, buffer); serializeJsonPretty(jsonConfig, buffer);
mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true);
@ -406,6 +409,7 @@ void onMqttMessage(char *topic, byte *payload, unsigned int length)
} }
esp_now_payload_data_t outgoingData; esp_now_payload_data_t outgoingData;
outgoingData.deviceType = ENDT_GATEWAY; outgoingData.deviceType = ENDT_GATEWAY;
outgoingData.payloadsType = ENPT_SET;
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
if (message == "update" || message == "restart") if (message == "update" || message == "restart")
{ {
@ -437,8 +441,8 @@ void onMqttMessage(char *topic, byte *payload, unsigned int length)
{ {
if (message == "restart") if (message == "restart")
outgoingData.payloadsType = ENPT_RESTART; outgoingData.payloadsType = ENPT_RESTART;
else if (message == "update")
outgoingData.payloadsType = message == "update" ? ENPT_UPDATE : ENPT_SET; outgoingData.payloadsType = ENPT_UPDATE;
serializeJsonPretty(json, outgoingData.message); serializeJsonPretty(json, outgoingData.message);
char temp[sizeof(esp_now_payload_data_t)]{0}; char temp[sizeof(esp_now_payload_data_t)]{0};
memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t)); memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t));
@ -459,7 +463,7 @@ void sendKeepAliveMessage()
StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json;
json["MQTT"] = isMqttAvailable ? "online" : "offline"; json["MQTT"] = isMqttAvailable ? "online" : "offline";
json["frequency"] = 10; // For compatibility with the previous version. Will be removed in future releases. json["frequency"] = 10; // For compatibility with the previous version. Will be removed in future releases.
if (workMode == ESP_NOW_WIFI) if (workMode == ESP_NOW_WIFI && WiFi.isConnected())
{ {
ntpWiFiClient.update(); ntpWiFiClient.update();
uint64_t epochTime = ntpWiFiClient.getEpochTime(); uint64_t epochTime = ntpWiFiClient.getEpochTime();
@ -467,7 +471,7 @@ void sendKeepAliveMessage()
json["time"] = ntpWiFiClient.getFormattedTime(); json["time"] = ntpWiFiClient.getFormattedTime();
json["date"] = String(time->tm_mday) + "." + String(time->tm_mon + 1) + "." + String(time->tm_year + 1900); json["date"] = String(time->tm_mday) + "." + String(time->tm_mon + 1) + "." + String(time->tm_year + 1900);
} }
if (workMode == ESP_NOW_LAN) if (workMode == ESP_NOW_LAN && Ethernet.linkStatus() == LinkON)
{ {
ntpEthClient.update(); ntpEthClient.update();
uint64_t epochTime = ntpEthClient.getEpochTime(); uint64_t epochTime = ntpEthClient.getEpochTime();