mirror of https://github.com/arendst/Tasmota.git
Merge pull request #9551 from Staars/nrf24
MI_NRF24: fix payload error, adaptions for HASS
This commit is contained in:
commit
9ab50db8ef
|
@ -20,6 +20,8 @@
|
|||
--------------------------------------------------------------------------------------------
|
||||
Version yyyymmdd Action Description
|
||||
--------------------------------------------------------------------------------------------
|
||||
0.9.8.2 20201015 integrate - adaptions for HASS, fix some payload glitches
|
||||
---
|
||||
0.9.8.1 20200918 integrate - add MHOC303, ATC-custom FW, allow lower case commands
|
||||
---
|
||||
0.9.8.0 20200705 integrate - add YEE-RC, NLIGHT and MJYD2S, add NRFUSE
|
||||
|
@ -39,7 +41,7 @@
|
|||
0.9.3.0 20200222 integrate - use now the correct id-word instead of MAC-OUI,
|
||||
add CGG1
|
||||
---
|
||||
0.9.2.0 20200212 integrate - "backports" from MI-HM10, change reading pattern,
|
||||
0.9.2.0 20200212 integrate - "backports" from MI-MINRF, change reading pattern,
|
||||
add missing PDU-types, renaming driver
|
||||
---
|
||||
0.9.1.0 20200117 integrate - Added support for the LYWSD02
|
||||
|
@ -281,37 +283,91 @@ struct {
|
|||
uint32_t PDU[3];
|
||||
bool active = false;
|
||||
} beacon;
|
||||
bool activeScan = false;
|
||||
bool stopScan = false;
|
||||
bool triggeredTELE = false;
|
||||
|
||||
struct {
|
||||
uint32_t allwaysAggregate:1; // always show all known values of one sensor in brdigemode
|
||||
// uint32_t ignoreBogusBattery:1;
|
||||
uint32_t noSummary:1; // no sensor values at TELE-period
|
||||
uint32_t minimalSummary:1; // DEPRECATED!!
|
||||
uint32_t directBridgeMode:1; // send every received BLE-packet as a MQTT-message in real-time
|
||||
} option;
|
||||
|
||||
struct {
|
||||
uint32_t shallTriggerTele:1;
|
||||
uint32_t triggeredTele:1;
|
||||
uint32_t activeScan:1;
|
||||
uint32_t stopScan:1;
|
||||
// uint32_t stopScan:1;
|
||||
} mode;
|
||||
|
||||
// bool activeScan = false;
|
||||
// bool stopScan = false;
|
||||
// bool triggeredTELE = false;
|
||||
|
||||
#ifdef DEBUG_TASMOTA_SENSOR
|
||||
uint8_t streamBuffer[sizeof(buffer)]; // raw data stream bytes
|
||||
uint8_t lsfrBuffer[sizeof(buffer)]; // correpsonding lfsr-bytes for the buffer, probably only useful for a BLE-packet
|
||||
uint8_t lsfrBuffer[sizeof(buffer)]; // corresponding lfsr-bytes for the buffer, probably only useful for a BLE-packet
|
||||
#endif // DEBUG_TASMOTA_SENSOR
|
||||
|
||||
} MINRF;
|
||||
|
||||
struct mi_sensor_t{
|
||||
uint8_t type; //Flora = 1; MJ_HT_V1=2; LYWSD02=3; LYWSD03=4; CGG1=5; CGD1=6; YEERC=9
|
||||
uint8_t MAC[6];
|
||||
uint8_t lastCnt; //device generated counter of the packet
|
||||
uint8_t shallSendMQTT;
|
||||
uint8_t showedUp;
|
||||
uint8_t MAC[6];
|
||||
|
||||
union {
|
||||
struct {
|
||||
uint32_t temp:1;
|
||||
uint32_t hum:1;
|
||||
uint32_t tempHum:1; //every hum sensor has temp too, easier to use Tasmota dew point functions
|
||||
uint32_t lux:1;
|
||||
uint32_t moist:1;
|
||||
uint32_t fert:1;
|
||||
uint32_t bat:1;
|
||||
uint32_t NMT:1;
|
||||
uint32_t PIR:1;
|
||||
uint32_t Btn:1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} feature;
|
||||
union {
|
||||
struct {
|
||||
uint32_t temp:1;
|
||||
uint32_t hum:1;
|
||||
uint32_t tempHum:1; //can be combined from the sensor
|
||||
uint32_t lux:1;
|
||||
uint32_t moist:1;
|
||||
uint32_t fert:1;
|
||||
uint32_t bat:1;
|
||||
uint32_t NMT:1;
|
||||
uint32_t motion:1;
|
||||
uint32_t noMotion:1;
|
||||
uint32_t Btn:1;
|
||||
};
|
||||
uint32_t raw;
|
||||
} eventType;
|
||||
|
||||
uint32_t lastTime;
|
||||
uint32_t lux;
|
||||
float temp; //Flora, MJ_HT_V1, LYWSD0x, CGx
|
||||
union {
|
||||
struct {
|
||||
float moisture;
|
||||
float fertility;
|
||||
uint32_t lux;
|
||||
uint8_t moisture;
|
||||
uint16_t fertility;
|
||||
}; // Flora
|
||||
struct {
|
||||
float hum;
|
||||
uint8_t bat;
|
||||
}; // MJ_HT_V1, LYWSD0x, CGx
|
||||
}; // MJ_HT_V1, LYWSD0x
|
||||
struct {
|
||||
uint8_t btn;
|
||||
uint8_t shallSendMQTT;
|
||||
uint8_t lastCnt;
|
||||
}; // yee-rc
|
||||
uint16_t events; //"alarms" since boot
|
||||
uint32_t NMT; // no motion time in seconds for the MJYD2S
|
||||
};
|
||||
uint16_t Btn;
|
||||
};
|
||||
union {
|
||||
uint8_t bat; // many values seem to be hard-coded garbage (LYWSD0x, GCD1)
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -329,7 +385,6 @@ struct mi_light_t{
|
|||
uint32_t lastTime;
|
||||
uint8_t lux; //1 or 64 for the MJYD2S
|
||||
uint8_t eventType; //internal type of actual event for the MJYD2S
|
||||
|
||||
};
|
||||
|
||||
struct scan_entry_t {
|
||||
|
@ -354,6 +409,18 @@ static union{
|
|||
|
||||
/********************************************************************************************/
|
||||
|
||||
void MINRFinit(void){
|
||||
MINRFinitBLE(1);
|
||||
|
||||
MINRF.option.allwaysAggregate = 1;
|
||||
// MINRF.option.ignoreBogusBattery = 1; // from advertisements
|
||||
MINRF.option.noSummary = 0;
|
||||
MINRF.option.minimalSummary = 0;
|
||||
MINRF.option.directBridgeMode = 0;
|
||||
}
|
||||
|
||||
/********************************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
|
@ -525,8 +592,8 @@ bool MINRFhandleBeacon(scan_entry_t * entry, uint32_t offset);
|
|||
*
|
||||
*/
|
||||
void MINRFhandleScan(void){
|
||||
if(MINRFscanResult.size()>20 || MINRF.stopScan) {
|
||||
MINRF.activeScan=false;
|
||||
if(MINRFscanResult.size()>20 || MINRF.mode.stopScan) {
|
||||
MINRF.mode.activeScan=false;
|
||||
MINRFcomputefirstUsedPacketMode();
|
||||
uint32_t i = 0; // pass counter as reference to lambda
|
||||
MINRFscanResult.erase(std::remove_if(MINRFscanResult.begin(),
|
||||
|
@ -537,7 +604,7 @@ void MINRFhandleScan(void){
|
|||
return ((e.showedUp < 3));
|
||||
}),
|
||||
MINRFscanResult.end());
|
||||
MINRF.stopScan=false;
|
||||
MINRF.mode.stopScan=false;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1013,19 +1080,43 @@ uint32_t MINRFgetSensorSlot(uint8_t (&_MAC)[6], uint16_t _type){
|
|||
memcpy(_newSensor.MAC,_MAC, sizeof(_MAC));
|
||||
_newSensor.type = _type;
|
||||
_newSensor.showedUp = 1;
|
||||
_newSensor.eventType.raw = 0;
|
||||
_newSensor.feature.raw = 0;
|
||||
_newSensor.temp =NAN;
|
||||
switch (_type)
|
||||
{
|
||||
case 1:
|
||||
_newSensor.moisture =NAN;
|
||||
_newSensor.fertility =NAN;
|
||||
_newSensor.lux = 0xffffffff;
|
||||
_newSensor.bat=0x00;
|
||||
_newSensor.lux = 0x00ffffff;
|
||||
switch (_type){
|
||||
case FLORA:
|
||||
_newSensor.moisture =0xff;
|
||||
_newSensor.fertility =0xffff;
|
||||
_newSensor.feature.temp=1;
|
||||
_newSensor.feature.moist=1;
|
||||
_newSensor.feature.fert=1;
|
||||
_newSensor.feature.lux=1;
|
||||
_newSensor.feature.bat=0;
|
||||
break;
|
||||
case 2: case 3: case 4: case 5: case 6: case ATC:
|
||||
_newSensor.hum=NAN;
|
||||
_newSensor.bat=0x00;
|
||||
case NLIGHT:
|
||||
_newSensor.events=0x00;
|
||||
_newSensor.feature.PIR=1;
|
||||
_newSensor.feature.NMT=1;
|
||||
break;
|
||||
case MJYD2S:
|
||||
_newSensor.NMT=0;
|
||||
_newSensor.events=0x00;
|
||||
_newSensor.feature.PIR=1;
|
||||
_newSensor.feature.NMT=1;
|
||||
_newSensor.feature.lux=1;
|
||||
_newSensor.feature.bat=1;
|
||||
break;
|
||||
case YEERC:
|
||||
_newSensor.feature.Btn=1;
|
||||
break;
|
||||
default:
|
||||
_newSensor.hum=NAN;
|
||||
_newSensor.feature.temp=1;
|
||||
_newSensor.feature.hum=1;
|
||||
_newSensor.feature.tempHum=1;
|
||||
_newSensor.feature.bat=1;
|
||||
break;
|
||||
}
|
||||
MIBLEsensors.push_back(_newSensor);
|
||||
|
@ -1067,7 +1158,7 @@ void MINRFconfirmSensors(void){
|
|||
*
|
||||
*/
|
||||
void MINRFtriggerTele(void){
|
||||
MINRF.triggeredTELE = true;
|
||||
MINRF.mode.triggeredTele= true;
|
||||
mqtt_data[0] = '\0';
|
||||
if (MqttShowSensor()) {
|
||||
MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain);
|
||||
|
@ -1086,7 +1177,7 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
uint32_t _slot = MINRFgetSensorSlot(MINRF.buffer.miBeacon.MAC, MINRF.buffer.miBeacon.PID);
|
||||
if(_slot==0xff) return;
|
||||
DEBUG_SENSOR_LOG(PSTR("NRF: slot %u, size vector: %u %u"),_slot,MIBLEsensors.size());
|
||||
mi_sensor_t *_sensorVec = &MIBLEsensors.at(_slot);
|
||||
mi_sensor_t *_sensorVec = &MIBLEsensors[_slot];
|
||||
DEBUG_SENSOR_LOG(PSTR("NRF: %u %u %u"),_slot,_sensorVec->type,MINRF.buffer.miBeacon.type);
|
||||
float _tempFloat;
|
||||
int decryptRet;
|
||||
|
@ -1110,14 +1201,14 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
if(MINRF.buffer.miBeacon.counter==_sensorVec->lastCnt) break;
|
||||
// AddLog_P2(LOG_LEVEL_INFO,PSTR("NRF: YEE-RC button: %u Long: %u"), MINRF.buffer.miBeacon.Btn.num, MINRF.buffer.miBeacon.Btn.longPress);
|
||||
_sensorVec->lastCnt=MINRF.buffer.miBeacon.counter;
|
||||
_sensorVec->btn=MINRF.buffer.miBeacon.Btn.num + (MINRF.buffer.miBeacon.Btn.longPress/2)*6;
|
||||
_sensorVec->shallSendMQTT = 1;
|
||||
MINRFtriggerTele();
|
||||
_sensorVec->Btn=MINRF.buffer.miBeacon.Btn.num + (MINRF.buffer.miBeacon.Btn.longPress/2)*6;
|
||||
_sensorVec->eventType.Btn = 1;
|
||||
break;
|
||||
case 0x04:
|
||||
_tempFloat=(float)(MINRF.buffer.miBeacon.temp)/10.0f;
|
||||
if(_tempFloat<60){
|
||||
_sensorVec->temp=_tempFloat;
|
||||
_sensorVec->eventType.temp = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 4: temp updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 4: U16: %u Temp"), MINRF.buffer.miBeacon.temp );
|
||||
|
@ -1126,18 +1217,21 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
_tempFloat=(float)(MINRF.buffer.miBeacon.hum)/10.0f;
|
||||
if(_tempFloat<101){
|
||||
_sensorVec->hum=_tempFloat;
|
||||
_sensorVec->eventType.hum = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 6: hum updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 6: U16: %u Hum"), MINRF.buffer.miBeacon.hum);
|
||||
break;
|
||||
case 0x07:
|
||||
_sensorVec->lux=MINRF.buffer.miBeacon.lux & 0x00ffffff;
|
||||
_sensorVec->eventType.lux = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 7: U24: %u Lux"), MINRF.buffer.miBeacon.lux & 0x00ffffff);
|
||||
break;
|
||||
case 0x08:
|
||||
_tempFloat =(float)MINRF.buffer.miBeacon.moist;
|
||||
if(_tempFloat<100){
|
||||
_sensorVec->moisture=_tempFloat;
|
||||
_sensorVec->eventType.moist = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 8: moisture updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 8: U8: %u Moisture"), MINRF.buffer.miBeacon.moist);
|
||||
|
@ -1146,6 +1240,7 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
_tempFloat=(float)(MINRF.buffer.miBeacon.fert);
|
||||
if(_tempFloat<65535){ // ???
|
||||
_sensorVec->fertility=_tempFloat;
|
||||
_sensorVec->eventType.fert = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 9: fertility updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode 9: U16: %u Fertility"), MINRF.buffer.miBeacon.fert);
|
||||
|
@ -1153,6 +1248,7 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
case 0x0a:
|
||||
if(MINRF.buffer.miBeacon.bat<101){
|
||||
_sensorVec->bat = MINRF.buffer.miBeacon.bat;
|
||||
_sensorVec->eventType.bat = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode a: bat updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode a: U8: %u %%"), MINRF.buffer.miBeacon.bat);
|
||||
|
@ -1168,9 +1264,13 @@ void MINRFhandleMiBeaconPacket(void){
|
|||
_sensorVec->hum = _tempFloat;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode d: hum updated"));
|
||||
}
|
||||
_sensorVec->eventType.tempHum = 1;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode d: U16: %x Temp U16: %x Hum"), MINRF.buffer.miBeacon.HT.temp, MINRF.buffer.miBeacon.HT.hum);
|
||||
break;
|
||||
}
|
||||
if(MIBLEsensors[_slot].eventType.raw == 0) return;
|
||||
MIBLEsensors[_slot].shallSendMQTT = 1;
|
||||
if (MINRF.option.directBridgeMode) MINRF.mode.shallTriggerTele = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1188,26 +1288,31 @@ void MINRFhandleCGD1Packet(void){ // no MiBeacon
|
|||
float _tempFloat;
|
||||
_tempFloat=(float)(MINRF.buffer.CGDPacket.temp)/10.0f;
|
||||
if(_tempFloat<60){
|
||||
MIBLEsensors.at(_slot).temp = _tempFloat;
|
||||
MIBLEsensors[_slot].temp = _tempFloat;
|
||||
DEBUG_SENSOR_LOG(PSTR("CGD1: temp updated"));
|
||||
}
|
||||
_tempFloat=(float)(MINRF.buffer.CGDPacket.hum)/10.0f;
|
||||
if(_tempFloat<100){
|
||||
MIBLEsensors.at(_slot).hum = _tempFloat;
|
||||
MIBLEsensors[_slot].hum = _tempFloat;
|
||||
DEBUG_SENSOR_LOG(PSTR("CGD1: hum updated"));
|
||||
}
|
||||
DEBUG_SENSOR_LOG(PSTR("CGD1: U16: %x Temp U16: %x Hum"), MINRF.buffer.CGDPacket.temp, MINRF.buffer.CGDPacket.hum);
|
||||
MIBLEsensors[_slot].eventType.tempHum = 1;
|
||||
break;
|
||||
case 0x0102:
|
||||
if(MINRF.buffer.CGDPacket.bat<101){
|
||||
MIBLEsensors.at(_slot).bat = MINRF.buffer.CGDPacket.bat;
|
||||
MIBLEsensors[_slot].bat = MINRF.buffer.CGDPacket.bat;
|
||||
DEBUG_SENSOR_LOG(PSTR("Mode a: bat updated"));
|
||||
}
|
||||
MIBLEsensors[_slot].eventType.bat = 1;
|
||||
break;
|
||||
default:
|
||||
DEBUG_SENSOR_LOG(PSTR("NRF: unexpected CGD1-packet"));
|
||||
MINRF_LOG_BUFFER(MINRF.buffer.raw);
|
||||
}
|
||||
if(MIBLEsensors[_slot].eventType.raw == 0) return;
|
||||
MIBLEsensors[_slot].shallSendMQTT = 1;
|
||||
if (MINRF.option.directBridgeMode) MINRF.mode.shallTriggerTele = 1;
|
||||
}
|
||||
|
||||
void MINRFhandleNlightPacket(void){ // no MiBeacon
|
||||
|
@ -1335,11 +1440,13 @@ void MINRFhandleATCPacket(void){
|
|||
// AddLog_P2(LOG_LEVEL_INFO,PSTR("NRF: ATC: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x"),MINRF.buffer.raw[0],MINRF.buffer.raw[1],MINRF.buffer.raw[2],MINRF.buffer.raw[3],MINRF.buffer.raw[4],MINRF.buffer.raw[5],MINRF.buffer.raw[6],MINRF.buffer.raw[7],MINRF.buffer.raw[8],MINRF.buffer.raw[9],MINRF.buffer.raw[10],MINRF.buffer.raw[11]);
|
||||
if(_slot==0xff) return;
|
||||
|
||||
MIBLEsensors.at(_slot).temp = (float)(__builtin_bswap16(_packet->temp))/10.0f;
|
||||
MIBLEsensors.at(_slot).hum = (float)_packet->hum;
|
||||
MIBLEsensors.at(_slot).bat = _packet->batPer;
|
||||
|
||||
MIBLEsensors[_slot].temp = (float)(__builtin_bswap16(_packet->temp))/10.0f;
|
||||
MIBLEsensors[_slot].hum = (float)_packet->hum;
|
||||
MIBLEsensors[_slot].bat = _packet->batPer;
|
||||
MIBLEsensors[_slot].eventType.tempHum = 1;
|
||||
MIBLEsensors[_slot].eventType.bat = 1;
|
||||
MIBLEsensors[_slot].shallSendMQTT = 1;
|
||||
if (MINRF.option.directBridgeMode) MINRF.mode.shallTriggerTele = 1;
|
||||
}
|
||||
|
||||
/*********************************************************************************************\
|
||||
|
@ -1356,6 +1463,10 @@ void MINRF_EVERY_50_MSECOND() { // Every 50mseconds
|
|||
MINRF.timer++;
|
||||
|
||||
if (!MINRFreceivePacket()){
|
||||
if(MINRF.mode.shallTriggerTele){
|
||||
MINRFtriggerTele();
|
||||
MINRF.mode.shallTriggerTele = 0;
|
||||
}
|
||||
// DEBUG_SENSOR_LOG(PSTR("NRF: nothing received"));
|
||||
// if (MINRF.packetMode==ATC) AddLog_P2(LOG_LEVEL_INFO,PSTR("no ATC.."));
|
||||
}
|
||||
|
@ -1384,7 +1495,7 @@ void MINRF_EVERY_50_MSECOND() { // Every 50mseconds
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (MINRF.beacon.active || MINRF.activeScan) {
|
||||
if (MINRF.beacon.active || MINRF.mode.activeScan) {
|
||||
MINRF.firstUsedPacketMode=0;
|
||||
}
|
||||
|
||||
|
@ -1405,7 +1516,7 @@ void MINRF_EVERY_50_MSECOND() { // Every 50mseconds
|
|||
}
|
||||
}
|
||||
|
||||
if (MINRF.activeScan) MINRF.packetMode=0;
|
||||
if (MINRF.mode.activeScan) MINRF.packetMode=0;
|
||||
|
||||
MINRFinitBLE(MINRF.packetMode);
|
||||
|
||||
|
@ -1478,19 +1589,19 @@ bool NRFCmd(void) {
|
|||
MINRF.beacon.active = false;
|
||||
switch(XdrvMailbox.payload){
|
||||
case 0: // new scan
|
||||
MINRF.activeScan = true;
|
||||
MINRF.stopScan = false;
|
||||
MINRF.mode.activeScan = true;
|
||||
MINRF.mode.stopScan = false;
|
||||
MINRFscanResult.erase(std::remove_if(MINRFscanResult.begin(),
|
||||
MINRFscanResult.end(),
|
||||
[](scan_entry_t&) { return true; }),
|
||||
MINRFscanResult.end());
|
||||
break;
|
||||
case 1: // append scan
|
||||
MINRF.activeScan = true;
|
||||
MINRF.stopScan = false;
|
||||
MINRF.mode.activeScan = true;
|
||||
MINRF.mode.stopScan = false;
|
||||
break;
|
||||
case 2: // stop scan
|
||||
MINRF.stopScan = true;
|
||||
MINRF.mode.stopScan = true;
|
||||
break;
|
||||
}
|
||||
Response_P(S_JSON_NRF_COMMAND_NVALUE, command, XdrvMailbox.payload);
|
||||
|
@ -1576,67 +1687,144 @@ const char HTTP_NRF24NEW[] PROGMEM = "{s}%sL01%c{m}%u%s / %u{e}";
|
|||
void MINRFShow(bool json)
|
||||
{
|
||||
if (json) {
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
bool _noSummarySave = MINRF.option.noSummary;
|
||||
bool _minimalSummarySave = MINRF.option.minimalSummary;
|
||||
if(hass_mode==2){
|
||||
MINRF.option.noSummary = false;
|
||||
MINRF.option.minimalSummary = false;
|
||||
}
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
if(!MINRF.mode.triggeredTele){
|
||||
if(MINRF.option.noSummary) return; // no message at TELEPERIOD
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < MIBLEsensors.size(); i++) {
|
||||
if(MINRF.mode.triggeredTele && MIBLEsensors[i].eventType.raw == 0) continue;
|
||||
if(MINRF.mode.triggeredTele && MIBLEsensors[i].shallSendMQTT==0) continue;
|
||||
|
||||
if(MIBLEsensors[i].showedUp < 3){
|
||||
DEBUG_SENSOR_LOG(PSTR("NRF: sensor not fully registered yet"));
|
||||
if(MIBLEsensors[i].type != YEERC) break; // send every RC code, even if there is a potentially false MAC
|
||||
}
|
||||
switch(MIBLEsensors[i].type){
|
||||
case YEERC:
|
||||
if(MIBLEsensors[i].shallSendMQTT==0) continue;
|
||||
break;
|
||||
default:
|
||||
if(MINRF.triggeredTELE) continue;
|
||||
break;
|
||||
}
|
||||
ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":{"),kMINRFDeviceType[MIBLEsensors[i].type-1],MIBLEsensors[i].MAC[3],MIBLEsensors[i].MAC[4],MIBLEsensors[i].MAC[5]);
|
||||
switch(MIBLEsensors[i].type){
|
||||
case FLORA:
|
||||
if(MINRF.triggeredTELE) {
|
||||
ResponseJsonEnd();
|
||||
break;
|
||||
}
|
||||
char stemp[FLOATSZ];
|
||||
dtostrfd(MIBLEsensors[i].temp, Settings.flag2.temperature_resolution, stemp);
|
||||
ResponseAppend_P(PSTR("\"" D_JSON_TEMPERATURE "\":%s"), stemp);
|
||||
|
||||
if(MIBLEsensors[i].lux!=0xffffffff){ // this is the error code -> no lux
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_ILLUMINANCE "\":%u"), MIBLEsensors[i].lux);
|
||||
ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":"),kMINRFDeviceType[MIBLEsensors[i].type-1],MIBLEsensors[i].MAC[3],MIBLEsensors[i].MAC[4],MIBLEsensors[i].MAC[5]);
|
||||
|
||||
uint32_t _positionCurlyBracket = strlen(mqtt_data); // ... this will be a ',' first, but later be replaced
|
||||
|
||||
if((!MINRF.mode.triggeredTele && !MINRF.option.minimalSummary)||MINRF.mode.triggeredTele){
|
||||
bool tempHumSended = false;
|
||||
if(MIBLEsensors[i].feature.tempHum){
|
||||
if(MIBLEsensors[i].eventType.tempHum || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate){
|
||||
if (!isnan(MIBLEsensors[i].hum) && !isnan(MIBLEsensors[i].temp)
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(!hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) {
|
||||
ResponseAppend_P(PSTR(","));
|
||||
ResponseAppendTHD(MIBLEsensors[i].temp, MIBLEsensors[i].hum);
|
||||
tempHumSended = true;
|
||||
}
|
||||
}
|
||||
if(!isnan(MIBLEsensors[i].moisture)){
|
||||
dtostrfd(MIBLEsensors[i].moisture, 0, stemp);
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_MOISTURE "\":%s"), stemp);
|
||||
}
|
||||
if(MIBLEsensors[i].feature.temp && !tempHumSended){
|
||||
if(MIBLEsensors[i].eventType.temp || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate) {
|
||||
if (!isnan(MIBLEsensors[i].temp)
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) {
|
||||
char temperature[FLOATSZ];
|
||||
dtostrfd(MIBLEsensors[i].temp, Settings.flag2.temperature_resolution, temperature);
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE "\":%s"), temperature);
|
||||
}
|
||||
}
|
||||
if(!isnan(MIBLEsensors[i].fertility)){
|
||||
dtostrfd(MIBLEsensors[i].fertility, 0, stemp);
|
||||
ResponseAppend_P(PSTR(",\"Fertility\":%s"), stemp);
|
||||
}
|
||||
if(MIBLEsensors[i].feature.hum && !tempHumSended){
|
||||
if(MIBLEsensors[i].eventType.hum || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate) {
|
||||
if (!isnan(MIBLEsensors[i].hum)) {
|
||||
char hum[FLOATSZ];
|
||||
dtostrfd(MIBLEsensors[i].hum, Settings.flag2.humidity_resolution, hum);
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_HUMIDITY "\":%s"), hum);
|
||||
}
|
||||
}
|
||||
ResponseJsonEnd();
|
||||
break;
|
||||
case YEERC:
|
||||
if(MIBLEsensors[i].shallSendMQTT == 1){
|
||||
ResponseAppend_P(PSTR("\"Btn\":%u"), MIBLEsensors[i].btn);
|
||||
MIBLEsensors[i].shallSendMQTT = 0;
|
||||
}
|
||||
if (MIBLEsensors[i].feature.lux){
|
||||
if(MIBLEsensors[i].eventType.lux || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate){
|
||||
if (MIBLEsensors[i].lux!=0x0ffffff
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) { // this is the error code -> no lux
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_ILLUMINANCE "\":%u"), MIBLEsensors[i].lux);
|
||||
}
|
||||
}
|
||||
ResponseJsonEnd();
|
||||
break;
|
||||
default:
|
||||
if(MINRF.triggeredTELE) {
|
||||
ResponseJsonEnd();
|
||||
break;
|
||||
}
|
||||
if (MIBLEsensors[i].feature.moist){
|
||||
if(MIBLEsensors[i].eventType.moist || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate){
|
||||
if (MIBLEsensors[i].moisture!=0xff
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) {
|
||||
ResponseAppend_P(PSTR(",\"" D_JSON_MOISTURE "\":%u"), MIBLEsensors[i].moisture);
|
||||
}
|
||||
}
|
||||
if(!isnan(MIBLEsensors[i].temp) && !isnan(MIBLEsensors[i].hum)){
|
||||
ResponseAppendTHD(MIBLEsensors[i].temp,MIBLEsensors[i].hum);
|
||||
}
|
||||
if (MIBLEsensors[i].feature.fert){
|
||||
if(MIBLEsensors[i].eventType.fert || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate){
|
||||
if (MIBLEsensors[i].fertility!=0xffff
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) {
|
||||
ResponseAppend_P(PSTR(",\"Fertility\":%u"), MIBLEsensors[i].fertility);
|
||||
}
|
||||
}
|
||||
if(MIBLEsensors[i].bat!=0x00){ // this is the error code -> no battery
|
||||
ResponseAppend_P(PSTR(",\"Battery\":%u"), MIBLEsensors[i].bat);
|
||||
}
|
||||
if (MIBLEsensors[i].feature.Btn){
|
||||
if(MIBLEsensors[i].eventType.Btn){
|
||||
ResponseAppend_P(PSTR(",\"Btn\":%u"),MIBLEsensors[i].Btn);
|
||||
}
|
||||
ResponseJsonEnd();
|
||||
break;
|
||||
}
|
||||
} // minimal summary
|
||||
if (MIBLEsensors[i].feature.PIR){
|
||||
if(MIBLEsensors[i].eventType.motion || !MINRF.mode.triggeredTele){
|
||||
if(MINRF.mode.triggeredTele) ResponseAppend_P(PSTR(",\"PIR\":1")); // only real-time
|
||||
ResponseAppend_P(PSTR(",\"Events\":%u"),MIBLEsensors[i].events);
|
||||
}
|
||||
else if(MIBLEsensors[i].eventType.noMotion && MINRF.mode.triggeredTele){
|
||||
ResponseAppend_P(PSTR(",\"PIR\":0"));
|
||||
}
|
||||
}
|
||||
|
||||
if (MIBLEsensors[i].feature.NMT || !MINRF.mode.triggeredTele){
|
||||
if(MIBLEsensors[i].eventType.NMT){
|
||||
ResponseAppend_P(PSTR(",\"NMT\":%u"), MIBLEsensors[i].NMT);
|
||||
}
|
||||
}
|
||||
if (MIBLEsensors[i].feature.bat){
|
||||
if(MIBLEsensors[i].eventType.bat || !MINRF.mode.triggeredTele || MINRF.option.allwaysAggregate){
|
||||
if (MIBLEsensors[i].bat != 0x00 // this is the error code -> no battery
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
||(hass_mode==2)
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
) {
|
||||
ResponseAppend_P(PSTR(",\"Battery\":%u"), MIBLEsensors[i].bat);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(_positionCurlyBracket==strlen(mqtt_data)) ResponseAppend_P(PSTR(",")); // write some random char, to be overwritten in the next step
|
||||
ResponseAppend_P(PSTR("}"));
|
||||
mqtt_data[_positionCurlyBracket] = '{';
|
||||
MIBLEsensors[i].eventType.raw = 0;
|
||||
if(MIBLEsensors[i].shallSendMQTT==1){
|
||||
MIBLEsensors[i].shallSendMQTT = 0;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
for(uint32_t i=0; i<MIBLElights.size(); i++){
|
||||
if(MINRF.triggeredTELE && MIBLElights[i].shallSendMQTT==0) continue;
|
||||
if(MINRF.mode.triggeredTele&& MIBLElights[i].shallSendMQTT==0) continue;
|
||||
ResponseAppend_P(PSTR(",\"%s-%02x%02x%02x\":{"),kMINRFDeviceType[MIBLElights[i].type-1],MIBLElights[i].MAC[3],MIBLElights[i].MAC[4],MIBLElights[i].MAC[5]);
|
||||
if(MIBLElights[i].shallSendMQTT == 1){
|
||||
switch(MIBLElights[i].type){
|
||||
|
@ -1670,8 +1858,13 @@ void MINRFShow(bool json)
|
|||
if(MINRF.beacon.active){
|
||||
ResponseAppend_P(PSTR(",\"Beacon\":{\"Timer\":%u}"),MINRF.beacon.time);
|
||||
}
|
||||
if(MINRF.triggeredTELE) MINRF.triggeredTELE = false;
|
||||
// ResponseJsonEnd();
|
||||
MINRF.mode.triggeredTele= 0;
|
||||
#ifdef USE_HOME_ASSISTANT
|
||||
if(hass_mode==2){
|
||||
MINRF.option.noSummary = _noSummarySave;
|
||||
MINRF.option.minimalSummary = _minimalSummarySave;
|
||||
}
|
||||
#endif //USE_HOME_ASSISTANT
|
||||
#ifdef USE_WEBSERVER
|
||||
} else {
|
||||
static uint32_t _page = 0;
|
||||
|
@ -1764,7 +1957,7 @@ bool Xsns61(uint8_t function)
|
|||
if (NRF24.chipType) {
|
||||
switch (function) {
|
||||
case FUNC_INIT:
|
||||
MINRFinitBLE(1);
|
||||
MINRFinit();
|
||||
AddLog_P2(LOG_LEVEL_INFO,PSTR("NRF: started"));
|
||||
break;
|
||||
case FUNC_EVERY_50_MSECOND:
|
||||
|
@ -1791,4 +1984,4 @@ bool Xsns61(uint8_t function)
|
|||
|
||||
#endif // USE_MIBLE
|
||||
#endif // USE_NRF24
|
||||
#endif // USE_SPI
|
||||
#endif // USE_SPI
|
Loading…
Reference in New Issue