Fixes on SCD4X admin comands (#9607)

* Fixes on SCD4X admin comands

* Minor fix in logs for SEN5X

---------

Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
oscgonfer
2026-02-11 13:11:11 -06:00
committed by GitHub
co-authored by Ben Meadors
parent 31fe15bb73
commit 6d299eac67
2 changed files with 76 additions and 32 deletions
+56 -23
View File
@@ -333,12 +333,6 @@ bool SCD4XSensor::setASC(bool ascEnabled)
return false; return false;
} }
if (ascActive) {
LOG_INFO("%s: ASC is enabled", sensorName);
} else {
LOG_INFO("%s: ASC is disabled", sensorName);
}
return true; return true;
} }
@@ -540,6 +534,7 @@ bool SCD4XSensor::setAltitude(uint32_t altitude)
if (!stopMeasurement()) { if (!stopMeasurement()) {
return false; return false;
} }
LOG_INFO("%s: setting altitude at %um", sensorName, altitude);
error = scd4x.setSensorAltitude(altitude); error = scd4x.setSensorAltitude(altitude);
@@ -548,11 +543,15 @@ bool SCD4XSensor::setAltitude(uint32_t altitude)
return false; return false;
} }
error = scd4x.persistSettings(); // NOTE: this gives an error if issued. Sensirion's library
if (error != SCD4X_NO_ERROR) { // doesn't indicate it's needed.
LOG_ERROR("%s: Unable to make settings persistent. Error code: %u", sensorName, error); // error = scd4x.persistSettings();
return false; // if (error != SCD4X_NO_ERROR) {
} // LOG_ERROR("%s: Unable to make settings persistent. Error code: %u", sensorName, error);
// return false;
// }
LOG_INFO("%s: altitude set", sensorName);
return true; return true;
} }
@@ -575,6 +574,8 @@ bool SCD4XSensor::setAmbientPressure(uint32_t ambientPressure)
{ {
uint16_t error; uint16_t error;
LOG_INFO("%s: setting ambient pressure at %u Pa", sensorName, ambientPressure);
error = scd4x.setAmbientPressure(ambientPressure); error = scd4x.setAmbientPressure(ambientPressure);
if (error != SCD4X_NO_ERROR) { if (error != SCD4X_NO_ERROR) {
@@ -589,6 +590,8 @@ bool SCD4XSensor::setAmbientPressure(uint32_t ambientPressure)
return false; return false;
} }
LOG_INFO("%s: ambient pressure set set", sensorName);
return true; return true;
} }
@@ -824,15 +827,28 @@ AdminMessageHandleResult SCD4XSensor::handleAdminMessage(const meshtastic_MeshPa
if (request->sensor_config.scd4x_config.has_factory_reset) { if (request->sensor_config.scd4x_config.has_factory_reset) {
LOG_DEBUG("%s: Requested factory reset", sensorName); LOG_DEBUG("%s: Requested factory reset", sensorName);
this->factoryReset(); if (!this->factoryReset()) {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} else { } else {
if (request->sensor_config.scd4x_config.has_set_asc) { if (request->sensor_config.scd4x_config.has_set_asc) {
this->setASC(request->sensor_config.scd4x_config.set_asc); getASC(ascActive);
bool currentASC = ascActive;
if (request->sensor_config.scd4x_config.set_asc == false) { if (request->sensor_config.scd4x_config.set_asc == false) {
LOG_DEBUG("%s: Request for FRC", sensorName); LOG_DEBUG("%s: Request for FRC", sensorName);
if (request->sensor_config.scd4x_config.has_set_target_co2_conc) { if (request->sensor_config.scd4x_config.has_set_target_co2_conc) {
this->performFRC(request->sensor_config.scd4x_config.set_target_co2_conc); if (this->setASC(request->sensor_config.scd4x_config.set_asc)) {
if (!this->performFRC(request->sensor_config.scd4x_config.set_target_co2_conc)) {
result = AdminMessageHandleResult::NOT_HANDLED;
// Set it back to ASC if failed
setASC(currentASC);
break;
};
} else {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} else { } else {
// FRC requested but no target CO2 provided // FRC requested but no target CO2 provided
LOG_ERROR("%s: target CO2 not provided", sensorName); LOG_ERROR("%s: target CO2 not provided", sensorName);
@@ -841,13 +857,18 @@ AdminMessageHandleResult SCD4XSensor::handleAdminMessage(const meshtastic_MeshPa
} }
} else { } else {
LOG_DEBUG("%s: Request for ASC", sensorName); LOG_DEBUG("%s: Request for ASC", sensorName);
if (this->setASC(request->sensor_config.scd4x_config.set_asc)) {
if (request->sensor_config.scd4x_config.has_set_target_co2_conc) { if (request->sensor_config.scd4x_config.has_set_target_co2_conc) {
LOG_DEBUG("%s: Request has target CO2", sensorName); LOG_DEBUG("%s: Request has target CO2", sensorName);
// TODO - Remove? see setASCBaseline function
this->setASCBaseline(request->sensor_config.scd4x_config.set_target_co2_conc); this->setASCBaseline(request->sensor_config.scd4x_config.set_target_co2_conc);
// NOTE - in this situation, if we set ASC, but baseline set fails, we stay on ASC
} else { } else {
LOG_DEBUG("%s: Request doesn't have target CO2", sensorName); LOG_DEBUG("%s: Request doesn't have target CO2", sensorName);
} }
} else {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} }
} }
@@ -855,26 +876,35 @@ AdminMessageHandleResult SCD4XSensor::handleAdminMessage(const meshtastic_MeshPa
// NOTE: this requires to have a sensor working on stable environment // NOTE: this requires to have a sensor working on stable environment
// And to make it between readings // And to make it between readings
if (request->sensor_config.scd4x_config.has_set_temperature) { if (request->sensor_config.scd4x_config.has_set_temperature) {
this->setTemperature(request->sensor_config.scd4x_config.set_temperature); if (!this->setTemperature(request->sensor_config.scd4x_config.set_temperature)) {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} }
// Check for altitude or pressure offset // Check for altitude or pressure offset
if (request->sensor_config.scd4x_config.has_set_altitude) { if (request->sensor_config.scd4x_config.has_set_altitude) {
this->setAltitude(request->sensor_config.scd4x_config.set_altitude); if (!this->setAltitude(request->sensor_config.scd4x_config.set_altitude)) {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} else if (request->sensor_config.scd4x_config.has_set_ambient_pressure) { } else if (request->sensor_config.scd4x_config.has_set_ambient_pressure) {
this->setAmbientPressure(request->sensor_config.scd4x_config.set_ambient_pressure); if (!this->setAmbientPressure(request->sensor_config.scd4x_config.set_ambient_pressure)) {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} }
// Check for low power mode // Check for low power mode
// NOTE: to switch from one mode to another do: // NOTE: to switch from one mode to another do:
// setPowerMode -> startMeasurement // setPowerMode -> startMeasurement
if (request->sensor_config.scd4x_config.has_set_power_mode) { if (request->sensor_config.scd4x_config.has_set_power_mode) {
this->setPowerMode(request->sensor_config.scd4x_config.set_power_mode); if (!this->setPowerMode(request->sensor_config.scd4x_config.set_power_mode)) {
result = AdminMessageHandleResult::NOT_HANDLED;
break;
}
} }
} }
// Start measurement mode
this->startMeasurement();
result = AdminMessageHandleResult::HANDLED; result = AdminMessageHandleResult::HANDLED;
break; break;
@@ -883,6 +913,9 @@ AdminMessageHandleResult SCD4XSensor::handleAdminMessage(const meshtastic_MeshPa
result = AdminMessageHandleResult::NOT_HANDLED; result = AdminMessageHandleResult::NOT_HANDLED;
} }
// Start measurement mode
this->startMeasurement();
#if defined(SCD4X_I2C_CLOCK_SPEED) && defined(CAN_RECLOCK_I2C) #if defined(SCD4X_I2C_CLOCK_SPEED) && defined(CAN_RECLOCK_I2C)
reClockI2C(currentClock, _bus, false); reClockI2C(currentClock, _bus, false);
#endif #endif
+15 -4
View File
@@ -919,6 +919,11 @@ bool SEN5XSensor::getMetrics(meshtastic_Telemetry *measurement)
void SEN5XSensor::setMode(bool setOneShot) void SEN5XSensor::setMode(bool setOneShot)
{ {
oneShotMode = setOneShot; oneShotMode = setOneShot;
if (oneShotMode) {
LOG_INFO("%s setting mode to one shot mode", sensorName);
} else {
LOG_INFO("%s setting mode to continuous mode", sensorName);
}
} }
AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPacket &mp, meshtastic_AdminMessage *request, AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPacket &mp, meshtastic_AdminMessage *request,
@@ -934,16 +939,22 @@ AdminMessageHandleResult SEN5XSensor::handleAdminMessage(const meshtastic_MeshPa
break; break;
} }
// TODO - Add admin command to set temperature offset // Check for one-shot/continuous mode request
if (request->sensor_config.sen5x_config.has_set_one_shot_mode) {
this->setMode(request->sensor_config.sen5x_config.set_one_shot_mode);
}
// TODO - Add admin command to set temperature offset?
// Check for temperature offset // Check for temperature offset
// if (request->sensor_config.sen5x_config.has_set_temperature) { // if (request->sensor_config.sen5x_config.has_set_temperature) {
// this->setTemperature(request->sensor_config.sen5x_config.set_temperature); // this->setTemperature(request->sensor_config.sen5x_config.set_temperature);
// } // }
// TODO - Add admin command to trigger fan cleaning?
// Check for one-shot/continuous mode request // Check for one-shot/continuous mode request
if (request->sensor_config.sen5x_config.has_set_one_shot_mode) { // if (request->sensor_config.sen5x_config.has_fan_cleaning && request->sensor_config.sen5x_config.fan_cleaning) {
this->setMode(request->sensor_config.sen5x_config.set_one_shot_mode); // this->startCleaning();
} // }
result = AdminMessageHandleResult::HANDLED; result = AdminMessageHandleResult::HANDLED;
break; break;