DT24 bluetooth Voltmeter (#975)
* DT24 bluetooth Voltmeter * Initial checkin of Home Assistant Discovery Co-authored-by: Northern Man <sgracey@Heisenberg.local>
This commit is contained in:
1 parent
9c9ef127e0
commit
6bb65ca12a
3 files changed
+91
No files matched your search
@@ -43,6 +43,7 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so
|
|||||||
| XIAOMI Mi band (1)||steps|
|
| XIAOMI Mi band (1)||steps|
|
||||||
| iNode Energy Meter (1)||power/energy/battery|
|
| iNode Energy Meter (1)||power/energy/battery|
|
||||||
| Thermobeacon|WS02|temperature/humidity/volt|
|
| Thermobeacon|WS02|temperature/humidity/volt|
|
||||||
|
| ATorch Battery Capacity Monitor|DT24|volt/amp/watt|
|
||||||
|
|
||||||
Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/)
|
Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/)
|
||||||
|
|
||||||
|
|||||||
@@ -550,6 +550,21 @@ void WS02Discovery(const char* mac, const char* sensorModel) {
|
|||||||
createDiscoveryFromList(mac, WS02sensor, WS02parametersCount, "WS02", "SensorBlue", sensorModel);
|
createDiscoveryFromList(mac, WS02sensor, WS02parametersCount, "WS02", "SensorBlue", sensorModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DT24Discovery(const char* mac, const char* sensorModel) {
|
||||||
|
# define DT24parametersCount 5
|
||||||
|
Log.trace(F("DT24Discovery" CR));
|
||||||
|
const char* DT24sensor[DT24parametersCount][8] = {
|
||||||
|
{"sensor", "DT24-volt", mac, "power", jsonVolt, "", "", "V"},
|
||||||
|
{"sensor", "DT24-amp", mac, "power", jsonCurrent, "", "", "A"},
|
||||||
|
{"sensor", "DT24-watt", mac, "power", jsonPower, "", "", "W"},
|
||||||
|
{"sensor", "DT24-watt-hour", mac, "power", jsonEnergy, "", "", "kWh"},
|
||||||
|
{"sensor", "DT24-price", mac, "", jsonMsg, "", "", ""}
|
||||||
|
//component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement
|
||||||
|
};
|
||||||
|
|
||||||
|
createDiscoveryFromList(mac, DT24sensor, DT24parametersCount, "DT24", "ATorch", sensorModel);
|
||||||
|
}
|
||||||
|
|
||||||
# else
|
# else
|
||||||
void MiFloraDiscovery(const char* mac, const char* sensorModel) {}
|
void MiFloraDiscovery(const char* mac, const char* sensorModel) {}
|
||||||
void VegTrugDiscovery(const char* mac, const char* sensorModel) {}
|
void VegTrugDiscovery(const char* mac, const char* sensorModel) {}
|
||||||
@@ -572,6 +587,7 @@ void LYWSD03MMCDiscovery(const char* mac, const char* sensorModel) {}
|
|||||||
void MHO_C401Discovery(const char* mac, const char* sensorModel) {}
|
void MHO_C401Discovery(const char* mac, const char* sensorModel) {}
|
||||||
void INodeEMDiscovery(const char* mac, const char* sensorModel) {}
|
void INodeEMDiscovery(const char* mac, const char* sensorModel) {}
|
||||||
void WS02Discovery(const char* mac, const char* sensorModel) {}
|
void WS02Discovery(const char* mac, const char* sensorModel) {}
|
||||||
|
void DT24Discovery(const char* mac, const char* sensorModel) {}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef ESP32
|
# ifdef ESP32
|
||||||
@@ -700,6 +716,8 @@ void notifyCB(
|
|||||||
if (!ProcessLock) {
|
if (!ProcessLock) {
|
||||||
Log.trace(F("Callback from %s characteristic" CR), pBLERemoteCharacteristic->getUUID().toString().c_str());
|
Log.trace(F("Callback from %s characteristic" CR), pBLERemoteCharacteristic->getUUID().toString().c_str());
|
||||||
|
|
||||||
|
// This logic needs refactoring and should be changed to a device/model approach based on the sensor macAdr lookup. Growing this beyond 2 devices will get too cumbersome
|
||||||
|
|
||||||
if (length == 5) {
|
if (length == 5) {
|
||||||
Log.trace(F("Device identified creating BLE buffer" CR));
|
Log.trace(F("Device identified creating BLE buffer" CR));
|
||||||
JsonObject& BLEdata = getBTJsonObject();
|
JsonObject& BLEdata = getBTJsonObject();
|
||||||
@@ -722,6 +740,34 @@ void notifyCB(
|
|||||||
BLEdata.set("volt", (float)(((pData[4] * 256) + pData[3]) / 1000.0));
|
BLEdata.set("volt", (float)(((pData[4] * 256) + pData[3]) / 1000.0));
|
||||||
BLEdata.set("batt", (float)(((((pData[4] * 256) + pData[3]) / 1000.0) - 2.1) * 100));
|
BLEdata.set("batt", (float)(((((pData[4] * 256) + pData[3]) / 1000.0) - 2.1) * 100));
|
||||||
|
|
||||||
|
pubBT(BLEdata);
|
||||||
|
} else if (length == 20) {
|
||||||
|
// DT24-BLE data format
|
||||||
|
// https://github.com/NiceLabs/atorch-console/blob/master/docs/protocol-design.md#dc-meter-report
|
||||||
|
// Data comes as two packets ( 20 and 16 ), and am only processing first
|
||||||
|
Log.trace(F("Device identified creating BLE buffer" CR));
|
||||||
|
JsonObject& BLEdata = getBTJsonObject();
|
||||||
|
String mac_adress = pBLERemoteCharacteristic->getRemoteService()->getClient()->getPeerAddress().toString().c_str();
|
||||||
|
mac_adress.toUpperCase();
|
||||||
|
for (vector<BLEdevice*>::iterator it = devices.begin(); it != devices.end(); ++it) {
|
||||||
|
BLEdevice* p = *it;
|
||||||
|
if ((strcmp(p->macAdr, (char*)mac_adress.c_str()) == 0)) {
|
||||||
|
if (p->sensorModel == LYWSD03MMC)
|
||||||
|
BLEdata.set("model", "LYWSD03MMC");
|
||||||
|
else if (p->sensorModel == MHO_C401)
|
||||||
|
BLEdata.set("model", "MHO_C401");
|
||||||
|
else if (p->sensorModel == DT24)
|
||||||
|
BLEdata.set("model", "DT24");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BLEdata.set("id", (char*)mac_adress.c_str());
|
||||||
|
Log.trace(F("Device identified in CB: %s" CR), (char*)mac_adress.c_str());
|
||||||
|
BLEdata.set("volt", (float)(((pData[4] * 256 * 256) + (pData[5] * 256) + pData[6]) / 10.0));
|
||||||
|
BLEdata.set("amp", (float)(((pData[7] * 256 * 256) + (pData[8] * 256) + pData[9]) / 1000.0));
|
||||||
|
BLEdata.set("watt", (float)(((pData[10] * 256 * 256) + (pData[11] * 256) + pData[12]) / 10.0));
|
||||||
|
BLEdata.set("watt hour", (float)(((pData[13] * 256 * 256 * 256) + (pData[14] * 256 * 256) + (pData[15] * 256) + pData[16]) / 100.0));
|
||||||
|
BLEdata.set("price", (float)(((pData[17] * 256 * 256) + (pData[18] * 256) + pData[19]) / 100.0));
|
||||||
|
|
||||||
pubBT(BLEdata);
|
pubBT(BLEdata);
|
||||||
} else {
|
} else {
|
||||||
Log.notice(F("Device not identified" CR));
|
Log.notice(F("Device not identified" CR));
|
||||||
@@ -772,6 +818,40 @@ void BLEconnect() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
NimBLEDevice::deleteClient(pClient);
|
NimBLEDevice::deleteClient(pClient);
|
||||||
|
} else if (p->sensorModel == DT24) {
|
||||||
|
Log.trace(F("Model to connect found: %s" CR), p->macAdr);
|
||||||
|
NimBLEClient* pClient;
|
||||||
|
pClient = BLEDevice::createClient();
|
||||||
|
BLEUUID serviceUUID("ffe0");
|
||||||
|
BLEUUID charUUID("ffe1");
|
||||||
|
BLEAddress sensorAddress(p->macAdr);
|
||||||
|
if (!pClient->connect(sensorAddress)) {
|
||||||
|
Log.notice(F("Failed to find client: %s" CR), p->macAdr);
|
||||||
|
} else {
|
||||||
|
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
|
||||||
|
if (!pRemoteService) {
|
||||||
|
Log.notice(F("Failed to find service UUID: %s" CR), serviceUUID.toString().c_str());
|
||||||
|
} else {
|
||||||
|
Log.trace(F("Found service: %s" CR), serviceUUID.toString().c_str());
|
||||||
|
// Obtain a reference to the characteristic in the service of the remote BLE server.
|
||||||
|
if (pClient->isConnected()) {
|
||||||
|
Log.trace(F("Client isConnected, freeHeap: %d" CR), ESP.getFreeHeap());
|
||||||
|
BLERemoteCharacteristic* pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
|
||||||
|
if (!pRemoteCharacteristic) {
|
||||||
|
Log.notice(F("Failed to find characteristic UUID: %s" CR), charUUID.toString().c_str());
|
||||||
|
} else {
|
||||||
|
if (pRemoteCharacteristic->canNotify()) {
|
||||||
|
Log.trace(F("Registering notification" CR));
|
||||||
|
pRemoteCharacteristic->subscribe(true, notifyCB);
|
||||||
|
delay(BLE_CNCT_TIMEOUT);
|
||||||
|
} else {
|
||||||
|
Log.notice(F("Failed registering notification" CR));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NimBLEDevice::deleteClient(pClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.notice(F("BLE Connect end" CR));
|
Log.notice(F("BLE Connect end" CR));
|
||||||
@@ -1075,6 +1155,7 @@ void launchBTDiscovery() {
|
|||||||
if (p->sensorModel == LYWSD03MMC || p->sensorModel == LYWSD03MMC_ATC || p->sensorModel == LYWSD03MMC_PVVX) LYWSD03MMCDiscovery(macWOdots.c_str(), "LYWSD03MMC");
|
if (p->sensorModel == LYWSD03MMC || p->sensorModel == LYWSD03MMC_ATC || p->sensorModel == LYWSD03MMC_PVVX) LYWSD03MMCDiscovery(macWOdots.c_str(), "LYWSD03MMC");
|
||||||
if (p->sensorModel == MHO_C401) MHO_C401Discovery(macWOdots.c_str(), "MHO_C401");
|
if (p->sensorModel == MHO_C401) MHO_C401Discovery(macWOdots.c_str(), "MHO_C401");
|
||||||
if (p->sensorModel == INODE_EM) INodeEMDiscovery(macWOdots.c_str(), "INODE_EM");
|
if (p->sensorModel == INODE_EM) INodeEMDiscovery(macWOdots.c_str(), "INODE_EM");
|
||||||
|
if (p->sensorModel == DT24) DT24Discovery(macWOdots.c_str(), "DT24-BLE");
|
||||||
p->isDisc = true; // we don't need the semaphore and all the search magic via createOrUpdateDevice
|
p->isDisc = true; // we don't need the semaphore and all the search magic via createOrUpdateDevice
|
||||||
} else {
|
} else {
|
||||||
if (!isDiscovered(p)) {
|
if (!isDiscovered(p)) {
|
||||||
@@ -1310,6 +1391,14 @@ JsonObject& process_bledata(JsonObject& BLEdata) {
|
|||||||
createOrUpdateDevice(mac, device_flags_init, IBT4XS);
|
createOrUpdateDevice(mac, device_flags_init, IBT4XS);
|
||||||
return process_inkbird_4xs(BLEdata);
|
return process_inkbird_4xs(BLEdata);
|
||||||
}
|
}
|
||||||
|
Log.trace(F("Is it a DT24?" CR));
|
||||||
|
if (strcmp(name, "DT24-BLE") == 0) {
|
||||||
|
Log.trace(F("DT24 data reading data reading" CR));
|
||||||
|
BLEdata.set("model", "DT24");
|
||||||
|
if (device->sensorModel == -1)
|
||||||
|
createOrUpdateDevice(mac, device_flags_init, DT24);
|
||||||
|
return BLEdata;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Log.trace(F("Is it a iNode Energy Meter?" CR));
|
Log.trace(F("Is it a iNode Energy Meter?" CR));
|
||||||
if (strlen(manufacturerdata) == 26 && ((long)value_from_hex_data(manufacturerdata, 0, 4, true) & 0xFFF9) == 0x8290) {
|
if (strlen(manufacturerdata) == 26 && ((long)value_from_hex_data(manufacturerdata, 0, 4, true) & 0xFFF9) == 0x8290) {
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ enum ble_sensor_model {
|
|||||||
WS02,
|
WS02,
|
||||||
IBSTH2,
|
IBSTH2,
|
||||||
IBT4XS,
|
IBT4XS,
|
||||||
|
DT24,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*-------------------PIN DEFINITIONS----------------------*/
|
/*-------------------PIN DEFINITIONS----------------------*/
|
||||||
|
|||||||
Reference in new issue
Block a user