Fixed Sonoff SPM PowerOnState overrules SSPMPowerOnState in mixed 4Relay setup with 4Relay version 1.0.0

This commit is contained in:
Theo Arends 2025-01-16 16:36:20 +01:00
parent 3efdfae845
commit 866ffc8967
3 changed files with 23 additions and 8 deletions

View File

@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file.
- Allow negative values for AdcParam/AdcGpio INPUT, TEMP and RANGE parameters (#22809)
### Fixed
- Sonoff SPM `PowerOnState` overrules `SSPMPowerOnState` in mixed 4Relay setup with 4Relay version 1.0.0
### Removed

View File

@ -152,6 +152,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
### Fixed
- Shutter discovery message regression from v14.4.1 [#22730](https://github.com/arendst/Tasmota/issues/22730)
- Sonoff SPM `PowerOnState` overrules `SSPMPowerOnState` in mixed 4Relay setup with 4Relay version 1.0.0
- Webcam compilation with `define USE_WEBCAM` but without `define ENABLE_RTSPSERVER` [#22686](https://github.com/arendst/Tasmota/issues/22686)
- Berry Zigbee fix wrong attributes [#22684](https://github.com/arendst/Tasmota/issues/22684)
- Berry walrus operator [#22685](https://github.com/arendst/Tasmota/issues/22685)

View File

@ -67,6 +67,8 @@
* SspmOverload<relay> 10,0,0,0,235.2 - Enable overload detection after 10 seconds for MaxVoltage
* SspmScan - Rescan ARM modbus taking around 20 seconds
* SspmReset 1 - Reset ARM and restart ESP
* SspmPowerOnState2 0|1|2 - Set relay2 power on state (0 = Off, 1 = On, 2 = Saved) - Needs both main and 4relay at v1.2.0
* (4relay modules below v1.2.0 will be controlled by command PowerOnState)
*
* Todo:
* Gui for Overload Protection entry (is handled by ARM processor).
@ -252,6 +254,8 @@ typedef struct {
float energy_today[SSPM_MAX_MODULES][4]; // 12345 kWh
float energy_total[SSPM_MAX_MODULES][4]; // 12345 kWh total energy since last 6 month!!!
uint32_t relay_versions[SSPM_MAX_MODULES];
float min_power;
float max_power;
float min_voltage;
@ -1032,9 +1036,9 @@ void SSPMAddModule(void) {
Sspm->map_change = true;
}
uint32_t relay_version = SspmBuffer[36] << 16 | SspmBuffer[37] << 8 | SspmBuffer[38]; // 0x00010000 or 0x00010200
if (relay_version < Sspm->relay_version) {
Sspm->relay_version = relay_version; // Lowest version will be supported
Sspm->relay_versions[mapped] = SspmBuffer[36] << 16 | SspmBuffer[37] << 8 | SspmBuffer[38]; // 0x00010000 or 0x00010200
if (Sspm->relay_versions[mapped] < Sspm->relay_version) {
Sspm->relay_version = Sspm->relay_versions[mapped]; // Lowest version will be supported
}
mapped++;
AddLog(LOG_LEVEL_INFO, PSTR("SPM: 4Relay %d (mapped to %d) type %d version %d.%d.%d found with id %12_H"),
@ -1043,7 +1047,7 @@ void SSPMAddModule(void) {
Sspm->module_max++;
if (Settings->save_data) {
TasmotaGlobal.save_data_counter = Settings->save_data +2; // Postpone flash write until all modules are scanned
TasmotaGlobal.save_data_counter = Settings->save_data +2; // Postpone flash write until all modules are scanned
}
}
}
@ -2104,11 +2108,19 @@ void SSPMEvery100ms(void) {
if (!Sspm->Settings.simulate_count) {
#endif // SSPM_SIMULATE
if (Sspm->relay_version < SSPM_VERSION_1_2_0) {
// Set relay power on state based on Tasmota global setting
// Set relay power on state based on Tasmota global setting (only needed for 4Relay v1.0.0 modules)
if (Sspm->power_on_state) {
TasmotaGlobal.power = Sspm->power_on_state;
Sspm->power_on_state = 0; // Reset power on state solving re-scan
SetPowerOnState(); // Set power on state now that all relays have been detected
for (uint32_t module = 0; module < Sspm->module_max; module++) {
if (Sspm->relay_versions[module] < SSPM_VERSION_1_2_0) {
uint32_t mask = 1 << (module *4);
for (uint32_t relay = 0; relay < 4; relay++) {
uint32_t bit = (module *4) +relay;
bitWrite(TasmotaGlobal.power, bit, bitRead(Sspm->power_on_state, bit));
}
}
}
Sspm->power_on_state = 0; // Reset power on state solving re-scan
SetDevicePower(TasmotaGlobal.power, SRC_RESTART); // Set power on state now that all relays have been detected
}
}
#ifdef SSPM_SIMULATE
@ -2662,6 +2674,7 @@ void CmndSSPMSend(void) {
void CmndSSPMPowerOnState(void) {
// SspmPowerOnState2 0|1|2 - Set relay2 power on state (0 = Off, 1 = On, 2 = Saved)
// Needs both main and 4relay at v1.2.0
// 4relay modules below v1.2.0 will be controlled by command PowerOnState in state SPM_SCAN_COMPLETE)
if (Sspm->main_version > SSPM_VERSION_1_0_0) {
uint32_t max_index = Sspm->module_max *4;
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= max_index)) {