mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-13 13:56:33 +00:00
[MI BLE] added support for alternative version of LYWSD02MMC (#23169)
* [MI BLE] added support for alternative version of LYWSD02MMC * Bumped MI32_VERSION to 0.9.2.5
This commit is contained in:
parent
fbb752d8c2
commit
1ada6da6b8
@ -20,11 +20,13 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#define MI32_VERSION "V0.9.2.4"
|
#define MI32_VERSION "V0.9.2.5"
|
||||||
/*
|
/*
|
||||||
--------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------
|
||||||
Version yyyymmdd Action Description
|
Version yyyymmdd Action Description
|
||||||
--------------------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------------------
|
||||||
|
0.9.2.5 20250319 changed - added support for MI LYWSD02MMC with different device ID
|
||||||
|
|
||||||
0.9.2.4 20240111 changed - Enhancement of debug log output
|
0.9.2.4 20240111 changed - Enhancement of debug log output
|
||||||
-------
|
-------
|
||||||
0.9.2.3 20240101 changed - added initial support for MI LYWSD02MMC
|
0.9.2.3 20240101 changed - added initial support for MI LYWSD02MMC
|
||||||
@ -492,8 +494,9 @@ void (*const MI32_Commands[])(void) PROGMEM = {
|
|||||||
#define AT_BTN 18
|
#define AT_BTN 18
|
||||||
#define MI_SJWS01LM 19
|
#define MI_SJWS01LM 19
|
||||||
#define MI_LYWSD02MMC 20
|
#define MI_LYWSD02MMC 20
|
||||||
|
#define MI_LYWSD02MMC2 21
|
||||||
|
|
||||||
#define MI_MI32_TYPES 20 //count this manually
|
#define MI_MI32_TYPES 21 //count this manually
|
||||||
|
|
||||||
const uint16_t kMI32DeviceID[MI_MI32_TYPES]={
|
const uint16_t kMI32DeviceID[MI_MI32_TYPES]={
|
||||||
0x0000, // Unkown
|
0x0000, // Unkown
|
||||||
@ -515,7 +518,8 @@ const uint16_t kMI32DeviceID[MI_MI32_TYPES]={
|
|||||||
0x066f, // CGDK2
|
0x066f, // CGDK2
|
||||||
0x004e, // Avago Tech Bluetooth Buttons (Company Id)
|
0x004e, // Avago Tech Bluetooth Buttons (Company Id)
|
||||||
0x0863, // SJWS01LM
|
0x0863, // SJWS01LM
|
||||||
0x2542 // LYWSD02MMC
|
0x2542, // LYWSD02MMC
|
||||||
|
0x16e4 // LYWSD02MMC F3_A1 hardware revision, 2.0.1_0060 firmware revision
|
||||||
};
|
};
|
||||||
|
|
||||||
const char kMI32DeviceType0[] PROGMEM = "Unknown";
|
const char kMI32DeviceType0[] PROGMEM = "Unknown";
|
||||||
@ -538,10 +542,11 @@ const char kMI32DeviceType16[] PROGMEM ="CGDK2";
|
|||||||
const char kMI32DeviceType17[] PROGMEM ="ATBTN";
|
const char kMI32DeviceType17[] PROGMEM ="ATBTN";
|
||||||
const char kMI32DeviceType18[] PROGMEM = "SJWS01LM";
|
const char kMI32DeviceType18[] PROGMEM = "SJWS01LM";
|
||||||
const char kMI32DeviceType19[] PROGMEM = "LYWSD02MMC";
|
const char kMI32DeviceType19[] PROGMEM = "LYWSD02MMC";
|
||||||
|
const char kMI32DeviceType20[] PROGMEM = "LYWSD02MMC";
|
||||||
const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType0, kMI32DeviceType1, kMI32DeviceType2, kMI32DeviceType3,
|
const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType0, kMI32DeviceType1, kMI32DeviceType2, kMI32DeviceType3,
|
||||||
kMI32DeviceType4, kMI32DeviceType5, kMI32DeviceType6, kMI32DeviceType7, kMI32DeviceType8, kMI32DeviceType9,
|
kMI32DeviceType4, kMI32DeviceType5, kMI32DeviceType6, kMI32DeviceType7, kMI32DeviceType8, kMI32DeviceType9,
|
||||||
kMI32DeviceType10, kMI32DeviceType11, kMI32DeviceType12, kMI32DeviceType13, kMI32DeviceType14, kMI32DeviceType15,
|
kMI32DeviceType10, kMI32DeviceType11, kMI32DeviceType12, kMI32DeviceType13, kMI32DeviceType14, kMI32DeviceType15,
|
||||||
kMI32DeviceType16, kMI32DeviceType17, kMI32DeviceType18, kMI32DeviceType19};
|
kMI32DeviceType16, kMI32DeviceType17, kMI32DeviceType18, kMI32DeviceType19, kMI32DeviceType20};
|
||||||
|
|
||||||
typedef int BATREAD_FUNCTION(int slot);
|
typedef int BATREAD_FUNCTION(int slot);
|
||||||
typedef int UNITWRITE_FUNCTION(int slot, int unit);
|
typedef int UNITWRITE_FUNCTION(int slot, int unit);
|
||||||
@ -796,6 +801,7 @@ int genericSensorReadFn(int slot, int force){
|
|||||||
res = MI32Operation(slot, OP_READ_HT_LY, LYWSD03_Svc, nullptr, LYWSD03_BattNotifyChar);
|
res = MI32Operation(slot, OP_READ_HT_LY, LYWSD03_Svc, nullptr, LYWSD03_BattNotifyChar);
|
||||||
break;
|
break;
|
||||||
case MI_LYWSD02MMC:
|
case MI_LYWSD02MMC:
|
||||||
|
case MI_LYWSD02MMC2:
|
||||||
res = MI32Operation(slot, OP_READ_HT_LY, LYWSD03_Svc, nullptr, LYWSD03_BattNotifyChar);
|
res = MI32Operation(slot, OP_READ_HT_LY, LYWSD03_Svc, nullptr, LYWSD03_BattNotifyChar);
|
||||||
break;
|
break;
|
||||||
case MI_MHOC401:
|
case MI_MHOC401:
|
||||||
@ -944,6 +950,7 @@ int genericTimeWriteFn(int slot){
|
|||||||
int res = 0;
|
int res = 0;
|
||||||
switch (MIBLEsensors[slot].type){
|
switch (MIBLEsensors[slot].type){
|
||||||
case MI_LYWSD02MMC:
|
case MI_LYWSD02MMC:
|
||||||
|
case MI_LYWSD02MMC2:
|
||||||
case MI_LYWSD02: {
|
case MI_LYWSD02: {
|
||||||
union {
|
union {
|
||||||
uint8_t buf[5];
|
uint8_t buf[5];
|
||||||
@ -2129,6 +2136,21 @@ int MI32parseMiPayload(int _slot, struct mi_beacon_data_t *parsed){
|
|||||||
MIBLEsensors[_slot].shallSendMQTT = 1;
|
MIBLEsensors[_slot].shallSendMQTT = 1;
|
||||||
MIBLEsensors[_slot].feature.Btn = 1;
|
MIBLEsensors[_slot].feature.Btn = 1;
|
||||||
} break;
|
} break;
|
||||||
|
case 0x4c01:{ // 'temperature'
|
||||||
|
const uint32_t payload32 = uint32_t(parsed->payload.data[0]) | (uint32_t(parsed->payload.data[1]) << 8) | (uint32_t(parsed->payload.data[2]) << 16) | (uint32_t(parsed->payload.data[3]) << 24);
|
||||||
|
float _tempFloat;
|
||||||
|
memcpy(&_tempFloat, &payload32, sizeof(_tempFloat));
|
||||||
|
MIBLEsensors[_slot].temp = _tempFloat;
|
||||||
|
MIBLEsensors[_slot].feature.temp = 1;
|
||||||
|
MIBLEsensors[_slot].eventType.temp = 1;
|
||||||
|
} break;
|
||||||
|
case 0x4c02:{ // 'humidity'
|
||||||
|
const uint8_t payload8 = parsed->payload.data[0];
|
||||||
|
float _tempFloat = (float)payload8 / 1.0f;
|
||||||
|
MIBLEsensors[_slot].hum = _tempFloat;
|
||||||
|
MIBLEsensors[_slot].feature.hum = 1;
|
||||||
|
MIBLEsensors[_slot].eventType.hum = 1;
|
||||||
|
} break;
|
||||||
|
|
||||||
//Weight attributes 0x101A 600 0
|
//Weight attributes 0x101A 600 0
|
||||||
//No one moves over time 0x101B 1 1
|
//No one moves over time 0x101B 1 1
|
||||||
@ -2279,7 +2301,7 @@ void MI32notifyHT_LY(int _slot, char *_buf, int len){
|
|||||||
if (BLE_ESP32::BLEDebugMode) AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("M32: %s: LYWSD0x Hum updated %1_f"), MIaddrStr(MIBLEsensors[_slot].MAC), &MIBLEsensors[_slot].hum);
|
if (BLE_ESP32::BLEDebugMode) AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("M32: %s: LYWSD0x Hum updated %1_f"), MIaddrStr(MIBLEsensors[_slot].MAC), &MIBLEsensors[_slot].hum);
|
||||||
}
|
}
|
||||||
MIBLEsensors[_slot].eventType.tempHum = 1;
|
MIBLEsensors[_slot].eventType.tempHum = 1;
|
||||||
if (MIBLEsensors[_slot].type == MI_LYWSD02MMC || MIBLEsensors[_slot].type == MI_LYWSD03MMC || MIBLEsensors[_slot].type == MI_MHOC401){
|
if (MIBLEsensors[_slot].type == MI_LYWSD02MMC || MIBLEsensors[_slot].type == MI_LYWSD02MMC2 || MIBLEsensors[_slot].type == MI_LYWSD03MMC || MIBLEsensors[_slot].type == MI_MHOC401){
|
||||||
// ok, so CR2032 is 3.0v, but drops immediately to ~2.9.
|
// ok, so CR2032 is 3.0v, but drops immediately to ~2.9.
|
||||||
// so we'll go with the 2.1 min, 2.95 max.
|
// so we'll go with the 2.1 min, 2.95 max.
|
||||||
float minVolts = 2100.0;
|
float minVolts = 2100.0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user