diff --git a/README.md b/README.md index 91f6600..92bb585 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ ESP32 (GPIO05 - CS, GPIO18 - SCK, GPIO19 - MISO, GPIO23 - MOSI). ## Supported devices -1. [RF Gateway](https://github.com/aZholtikov/RF-Gateway) (coming soon) +1. [RF Gateway](https://github.com/aZholtikov/RF-Gateway) 2. [ESP-NOW Switch](https://github.com/aZholtikov/ESP-NOW-Switch) 3. [ESP-NOW Light/Led Strip](https://github.com/aZholtikov/ESP-NOW-Light-Led-Strip) 4. [ESP-NOW Window/Door Sensor](https://github.com/aZholtikov/ESP-NOW-Window-Door-Sensor) @@ -57,8 +57,8 @@ ESP32 (GPIO05 - CS, GPIO18 - SCK, GPIO19 - MISO, GPIO23 - MOSI). - [X] Automatically add ESP-NOW devices configurations to Home Assistan via MQTT discovery. - [X] LAN connection support. -- [ ] nRF24 device support (in current time uses "RF Gateway"). -- [ ] BLE device support (for ESP32). -- [ ] LoRa device support. +- [X] nRF24 device support (via [RF Gateway](https://github.com/aZholtikov/RF-Gateway)). +- [ ] BLE device support (via BLE Gateway). +- [ ] LoRa device support (via LoRa Gateway). Any feedback via [e-mail](mailto:github@zh.com.ru) would be appreciated. Or... [Buy me a coffee](https://paypal.me/aZholtikov). diff --git a/src/main.cpp b/src/main.cpp index e758ce6..c2f8025 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,7 @@ void checkMqttAvailability(void); void mqttPublish(const char *topic, const char *payload, bool retained); -const String firmware{"1.3"}; +const String firmware{"1.4"}; String espnowNetName{"DEFAULT"}; @@ -228,7 +228,6 @@ void onEspnowMessage(const char *data, const uint8_t *sender) StaticJsonDocument json; deserializeJson(json, configData.message); uint8_t unit = json["unit"].as(); - ha_component_type_t type = json["type"].as(); StaticJsonDocument<2048> jsonConfig; jsonConfig["platform"] = "mqtt"; jsonConfig["name"] = json["name"]; @@ -245,7 +244,7 @@ void onEspnowMessage(const char *data, const uint8_t *sender) jsonConfig["retain"] = "true"; char buffer[2048]{0}; serializeJsonPretty(jsonConfig, buffer); - mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); + mqttPublish((topicPrefix + "/" + getValueName(json["type"].as()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); } if (incomingData.deviceType == ENDT_LED) { @@ -254,7 +253,6 @@ void onEspnowMessage(const char *data, const uint8_t *sender) StaticJsonDocument json; deserializeJson(json, configData.message); uint8_t unit = json["unit"].as(); - ha_component_type_t type = json["type"].as(); esp_now_led_type_t ledClass = json["class"]; StaticJsonDocument<2048> jsonConfig; jsonConfig["platform"] = "mqtt"; @@ -286,7 +284,7 @@ void onEspnowMessage(const char *data, const uint8_t *sender) jsonConfig["retain"] = "true"; char buffer[2048]{0}; serializeJsonPretty(jsonConfig, buffer); - mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); + mqttPublish((topicPrefix + "/" + getValueName(json["type"].as()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); } if (incomingData.deviceType == ENDT_SENSOR) { @@ -309,14 +307,78 @@ void onEspnowMessage(const char *data, const uint8_t *sender) jsonConfig["device_class"] = getValueName(json["class"].as()); if (type == HACT_BINARY_SENSOR) { - jsonConfig["device_class"] = getValueName(json["class"].as()); + ha_binary_sensor_device_class_t deviceClass = json["class"].as(); + 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["payload_off"] = json["payload_off"]; } char buffer[2048]{0}; serializeJsonPretty(jsonConfig, buffer); mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); } + if (incomingData.deviceType == ENDT_RF_SENSOR) + { + esp_now_payload_data_t configData; + memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); + StaticJsonDocument json; + deserializeJson(json, configData.message); + uint8_t unit = json["u"].as(); + ha_component_type_t type = json["t"].as(); + rf_sensor_type_t rf = json["r"].as(); + uint16_t id = json["i"].as(); + String tmp = json["v"].as(); + StaticJsonDocument<2048> jsonConfig; + jsonConfig["platform"] = "mqtt"; + jsonConfig["name"] = getValueName(rf) + " " + id + " " + tmp; + jsonConfig["unique_id"] = String(id) + "-" + unit; + jsonConfig["state_topic"] = topicPrefix + "/rf_sensor/" + getValueName(rf) + "/" + id + "/state"; + jsonConfig["value_template"] = "{{ value_json." + tmp + " }}"; + if (type == HACT_SENSOR) + { + jsonConfig["device_class"] = getValueName(json["h"].as()); + jsonConfig["unit_of_measurement"] = json["m"]; + jsonConfig["expire_after"] = json["e"]; + } + if (type == HACT_BINARY_SENSOR) + { + ha_binary_sensor_device_class_t deviceClass = json["h"].as(); + if (deviceClass == HABSDC_MOISTURE) + jsonConfig["expire_after"] = json["e"]; + jsonConfig["device_class"] = getValueName(deviceClass); + jsonConfig["payload_on"] = json["o"]; + jsonConfig["payload_off"] = json["f"]; + } + jsonConfig["force_update"] = "true"; + jsonConfig["retain"] = "true"; + char buffer[2048]{0}; + serializeJsonPretty(jsonConfig, buffer); + mqttPublish((topicPrefix + "/" + getValueName(type) + "/" + id + "-" + unit + "/config").c_str(), buffer, true); + } + if (incomingData.deviceType == ENDT_RF_GATEWAY) + { + esp_now_payload_data_t configData; + memcpy(&configData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); + StaticJsonDocument json; + deserializeJson(json, configData.message); + uint8_t unit = json["unit"].as(); + StaticJsonDocument<2048> jsonConfig; + jsonConfig["platform"] = "mqtt"; + jsonConfig["name"] = json["name"]; + jsonConfig["unique_id"] = myNet.macToString(sender) + "-" + unit; + jsonConfig["device_class"] = getValueName(json["class"].as()); + jsonConfig["state_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/status"; + jsonConfig["json_attributes_topic"] = topicPrefix + "/" + getValueName(incomingData.deviceType) + "/" + myNet.macToString(sender) + "/attributes"; + jsonConfig["payload_on"] = json["payload_on"]; + jsonConfig["expire_after"] = json["expire_after"]; + jsonConfig["force_update"] = "true"; + jsonConfig["retain"] = "true"; + char buffer[2048]{0}; + serializeJsonPretty(jsonConfig, buffer); + mqttPublish((topicPrefix + "/" + getValueName(json["type"].as()) + "/" + myNet.macToString(sender) + "-" + unit + "/config").c_str(), buffer, true); + } } if (incomingData.payloadsType == ENPT_FORWARD) { @@ -324,7 +386,8 @@ void onEspnowMessage(const char *data, const uint8_t *sender) memcpy(&forwardData.message, &incomingData.message, sizeof(esp_now_payload_data_t::message)); StaticJsonDocument json; deserializeJson(json, forwardData.message); - mqttPublish((topicPrefix + "/rf_sensor/" + getValueName(json["type"].as()) + "/" + json["id"].as()).c_str(), incomingData.message, false); + if (incomingData.deviceType == ENDT_RF_GATEWAY) + mqttPublish((topicPrefix + "/rf_sensor/" + getValueName(json["type"].as()) + "/" + json["id"].as() + "/state").c_str(), incomingData.message, false); } }