Esp32 compatibility (#145)
* esp32 init * RF gateway ok with ESP32 * correct IR gateway compilation errors and test RF2 ok * divide config per board type * update test file according user_config * differentiate variable type following IR libraries aka platforms * implement BLE beacons detection with ESP32 * Implement multitasking on BLE gateway * Library add and change core assignement * change core assignement for BLE * add mi flora value readings with ESP32 * adding some traces and removing unecessary comment * correct compilation error due to pin assignement * correct temperature float value and wrong mac adress rssi publishing * add esp32 to CI * correct esp32 ide retrieving * correcting paths * CI: correct architecture * libraries update (irremote) and overwrite ble library files
This commit is contained in:
1 parent
15cea6b222
commit
7c6e0ccf61
19 files changed
+319
-101
No files matched your search
+180
-69
@@ -27,6 +27,99 @@
|
||||
Thanks to wolass https://github.com/wolass for suggesting me HM 10 and dinosd https://github.com/dinosd/BLE_PROXIMITY for inspiring me how to implement the gateway
|
||||
*/
|
||||
#ifdef ZgatewayBT
|
||||
|
||||
#ifdef ESP32
|
||||
/*
|
||||
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
|
||||
Ported to Arduino ESP32 by Evandro Copercini
|
||||
*/
|
||||
// core task implementation thanks to https://techtutorialsx.com/2017/05/09/esp32-running-code-on-a-specific-core/
|
||||
|
||||
#include <BLEDevice.h>
|
||||
#include <BLEUtils.h>
|
||||
#include <BLEScan.h>
|
||||
#include <BLEAdvertisedDevice.h>
|
||||
|
||||
//core on which the BLE detection task will run
|
||||
static int taskCore = 0;
|
||||
|
||||
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
|
||||
void onResult(BLEAdvertisedDevice advertisedDevice) {
|
||||
String mac_adress = advertisedDevice.getAddress().toString().c_str();
|
||||
mac_adress.replace(":","");
|
||||
mac_adress.toUpperCase();
|
||||
String mactopic = subjectBTtoMQTT + mac_adress;
|
||||
if (advertisedDevice.haveName()){
|
||||
String nameBLE = advertisedDevice.getName().c_str();
|
||||
trc(mactopic + " " + nameBLE);
|
||||
client.publish((char *)(mactopic + "/name").c_str(),(char *)nameBLE.c_str());
|
||||
}
|
||||
String rssi = String(advertisedDevice.getRSSI());
|
||||
trc(mactopic + " " + rssi);
|
||||
client.publish((char *)mactopic.c_str(),(char *)rssi.c_str());
|
||||
|
||||
if (advertisedDevice.haveServiceData()){
|
||||
trc(F("Get service data "));
|
||||
std::string serviceData = advertisedDevice.getServiceData();
|
||||
int serviceDataLength = serviceData.length();
|
||||
String returnedString = "";
|
||||
for (int i=0; i<serviceDataLength; i++)
|
||||
{
|
||||
int a = serviceData[i];
|
||||
if (a < 16) {
|
||||
returnedString = returnedString + "0";
|
||||
}
|
||||
returnedString = returnedString + String(a,HEX);
|
||||
}
|
||||
trc(returnedString);
|
||||
|
||||
trc(F("Get service data UUID"));
|
||||
BLEUUID serviceDataUUID = advertisedDevice.getServiceDataUUID();
|
||||
trc(serviceDataUUID.toString().c_str());
|
||||
|
||||
if (strstr(serviceDataUUID.toString().c_str(),"fe95") != NULL){
|
||||
trc("Processing mi flora data");
|
||||
char service_data[returnedString.length()+1];
|
||||
returnedString.toCharArray(service_data,returnedString.length()+1);
|
||||
service_data[returnedString.length()] = '\0';
|
||||
char mac[mac_adress.length()+1];
|
||||
mac_adress.toCharArray(mac,mac_adress.length()+1);
|
||||
boolean result = process_miflora_data(-22,service_data,mac);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void setupBT(){
|
||||
// we setup a task with priority one to avoid conflict with other gateways
|
||||
xTaskCreatePinnedToCore(
|
||||
coreTask, /* Function to implement the task */
|
||||
"coreTask", /* Name of the task */
|
||||
10000, /* Stack size in words */
|
||||
NULL, /* Task input parameter */
|
||||
1, /* Priority of the task */
|
||||
NULL, /* Task handle. */
|
||||
taskCore); /* Core where the task should run */
|
||||
}
|
||||
|
||||
void coreTask( void * pvParameters ){
|
||||
|
||||
String taskMessage = "BT Task running on core ";
|
||||
taskMessage = taskMessage + xPortGetCoreID();
|
||||
|
||||
while(true){
|
||||
trc(taskMessage);
|
||||
delay(TimeBtw_Read);
|
||||
BLEDevice::init("");
|
||||
BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
|
||||
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
|
||||
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
|
||||
BLEScanResults foundDevices = pBLEScan->start(Scan_duration);
|
||||
}
|
||||
}
|
||||
|
||||
#else // arduino or ESP8266 working with HM10/11
|
||||
|
||||
#include <SoftwareSerial.h>
|
||||
|
||||
#define STRING_MSG "OK+DISC:"
|
||||
@@ -67,40 +160,43 @@ boolean BTtoMQTT() {
|
||||
|
||||
if (millis() > (timebt + TimeBtw_Read)) {//retriving data
|
||||
timebt = millis();
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
if (returnedString != "") {
|
||||
size_t pos = 0;
|
||||
while ((pos = returnedString.lastIndexOf(delimiter)) != -1) {
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
String token = returnedString.substring(pos);
|
||||
trc(token);
|
||||
returnedString.remove(pos,returnedString.length() );
|
||||
char token_char[token.length()+1];
|
||||
token.toCharArray(token_char, token.length()+1);
|
||||
|
||||
for(int i =0; i<6;i++)
|
||||
{
|
||||
extract_char(token_char,d[i].extract,d[i].start, d[i].len ,d[i].reverse, false);
|
||||
if (i == 3) d[5].len = (int)strtol(d[i].extract, NULL, 16) * 2; // extracting the length of the rest data
|
||||
}
|
||||
|
||||
if((strlen(d[0].extract)) == 12) // if a mac adress is detected we publish it
|
||||
{
|
||||
strupp(d[0].extract);
|
||||
String mactopic(d[0].extract);
|
||||
trc(mactopic);
|
||||
mactopic = subjectBTtoMQTT + mactopic;
|
||||
int rssi = (int)strtol(d[2].extract, NULL, 16) - 256;
|
||||
char val[12];
|
||||
sprintf(val, "%d", rssi);
|
||||
client.publish((char *)mactopic.c_str(),val);
|
||||
if (strcmp(d[4].extract, "fe95") == 0)
|
||||
boolean result = process_miflora_data(d[5].extract,d[0].extract);
|
||||
|
||||
return true;
|
||||
trc(token);
|
||||
if ( token.length() > 60){// we extract data only if we have detailled infos
|
||||
for(int i =0; i<6;i++)
|
||||
{
|
||||
extract_char(token_char,d[i].extract,d[i].start, d[i].len ,d[i].reverse, false);
|
||||
if (i == 3) d[5].len = (int)strtol(d[i].extract, NULL, 16) * 2; // extracting the length of the rest data
|
||||
}
|
||||
|
||||
if((strlen(d[0].extract)) == 12) // if a mac adress is detected we publish it
|
||||
{
|
||||
strupp(d[0].extract);
|
||||
String mactopic(d[0].extract);
|
||||
trc(mactopic);
|
||||
mactopic = subjectBTtoMQTT + mactopic;
|
||||
int rssi = (int)strtol(d[2].extract, NULL, 16) - 256;
|
||||
char val[12];
|
||||
sprintf(val, "%d", rssi);
|
||||
client.publish((char *)mactopic.c_str(),val);
|
||||
if (strcmp(d[4].extract, "fe95") == 0)
|
||||
boolean result = process_miflora_data(0,d[5].extract,d[0].extract);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
returnedString = ""; //init data string
|
||||
@@ -119,56 +215,13 @@ void strupp(char* beg)
|
||||
++beg;
|
||||
}
|
||||
|
||||
boolean process_miflora_data(char * rest_data, char * mac_adress){
|
||||
|
||||
char tmp_rest_data_length[1];
|
||||
memcpy( tmp_rest_data_length, &rest_data[51], 1 );
|
||||
int data_length = ((int)strtol(tmp_rest_data_length, NULL, 16)*2)+1;
|
||||
char rev_data[data_length];
|
||||
char data[data_length];
|
||||
memcpy( rev_data, &rest_data[52], data_length );
|
||||
rev_data[data_length] = '\0';
|
||||
|
||||
// reverse data order
|
||||
revert_hex_data(rev_data, data, data_length);
|
||||
int value = strtol(data, NULL, 16);
|
||||
char val[12];
|
||||
sprintf(val, "%d", value);
|
||||
String mactopic(mac_adress);
|
||||
mactopic = subjectBTtoMQTT + mactopic;
|
||||
|
||||
|
||||
// following the value of digit 47 we determine the type of data we get from the sensor
|
||||
switch (rest_data[47]) {
|
||||
case '9' :
|
||||
mactopic = mactopic + "/" + "fer";
|
||||
break;
|
||||
case '4' :
|
||||
mactopic = mactopic + "/" + "tem";
|
||||
dtostrf(value/10,4,1,val); // override temperature value in case we have, indeed temp has to be divided by 10
|
||||
break;
|
||||
case '7' :
|
||||
mactopic = mactopic + "/" + "lux";
|
||||
break;
|
||||
case '8' :
|
||||
mactopic = mactopic + "/" + "hum";
|
||||
break;
|
||||
default:
|
||||
trc("can't read values");
|
||||
return false;
|
||||
}
|
||||
client.publish((char *)mactopic.c_str(),val);;
|
||||
trc(String(val));
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef ZgatewayBT_v6xx
|
||||
#define QUESTION_MSG "AT+DISI?"
|
||||
boolean BTtoMQTT() {
|
||||
while (softserial.available() > 0) {
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
String discResult = softserial.readString();
|
||||
@@ -178,7 +231,7 @@ boolean BTtoMQTT() {
|
||||
float device_number = discResult.length()/78.0;
|
||||
if (device_number == (int)device_number){ // to avoid publishing partial values we detect if the serial data has been fully read = a multiple of 78
|
||||
trc(F("Sending BT data to MQTT"));
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
for (int i=0;i<(int)device_number;i++){
|
||||
@@ -201,7 +254,7 @@ boolean BTtoMQTT() {
|
||||
}
|
||||
if (millis() > (timebt + TimeBtw_Read)) {//retriving value of adresses and rssi
|
||||
timebt = millis();
|
||||
#ifdef ESP8266
|
||||
#if defined(ESP8266)
|
||||
yield();
|
||||
#endif
|
||||
softserial.print(F(QUESTION_MSG));
|
||||
@@ -211,3 +264,61 @@ boolean BTtoMQTT() {
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
boolean process_miflora_data(int offset, char * rest_data, char * mac_adress){
|
||||
|
||||
int data_length = 0;
|
||||
switch (rest_data[51 + offset]) {
|
||||
case '1' :
|
||||
case '2' :
|
||||
case '3' :
|
||||
case '4' :
|
||||
data_length = ((rest_data[51 + offset] - '0') * 2)+1;
|
||||
trc(String(data_length));
|
||||
break;
|
||||
default:
|
||||
trc("can't read data_length");
|
||||
return false;
|
||||
}
|
||||
|
||||
char rev_data[data_length];
|
||||
char data[data_length];
|
||||
memcpy( rev_data, &rest_data[52 + offset], data_length );
|
||||
rev_data[data_length] = '\0';
|
||||
|
||||
// reverse data order
|
||||
revert_hex_data(rev_data, data, data_length);
|
||||
double value = strtol(data, NULL, 16);
|
||||
trc(String(value));
|
||||
char val[12];
|
||||
String mactopic(mac_adress);
|
||||
mactopic = subjectBTtoMQTT + mactopic;
|
||||
|
||||
// following the value of digit 47 we determine the type of data we get from the sensor
|
||||
switch (rest_data[47 + offset]) {
|
||||
case '9' :
|
||||
mactopic = mactopic + "/" + "fer";
|
||||
dtostrf(value,0,0,val);
|
||||
break;
|
||||
case '4' :
|
||||
mactopic = mactopic + "/" + "tem";
|
||||
dtostrf(value/10,3,1,val); // temp has to be divided by 10
|
||||
break;
|
||||
case '7' :
|
||||
mactopic = mactopic + "/" + "lux";
|
||||
dtostrf(value,0,0,val);
|
||||
break;
|
||||
case '8' :
|
||||
mactopic = mactopic + "/" + "hum";
|
||||
dtostrf(value,0,0,val);
|
||||
break;
|
||||
default:
|
||||
trc("can't read values");
|
||||
return false;
|
||||
}
|
||||
client.publish((char *)mactopic.c_str(),val);;
|
||||
trc(String(val));
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user