mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 19:26:37 +00:00
more error catching and reporting
This commit is contained in:
parent
8a7fa3e03c
commit
dbd1fcf10c
@ -226,7 +226,6 @@ struct mi_sensor_t{
|
|||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint32_t needsKey:1;
|
uint32_t needsKey:1;
|
||||||
uint32_t hasWrongKey:1;
|
|
||||||
uint32_t temp:1;
|
uint32_t temp:1;
|
||||||
uint32_t hum:1;
|
uint32_t hum:1;
|
||||||
uint32_t tempHum:1; //every hum sensor has temp too, easier to use Tasmota dew point functions
|
uint32_t tempHum:1; //every hum sensor has temp too, easier to use Tasmota dew point functions
|
||||||
@ -260,6 +259,13 @@ struct mi_sensor_t{
|
|||||||
};
|
};
|
||||||
uint32_t raw;
|
uint32_t raw;
|
||||||
} eventType;
|
} eventType;
|
||||||
|
union{
|
||||||
|
struct{
|
||||||
|
uint8_t hasWrongKey:1;
|
||||||
|
uint8_t isUnbounded:1;
|
||||||
|
};
|
||||||
|
uint8_t raw;
|
||||||
|
} status;
|
||||||
|
|
||||||
int RSSI;
|
int RSSI;
|
||||||
uint32_t lastTime;
|
uint32_t lastTime;
|
||||||
|
@ -255,7 +255,7 @@ void MI32AddKey(mi_bindKey_t keyMAC){
|
|||||||
memcpy(_key,keyMAC.key,16);
|
memcpy(_key,keyMAC.key,16);
|
||||||
_sensor.key = _key;
|
_sensor.key = _key;
|
||||||
unknownMAC=false;
|
unknownMAC=false;
|
||||||
_sensor.feature.hasWrongKey = 0;
|
_sensor.status.hasWrongKey = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(unknownMAC){
|
if(unknownMAC){
|
||||||
@ -282,7 +282,6 @@ int MI32_decryptPacket(char * _buf, uint16_t _bufSize, uint8_t * _payload, uint3
|
|||||||
uint8_t tag[4] = {0};
|
uint8_t tag[4] = {0};
|
||||||
const unsigned char authData[1] = {0x11};
|
const unsigned char authData[1] = {0x11};
|
||||||
size_t dataLen = _bufSize - 11 ; // _bufsize - frame - type - frame.counter - MAC
|
size_t dataLen = _bufSize - 11 ; // _bufsize - frame - type - frame.counter - MAC
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if(MIBLEsensors[_slot].key == nullptr){
|
if(MIBLEsensors[_slot].key == nullptr){
|
||||||
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: No Key found !!"));
|
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: No Key found !!"));
|
||||||
@ -355,11 +354,11 @@ int MI32_decryptPacket(char * _buf, uint16_t _bufSize, uint8_t * _payload, uint3
|
|||||||
br_ccm_flip(&ctx);
|
br_ccm_flip(&ctx);
|
||||||
br_ccm_run(&ctx, 0, _payload, dataLen);
|
br_ccm_run(&ctx, 0, _payload, dataLen);
|
||||||
|
|
||||||
ret = br_ccm_check_tag(&ctx, &tag);
|
if(br_ccm_check_tag(&ctx, &tag)) return 0;
|
||||||
|
|
||||||
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: decrypted in %.2f mSec"),enctime);
|
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: decrypted in %.2f mSec"),enctime);
|
||||||
// AddLogBuffer(LOG_LEVEL_DEBUG,(uint8_t*) _payload, dataLen);
|
// AddLogBuffer(LOG_LEVEL_DEBUG,(uint8_t*) _payload, dataLen);
|
||||||
return ret;
|
return -1; // wrong key ... maybe corrupt data packet too
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
@ -412,6 +411,7 @@ uint32_t MIBLEgetSensorSlot(uint8_t (&_MAC)[6], uint16_t _type, uint8_t counter)
|
|||||||
_newSensor.type = _type;
|
_newSensor.type = _type;
|
||||||
_newSensor.eventType.raw = 0;
|
_newSensor.eventType.raw = 0;
|
||||||
_newSensor.feature.raw = 0;
|
_newSensor.feature.raw = 0;
|
||||||
|
_newSensor.status.raw = 0;
|
||||||
_newSensor.temp = NAN;
|
_newSensor.temp = NAN;
|
||||||
_newSensor.temp_history = (uint8_t*) calloc(24,1);
|
_newSensor.temp_history = (uint8_t*) calloc(24,1);
|
||||||
_newSensor.bat=0x00;
|
_newSensor.bat=0x00;
|
||||||
@ -498,12 +498,6 @@ uint32_t MIBLEgetSensorSlot(uint8_t (&_MAC)[6], uint16_t _type, uint8_t counter)
|
|||||||
#endif //USE_MI_HOMEKIT
|
#endif //USE_MI_HOMEKIT
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (_type){
|
|
||||||
case LYWSD03MMC: case MHOC401: case MJYD2S: case MCCGQ02: case SJWS01L: case YLKG08:
|
|
||||||
_newSensor.feature.needsKey = 1;
|
|
||||||
default:
|
|
||||||
_newSensor.feature.needsKey = 0;
|
|
||||||
}
|
|
||||||
MIBLEsensors.push_back(_newSensor);
|
MIBLEsensors.push_back(_newSensor);
|
||||||
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: new %s at slot: %u"),kMI32DeviceType[_type-1],MIBLEsensors.size()-1);
|
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: new %s at slot: %u"),kMI32DeviceType[_type-1],MIBLEsensors.size()-1);
|
||||||
MI32.mode.shallShowStatusInfo = 1;
|
MI32.mode.shallShowStatusInfo = 1;
|
||||||
@ -1199,12 +1193,15 @@ void MI32parseMiBeacon(char * _buf, uint32_t _slot, uint16_t _bufSize){
|
|||||||
bitSet(MI32.widgetSlot,_slot);
|
bitSet(MI32.widgetSlot,_slot);
|
||||||
#endif //USE_MI_EXT_GUI
|
#endif //USE_MI_EXT_GUI
|
||||||
if(_beacon->frame.includesObj == 0){
|
if(_beacon->frame.includesObj == 0){
|
||||||
|
if(_beacon->capability == 0x28) MIBLEsensors[_slot].status.isUnbounded = 1;
|
||||||
return; //nothing to parse
|
return; //nothing to parse
|
||||||
}
|
}
|
||||||
|
|
||||||
int decryptRet = 0;
|
int decryptRet = 0;
|
||||||
if(_beacon->frame.isEncrypted){
|
if(_beacon->frame.isEncrypted){
|
||||||
|
MIBLEsensors[_slot].feature.needsKey = 1;
|
||||||
decryptRet = MI32_decryptPacket(_buf,_bufSize, (uint8_t*)&_payload,_slot);
|
decryptRet = MI32_decryptPacket(_buf,_bufSize, (uint8_t*)&_payload,_slot);
|
||||||
|
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: decryptRet: %d"),decryptRet);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
uint32_t _offset = (_beacon->frame.includesCapability)?0:1;
|
uint32_t _offset = (_beacon->frame.includesCapability)?0:1;
|
||||||
@ -1215,17 +1212,11 @@ else{
|
|||||||
// AddLogBuffer(LOG_LEVEL_DEBUG,(uint8_t*)&_payload,_payloadSize + 3);
|
// AddLogBuffer(LOG_LEVEL_DEBUG,(uint8_t*)&_payload,_payloadSize + 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(decryptRet<0){
|
if(decryptRet!=0){
|
||||||
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: Decryption failed with error: %d"),decryptRet);
|
AddLog(LOG_LEVEL_DEBUG,PSTR("M32: Decryption failed with error: %d"),decryptRet);
|
||||||
MIBLEsensors[_slot].feature.hasWrongKey = 1;
|
if (decryptRet == -1) MIBLEsensors[_slot].status.hasWrongKey = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if (_beacon->frame.solicited){
|
|
||||||
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: sensor unbonded: %s"),kMI32DeviceType[MIBLEsensors[_slot].type-1]);
|
|
||||||
// }
|
|
||||||
// if (_beacon->frame.registered){
|
|
||||||
// AddLog(LOG_LEVEL_DEBUG,PSTR("M32: registered: %s"),kMI32DeviceType[MIBLEsensors[_slot].type-1]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// AddLog(LOG_LEVEL_DEBUG,PSTR("%s at slot %u with payload type: %02x"), kMI32DeviceType[MIBLEsensors[_slot].type-1],_slot,_payload.type);
|
// AddLog(LOG_LEVEL_DEBUG,PSTR("%s at slot %u with payload type: %02x"), kMI32DeviceType[MIBLEsensors[_slot].type-1],_slot,_payload.type);
|
||||||
MIBLEsensors[_slot].lastTime = millis();
|
MIBLEsensors[_slot].lastTime = millis();
|
||||||
@ -1722,18 +1713,30 @@ void MI32sendWidget(uint32_t slot){
|
|||||||
_opacity=0;
|
_opacity=0;
|
||||||
}
|
}
|
||||||
char _key[33] ={0};
|
char _key[33] ={0};
|
||||||
if(_sensor.feature.needsKey){
|
|
||||||
snprintf_P(_key,32,PSTR("!! needs key!!"));
|
|
||||||
_opacity=0;
|
|
||||||
}
|
|
||||||
if(_sensor.key!=nullptr){
|
if(_sensor.key!=nullptr){
|
||||||
ToHex_P(_sensor.key,16,_key,33);
|
ToHex_P(_sensor.key,16,_key,33);
|
||||||
}
|
}
|
||||||
|
else if(_sensor.feature.needsKey == 1){
|
||||||
|
snprintf_P(_key,32,PSTR("!! needs key !!"));
|
||||||
|
_opacity=0;
|
||||||
|
}
|
||||||
|
if (_sensor.status.hasWrongKey == 1){
|
||||||
|
snprintf_P(_key,32,PSTR("!! wrong key !!"));
|
||||||
|
_opacity=0;
|
||||||
|
}
|
||||||
|
if (_sensor.status.isUnbounded == 1){
|
||||||
|
if(_sensor.type != CGD1){ //only exception atm
|
||||||
|
snprintf_P(_key,32,PSTR("!! not paired !!"));
|
||||||
|
_opacity=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char _bat[24];
|
char _bat[24];
|
||||||
snprintf_P(_bat,24,PSTR("🔋%u%%"), _sensor.bat);
|
snprintf_P(_bat,24,PSTR("🔋%u%%"), _sensor.bat);
|
||||||
if(!_sensor.feature.bat) _bat[0] = 0;
|
if(!_sensor.feature.bat) _bat[0] = 0;
|
||||||
if (_sensor.bat == 0) _bat[9] = 0;
|
if (_sensor.bat == 0) _bat[9] = 0;
|
||||||
WSContentSend_P(HTTP_MI32_WIDGET,slot+1,_opacity,_MAC,_sensor.RSSI,_bat,_key,kMI32DeviceType[_sensor.type-1]);
|
WSContentSend_P(HTTP_MI32_WIDGET,slot+1,_opacity,_MAC,_sensor.RSSI,_bat,_key,kMI32DeviceType[_sensor.type-1]);
|
||||||
|
|
||||||
if(_sensor.feature.tempHum){
|
if(_sensor.feature.tempHum){
|
||||||
if(!isnan(_sensor.temp)){
|
if(!isnan(_sensor.temp)){
|
||||||
char _polyline[176];
|
char _polyline[176];
|
||||||
@ -1752,7 +1755,6 @@ void MI32sendWidget(uint32_t slot){
|
|||||||
if(!isnan(_sensor.temp) && !isnan(_sensor.hum)){
|
if(!isnan(_sensor.temp) && !isnan(_sensor.hum)){
|
||||||
WSContentSend_P(PSTR("" D_JSON_DEWPOINT ": %.1f °C"),CalcTempHumToDew(_sensor.temp,_sensor.hum));
|
WSContentSend_P(PSTR("" D_JSON_DEWPOINT ": %.1f °C"),CalcTempHumToDew(_sensor.temp,_sensor.hum));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(_sensor.feature.temp){
|
else if(_sensor.feature.temp){
|
||||||
if(!isnan(_sensor.temp)){
|
if(!isnan(_sensor.temp)){
|
||||||
@ -2112,7 +2114,7 @@ void MI32Show(bool json)
|
|||||||
if(MIBLEsensors[i].key == nullptr){
|
if(MIBLEsensors[i].key == nullptr){
|
||||||
WSContentSend_PD(PSTR("{s}No known Key!!{m} can not decrypt messages{e}"));
|
WSContentSend_PD(PSTR("{s}No known Key!!{m} can not decrypt messages{e}"));
|
||||||
}
|
}
|
||||||
else if(MIBLEsensors[i].feature.hasWrongKey){
|
else if(MIBLEsensors[i].status.hasWrongKey){
|
||||||
WSContentSend_PD(PSTR("{s}Wrong Key!!{m} can not decrypt messages{e}"));
|
WSContentSend_PD(PSTR("{s}Wrong Key!!{m} can not decrypt messages{e}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user