Add support for Sonoff SPM v1.2.0

- Add support for Sonoff SPM v1.2.0
- Bump version to v11.1.0.3
This commit is contained in:
Theo Arends 2022-05-14 14:47:50 +02:00
parent 112808c2bf
commit da0a2280b5
4 changed files with 77 additions and 16 deletions

View File

@ -3,13 +3,12 @@ All notable changes to this project will be documented in this file.
## [Unreleased] - Development ## [Unreleased] - Development
## [11.1.0.2] ## [11.1.0.3]
### Added ### Added
- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production - Support for Sonoff SPM v1.2.0
### Changed ### Changed
- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota
- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries
### Fixed ### Fixed
@ -17,6 +16,14 @@ All notable changes to this project will be documented in this file.
### Removed ### Removed
## [11.1.0.2] 20220514
### Added
- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production
### Changed
- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota
- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries
## [11.1.0.1] 20220504 ## [11.1.0.1] 20220504
### Added ### Added
- Support for Sonoff MS01 soil moisture sensor (#15335) - Support for Sonoff MS01 soil moisture sensor (#15335)

View File

@ -104,7 +104,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
[Complete list](BUILDS.md) of available feature and sensors. [Complete list](BUILDS.md) of available feature and sensors.
## Changelog v11.1.0.2 ## Changelog v11.1.0.3
### Added ### Added
- Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350)
- Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530)
@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
- Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335)
- Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345)
- Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) - Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447)
- Support for Sonoff SPM v1.2.0
- Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474)
- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production

View File

@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_ #ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_
const uint32_t VERSION = 0x0B010002; // 11.1.0.2 const uint32_t VERSION = 0x0B010003; // 11.1.0.3
#endif // _TASMOTA_VERSION_H_ #endif // _TASMOTA_VERSION_H_

View File

@ -32,7 +32,7 @@
* Each SPM-4Relay has 4 bistable relays with their own CSE7761 energy monitoring device handled by an ARM processor. * Each SPM-4Relay has 4 bistable relays with their own CSE7761 energy monitoring device handled by an ARM processor.
* Green led is controlled by ARM processor indicating SD-Card access. * Green led is controlled by ARM processor indicating SD-Card access.
* ESP32 is used as interface between eWelink and ARM processor in SPM-Main unit communicating over proprietary serial protocol. * ESP32 is used as interface between eWelink and ARM processor in SPM-Main unit communicating over proprietary serial protocol.
* Power on sequence for two SPM-4Relay modules is 00-00-15-10-(0F)-(13)-(13)-(19)-0C-09-04-09-04-0B-0B * Power on sequence for two SPM-4Relay modules is 00-00-15-10-(0F)-(13)-(13)-(19)-0C-09-04-[25]-09-04-[25]-0B-0B
* Up to 180 days of daily energy are stored on the SD-Card. Previous data is lost. * Up to 180 days of daily energy are stored on the SD-Card. Previous data is lost.
* Tasmota support is based on Sonoff SPM v1.0.0 ARM firmware. * Tasmota support is based on Sonoff SPM v1.0.0 ARM firmware.
* Energy history cannot be guaranteed using either SD-Card or internal flash. As a solution Tasmota stores the total energy and yesterday energy just after midnight. * Energy history cannot be guaranteed using either SD-Card or internal flash. As a solution Tasmota stores the total energy and yesterday energy just after midnight.
@ -143,6 +143,7 @@
#define SSPM_FUNC_GET_LOG 26 // 0x1A #define SSPM_FUNC_GET_LOG 26 // 0x1A
#define SSPM_FUNC_ENERGY_PERIOD 27 // 0x1B #define SSPM_FUNC_ENERGY_PERIOD 27 // 0x1B
#define SSPM_FUNC_RESET 28 // 0x1C - Remove device from eWelink and factory reset #define SSPM_FUNC_RESET 28 // 0x1C - Remove device from eWelink and factory reset
#define SSPM_FUNC_GET_NEW1 37 // 0x25
// From ARM to ESP // From ARM to ESP
#define SSPM_FUNC_ENERGY_RESULT 6 // 0x06 #define SSPM_FUNC_ENERGY_RESULT 6 // 0x06
@ -166,6 +167,9 @@
#define SSPM_MODULE_NAME_SIZE 12 #define SSPM_MODULE_NAME_SIZE 12
#define SSPM_MAIN_V1_0_0 0x00010000
#define SSPM_MAIN_V1_2_0 0x00010200
/*********************************************************************************************/ /*********************************************************************************************/
#define SSPM_TOTAL_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays #define SSPM_TOTAL_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays
@ -176,9 +180,10 @@ enum SspmMachineStates { SPM_NONE, // Do nothing
SPM_WAIT, // Wait 100ms SPM_WAIT, // Wait 100ms
SPM_RESET, // Toggle ARM reset pin SPM_RESET, // Toggle ARM reset pin
SPM_POLL_ARM, // Wait for first acknowledge from ARM after reset SPM_POLL_ARM, // Wait for first acknowledge from ARM after reset
SPM_POLL_ARM_SPI, // Wait for first acknowledge from ARM SPI after reset // Removed to accomodate v1.2.0 too
SPM_POLL_ARM_2, // Wait for second acknowledge from ARM after reset // SPM_POLL_ARM_SPI, // Wait for first acknowledge from ARM SPI after reset
SPM_POLL_ARM_3, // Wait for second acknowledge from ARM after reset // SPM_POLL_ARM_2, // Wait for second acknowledge from ARM after reset
// SPM_POLL_ARM_3, // Wait for second acknowledge from ARM after reset
SPM_SEND_FUNC_UNITS, // Get number of units SPM_SEND_FUNC_UNITS, // Get number of units
SPM_START_SCAN, // Start module scan sequence SPM_START_SCAN, // Start module scan sequence
SPM_WAIT_FOR_SCAN, // Wait for scan sequence to complete SPM_WAIT_FOR_SCAN, // Wait for scan sequence to complete
@ -250,6 +255,7 @@ typedef struct {
float overload_max_current; float overload_max_current;
uint32_t timeout; uint32_t timeout;
uint32_t main_version;
power_t old_power; power_t old_power;
power_t power_on_state; power_t power_on_state;
uint16_t last_totals; uint16_t last_totals;
@ -894,6 +900,23 @@ void SSPMSendGetEnergyPeriod(uint32_t relay) {
} }
void SSPMSendGetNew1(uint32_t module) {
/*
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
aa 55 01 6b 7e 32 37 39 37 34 13 4b 35 36 37 00 25 00 00 08 c0 0a
Marker |Module id |Ac|Cm|Size |Ix|Chksm|
*/
if (module >= Sspm->module_max) { return; }
SSPMInitSend();
memcpy(SspmBuffer +3, Sspm->module[SSPMGetMappedModuleId(module)], SSPM_MODULE_NAME_SIZE);
SspmBuffer[16] = SSPM_FUNC_GET_NEW1; // 0x25
Sspm->command_sequence++;
SspmBuffer[19] = Sspm->command_sequence;
SSPMSend(22);
}
/*********************************************************************************************/ /*********************************************************************************************/
void SSPMAddModule(void) { void SSPMAddModule(void) {
@ -1050,6 +1073,9 @@ void SSPMHandleReceivedData(void) {
} }
MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR("SSPMOverload")); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR("SSPMOverload"));
Sspm->overload_relay = 255; Sspm->overload_relay = 255;
} else {
if (Sspm->main_version > SSPM_MAIN_V1_0_0) {
SSPMSendGetNew1(Sspm->module_selected -1);
} else { } else {
Sspm->module_selected--; Sspm->module_selected--;
if (Sspm->module_selected > 0) { if (Sspm->module_selected > 0) {
@ -1058,6 +1084,7 @@ void SSPMHandleReceivedData(void) {
SSPMSendGetScheme(Sspm->module_selected); SSPMSendGetScheme(Sspm->module_selected);
} }
} }
}
break; break;
case SSPM_FUNC_GET_MODULE_STATE: case SSPM_FUNC_GET_MODULE_STATE:
/* 0x09 /* 0x09
@ -1101,9 +1128,14 @@ void SSPMHandleReceivedData(void) {
case SSPM_FUNC_SET_TIME: case SSPM_FUNC_SET_TIME:
/* 0x0C /* 0x0C
AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 0c 00 01 00 04 3e 62 AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 0c 00 01 00 04 3e 62
v1.2.0: adds response from each 4-relay module
AA 55 01 8b 34 32 37 39 37 34 13 4b 35 36 37 80 0c 00 01 00 19 4c 09
*/ */
if (0 == SspmBuffer[3]) {
// Discard v1.2.0 additions
TasmotaGlobal.devices_present = 0; TasmotaGlobal.devices_present = 0;
SSPMSendGetModuleState(Sspm->module_selected -1); SSPMSendGetModuleState(Sspm->module_selected -1);
}
break; break;
case SSPM_FUNC_INIT_SCAN: case SSPM_FUNC_INIT_SCAN:
/* 0x10 /* 0x10
@ -1117,7 +1149,11 @@ void SSPMHandleReceivedData(void) {
AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 15 00 04 00 01 00 00 01 81 b1 AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 15 00 04 00 01 00 00 01 81 b1
|St|FwVersio| |St|FwVersio|
| | 1.0.0| | | 1.0.0|
v1.2.0:
AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 15 00 04 00 01 02 00 01 41 10
| | 1.2.0|
*/ */
Sspm->main_version = SspmBuffer[20] << 16 | SspmBuffer[21] << 8 | SspmBuffer[22]; // 0x00010000 or 0x00010200
AddLog(LOG_LEVEL_INFO, PSTR("SPM: Main version %d.%d.%d found"), SspmBuffer[20], SspmBuffer[21], SspmBuffer[22]); AddLog(LOG_LEVEL_INFO, PSTR("SPM: Main version %d.%d.%d found"), SspmBuffer[20], SspmBuffer[21], SspmBuffer[22]);
Sspm->mstate = SPM_START_SCAN; Sspm->mstate = SPM_START_SCAN;
@ -1314,6 +1350,19 @@ void SSPMHandleReceivedData(void) {
*/ */
// TasmotaGlobal.restart_flag = 2; // TasmotaGlobal.restart_flag = 2;
break; break;
case SSPM_FUNC_GET_NEW1:
/* 0x25 v1.2.0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23
AA 55 01 8b 34 32 37 39 37 34 13 4b 35 36 37 80 25 00 01 01 06 98 06
Marker |Module id |Ac|Cm|Size |St|Ix|Chksm|
*/
Sspm->module_selected--;
if (Sspm->module_selected > 0) {
SSPMSendGetModuleState(Sspm->module_selected -1);
} else {
SSPMSendGetScheme(Sspm->module_selected);
}
break;
} }
} else { } else {
// Initiated by ARM // Initiated by ARM
@ -1515,6 +1564,7 @@ void SSPMHandleReceivedData(void) {
AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Relay scan done - none found")); AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Relay scan done - none found"));
Sspm->mstate = SPM_NONE; Sspm->mstate = SPM_NONE;
Sspm->error_led_blinks = 255;
} }
SSPMSendSetTime(); SSPMSendSetTime();
@ -1755,6 +1805,8 @@ void SSPMEvery100ms(void) {
// Wait for first acknowledge from ARM after reset // Wait for first acknowledge from ARM after reset
SSPMSendCmnd(SSPM_FUNC_FIND); SSPMSendCmnd(SSPM_FUNC_FIND);
break; break;
/*
// Removed to accomodate v1.2.0 too
case SPM_POLL_ARM_SPI: case SPM_POLL_ARM_SPI:
SSPMSendSPIFind(); SSPMSendSPIFind();
Sspm->mstate = SPM_POLL_ARM_2; Sspm->mstate = SPM_POLL_ARM_2;
@ -1766,6 +1818,7 @@ void SSPMEvery100ms(void) {
case SPM_POLL_ARM_3: case SPM_POLL_ARM_3:
// Wait for second acknowledge from ARM after reset // Wait for second acknowledge from ARM after reset
break; break;
*/
case SPM_SEND_FUNC_UNITS: case SPM_SEND_FUNC_UNITS:
// Get number of units // Get number of units
SSPMSendCmnd(SSPM_FUNC_UNITS); SSPMSendCmnd(SSPM_FUNC_UNITS);