@@ -55,75 +55,86 @@ vector<BLEdevice> devices;
5555 static int taskCore = 0 ;
5656
5757 class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
58- void onResult (BLEAdvertisedDevice advertisedDevice) {
59- trc (F (" Creating BLE buffer" ));
60- StaticJsonBuffer<JSON_MSG_BUFFER> jsonBuffer;
61- JsonObject& BLEdata = jsonBuffer.createObject ();
62- String mac_adress = advertisedDevice.getAddress ().toString ().c_str ();
63- BLEdata.set (" id" , (char *)mac_adress.c_str ());
64- mac_adress.replace (" :" ," " );
65- mac_adress.toUpperCase ();
66- String mactopic = subjectBTtoMQTT + mac_adress;
67- if (advertisedDevice.haveName ()) BLEdata.set (" name" , (char *)advertisedDevice.getName ().c_str ());
68- if (advertisedDevice.haveManufacturerData ()) BLEdata.set (" manufacturerdata" , (char *)advertisedDevice.getManufacturerData ().c_str ());
69- if (advertisedDevice.haveRSSI ()) BLEdata.set (" rssi" , (int ) advertisedDevice.getRSSI ());
70- if (advertisedDevice.haveTXPower ()) BLEdata.set (" txpower" , (int8_t ) advertisedDevice.getTXPower ());
71- #ifdef subjectHomePresence
72- if (advertisedDevice.haveRSSI ()) haRoomPresence (BLEdata);// this device has an rssi in consequence we can use it for home assistant room presence component
73- #endif
74- if (advertisedDevice.haveServiceData ()){
75-
76- char mac[mac_adress.length ()+1 ];
77- mac_adress.toCharArray (mac,mac_adress.length ()+1 );
78-
79- trc (F (" Get service data " ));
80-
81- std::string serviceData = advertisedDevice.getServiceData ();
82- int serviceDataLength = serviceData.length ();
83- String returnedString = " " ;
84- for (int i=0 ; i<serviceDataLength; i++)
85- {
86- int a = serviceData[i];
87- if (a < 16 ) {
88- returnedString = returnedString + " 0" ;
89- }
90- returnedString = returnedString + String (a,HEX);
91- }
92- char service_data[returnedString.length ()+1 ];
93- returnedString.toCharArray (service_data,returnedString.length ()+1 );
94- service_data[returnedString.length ()] = ' \0 ' ;
95- #ifdef pubBLEServiceData
96- BLEdata.set (" servicedata" , service_data);
97- BLEdata.set (" servicedatauuid" , (char *)advertisedDevice.getServiceDataUUID ().toString ().c_str ());
98- #endif
99- if ((!oneWhite () || isWhite (mac)) && !isBlack (mac)){ // if not black listed mac we go AND if we have no white mac or this mac is white we go out
100- pub ((char *)mactopic.c_str (),BLEdata);
101- if (strstr (BLEdata[" servicedatauuid" ].as <char *>()," fe95" ) != NULL ){
102- trc (" Processing BLE device data" );
103- int pos = -1 ;
104- pos = strpos (service_data," 209800" );
105- if (pos != -1 ){
106- trc (F (" mi flora data reading" ));
107- #ifdef ZmqttDiscovery
108- if (!isDiscovered (mac)) MiFloraDiscovery (mac);
109- #endif
110- process_data (pos - 24 ,service_data,mac);
111- }
112- pos = -1 ;
113- pos = strpos (service_data," 20aa01" );
114- if (pos != -1 ){
115- trc (F (" mi jia data reading" ));
116- #ifdef ZmqttDiscovery
117- if (!isDiscovered (mac)) MiJiaDiscovery (mac);
118- #endif
119- process_data (pos - 26 ,service_data,mac);
120- }
58+ void onResult (BLEAdvertisedDevice advertisedDevice) {
59+ trc (F (" Creating BLE buffer" ));
60+ StaticJsonBuffer<JSON_MSG_BUFFER> jsonBuffer;
61+ JsonObject& BLEdata = jsonBuffer.createObject ();
62+ String mac_adress = advertisedDevice.getAddress ().toString ().c_str ();
63+ BLEdata.set (" id" , (char *)mac_adress.c_str ());
64+ mac_adress.replace (" :" ," " );
65+ mac_adress.toUpperCase ();
66+ String mactopic = subjectBTtoMQTT + mac_adress;
67+ if (advertisedDevice.haveName ()) BLEdata.set (" name" , (char *)advertisedDevice.getName ().c_str ());
68+ if (advertisedDevice.haveManufacturerData ()) BLEdata.set (" manufacturerdata" , (char *)advertisedDevice.getManufacturerData ().c_str ());
69+ if (advertisedDevice.haveRSSI ()) BLEdata.set (" rssi" , (int ) advertisedDevice.getRSSI ());
70+ if (advertisedDevice.haveTXPower ()) BLEdata.set (" txpower" , (int8_t ) advertisedDevice.getTXPower ());
71+ #ifdef subjectHomePresence
72+ if (advertisedDevice.haveRSSI ()) haRoomPresence (BLEdata);// this device has an rssi in consequence we can use it for home assistant room presence component
73+ #endif
74+ if (advertisedDevice.haveServiceData ()){
75+ char mac[mac_adress.length ()+1 ];
76+ mac_adress.toCharArray (mac,mac_adress.length ()+1 );
77+ trc (F (" Get services data :" ));
78+ int serviceDataCount = advertisedDevice.getServiceDataCount ();
79+ trc (serviceDataCount);
80+ for (int j = 0 ; j < serviceDataCount;j++){
81+ std::string serviceData = advertisedDevice.getServiceData (j);
82+ int serviceDataLength = serviceData.length ();
83+ String returnedString = " " ;
84+ for (int i=0 ; i<serviceDataLength; i++)
85+ {
86+ int a = serviceData[i];
87+ if (a < 16 ) {
88+ returnedString = returnedString + " 0" ;
89+ }
90+ returnedString = returnedString + String (a,HEX);
91+ }
92+ char service_data[returnedString.length ()+1 ];
93+ returnedString.toCharArray (service_data,returnedString.length ()+1 );
94+ service_data[returnedString.length ()] = ' \0 ' ;
95+ #ifdef pubBLEServiceData
96+ BLEdata.set (" servicedata" , service_data);
97+ BLEdata.set (" servicedatauuid" , (char *)advertisedDevice.getServiceDataUUID (j).toString ().c_str ());
98+ #endif
99+ if ((!oneWhite () || isWhite (mac)) && !isBlack (mac)){ // if not black listed mac we go AND if we have no white mac or this mac is white we go out
100+ pub ((char *)mactopic.c_str (),BLEdata);
101+ if (strstr (BLEdata[" servicedatauuid" ].as <char *>()," fe95" ) != NULL ){
102+ trc (" Processing BLE device data" );
103+ int pos = -1 ;
104+ pos = strpos (service_data," 209800" );
105+ if (pos != -1 ){
106+ trc (F (" mi flora data reading" ));
107+ #ifdef ZmqttDiscovery
108+ if (!isDiscovered (mac)) MiFloraDiscovery (mac);
109+ #endif
110+ process_data (pos - 24 ,service_data,mac);
111+ }
112+ pos = -1 ;
113+ pos = strpos (service_data," 20aa01" );
114+ if (pos != -1 ){
115+ trc (F (" mi jia data reading" ));
116+ #ifdef ZmqttDiscovery
117+ if (!isDiscovered (mac)) MiJiaDiscovery (mac);
118+ #endif
119+ process_data (pos - 26 ,service_data,mac);
120+ }
121+ pos = -1 ;
122+ pos = strpos (service_data," 205b04" );
123+ if (pos != -1 ){
124+ trc (F (" LYWSD02 data reading" ));
125+ // example 70205b04b96ab883c8593f09041002e000
126+ #ifdef ZmqttDiscovery
127+ if (!isDiscovered (mac)) LYWSD02Discovery (mac);
128+ #endif
129+ process_data (pos - 24 ,service_data,mac);
121130 }
122131 }
132+ }
123133 }
124- }
125- };
126-
134+ }
135+ }
136+ };
137+
127138 void setupBT (){
128139 BLEinterval = TimeBtw_Read;
129140 trc (F (" BLEinterval btw scans" ));
@@ -302,6 +313,15 @@ vector<BLEdevice> devices;
302313 #endif
303314 boolean result = process_data (pos - 40 ,(char *)Service_data.c_str (),d[0 ].extract );
304315 }
316+ pos = -1 ;
317+ pos = strpos (d[5 ].extract ," 205b04" );
318+ if (pos != -1 ){
319+ trc (" LYWSD02 data reading" );
320+ #ifdef ZmqttDiscovery
321+ if (!isDiscovered (d[0 ].extract )) LYWSD02Discovery (d[0 ].extract );
322+ #endif
323+ boolean result = process_data (pos - 38 ,(char *)Service_data.c_str (),d[0 ].extract );
324+ }
305325 return true ;
306326 }
307327 }
@@ -380,6 +400,34 @@ void MiJiaDiscovery(char * mac){
380400 device.isDisc = true ;
381401 devices.push_back (device);
382402}
403+
404+ void LYWSD02Discovery (char * mac){
405+ #define LYWSD02parametersCount 3
406+ trc (F (" LYWSD02Discovery" ));
407+ char * LYWSD02sensor[LYWSD02parametersCount][8 ] = {
408+ {" sensor" , " LYWSD02-batt" , mac, " battery" ," {{ value_json.batt | is_defined }}" ," " , " " , " V" } ,
409+ {" sensor" , " LYWSD02-tem" , mac," temperature" ," {{ value_json.tem | is_defined }}" ," " , " " , " °C" } ,
410+ {" sensor" , " LYWSD02-hum" , mac," humidity" ," {{ value_json.hum | is_defined }}" ," " , " " , " %" }
411+ // component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement
412+ };
413+
414+ for (int i=0 ;i<LYWSD02parametersCount;i++){
415+ trc (F (" CreateDiscoverySensor" ));
416+ trc (LYWSD02sensor[i][1 ]);
417+ String discovery_topic = String (subjectBTtoMQTT) + String (mac);
418+ String unique_id = String (mac) + " -" + LYWSD02sensor[i][1 ];
419+ createDiscovery (LYWSD02sensor[i][0 ],
420+ (char *)discovery_topic.c_str (), LYWSD02sensor[i][1 ], (char *)unique_id.c_str (),
421+ will_Topic, LYWSD02sensor[i][3 ], LYWSD02sensor[i][4 ],
422+ LYWSD02sensor[i][5 ], LYWSD02sensor[i][6 ], LYWSD02sensor[i][7 ],
423+ 0 ," " ," " ,true ," " );
424+ }
425+ BLEdevice device;
426+ strcpy ( device.macAdr , mac );
427+ device.isDisc = true ;
428+ devices.push_back (device);
429+ }
430+
383431#endif
384432
385433boolean process_data (int offset, char * rest_data, char * mac_adress){
0 commit comments