fix gpio check

This commit is contained in:
MichaelDvP
2025-11-17 13:28:00 +01:00
parent a693e96248
commit ea75a34c82
4 changed files with 30 additions and 26 deletions

View File

@@ -447,7 +447,7 @@ const Sensors = () => {
item={as} item={as}
onClick={() => updateAnalogSensor(as)} onClick={() => updateAnalogSensor(as)}
> >
<Cell stiff>{as.g}</Cell> <Cell stiff>{as.g !== 99 ? as.g : ''}</Cell>
<Cell>{as.n}</Cell> <Cell>{as.n}</Cell>
<Cell stiff>{AnalogTypeNames[as.t]} </Cell> <Cell stiff>{AnalogTypeNames[as.t]} </Cell>
{(as.t === AnalogType.DIGITAL_OUT && {(as.t === AnalogType.DIGITAL_OUT &&
@@ -455,10 +455,10 @@ const Sensors = () => {
as.g !== GPIO_26) || as.g !== GPIO_26) ||
as.t === AnalogType.DIGITAL_IN || as.t === AnalogType.DIGITAL_IN ||
as.t === AnalogType.PULSE ? ( as.t === AnalogType.PULSE ? (
<Cell stiff>{as.v ? LL.ON() : LL.OFF()}</Cell> <Cell stiff>{as.g !== 99 ? as.v ? LL.ON() : LL.OFF() : ''}</Cell>
) : ( ) : (
<Cell stiff> <Cell stiff>
{as.t !== AnalogType.NOTUSED ? formatValue(as.v, as.u) : ''} {as.t !== AnalogType.NOTUSED && as.g !== 99 ? formatValue(as.v, as.u) : ''}
</Cell> </Cell>
)} )}
</Row> </Row>

View File

@@ -155,7 +155,14 @@ void AnalogSensor::reload(bool get_nvs) {
} }
} }
if (!found) { if (!found) {
// 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.
if (!EMSESP::system_.is_valid_gpio(sensor.gpio)) {
LOG_WARNING("Bad GPIO %d for Sensor %s. Disabling.", sensor.gpio, sensor.name.c_str());
sensors_.emplace_back(99, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system);
} else {
sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system); sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type, sensor.is_system);
}
sensors_.back().ha_registered = false; // this will trigger recreate of the HA config sensors_.back().ha_registered = false; // this will trigger recreate of the HA config
if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) { if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) {
sensors_.back().set_value(sensor.offset); sensors_.back().set_value(sensor.offset);
@@ -187,16 +194,8 @@ void AnalogSensor::reload(bool get_nvs) {
for (auto & sensor : sensors_) { for (auto & sensor : sensors_) {
sensor.ha_registered = false; // force HA configs to be re-created sensor.ha_registered = false; // force HA configs to be re-created
// first check if the GPIO is valid. If not, force set the sensor to disabled, but don't remove it if (sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::RATE
if (!EMSESP::system_.is_valid_gpio(sensor.gpio())) { || sensor.type() == AnalogType::TIMER) {
LOG_WARNING("Bad GPIO %d for Sensor %s. Disabling.", sensor.gpio(), sensor.name().c_str());
sensor.set_type(AnalogType::NOTUSED); // set disabled
continue; // skip this loop pass
}
if ((sensor.gpio() == 25 || sensor.gpio() == 26)
&& (sensor.type() == AnalogType::COUNTER || sensor.type() == AnalogType::DIGITAL_IN || sensor.type() == AnalogType::RATE
|| sensor.type() == AnalogType::TIMER)) {
// pullup is mapped to DAC, so set to 3.3V // pullup is mapped to DAC, so set to 3.3V
#if CONFIG_IDF_TARGET_ESP32 #if CONFIG_IDF_TARGET_ESP32
if (sensor.gpio() == 25 || sensor.gpio() == 26) { if (sensor.gpio() == 25 || sensor.gpio() == 26) {
@@ -521,7 +520,9 @@ 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
if (!found_sensor) { // gpio is already checked in web interface, should never trigger.
if (!found_sensor && EMSESP::system_.is_valid_gpio(gpio)) {
found_sensor = true;
EMSESP::webCustomizationService.update([&](WebCustomization & settings) { EMSESP::webCustomizationService.update([&](WebCustomization & settings) {
auto newSensor = AnalogCustomization(); auto newSensor = AnalogCustomization();
newSensor.gpio = gpio; newSensor.gpio = gpio;
@@ -538,11 +539,12 @@ bool AnalogSensor::update(uint8_t gpio, std::string & name, double offset, doubl
} }
// reloads the sensors in the customizations file into the sensors list // reloads the sensors in the customizations file into the sensors list
if (found_sensor) {
reload(); reload();
return true;
}
// return false if it's an invalid GPIO, an error will show in WebUI return false;
// and reported as an error in the log
return EMSESP::system_.is_valid_gpio(gpio);
} }
// check to see if values have been updated // check to see if values have been updated

View File

@@ -414,13 +414,17 @@ void System::reload_settings() {
dallas_gpio_ = 0; dallas_gpio_ = 0;
EMSESP::webSettingsService.read([&](WebSettings & settings) { EMSESP::webSettingsService.read([&](WebSettings & settings) {
version_ = settings.version; version_ = settings.version;
// first check gpios, prioriy to rx and tx
rx_gpio_ = is_valid_gpio(settings.rx_gpio) ? settings.rx_gpio : 0;
tx_gpio_ = is_valid_gpio(settings.tx_gpio) ? settings.tx_gpio : 0;
pbutton_gpio_ = is_valid_gpio(settings.pbutton_gpio) ? settings.pbutton_gpio : 0; pbutton_gpio_ = is_valid_gpio(settings.pbutton_gpio) ? settings.pbutton_gpio : 0;
dallas_gpio_ = is_valid_gpio(settings.dallas_gpio) ? settings.dallas_gpio : 0;
led_gpio_ = is_valid_gpio(settings.led_gpio) ? settings.led_gpio : 0;
analog_enabled_ = settings.analog_enabled; analog_enabled_ = settings.analog_enabled;
low_clock_ = settings.low_clock; low_clock_ = settings.low_clock;
hide_led_ = settings.hide_led; hide_led_ = settings.hide_led;
led_type_ = settings.led_type; led_type_ = settings.led_type;
led_gpio_ = is_valid_gpio(settings.led_gpio) ? settings.led_gpio : 0;
board_profile_ = settings.board_profile; board_profile_ = settings.board_profile;
telnet_enabled_ = settings.telnet_enabled; telnet_enabled_ = settings.telnet_enabled;
@@ -430,9 +434,6 @@ void System::reload_settings() {
modbus_timeout_ = settings.modbus_timeout; modbus_timeout_ = settings.modbus_timeout;
tx_mode_ = settings.tx_mode; tx_mode_ = settings.tx_mode;
rx_gpio_ = is_valid_gpio(settings.rx_gpio) ? settings.rx_gpio : 0;
tx_gpio_ = is_valid_gpio(settings.tx_gpio) ? settings.tx_gpio : 0;
dallas_gpio_ = is_valid_gpio(settings.dallas_gpio) ? settings.dallas_gpio : 0;
syslog_enabled_ = settings.syslog_enabled; syslog_enabled_ = settings.syslog_enabled;
syslog_level_ = settings.syslog_level; syslog_level_ = settings.syslog_level;
syslog_mark_interval_ = settings.syslog_mark_interval; syslog_mark_interval_ = settings.syslog_mark_interval;
@@ -457,7 +458,8 @@ void System::reload_settings() {
// check for valid ESP32 pins // check for valid ESP32 pins
bool System::is_valid_gpio(uint8_t pin) { bool System::is_valid_gpio(uint8_t pin) {
return std::find(valid_gpio_list().begin(), valid_gpio_list().end(), pin) != valid_gpio_list().end(); auto valid_gpios = valid_gpio_list();
return std::find(valid_gpios.begin(), valid_gpios.end(), pin) != valid_gpios.end();
} }
// Starts up the UART Serial bridge // Starts up the UART Serial bridge

View File

@@ -146,7 +146,7 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) {
obj["t"] = sensor.type(); obj["t"] = sensor.type();
obj["s"] = sensor.is_system(); obj["s"] = sensor.is_system();
if (sensor.type() != AnalogSensor::AnalogType::NOTUSED) { if (sensor.type() != AnalogSensor::AnalogType::NOTUSED && sensor.gpio() != 99) {
obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float obj["v"] = Helpers::transformNumFloat(sensor.value()); // is optional and is a float
} else { } else {
obj["v"] = 0; // must have a value for web sorting to work obj["v"] = 0; // must have a value for web sorting to work