diff --git a/platformio.ini b/platformio.ini index 071743b..e5b0cf8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -2,6 +2,7 @@ platform = espressif8266 board = esp12e framework = arduino +build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305 board_build.filesystem = littlefs lib_deps = https://github.com/aZholtikov/ZHNetwork @@ -16,6 +17,7 @@ lib_deps = platform = espressif8266 board = esp12e framework = arduino +build_flags = -D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305 board_build.filesystem = littlefs upload_port = 192.168.4.1 upload_protocol = espota diff --git a/src/main.cpp b/src/main.cpp index 1f6edf2..2775722 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,7 @@ typedef enum : uint8_t ESP_NOW_LAN } work_mode_t; -const String firmware{"1.43"}; +const String firmware{"1.5"}; String espnowNetName{"DEFAULT"}; @@ -193,12 +193,12 @@ void setup() void loop() { + if (mqttAvailabilityCheckTimerSemaphore) + checkMqttAvailability(); if (keepAliveMessageTimerSemaphore) sendKeepAliveMessage(); if (attributesMessageTimerSemaphore) sendAttributesMessage(); - if (mqttAvailabilityCheckTimerSemaphore) - checkMqttAvailability(); if (workMode == ESP_NOW_WIFI) mqttWifiClient.loop(); 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)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; 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; jsonConfig["platform"] = "mqtt"; - jsonConfig["name"] = json["name"]; + jsonConfig["name"] = json[MCMT_DEVICE_NAME]; 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["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["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes"; jsonConfig["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status"; - jsonConfig["payload_on"] = json["payload_on"]; - jsonConfig["payload_off"] = json["payload_off"]; + if (json[MCMT_PAYLOAD_ON]) + jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON]; + if (json[MCMT_PAYLOAD_OFF]) + jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF]; jsonConfig["optimistic"] = "false"; jsonConfig["retain"] = "true"; char buffer[2048]{0}; 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) { @@ -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)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; deserializeJson(json, configData.message); - uint8_t unit = json["unit"].as<uint8_t>(); - esp_now_led_type_t ledClass = json["class"]; + uint8_t unit = json[MCMT_DEVICE_UNIT].as<uint8_t>(); + esp_now_led_type_t ledClass = json[MCMT_DEVICE_CLASS]; StaticJsonDocument<2048> jsonConfig; jsonConfig["platform"] = "mqtt"; - jsonConfig["name"] = json["name"]; + jsonConfig["name"] = json[MCMT_DEVICE_NAME]; jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/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["availability_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status"; - jsonConfig["payload_on"] = json["payload_on"]; - jsonConfig["payload_off"] = json["payload_off"]; + if (json[MCMT_PAYLOAD_ON]) + jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON]; + if (json[MCMT_PAYLOAD_OFF]) + jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF]; jsonConfig["optimistic"] = "false"; jsonConfig["retain"] = "true"; char buffer[2048]{0}; 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) { @@ -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)); StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; deserializeJson(json, configData.message); - uint8_t unit = json["unit"].as<uint8_t>(); - ha_component_type_t type = json["type"].as<ha_component_type_t>(); + uint8_t unit = json[MCMT_DEVICE_UNIT].as<uint8_t>(); + ha_component_type_t type = json[MCMT_COMPONENT_TYPE].as<ha_component_type_t>(); StaticJsonDocument<2048> jsonConfig; jsonConfig["platform"] = "mqtt"; - jsonConfig["name"] = json["name"]; + jsonConfig["name"] = json[MCMT_DEVICE_NAME]; jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; 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["force_update"] = "true"; jsonConfig["retain"] = "true"; if (type == HACT_SENSOR) { - jsonConfig["device_class"] = getValueName(json["class"].as<ha_sensor_device_class_t>()); - jsonConfig["unit_of_measurement"] = json["meas"]; - jsonConfig["expire_after"] = json["time"]; + jsonConfig["device_class"] = getValueName(json[MCMT_DEVICE_CLASS].as<ha_sensor_device_class_t>()); + jsonConfig["unit_of_measurement"] = json[MCMT_UNIT_OF_MEASUREMENT]; } if (type == HACT_BINARY_SENSOR) - { - ha_binary_sensor_device_class_t deviceClass = json["class"].as<ha_binary_sensor_device_class_t>(); - if (deviceClass == HABSDC_BATTERY || deviceClass == HABSDC_WINDOW || deviceClass == HABSDC_DOOR) - jsonConfig["payload_off"] = json["payload_off"]; - if (deviceClass == HABSDC_CONNECTIVITY) - jsonConfig["expire_after"] = json["expire_after"]; - jsonConfig["device_class"] = getValueName(deviceClass); - jsonConfig["payload_on"] = json["payload_on"]; - } + jsonConfig["device_class"] = getValueName(json[MCMT_DEVICE_CLASS].as<ha_binary_sensor_device_class_t>()); + if (json[MCMT_EXPIRE_AFTER]) + jsonConfig["expire_after"] = json[MCMT_EXPIRE_AFTER]; + if (json[MCMT_OFF_DELAY]) + jsonConfig["off_delay"] = json[MCMT_OFF_DELAY]; + if (json[MCMT_PAYLOAD_ON]) + jsonConfig["payload_on"] = json[MCMT_PAYLOAD_ON]; + if (json[MCMT_PAYLOAD_OFF]) + jsonConfig["payload_off"] = json[MCMT_PAYLOAD_OFF]; char buffer[2048]{0}; serializeJsonPretty(jsonConfig, buffer); 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; outgoingData.deviceType = ENDT_GATEWAY; + outgoingData.payloadsType = ENPT_SET; StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; if (message == "update" || message == "restart") { @@ -437,8 +441,8 @@ void onMqttMessage(char *topic, byte *payload, unsigned int length) { if (message == "restart") outgoingData.payloadsType = ENPT_RESTART; - else - outgoingData.payloadsType = message == "update" ? ENPT_UPDATE : ENPT_SET; + if (message == "update") + outgoingData.payloadsType = ENPT_UPDATE; serializeJsonPretty(json, outgoingData.message); char temp[sizeof(esp_now_payload_data_t)]{0}; memcpy(&temp, &outgoingData, sizeof(esp_now_payload_data_t)); @@ -459,7 +463,7 @@ void sendKeepAliveMessage() StaticJsonDocument<sizeof(esp_now_payload_data_t::message)> json; json["MQTT"] = isMqttAvailable ? "online" : "offline"; 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(); uint64_t epochTime = ntpWiFiClient.getEpochTime(); @@ -467,7 +471,7 @@ void sendKeepAliveMessage() json["time"] = ntpWiFiClient.getFormattedTime(); 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(); uint64_t epochTime = ntpEthClient.getEpochTime();