mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
alanogsensor pulse,add mqtt/HA output #2732
This commit is contained in:
@@ -481,7 +481,7 @@ bool AnalogSensor::update(uint8_t gpio, std::string & name, double offset, doubl
|
|||||||
for (auto & AnalogCustomization : settings.analogCustomizations) {
|
for (auto & AnalogCustomization : settings.analogCustomizations) {
|
||||||
if (AnalogCustomization.type == AnalogType::COUNTER
|
if (AnalogCustomization.type == AnalogType::COUNTER
|
||||||
|| (AnalogCustomization.type >= AnalogType::DIGITAL_OUT && AnalogCustomization.type <= AnalogType::PWM_2)
|
|| (AnalogCustomization.type >= AnalogType::DIGITAL_OUT && AnalogCustomization.type <= AnalogType::PWM_2)
|
||||||
|| AnalogCustomization.type >= AnalogType::RGB) {
|
|| AnalogCustomization.type == AnalogType::RGB || AnalogCustomization.type == AnalogType::PULSE) {
|
||||||
Command::erase_command(EMSdevice::DeviceType::ANALOGSENSOR, AnalogCustomization.name.c_str());
|
Command::erase_command(EMSdevice::DeviceType::ANALOGSENSOR, AnalogCustomization.name.c_str());
|
||||||
}
|
}
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
@@ -586,9 +586,9 @@ void AnalogSensor::remove_ha_topic(const int8_t type, const uint8_t gpio) const
|
|||||||
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (type == AnalogType::DIGITAL_OUT && gpio != 25 && gpio != 26) {
|
if (type == AnalogType::PULSE || (type == AnalogType::DIGITAL_OUT && gpio != 25 && gpio != 26)) {
|
||||||
#else
|
#else
|
||||||
if (type == AnalogType::DIGITAL_OUT) {
|
if (type == AnalogType::PULSE || type == AnalogType::DIGITAL_OUT) {
|
||||||
#endif
|
#endif
|
||||||
snprintf(topic, sizeof(topic), "switch/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), gpio);
|
snprintf(topic, sizeof(topic), "switch/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), gpio);
|
||||||
} else if (type == AnalogType::DIGITAL_OUT) { // DAC
|
} else if (type == AnalogType::DIGITAL_OUT) { // DAC
|
||||||
@@ -627,23 +627,11 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
char s[10];
|
char s[10];
|
||||||
JsonObject dataSensor = doc[Helpers::smallitoa(s, sensor.gpio())].to<JsonObject>();
|
JsonObject dataSensor = doc[Helpers::smallitoa(s, sensor.gpio())].to<JsonObject>();
|
||||||
dataSensor["name"] = sensor.name();
|
dataSensor["name"] = sensor.name();
|
||||||
switch (sensor.type()) {
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
case AnalogType::COUNTER:
|
if (sensor.type() == AnalogType::PULSE || (sensor.type() == AnalogType::DIGITAL_OUT && sensor.gpio() != 25 && sensor.gpio() != 26)) {
|
||||||
case AnalogType::TIMER:
|
#else
|
||||||
case AnalogType::RATE:
|
if (sensor.type() == AnalogType::PULSE || sensor.type() == AnalogType::DIGITAL_OUT) {
|
||||||
case AnalogType::ADC:
|
#endif
|
||||||
case AnalogType::PWM_0:
|
|
||||||
case AnalogType::PWM_1:
|
|
||||||
case AnalogType::PWM_2:
|
|
||||||
case AnalogType::FREQ_0:
|
|
||||||
case AnalogType::FREQ_1:
|
|
||||||
case AnalogType::FREQ_2:
|
|
||||||
case AnalogType::RGB:
|
|
||||||
case AnalogType::NTC:
|
|
||||||
dataSensor["value"] = serialized(Helpers::render_value(s, sensor.value(), 2)); // double
|
|
||||||
break;
|
|
||||||
case AnalogType::DIGITAL_IN:
|
|
||||||
case AnalogType::DIGITAL_OUT:
|
|
||||||
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
||||||
dataSensor["value"] = sensor.value() != 0;
|
dataSensor["value"] = sensor.value() != 0;
|
||||||
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
||||||
@@ -652,11 +640,10 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
char result[12];
|
char result[12];
|
||||||
dataSensor["value"] = Helpers::render_boolean(result, sensor.value() != 0);
|
dataSensor["value"] = Helpers::render_boolean(result, sensor.value() != 0);
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
default:
|
dataSensor["value"] = serialized(Helpers::render_value(s, sensor.value(), 2)); // double
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
} else if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT) {
|
} else if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT || sensor.type() == AnalogType::PULSE) {
|
||||||
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
||||||
doc[sensor.name()] = sensor.value() != 0;
|
doc[sensor.name()] = sensor.value() != 0;
|
||||||
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
||||||
@@ -690,7 +677,7 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj);
|
snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj);
|
||||||
}
|
}
|
||||||
char sample_val[12] = "0";
|
char sample_val[12] = "0";
|
||||||
if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT) {
|
if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT || sensor.type() == AnalogType::PULSE) {
|
||||||
Helpers::render_boolean(sample_val, false);
|
Helpers::render_boolean(sample_val, false);
|
||||||
}
|
}
|
||||||
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
||||||
@@ -713,7 +700,7 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
snprintf(name, sizeof(name), "%s", sensor.name().c_str());
|
snprintf(name, sizeof(name), "%s", sensor.name().c_str());
|
||||||
config["name"] = name;
|
config["name"] = name;
|
||||||
|
|
||||||
if (sensor.uom() != DeviceValueUOM::NONE) {
|
if (sensor.uom() != DeviceValueUOM::NONE && sensor.type() != AnalogType::DIGITAL_OUT) {
|
||||||
config["unit_of_meas"] = EMSdevice::uom_to_string(sensor.uom());
|
config["unit_of_meas"] = EMSdevice::uom_to_string(sensor.uom());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -722,9 +709,9 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
// Set commands for some analog types
|
// Set commands for some analog types
|
||||||
char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (sensor.type() == AnalogType::DIGITAL_OUT && sensor.gpio() != 25 && sensor.gpio() != 26) {
|
if (sensor.type() == AnalogType::PULSE || (sensor.type() == AnalogType::DIGITAL_OUT && sensor.gpio() != 25 && sensor.gpio() != 26)) {
|
||||||
#else
|
#else
|
||||||
if (sensor.type() == AnalogType::DIGITAL_OUT) {
|
if (sensor.type() == AnalogType::PULSE || sensor.type() == AnalogType::DIGITAL_OUT) {
|
||||||
#endif
|
#endif
|
||||||
snprintf(topic, sizeof(topic), "switch/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "switch/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
||||||
snprintf(command_topic, sizeof(command_topic), "%s/%s/%s", Mqtt::base().c_str(), F_(analogsensor), sensor.name().c_str());
|
snprintf(command_topic, sizeof(command_topic), "%s/%s/%s", Mqtt::base().c_str(), F_(analogsensor), sensor.name().c_str());
|
||||||
@@ -863,10 +850,16 @@ void AnalogSensor::get_value_json(JsonObject output, const Sensor & sensor) {
|
|||||||
output["max"] = 100;
|
output["max"] = 100;
|
||||||
output["uom"] = EMSdevice::uom_to_string(sensor.uom());
|
output["uom"] = EMSdevice::uom_to_string(sensor.uom());
|
||||||
} else if (sensor.type() == AnalogType::DIGITAL_OUT) {
|
} else if (sensor.type() == AnalogType::DIGITAL_OUT) {
|
||||||
output["min"] = 0;
|
output["min"] = 0;
|
||||||
output["max"] = sensor.gpio() == 25 || sensor.gpio() == 26 ? 255 : 1;
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
char state[][2] = {"?", "0", "1"};
|
output["max"] = sensor.gpio() == 25 || sensor.gpio() == 26 ? 255 : 1;
|
||||||
output["start"] = state[sensor.uom()];
|
#else
|
||||||
|
output["max"] = 1;
|
||||||
|
#endif
|
||||||
|
output["start"] = sensor.uom() == 1 ? "0" : sensor.uom() == 2 ? "1" : "?";
|
||||||
|
} else if (sensor.type() == AnalogType::PULSE) {
|
||||||
|
output["min"] = 0;
|
||||||
|
output["max"] = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user