v6.0.0c - Add spare SetOptions

6.0.0c
* Add support for bitflags SetOption50 .. SetOption81 (#3118)
This commit is contained in:
Theo Arends 2018-07-03 12:48:56 +02:00
parent d5a08077af
commit c896437124
5 changed files with 113 additions and 64 deletions

View File

@ -15,7 +15,7 @@ If you like **Sonoff-Tasmota**, give it a star, or fork it and contribute!
### Development
[![Build Status](https://img.shields.io/travis/arendst/Sonoff-Tasmota.svg)](https://travis-ci.org/arendst/Sonoff-Tasmota)
Current version is **6.0.0b** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
Current version is **6.0.0c** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/development/sonoff/_releasenotes.ino) for change information.
### Disclaimer
:warning: **DANGER OF ELECTROCUTION** :warning:
@ -123,6 +123,7 @@ Different firmware images are released based on Features and Sensors selection g
| USE_SHT | x | x | - | x | x |
| USE_SHT3X | x | x | - | x | x |
| USE_HTU | x | x | - | x | x |
| USE_LM75AD | x | - | - | x | x |
| USE_BMP | x | x | - | x | x |
| USE_BME680 | - | - | - | - | x |
| USE_SGP30 | x | - | - | x | x |
@ -133,6 +134,7 @@ Different firmware images are released based on Features and Sensors selection g
| USE_ADS1115 | - | - | - | - | x |
| USE_ADS1115_I2CDEV | - | - | - | - | - |
| USE_INA219 | - | - | - | - | x |
| USE_APDS9960 | - | - | - | - | - |
| USE_MGS | - | - | - | - | x |
| USE_SPI | - | - | - | - | - |
| USE_MHZ19 | x | x | - | x | x |
@ -141,7 +143,8 @@ Different firmware images are released based on Features and Sensors selection g
| USE_NOVA_SDS | x | - | - | x | x |
| USE_PZEM004T | x | x | - | x | x |
| USE_SERIAL_BRIDGE | x | - | - | x | x |
| USE_SDM120 | - | - | - | - | x |
| USE_SDM120 | x | - | - | - | x |
| USE_SDM630 | x | - | - | - | x |
| USE_IR_REMOTE | x | x | - | x | x |
| USE_IR_HVAC | - | - | - | - | x |
| USE_IR_RECEIVE | x | - | - | x | x |
@ -149,6 +152,8 @@ Different firmware images are released based on Features and Sensors selection g
| USE_WS2812_DMA | - | - | - | - | - |
| USE_ARILUX_RF | x | x | - | x | x |
| USE_SR04 | x | - | - | x | x |
| USE_TM1638 | - | - | - | - | - |
| USE_RF_FLASH | x | - | - | x | x |
#### Typical File Size

View File

@ -1,4 +1,7 @@
/* 6.0.0b
/* 6.0.0c
* Add support for bitflags SetOption50 .. SetOption81 (#3118)
*
* 6.0.0b
* Add support for BlitzWolf BW-SHP2 (and Homecube, Gosund SP1) Energy Monitoring Smart Socket (#2223)
* Add support for Sonoff iFan02 as module 44 introducing command FanSpeed 0..3 (#2839)
* Add support for Sonoff S26 Smart Socket (#2808)

View File

@ -20,21 +20,21 @@
#ifndef _SETTINGS_H_
#define _SETTINGS_H_
#define PARAM8_SIZE 18 // Number of param bytes
#define PARAM8_SIZE 18 // Number of param bytes (SetOption)
typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull...
uint32_t data; // Allow bit manipulation using SetOption
struct {
struct { // SetOption0 .. SetOption31
uint32_t save_state : 1; // bit 0
uint32_t button_restrict : 1; // bit 1
uint32_t value_units : 1; // bit 2
uint32_t mqtt_enabled : 1; // bit 3
uint32_t mqtt_response : 1; // bit 4
uint32_t mqtt_power_retain : 1;
uint32_t mqtt_button_retain : 1;
uint32_t mqtt_switch_retain : 1;
uint32_t mqtt_power_retain : 1; // CMND_POWERRETAIN
uint32_t mqtt_button_retain : 1; // CMND_BUTTONRETAIN
uint32_t mqtt_switch_retain : 1; // CMND_SWITCHRETAIN
uint32_t temperature_conversion : 1; // bit 8
uint32_t mqtt_sensor_retain : 1;
uint32_t mqtt_sensor_retain : 1; // CMND_SENSORRETAIN
uint32_t mqtt_offline : 1; // bit 10
uint32_t button_swap : 1; // bit 11 (v5.1.6)
uint32_t stop_flash_rotate : 1; // bit 12 (v5.2.0)
@ -60,8 +60,46 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
};
} SysBitfield;
typedef union {
typedef union { // Restricted by MISRA-C Rule 18.4 but so usefull...
uint32_t data; // Allow bit manipulation using SetOption
struct { // SetOption50 .. SetOption81
uint32_t spare00 : 1;
uint32_t spare01 : 1;
uint32_t spare02 : 1;
uint32_t spare03 : 1;
uint32_t spare04 : 1;
uint32_t spare05 : 1;
uint32_t spare06 : 1;
uint32_t spare07 : 1;
uint32_t spare08 : 1;
uint32_t spare09 : 1;
uint32_t spare10 : 1;
uint32_t spare11 : 1;
uint32_t spare12 : 1;
uint32_t spare13 : 1;
uint32_t spare14 : 1;
uint32_t spare15 : 1;
uint32_t spare16 : 1;
uint32_t spare17 : 1;
uint32_t spare18 : 1;
uint32_t spare19 : 1;
uint32_t spare20 : 1;
uint32_t spare21 : 1;
uint32_t spare22 : 1;
uint32_t spare23 : 1;
uint32_t spare24 : 1;
uint32_t spare25 : 1;
uint32_t spare26 : 1;
uint32_t spare27 : 1;
uint32_t spare28 : 1;
uint32_t spare29 : 1;
uint32_t spare30 : 1;
uint32_t spare31 : 1;
};
} SysBitfield3;
typedef union {
uint32_t data; // Allow bit manipulation
struct {
uint32_t spare00 : 1;
uint32_t spare01 : 1;
@ -192,7 +230,7 @@ struct SYSCFG {
byte free_2fa[1]; // 2FA
uint8_t ledstate; // 2FB
uint8_t param[PARAM8_SIZE]; // 2FC
uint8_t param[PARAM8_SIZE]; // 2FC SetOption32 .. SetOption49
int16_t toffset[2]; // 30E
byte free_312[1]; // 312
@ -229,9 +267,7 @@ struct SYSCFG {
uint16_t blinktime; // 39A
uint16_t blinkcount; // 39C
uint16_t light_rotation; // 39E
byte free_3A0[4]; // 3A0
SysBitfield3 flag3; // 3A0
uint8_t switchmode[MAX_SWITCHES]; // 3A4 (6.0.0b - moved from 0x4CA)
char friendlyname[MAX_FRIENDLYNAMES][33]; // 3AC
char switch_topic[33]; // 430

View File

@ -777,6 +777,11 @@ void SettingsDelta()
}
}
}
if (Settings.version < 0x06000003) {
Settings.flag.rules_enabled = 0;
Settings.flag.rules_once = 0;
Settings.flag3.data = 0;
}
Settings.version = VERSION;
SettingsSave(1);

View File

@ -25,7 +25,7 @@
- Select IDE Tools - Flash Size: "1M (no SPIFFS)"
====================================================*/
#define VERSION 0x06000002 // 6.0.0b
#define VERSION 0x06000003 // 6.0.0c
// Location specific includes
#include <core_version.h> // Arduino_Esp8266 version information (ARDUINO_ESP8266_RELEASE and ARDUINO_ESP8266_RELEASE_2_3_0)
@ -402,7 +402,6 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
char stemp1[TOPSZ];
char *p;
char *type = NULL;
byte ptype = 0;
byte jsflg = 0;
byte lines = 1;
uint8_t grpflg = 0;
@ -602,75 +601,76 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
XsnsCall(FUNC_COMMAND);
// if (!XsnsCall(FUNC_COMMAND)) type = NULL;
}
else if ((CMND_SETOPTION == command_code) && (index <= P_MAX_PARAM8 + 31)) {
if (index <= 31) {
ptype = 0; // SetOption0 .. 31
} else {
ptype = 1; // SetOption32 ..
index = index -32;
else if ((CMND_SETOPTION == command_code) && (index < 82)) {
byte ptype;
byte pindex;
if (index <= 31) { // SetOption0 .. 31 = Settings.flag
ptype = 0;
pindex = index; // 0 .. 31
}
else if (index <= 49) { // SetOption32 .. 49 = Settings.param
ptype = 2;
pindex = index -32; // 0 .. 17 (= PARAM8_SIZE -1)
}
else { // SetOption50 .. 81 = Settings.flag3
ptype = 1;
pindex = index -50; // 0 .. 31
}
if (payload >= 0) {
if (0 == ptype) { // SetOption0 .. 31
if (0 == ptype) { // SetOption0 .. 31
if (payload <= 1) {
switch (index) {
case 3: // mqtt
case 15: // pwm_control
switch (pindex) {
case 5: // mqtt_power_retain (CMND_POWERRETAIN)
case 6: // mqtt_button_retain (CMND_BUTTONRETAIN)
case 7: // mqtt_switch_retain (CMND_SWITCHRETAIN)
case 9: // mqtt_sensor_retain (CMND_SENSORRETAIN)
case 22: // mqtt_serial (SerialSend and SerialLog)
ptype = 99; // Command Error
break; // Ignore command SetOption
case 3: // mqtt
case 15: // pwm_control
restart_flag = 2;
case 0: // save_state
case 1: // button_restrict
case 2: // value_units
case 4: // mqtt_response
case 8: // temperature_conversion
case 10: // mqtt_offline
case 11: // button_swap
case 12: // stop_flash_rotate
case 13: // button_single
case 14: // interlock
case 16: // ws_clock_reverse
case 17: // decimal_text
case 18: // light_signal
case 19: // hass_discovery
case 20: // not_power_linked
case 21: // no_power_on_check
// case 22: // mqtt_serial - use commands SerialSend and SerialLog
// case 23: // rules_enabled - use command Rule
// case 24: // rules_once
// case 25: // knx_enabled
case 26: // device_index_enable
// case 27: // knx_enable_enhancement
case 28: // rf_receive_decimal
case 29: // ir_receive_decimal
case 30: // hass_light
bitWrite(Settings.flag.data, index, payload);
default:
bitWrite(Settings.flag.data, pindex, payload);
}
if (12 == index) { // stop_flash_rotate
if (12 == pindex) { // stop_flash_rotate
stop_flash_rotate = payload;
SettingsSave(2);
}
#ifdef USE_HOME_ASSISTANT
if ((19 == index) || (30 == index)) { // hass_discovery or hass_light
HAssDiscovery(1);
if ((19 == pindex) || (30 == pindex)) {
HAssDiscovery(1); // hass_discovery or hass_light
}
#endif // USE_HOME_ASSISTANT
}
}
else { // SetOption32 ..
switch (index) {
else if (1 == ptype) { // SetOption50 .. 81
if (payload <= 1) {
bitWrite(Settings.flag3.data, pindex, payload);
}
}
else { // SetOption32 .. 49
/*
switch (pindex) {
case P_HOLD_TIME:
if ((payload >= 1) && (payload <= 250)) {
Settings.param[P_HOLD_TIME] = payload;
}
break;
case P_MAX_POWER_RETRY:
if ((payload >= 1) && (payload <= 250)) {
Settings.param[P_MAX_POWER_RETRY] = payload;
Settings.param[pindex] = payload;
}
break;
default:
ptype = 99; // Command Error
}
*/
if ((payload >= 1) && (payload <= 250)) {
Settings.param[pindex] = payload;
}
}
}
if (ptype) snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), Settings.param[index]);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, (ptype) ? index +32 : index, (ptype) ? stemp1 : GetStateText(bitRead(Settings.flag.data, index)));
if (ptype < 99) {
if (2 == ptype) snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), Settings.param[pindex]);
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, index, (2 == ptype) ? stemp1 : (1 == ptype) ? GetStateText(bitRead(Settings.flag3.data, pindex)) : GetStateText(bitRead(Settings.flag.data, pindex)));
}
}
else if (CMND_TEMPERATURE_RESOLUTION == command_code) {
if ((payload >= 0) && (payload <= 3)) {