mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
updated gpio test logic
This commit is contained in:
@@ -360,7 +360,7 @@ const Sensors = () => {
|
|||||||
v: 0,
|
v: 0,
|
||||||
o: 0,
|
o: 0,
|
||||||
f: 1,
|
f: 1,
|
||||||
t: AnalogType.NOTUSED,
|
t: AnalogType.DIGITAL_IN, // default to digital in 1
|
||||||
d: false,
|
d: false,
|
||||||
s: false,
|
s: false,
|
||||||
o_n: ''
|
o_n: ''
|
||||||
@@ -462,7 +462,7 @@ const Sensors = () => {
|
|||||||
>
|
>
|
||||||
<Cell stiff>{as.g}</Cell>
|
<Cell stiff>{as.g}</Cell>
|
||||||
<Cell>{as.n}</Cell>
|
<Cell>{as.n}</Cell>
|
||||||
<Cell stiff>{AnalogTypeNames[as.t]} </Cell>
|
<Cell stiff>{AnalogTypeNames[as.t - 1]} </Cell>
|
||||||
{(as.t === AnalogType.DIGITAL_OUT &&
|
{(as.t === AnalogType.DIGITAL_OUT &&
|
||||||
as.g !== GPIO_25 &&
|
as.g !== GPIO_25 &&
|
||||||
as.g !== GPIO_26) ||
|
as.g !== GPIO_26) ||
|
||||||
@@ -470,9 +470,7 @@ const Sensors = () => {
|
|||||||
as.t === AnalogType.PULSE ? (
|
as.t === AnalogType.PULSE ? (
|
||||||
<Cell stiff>{as.v ? LL.ON() : LL.OFF()}</Cell>
|
<Cell stiff>{as.v ? LL.ON() : LL.OFF()}</Cell>
|
||||||
) : (
|
) : (
|
||||||
<Cell stiff>
|
<Cell stiff>{formatValue(as.v, as.u)}</Cell>
|
||||||
{as.t !== AnalogType.NOTUSED ? formatValue(as.v, as.u) : ''}
|
|
||||||
</Cell>
|
|
||||||
)}
|
)}
|
||||||
</Row>
|
</Row>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ const SensorsAnalogDialog = ({
|
|||||||
const analogTypeMenuItems = useMemo(
|
const analogTypeMenuItems = useMemo(
|
||||||
() =>
|
() =>
|
||||||
AnalogTypeNames.map((val, i) => (
|
AnalogTypeNames.map((val, i) => (
|
||||||
<MenuItem key={val} value={i}>
|
<MenuItem key={val} value={i + 1}>
|
||||||
{val}
|
{val}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)),
|
)),
|
||||||
|
|||||||
@@ -231,7 +231,6 @@ export const DeviceValueUOM_s = [
|
|||||||
|
|
||||||
export enum AnalogType {
|
export enum AnalogType {
|
||||||
REMOVED = -1,
|
REMOVED = -1,
|
||||||
NOTUSED = 0,
|
|
||||||
DIGITAL_IN = 1,
|
DIGITAL_IN = 1,
|
||||||
COUNTER = 2,
|
COUNTER = 2,
|
||||||
ADC = 3,
|
ADC = 3,
|
||||||
@@ -250,22 +249,21 @@ export enum AnalogType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const AnalogTypeNames = [
|
export const AnalogTypeNames = [
|
||||||
'(disabled)',
|
'Digital In', // 1
|
||||||
'Digital In',
|
'Counter', // 2
|
||||||
'Counter',
|
'ADC In', // 3
|
||||||
'ADC In',
|
'Timer', // 4
|
||||||
'Timer',
|
'Rate', // 5
|
||||||
'Rate',
|
'Digital Out', // 6
|
||||||
'Digital Out',
|
'PWM 0', // 7
|
||||||
'PWM 0',
|
'PWM 1', // 8
|
||||||
'PWM 1',
|
'PWM 2', // 9
|
||||||
'PWM 2',
|
'NTC Temp.', // 10
|
||||||
'NTC Temp.',
|
'RGB Led', // 11
|
||||||
'RGB Led',
|
'Pulse', // 12
|
||||||
'Pulse',
|
'Freq 0', // 13
|
||||||
'Freq 0',
|
'Freq 1', // 14
|
||||||
'Freq 1',
|
'Freq 2', // 15
|
||||||
'Freq 2'
|
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export const BOARD_PROFILES = {
|
export const BOARD_PROFILES = {
|
||||||
|
|||||||
@@ -276,10 +276,10 @@ function updateMask(entity: any, de: any, dd: any) {
|
|||||||
const old_custom_name = dd.nodes[dd_objIndex].cn;
|
const old_custom_name = dd.nodes[dd_objIndex].cn;
|
||||||
console.log(
|
console.log(
|
||||||
'comparing names, old (' +
|
'comparing names, old (' +
|
||||||
old_custom_name +
|
old_custom_name +
|
||||||
') with new (' +
|
') with new (' +
|
||||||
new_custom_name +
|
new_custom_name +
|
||||||
')'
|
')'
|
||||||
);
|
);
|
||||||
if (old_custom_name !== new_custom_name) {
|
if (old_custom_name !== new_custom_name) {
|
||||||
changed = true;
|
changed = true;
|
||||||
@@ -375,15 +375,15 @@ function check_upgrade(version: string) {
|
|||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
'Upgrade this version (' +
|
'Upgrade this version (' +
|
||||||
THIS_VERSION +
|
THIS_VERSION +
|
||||||
') to dev (' +
|
') to dev (' +
|
||||||
dev_version +
|
dev_version +
|
||||||
') is ' +
|
') is ' +
|
||||||
(DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
|
(DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
|
||||||
' and to stable (' +
|
' and to stable (' +
|
||||||
stable_version +
|
stable_version +
|
||||||
') is ' +
|
') is ' +
|
||||||
(STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO')
|
(STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO')
|
||||||
);
|
);
|
||||||
data = {
|
data = {
|
||||||
emsesp_version: THIS_VERSION,
|
emsesp_version: THIS_VERSION,
|
||||||
@@ -984,7 +984,7 @@ const emsesp_sensordata = {
|
|||||||
],
|
],
|
||||||
// as: [],
|
// as: [],
|
||||||
as: [
|
as: [
|
||||||
{ id: 1, g: 35, n: 'motor', v: 0, u: 0, o: 17, f: 0, t: 0, d: false, s: false },
|
{ id: 1, g: 35, n: 'motor', v: 0, u: 0, o: 17, f: 0, t: 7, d: false, s: false },
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
g: 34,
|
g: 34,
|
||||||
|
|||||||
@@ -831,7 +831,6 @@ notoken
|
|||||||
NOTOKEN
|
NOTOKEN
|
||||||
NOTRANSLATION
|
NOTRANSLATION
|
||||||
NOTSET
|
NOTSET
|
||||||
NOTUSED
|
|
||||||
NOTYPE
|
NOTYPE
|
||||||
nrgconscomp
|
nrgconscomp
|
||||||
nrgconscompcooling
|
nrgconscompcooling
|
||||||
|
|||||||
@@ -155,12 +155,12 @@ void AnalogSensor::reload(bool get_nvs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
|
// it's new
|
||||||
// check if the GPIO is valid before registering. If not, force set the sensor to disabled, but don't remove it
|
// check if the GPIO is valid before registering. If not, force set the sensor to disabled, but don't remove it
|
||||||
// should only trigger if uploading a customization file with invalid gpios.
|
// should only trigger if uploading a customization file with invalid gpios.
|
||||||
AnalogType type = static_cast<AnalogType>(sensor.type);
|
AnalogType type = static_cast<AnalogType>(sensor.type);
|
||||||
if (!EMSESP::system_.is_valid_gpio(sensor.gpio)) {
|
if (!EMSESP::system_.check_valid_gpio(sensor.gpio, "Analog Sensor")) {
|
||||||
LOG_WARNING("Bad GPIO %d for Sensor %s. Disabling.", sensor.gpio, sensor.name.c_str());
|
continue;
|
||||||
type = AnalogType::NOTUSED;
|
|
||||||
}
|
}
|
||||||
sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, type, sensor.is_system);
|
sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, type, sensor.is_system);
|
||||||
|
|
||||||
@@ -171,6 +171,8 @@ void AnalogSensor::reload(bool get_nvs) {
|
|||||||
sensors_.back().set_value(0); // reset value only for new sensors
|
sensors_.back().set_value(0); // reset value only for new sensors
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add the command to set the value of the sensor
|
||||||
if (sensor.type == AnalogType::COUNTER || (sensor.type >= AnalogType::DIGITAL_OUT && sensor.type <= AnalogType::PWM_2)
|
if (sensor.type == AnalogType::COUNTER || (sensor.type >= AnalogType::DIGITAL_OUT && sensor.type <= AnalogType::PWM_2)
|
||||||
|| sensor.type == AnalogType::RGB || sensor.type == AnalogType::PULSE) {
|
|| sensor.type == AnalogType::RGB || sensor.type == AnalogType::PULSE) {
|
||||||
Command::add(
|
Command::add(
|
||||||
@@ -522,8 +524,8 @@ bool AnalogSensor::update(uint8_t gpio, std::string & name, double offset, doubl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// we didn't find it, it's new, so create and store it in the customization list
|
// we didn't find it, it's new, so create and store it in the customization list
|
||||||
// gpio is already checked in web interface
|
// gpio is already checked if valid in the webUI
|
||||||
if (!found_sensor && EMSESP::system_.is_valid_gpio(gpio)) {
|
if (!found_sensor) {
|
||||||
found_sensor = true;
|
found_sensor = true;
|
||||||
EMSESP::webCustomizationService.update([&](WebCustomization & settings) {
|
EMSESP::webCustomizationService.update([&](WebCustomization & settings) {
|
||||||
auto newSensor = AnalogCustomization();
|
auto newSensor = AnalogCustomization();
|
||||||
@@ -626,158 +628,156 @@ void AnalogSensor::publish_values(const bool force) {
|
|||||||
JsonDocument doc;
|
JsonDocument doc;
|
||||||
|
|
||||||
for (auto & sensor : sensors_) {
|
for (auto & sensor : sensors_) {
|
||||||
if (sensor.type() != AnalogType::NOTUSED) {
|
if (Mqtt::is_nested()) {
|
||||||
if (Mqtt::is_nested()) {
|
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();
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (sensor.type() == AnalogType::PULSE || (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::PULSE || sensor.type() == AnalogType::DIGITAL_OUT) {
|
if (sensor.type() == AnalogType::PULSE || sensor.type() == AnalogType::DIGITAL_OUT) {
|
||||||
#endif
|
#endif
|
||||||
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
|
||||||
dataSensor["value"] = sensor.value() != 0;
|
|
||||||
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
|
||||||
dataSensor["value"] = sensor.value() != 0 ? 1 : 0;
|
|
||||||
} else {
|
|
||||||
char result[12];
|
|
||||||
dataSensor["value"] = Helpers::render_boolean(result, sensor.value() != 0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dataSensor["value"] = serialized(Helpers::render_value(s, sensor.value(), 2)); // double
|
|
||||||
}
|
|
||||||
} 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;
|
dataSensor["value"] = sensor.value() != 0;
|
||||||
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
||||||
doc[sensor.name()] = sensor.value() != 0 ? 1 : 0;
|
dataSensor["value"] = sensor.value() != 0 ? 1 : 0;
|
||||||
} else {
|
} else {
|
||||||
char result[12];
|
char result[12];
|
||||||
doc[sensor.name()] = Helpers::render_boolean(result, sensor.value() != 0);
|
dataSensor["value"] = Helpers::render_boolean(result, sensor.value() != 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char s[10];
|
dataSensor["value"] = serialized(Helpers::render_value(s, sensor.value(), 2)); // double
|
||||||
doc[sensor.name()] = serialized(Helpers::render_value(s, sensor.value(), 2));
|
}
|
||||||
|
} else if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT || sensor.type() == AnalogType::PULSE) {
|
||||||
|
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) {
|
||||||
|
doc[sensor.name()] = sensor.value() != 0;
|
||||||
|
} else if (EMSESP::system_.bool_format() == BOOL_FORMAT_10) {
|
||||||
|
doc[sensor.name()] = sensor.value() != 0 ? 1 : 0;
|
||||||
|
} else {
|
||||||
|
char result[12];
|
||||||
|
doc[sensor.name()] = Helpers::render_boolean(result, sensor.value() != 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char s[10];
|
||||||
|
doc[sensor.name()] = serialized(Helpers::render_value(s, sensor.value(), 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// create HA config if hasn't already been done
|
||||||
|
if (Mqtt::ha_enabled() && (!sensor.ha_registered || force)) {
|
||||||
|
LOG_DEBUG("Recreating HA config for analog sensor GPIO %02d", sensor.gpio());
|
||||||
|
|
||||||
|
JsonDocument config;
|
||||||
|
|
||||||
|
char stat_t[50];
|
||||||
|
snprintf(stat_t, sizeof(stat_t), "%s/%s_data", Mqtt::base().c_str(), F_(analogsensor)); // use base path
|
||||||
|
config["stat_t"] = stat_t;
|
||||||
|
|
||||||
|
char val_obj[50];
|
||||||
|
char val_cond[95];
|
||||||
|
if (Mqtt::is_nested()) {
|
||||||
|
snprintf(val_obj, sizeof(val_obj), "value_json['%02d']['value']", sensor.gpio());
|
||||||
|
snprintf(val_cond, sizeof(val_cond), "value_json['%02d'] is defined and %s is defined", sensor.gpio(), val_obj);
|
||||||
|
} else {
|
||||||
|
snprintf(val_obj, sizeof(val_obj), "value_json['%s']", sensor.name().c_str());
|
||||||
|
snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj);
|
||||||
|
}
|
||||||
|
char sample_val[12] = "0";
|
||||||
|
if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT || sensor.type() == AnalogType::PULSE) {
|
||||||
|
Helpers::render_boolean(sample_val, false);
|
||||||
|
}
|
||||||
|
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
||||||
|
if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
|
||||||
|
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + "}}";
|
||||||
|
} else {
|
||||||
|
config["val_tpl"] = (std::string) "{{" + val_obj + "}}";
|
||||||
}
|
}
|
||||||
|
|
||||||
// create HA config if hasn't already been done
|
char uniq_s[70];
|
||||||
if (Mqtt::ha_enabled() && (!sensor.ha_registered || force)) {
|
if (Mqtt::entity_format() == Mqtt::entityFormat::MULTI_SHORT) {
|
||||||
LOG_DEBUG("Recreating HA config for analog sensor GPIO %02d", sensor.gpio());
|
snprintf(uniq_s, sizeof(uniq_s), "%s_%s_%02d", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
||||||
|
} else {
|
||||||
|
snprintf(uniq_s, sizeof(uniq_s), "%s_%02d", F_(analogsensor), sensor.gpio());
|
||||||
|
}
|
||||||
|
|
||||||
JsonDocument config;
|
config["uniq_id"] = uniq_s;
|
||||||
|
|
||||||
char stat_t[50];
|
char name[50];
|
||||||
snprintf(stat_t, sizeof(stat_t), "%s/%s_data", Mqtt::base().c_str(), F_(analogsensor)); // use base path
|
snprintf(name, sizeof(name), "%s", sensor.name().c_str());
|
||||||
config["stat_t"] = stat_t;
|
config["name"] = name;
|
||||||
|
|
||||||
char val_obj[50];
|
if (sensor.uom() != DeviceValueUOM::NONE && sensor.type() != AnalogType::DIGITAL_OUT) {
|
||||||
char val_cond[95];
|
config["unit_of_meas"] = EMSdevice::uom_to_string(sensor.uom());
|
||||||
if (Mqtt::is_nested()) {
|
}
|
||||||
snprintf(val_obj, sizeof(val_obj), "value_json['%02d']['value']", sensor.gpio());
|
|
||||||
snprintf(val_cond, sizeof(val_cond), "value_json['%02d'] is defined and %s is defined", sensor.gpio(), val_obj);
|
|
||||||
} else {
|
|
||||||
snprintf(val_obj, sizeof(val_obj), "value_json['%s']", sensor.name().c_str());
|
|
||||||
snprintf(val_cond, sizeof(val_cond), "%s is defined", val_obj);
|
|
||||||
}
|
|
||||||
char sample_val[12] = "0";
|
|
||||||
if (sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::DIGITAL_OUT || sensor.type() == AnalogType::PULSE) {
|
|
||||||
Helpers::render_boolean(sample_val, false);
|
|
||||||
}
|
|
||||||
// don't bother with value template conditions if using Domoticz which doesn't fully support MQTT Discovery
|
|
||||||
if (Mqtt::discovery_type() == Mqtt::discoveryType::HOMEASSISTANT) {
|
|
||||||
config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + "}}";
|
|
||||||
} else {
|
|
||||||
config["val_tpl"] = (std::string) "{{" + val_obj + "}}";
|
|
||||||
}
|
|
||||||
|
|
||||||
char uniq_s[70];
|
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||||
if (Mqtt::entity_format() == Mqtt::entityFormat::MULTI_SHORT) {
|
|
||||||
snprintf(uniq_s, sizeof(uniq_s), "%s_%s_%02d", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
|
||||||
} else {
|
|
||||||
snprintf(uniq_s, sizeof(uniq_s), "%s_%02d", F_(analogsensor), sensor.gpio());
|
|
||||||
}
|
|
||||||
|
|
||||||
config["uniq_id"] = uniq_s;
|
// Set commands for some analog types
|
||||||
|
char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
||||||
char name[50];
|
|
||||||
snprintf(name, sizeof(name), "%s", sensor.name().c_str());
|
|
||||||
config["name"] = name;
|
|
||||||
|
|
||||||
if (sensor.uom() != DeviceValueUOM::NONE && sensor.type() != AnalogType::DIGITAL_OUT) {
|
|
||||||
config["unit_of_meas"] = EMSdevice::uom_to_string(sensor.uom());
|
|
||||||
}
|
|
||||||
|
|
||||||
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
|
||||||
|
|
||||||
// Set commands for some analog types
|
|
||||||
char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
if (sensor.type() == AnalogType::PULSE || (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::PULSE || 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());
|
||||||
config["cmd_t"] = command_topic;
|
config["cmd_t"] = command_topic;
|
||||||
Mqtt::add_ha_bool(config.as<JsonObject>());
|
Mqtt::add_ha_bool(config.as<JsonObject>());
|
||||||
} else if (sensor.type() == AnalogType::DIGITAL_OUT) { // DAC
|
} else if (sensor.type() == AnalogType::DIGITAL_OUT) { // DAC
|
||||||
snprintf(topic, sizeof(topic), "number/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "number/%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());
|
||||||
config["cmd_t"] = command_topic;
|
config["cmd_t"] = command_topic;
|
||||||
config["min"] = 0;
|
config["min"] = 0;
|
||||||
config["max"] = 255;
|
config["max"] = 255;
|
||||||
config["mode"] = "box"; // auto, slider or box
|
config["mode"] = "box"; // auto, slider or box
|
||||||
config["step"] = 1;
|
config["step"] = 1;
|
||||||
} else if (sensor.type() >= AnalogType::PWM_0 && sensor.type() <= AnalogType::PWM_2) {
|
} else if (sensor.type() >= AnalogType::PWM_0 && sensor.type() <= AnalogType::PWM_2) {
|
||||||
snprintf(topic, sizeof(topic), "number/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "number/%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());
|
||||||
config["cmd_t"] = command_topic;
|
config["cmd_t"] = command_topic;
|
||||||
config["min"] = 0;
|
config["min"] = 0;
|
||||||
config["max"] = 100;
|
config["max"] = 100;
|
||||||
config["mode"] = "box"; // auto, slider or box
|
config["mode"] = "box"; // auto, slider or box
|
||||||
config["step"] = 0.1;
|
config["step"] = 0.1;
|
||||||
} else if (sensor.type() == AnalogType::RGB) {
|
} else if (sensor.type() == AnalogType::RGB) {
|
||||||
snprintf(topic, sizeof(topic), "number/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "number/%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());
|
||||||
config["cmd_t"] = command_topic;
|
config["cmd_t"] = command_topic;
|
||||||
config["min"] = 0;
|
config["min"] = 0;
|
||||||
config["max"] = 999999;
|
config["max"] = 999999;
|
||||||
config["mode"] = "box"; // auto, slider or box
|
config["mode"] = "box"; // auto, slider or box
|
||||||
config["step"] = 1;
|
config["step"] = 1;
|
||||||
} else if (sensor.type() == AnalogType::COUNTER) {
|
} else if (sensor.type() == AnalogType::COUNTER) {
|
||||||
snprintf(topic, sizeof(topic), "sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "sensor/%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());
|
||||||
config["cmd_t"] = command_topic;
|
config["cmd_t"] = command_topic;
|
||||||
config["stat_cla"] = "total_increasing";
|
config["stat_cla"] = "total_increasing";
|
||||||
// config["mode"] = "box"; // auto, slider or box
|
// config["mode"] = "box"; // auto, slider or box
|
||||||
// config["step"] = sensor.factor();
|
// config["step"] = sensor.factor();
|
||||||
} else if (sensor.type() == AnalogType::DIGITAL_IN) {
|
} else if (sensor.type() == AnalogType::DIGITAL_IN) {
|
||||||
snprintf(topic, sizeof(topic), "binary_sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "binary_sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
||||||
Mqtt::add_ha_bool(config.as<JsonObject>());
|
Mqtt::add_ha_bool(config.as<JsonObject>());
|
||||||
} else {
|
} else {
|
||||||
snprintf(topic, sizeof(topic), "sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
snprintf(topic, sizeof(topic), "sensor/%s/%s_%02d/config", Mqtt::basename().c_str(), F_(analogsensor), sensor.gpio());
|
||||||
config["stat_cla"] = "measurement";
|
config["stat_cla"] = "measurement";
|
||||||
}
|
|
||||||
|
|
||||||
// see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors
|
|
||||||
bool is_ha_device_created = false;
|
|
||||||
for (auto const & sensor : sensors_) {
|
|
||||||
if (sensor.ha_registered) {
|
|
||||||
is_ha_device_created = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add default_entity_id
|
|
||||||
std::string topic_str(topic);
|
|
||||||
doc["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s;
|
|
||||||
|
|
||||||
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", nullptr, nullptr, nullptr, false);
|
|
||||||
Mqtt::add_ha_avail_section(config.as<JsonObject>(), stat_t, !is_ha_device_created, val_cond);
|
|
||||||
|
|
||||||
sensor.ha_registered = Mqtt::queue_ha(topic, config.as<JsonObject>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see if we need to create the [devs] discovery section, as this needs only to be done once for all sensors
|
||||||
|
bool is_ha_device_created = false;
|
||||||
|
for (auto const & sensor : sensors_) {
|
||||||
|
if (sensor.ha_registered) {
|
||||||
|
is_ha_device_created = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add default_entity_id
|
||||||
|
std::string topic_str(topic);
|
||||||
|
doc["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s;
|
||||||
|
|
||||||
|
Mqtt::add_ha_dev_section(config.as<JsonObject>(), "Analog Sensors", nullptr, nullptr, nullptr, false);
|
||||||
|
Mqtt::add_ha_avail_section(config.as<JsonObject>(), stat_t, !is_ha_device_created, val_cond);
|
||||||
|
|
||||||
|
sensor.ha_registered = Mqtt::queue_ha(topic, config.as<JsonObject>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,6 @@ class AnalogSensor {
|
|||||||
~AnalogSensor() = default;
|
~AnalogSensor() = default;
|
||||||
|
|
||||||
enum AnalogType : int8_t {
|
enum AnalogType : int8_t {
|
||||||
NOTUSED = 0, // 0 = disabled
|
|
||||||
DIGITAL_IN = 1,
|
DIGITAL_IN = 1,
|
||||||
COUNTER = 2,
|
COUNTER = 2,
|
||||||
ADC = 3,
|
ADC = 3,
|
||||||
@@ -164,12 +163,10 @@ class AnalogSensor {
|
|||||||
return (!sensors_.empty());
|
return (!sensors_.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// count number of items in sensors_ where type is not set to disabled and not a system sensor
|
||||||
size_t count_entities(bool exclude_disabled_system = false) const {
|
size_t count_entities(bool exclude_disabled_system = false) const {
|
||||||
if (exclude_disabled_system) {
|
if (exclude_disabled_system) {
|
||||||
// count number of items in sensors_ where type is not set to disabled and not a system sensor
|
return std::count_if(sensors_.begin(), sensors_.end(), [](const Sensor & sensor) { return !sensor.is_system(); });
|
||||||
return std::count_if(sensors_.begin(), sensors_.end(), [](const Sensor & sensor) {
|
|
||||||
return sensor.type() != AnalogSensor::AnalogType::NOTUSED && !sensor.is_system();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return sensors_.size();
|
return sensors_.size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
|||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
});
|
});
|
||||||
shell.printfln("Loaded board profile %s", board_profile.c_str());
|
shell.printfln("Loaded board profile %s", board_profile.c_str());
|
||||||
EMSESP::system_.network_init(true);
|
EMSESP::system_.network_init();
|
||||||
});
|
});
|
||||||
|
|
||||||
commands->add_command(
|
commands->add_command(
|
||||||
@@ -357,7 +357,7 @@ static void setup_commands(std::shared_ptr<Commands> const & commands) {
|
|||||||
shell.printfln(F_(tx_mode_fmt), settings.tx_mode);
|
shell.printfln(F_(tx_mode_fmt), settings.tx_mode);
|
||||||
return StateUpdateResult::CHANGED;
|
return StateUpdateResult::CHANGED;
|
||||||
});
|
});
|
||||||
EMSESP::system_.uart_init(false);
|
EMSESP::system_.uart_init();
|
||||||
});
|
});
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1665,6 +1665,9 @@ void EMSESP::start() {
|
|||||||
bool factory_settings = false;
|
bool factory_settings = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// set valid GPIOs list based on ESP32 board/platform type
|
||||||
|
system_.set_valid_system_gpios();
|
||||||
|
|
||||||
// start web log service. now we can start capturing logs to the web log
|
// start web log service. now we can start capturing logs to the web log
|
||||||
webLogService.begin();
|
webLogService.begin();
|
||||||
|
|
||||||
@@ -1714,7 +1717,7 @@ void EMSESP::start() {
|
|||||||
};
|
};
|
||||||
LOG_INFO("Library loaded: %d EMS devices, %d device entities, %s", device_library_.size(), EMSESP_TRANSLATION_COUNT, system_.languages_string().c_str());
|
LOG_INFO("Library loaded: %d EMS devices, %d device entities, %s", device_library_.size(), EMSESP_TRANSLATION_COUNT, system_.languages_string().c_str());
|
||||||
|
|
||||||
system_.reload_settings(); // ... and store some of the settings locally
|
system_.get_settings(); // ... and store some of the settings locally
|
||||||
|
|
||||||
webCustomizationService.begin(); // load the customizations
|
webCustomizationService.begin(); // load the customizations
|
||||||
webSchedulerService.begin(); // load the scheduler events
|
webSchedulerService.begin(); // load the scheduler events
|
||||||
@@ -1806,6 +1809,14 @@ void EMSESP::loop() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (EMSESP::system_.systemStatus() == SYSTEM_STATUS::SYSTEM_STATUS_INVALID_GPIO) {
|
||||||
|
static bool only_once = false;
|
||||||
|
if (!only_once) {
|
||||||
|
LOG_ERROR("Invalid GPIOs used in settings. Please check your settings.");
|
||||||
|
only_once = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uuid::loop();
|
uuid::loop();
|
||||||
|
|
||||||
#ifndef EMSESP_STANDALONE
|
#ifndef EMSESP_STANDALONE
|
||||||
|
|||||||
3322
src/core/system.cpp
3322
src/core/system.cpp
File diff suppressed because it is too large
Load Diff
@@ -67,7 +67,8 @@ enum SYSTEM_STATUS : uint8_t {
|
|||||||
SYSTEM_STATUS_UPLOADING = 100,
|
SYSTEM_STATUS_UPLOADING = 100,
|
||||||
SYSTEM_STATUS_ERROR_UPLOAD = 3,
|
SYSTEM_STATUS_ERROR_UPLOAD = 3,
|
||||||
SYSTEM_STATUS_PENDING_RESTART = 4,
|
SYSTEM_STATUS_PENDING_RESTART = 4,
|
||||||
SYSTEM_STATUS_RESTART_REQUESTED = 5
|
SYSTEM_STATUS_RESTART_REQUESTED = 5,
|
||||||
|
SYSTEM_STATUS_INVALID_GPIO = 6
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FUSE_VALUE : uint8_t { ALL = 0, MFG = 1, MODEL = 2, BOARD = 3, REV = 4, BATCH = 5, FUSE = 6 };
|
enum FUSE_VALUE : uint8_t { ALL = 0, MFG = 1, MODEL = 2, BOARD = 3, REV = 4, BATCH = 5, FUSE = 6 };
|
||||||
@@ -103,7 +104,7 @@ class System {
|
|||||||
void system_restart(const char * partition = nullptr);
|
void system_restart(const char * partition = nullptr);
|
||||||
|
|
||||||
void show_mem(const char * note);
|
void show_mem(const char * note);
|
||||||
void reload_settings();
|
void get_settings();
|
||||||
void syslog_init();
|
void syslog_init();
|
||||||
bool check_upgrade(bool factory_settings);
|
bool check_upgrade(bool factory_settings);
|
||||||
bool check_restore();
|
bool check_restore();
|
||||||
@@ -129,11 +130,11 @@ class System {
|
|||||||
|
|
||||||
static bool uploadFirmwareURL(const char * url = nullptr);
|
static bool uploadFirmwareURL(const char * url = nullptr);
|
||||||
|
|
||||||
void led_init(bool refresh);
|
void led_init();
|
||||||
void network_init(bool refresh);
|
void network_init();
|
||||||
void button_init(bool refresh);
|
void button_init();
|
||||||
void commands_init();
|
void commands_init();
|
||||||
void uart_init(bool refresh);
|
void uart_init();
|
||||||
|
|
||||||
void systemStatus(uint8_t status_code);
|
void systemStatus(uint8_t status_code);
|
||||||
uint8_t systemStatus();
|
uint8_t systemStatus();
|
||||||
@@ -141,8 +142,9 @@ class System {
|
|||||||
static void extractSettings(const char * filename, const char * section, JsonObject output);
|
static void extractSettings(const char * filename, const char * section, JsonObject output);
|
||||||
static bool saveSettings(const char * filename, const char * section, JsonObject input);
|
static bool saveSettings(const char * filename, const char * section, JsonObject input);
|
||||||
|
|
||||||
bool is_valid_gpio(uint8_t pin, bool exclude_used = false);
|
static bool check_valid_gpio(uint8_t pin, const char * source_name);
|
||||||
static bool load_board_profile(std::vector<int8_t> & data, const std::string & board_profile);
|
static std::vector<uint8_t> valid_gpio_list();
|
||||||
|
static bool load_board_profile(std::vector<int8_t> & data, const std::string & board_profile);
|
||||||
|
|
||||||
static bool readCommand(const char * data);
|
static bool readCommand(const char * data);
|
||||||
|
|
||||||
@@ -342,7 +344,7 @@ class System {
|
|||||||
test_set_all_active_ = n;
|
test_set_all_active_ = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::vector<uint8_t> valid_gpio_list(bool exclude_used = false);
|
static void set_valid_system_gpios(bool exclude_used = false);
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2
|
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S2
|
||||||
float temperature() {
|
float temperature() {
|
||||||
@@ -391,6 +393,9 @@ class System {
|
|||||||
|
|
||||||
static std::vector<uint8_t> string_range_to_vector(const std::string & range);
|
static std::vector<uint8_t> string_range_to_vector(const std::string & range);
|
||||||
|
|
||||||
|
static std::vector<uint8_t> valid_system_gpios_; // list of valid GPIOs for the ESP32 board that can be used
|
||||||
|
static std::vector<uint8_t> used_gpios_; // list of GPIOs used by the application
|
||||||
|
|
||||||
int8_t wifi_quality(int8_t dBm);
|
int8_t wifi_quality(int8_t dBm);
|
||||||
|
|
||||||
uint8_t healthcheck_ = HEALTHCHECK_NO_NETWORK | HEALTHCHECK_NO_BUS; // start with all flags set, no wifi and no ems bus connection
|
uint8_t healthcheck_ = HEALTHCHECK_NO_NETWORK | HEALTHCHECK_NO_BUS; // start with all flags set, no wifi and no ems bus connection
|
||||||
@@ -406,7 +411,6 @@ class System {
|
|||||||
bool eth_present_ = false;
|
bool eth_present_ = false;
|
||||||
|
|
||||||
// EMS-ESP settings
|
// EMS-ESP settings
|
||||||
// copies from WebSettings class in WebSettingsService.h and loaded with reload_settings()
|
|
||||||
std::string hostname_;
|
std::string hostname_;
|
||||||
String locale_;
|
String locale_;
|
||||||
bool hide_led_;
|
bool hide_led_;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ void TemperatureSensor::reload() {
|
|||||||
// load the service settings
|
// load the service settings
|
||||||
EMSESP::system_.dallas_gpio(0); // reset in system to check valid sensor
|
EMSESP::system_.dallas_gpio(0); // reset in system to check valid sensor
|
||||||
EMSESP::webSettingsService.read([&](WebSettings const & settings) {
|
EMSESP::webSettingsService.read([&](WebSettings const & settings) {
|
||||||
dallas_gpio_ = EMSESP::system_.is_valid_gpio(settings.dallas_gpio) ? settings.dallas_gpio : 0; // we use 0 for disabled
|
dallas_gpio_ = settings.dallas_gpio;
|
||||||
parasite_ = settings.dallas_parasite;
|
parasite_ = settings.dallas_parasite;
|
||||||
});
|
});
|
||||||
EMSESP::system_.dallas_gpio(dallas_gpio_); // set to system for checks
|
EMSESP::system_.dallas_gpio(dallas_gpio_); // set to system for checks
|
||||||
|
|||||||
@@ -118,8 +118,8 @@ StateUpdateResult WebCustomization::update(JsonObject root, WebCustomization & c
|
|||||||
for (const JsonObject analogJson : analogJsons) {
|
for (const JsonObject analogJson : analogJsons) {
|
||||||
// create each of the sensor, overwriting any previous settings
|
// create each of the sensor, overwriting any previous settings
|
||||||
// if the gpio is invalid skip the sensor
|
// if the gpio is invalid skip the sensor
|
||||||
if (!EMSESP::system_.is_valid_gpio(analogJson["gpio"].as<uint8_t>(), true)) {
|
if (!EMSESP::system_.check_valid_gpio(analogJson["gpio"].as<uint8_t>(), "Analog Sensor")) {
|
||||||
EMSESP::logger().warning("Invalid GPIO %d for Sensor %s. Skipping.",
|
EMSESP::logger().warning("Analog sensor: Invalid GPIO %d for %s. Skipping.",
|
||||||
analogJson["gpio"].as<uint8_t>(),
|
analogJson["gpio"].as<uint8_t>(),
|
||||||
analogJson["name"].as<std::string>().c_str());
|
analogJson["name"].as<std::string>().c_str());
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -145,21 +145,16 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) {
|
|||||||
obj["f"] = sensor.factor();
|
obj["f"] = sensor.factor();
|
||||||
obj["t"] = sensor.type();
|
obj["t"] = sensor.type();
|
||||||
obj["s"] = sensor.is_system();
|
obj["s"] = sensor.is_system();
|
||||||
|
obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float
|
||||||
if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) {
|
|
||||||
obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float
|
|
||||||
} else {
|
|
||||||
obj["v"] = 0; // must have a value for web sorting to work
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
root["analog_enabled"] = EMSESP::analog_enabled();
|
root["analog_enabled"] = EMSESP::analog_enabled();
|
||||||
root["platform"] = EMSESP_PLATFORM;
|
root["platform"] = EMSESP_PLATFORM;
|
||||||
|
|
||||||
// send back a list of valid GPIOs that can be used for analog sensors, excluding those already used
|
// send back a list of valid and unused GPIOs still available for use
|
||||||
JsonArray valid_gpio_list = root["valid_gpio_list"].to<JsonArray>();
|
JsonArray valid_gpio_list = root["valid_gpio_list"].to<JsonArray>();
|
||||||
for (const auto & gpio : EMSESP::system_.valid_gpio_list(true)) {
|
for (const auto & gpio : EMSESP::system_.valid_gpio_list()) {
|
||||||
valid_gpio_list.add(gpio);
|
valid_gpio_list.add(gpio);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,7 +432,7 @@ void WebDataService::dashboard_data(AsyncWebServerRequest * request) {
|
|||||||
uint8_t count = 0;
|
uint8_t count = 0;
|
||||||
for (const auto & sensor : EMSESP::analogsensor_.sensors()) {
|
for (const auto & sensor : EMSESP::analogsensor_.sensors()) {
|
||||||
// ignore system and disabled sensors
|
// ignore system and disabled sensors
|
||||||
if (sensor.is_system() || sensor.type() == AnalogSensor::AnalogType::NOTUSED) {
|
if (sensor.is_system()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
JsonObject node = nodes.add<JsonObject>();
|
JsonObject node = nodes.add<JsonObject>();
|
||||||
|
|||||||
@@ -136,9 +136,12 @@ StateUpdateResult WebSettings::update(JsonObject root, WebSettings & settings) {
|
|||||||
(int8_t)(root["led_type"] | 0)}; // 0 = LED, 1 = RGB-LED
|
(int8_t)(root["led_type"] | 0)}; // 0 = LED, 1 = RGB-LED
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// check valid pins in this board profile
|
// check valid pins for this board profile
|
||||||
if (!EMSESP::system_.is_valid_gpio(data[0]) || !EMSESP::system_.is_valid_gpio(data[1]) || !EMSESP::system_.is_valid_gpio(data[2])
|
if (!EMSESP::system_.check_valid_gpio(data[0], "LED") || !EMSESP::system_.check_valid_gpio(data[1], "Dallas")
|
||||||
|| !EMSESP::system_.is_valid_gpio(data[3]) || !EMSESP::system_.is_valid_gpio(data[4]) || !EMSESP::system_.is_valid_gpio(data[6])) {
|
|| !EMSESP::system_.check_valid_gpio(data[2], "UART Rx") || !EMSESP::system_.check_valid_gpio(data[3], "UART Tx")
|
||||||
|
|| !EMSESP::system_.check_valid_gpio(data[4], "Button") || !EMSESP::system_.check_valid_gpio(data[6], "Ethernet")) {
|
||||||
|
// set status
|
||||||
|
EMSESP::system_.systemStatus(SYSTEM_STATUS::SYSTEM_STATUS_INVALID_GPIO);
|
||||||
settings.board_profile = "default"; // reset to factory default
|
settings.board_profile = "default"; // reset to factory default
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -417,7 +420,7 @@ void WebSettingsService::onUpdate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (WebSettings::has_flags(WebSettings::ChangeFlags::UART)) {
|
if (WebSettings::has_flags(WebSettings::ChangeFlags::UART)) {
|
||||||
EMSESP::system_.uart_init(true);
|
EMSESP::system_.uart_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WebSettings::has_flags(WebSettings::ChangeFlags::SYSLOG)) {
|
if (WebSettings::has_flags(WebSettings::ChangeFlags::SYSLOG)) {
|
||||||
@@ -429,11 +432,11 @@ void WebSettingsService::onUpdate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (WebSettings::has_flags(WebSettings::ChangeFlags::BUTTON)) {
|
if (WebSettings::has_flags(WebSettings::ChangeFlags::BUTTON)) {
|
||||||
EMSESP::system_.button_init(true);
|
EMSESP::system_.button_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WebSettings::has_flags(WebSettings::ChangeFlags::LED)) {
|
if (WebSettings::has_flags(WebSettings::ChangeFlags::LED)) {
|
||||||
EMSESP::system_.led_init(true);
|
EMSESP::system_.led_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WebSettings::has_flags(WebSettings::ChangeFlags::MQTT)) {
|
if (WebSettings::has_flags(WebSettings::ChangeFlags::MQTT)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user