Add support for SJWS01LM BLE flooding sensor (#20288)

This commit is contained in:
lis0r 2023-12-22 14:31:14 +00:00 committed by GitHub
parent 5988e77f8c
commit 4ac93a4d1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 37 additions and 3 deletions

View File

@ -376,6 +376,7 @@ struct mi_sensor_t{
uint32_t light:1; // binary light sensor
uint32_t scale:1;
uint32_t impedance:1;
uint32_t flooding:1;
};
uint32_t raw;
} feature;
@ -395,6 +396,7 @@ struct mi_sensor_t{
uint32_t PairBtn:1;
uint32_t light:1; // binary light sensor
uint32_t scale:1;
uint32_t flooding:1;
};
uint32_t raw;
} eventType;
@ -403,6 +405,7 @@ struct mi_sensor_t{
uint8_t pairing;
int8_t light; // binary light sensor - initialise to -1
int16_t Btn; // moved so we can initialise to -1
int16_t flooding;
uint32_t lastTime;
uint32_t lux;
@ -486,8 +489,9 @@ void (*const MI32_Commands[])(void) PROGMEM = {
#define MI_SCALE_V2 16
#define MI_CGDK2 17
#define AT_BTN 18
#define MI_SJWS01LM 19
#define MI_MI32_TYPES 18 //count this manually
#define MI_MI32_TYPES 19 //count this manually
const uint16_t kMI32DeviceID[MI_MI32_TYPES]={
0x0000, // Unkown
@ -507,7 +511,8 @@ const uint16_t kMI32DeviceID[MI_MI32_TYPES]={
0x181d, // Mi Scale V1
0x181b, // Mi Scale V2
0x066f, // CGDK2
0x004e // Avago Tech Bluetooth Buttons (Company Id)
0x004e, // Avago Tech Bluetooth Buttons (Company Id)
0x0863 // SJWS01LM
};
const char kMI32DeviceType0[] PROGMEM = "Unknown";
@ -528,7 +533,8 @@ const char kMI32DeviceType14[] PROGMEM ="MISCALEV1";
const char kMI32DeviceType15[] PROGMEM ="MISCALEV2";
const char kMI32DeviceType16[] PROGMEM ="CGDK2";
const char kMI32DeviceType17[] PROGMEM ="ATBTN";
const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType0,kMI32DeviceType1,kMI32DeviceType2,kMI32DeviceType3,kMI32DeviceType4,kMI32DeviceType5,kMI32DeviceType6,kMI32DeviceType7,kMI32DeviceType8,kMI32DeviceType9,kMI32DeviceType10,kMI32DeviceType11,kMI32DeviceType12,kMI32DeviceType13,kMI32DeviceType14,kMI32DeviceType15,kMI32DeviceType16,kMI32DeviceType17};
const char kMI32DeviceType18[] PROGMEM = "SJWS01LM";
const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType0,kMI32DeviceType1,kMI32DeviceType2,kMI32DeviceType3,kMI32DeviceType4,kMI32DeviceType5,kMI32DeviceType6,kMI32DeviceType7,kMI32DeviceType8,kMI32DeviceType9,kMI32DeviceType10,kMI32DeviceType11,kMI32DeviceType12,kMI32DeviceType13,kMI32DeviceType14,kMI32DeviceType15,kMI32DeviceType16,kMI32DeviceType17,kMI32DeviceType18};
typedef int BATREAD_FUNCTION(int slot);
typedef int UNITWRITE_FUNCTION(int slot, int unit);
@ -1539,6 +1545,7 @@ uint32_t MIBLEgetSensorSlot(const uint8_t *mac, uint16_t _type, uint8_t counter,
_newSensor.lux = 0x00ffffff;
_newSensor.light = -1;
_newSensor.Btn = -1;
_newSensor.flooding = -1;
_newSensor.lastCnt = counter;
switch (_type)
{
@ -1586,6 +1593,11 @@ uint32_t MIBLEgetSensorSlot(const uint8_t *mac, uint16_t _type, uint8_t counter,
_newSensor.feature.Btn=1;
_newSensor.needkey = KEY_NOT_REQUIRED;
break;
case MI_SJWS01LM:
_newSensor.feature.flooding = 1;
_newSensor.feature.Btn = 1;
_newSensor.feature.bat = 1;
break;
default:
_newSensor.hum=NAN;
@ -2104,6 +2116,14 @@ int MI32parseMiPayload(int _slot, struct mi_beacon_data_t *parsed){
res = 0;
} break;
//Flooding 0x1014 1 1
case 0x1014:{ //'Flooding sensor' - 0=dry, 1=wet SJWS01LM
MIBLEsensors[_slot].flooding = (uint8_t)parsed->payload.data[0]; // just an 8 bit value in a union.
MIBLEsensors[_slot].eventType.flooding = 1;
MI32.mode.shallTriggerTele = 1;
MIBLEsensors[_slot].shallSendMQTT = 1;
MIBLEsensors[_slot].feature.flooding = 1;
}
break;
//smoke 0x1015 1 1
//Gas 0x1016
case 0x1017:{ // 'No one moves'
@ -2752,6 +2772,7 @@ const char HTTP_MISCALE_WEIGHT_REMOVED[] PROGMEM = "{s}%s" " Weight removed" "{m
const char HTTP_MISCALE_WEIGHT_STABILIZED[] PROGMEM = "{s}%s" " Weight stabilized" "{m}%s{e}";
const char HTTP_MISCALE_IMPEDANCE[] PROGMEM = "{s}%s" " Impedance" "{m}%u{e}";
const char HTTP_MISCALE_IMPEDANCE_STABILIZED[] PROGMEM = "{s}%s" " Impedance stabilized" "{m}%s{e}";
const char HTTP_SJWS01LM_FLOODING[] PROGMEM = "{s}%s Flooding{m}%u {e}";
//const char HTTP_NEEDKEY[] PROGMEM = "{s}%s <a target=\"_blank\" href=\""
// "https://atc1441.github.io/TelinkFlasher.html?mac=%s&cb=http%%3A%%2F%%2F%s%%2Fmikey"
@ -2985,6 +3006,15 @@ void MI32GetOneSensorJson(int slot, int hidename){
ResponseAppend_P(PSTR(",\"Btn\":%d"),p->Btn);
}
}
if (p->feature.flooding){
if(p->eventType.flooding || !MI32.mode.triggeredTele || MI32.option.allwaysAggregate
#ifdef USE_HOME_ASSISTANT
||(hass_mode==2)
#endif //USE_HOME_ASSISTANT
){
ResponseAppend_P(PSTR(",\"Flooding\":%d"),p->flooding);
}
}
if(p->eventType.PairBtn && p->pairing){
ResponseAppend_P(PSTR(",\"Pair\":%u"),p->pairing);
}
@ -3648,6 +3678,10 @@ void MI32Show(bool json)
if (p->feature.Btn){
WSContentSend_PD(HTTP_LASTBUTTON, typeName, p->Btn);
}
if (p->feature.flooding)
{
WSContentSend_PD(HTTP_SJWS01LM_FLOODING, typeName, p->flooding);
}
if (p->pairing){
WSContentSend_PD(HTTP_PAIRING, typeName);
}