From caad5dde1a7a01c975329ad622c771e61baf69d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Rybicki?= Date: Thu, 3 Sep 2020 23:09:34 +0200 Subject: [PATCH] Add iNode Energy Meter support (#755) --- docs/prerequisites/devices.md | 1 + main/ZgatewayBT.ino | 39 +++++++++++++++++++++++++++++++++++ main/config_BT.h | 1 + main/config_mqttDiscovery.h | 2 ++ 4 files changed, 43 insertions(+) diff --git a/docs/prerequisites/devices.md b/docs/prerequisites/devices.md index 0102bd7..1490cbc 100644 --- a/docs/prerequisites/devices.md +++ b/docs/prerequisites/devices.md @@ -35,6 +35,7 @@ OpenMQTTGateway is able to scan all the BLE devices that advertise their data so | XIAOMI Mi Scale v1 *|XMTZC04HM|weight| | XIAOMI Mi Scale v2 *|XMTZC05HM|weight| | XIAOMI Mi band * ||steps| +| iNode Energy Meter * ||power,energy,battery| Exhaustive list [here](https://compatible.openmqttgateway.com/index.php/devices/ble-devices/) diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index dbe13ca..a6756cd 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -382,6 +382,19 @@ void MHO_C401Discovery(char* mac) { createDiscoveryFromList(mac, MHO_C401sensor, MHO_C401parametersCount); } +void INodeEMDiscovery(char* mac) { +# define INodeEMparametersCount 3 + Log.trace(F("INodeEMDiscovery" CR)); + char* INodeEMsensor[INodeEMparametersCount][8] = { + {"sensor", "iNodeEM-power", mac, "power", jsonPower, "", "", "W"}, + {"sensor", "iNodeEM-energy", mac, "", jsonEnergy, "", "", "kWh"}, + {"sensor", "iNodeEM-batt", mac, "battery", jsonBatt, "", "", "%"} + //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement + }; + + createDiscoveryFromList(mac, INodeEMsensor, INodeEMparametersCount); +} + # else void MiFloraDiscovery(char* mac) {} void VegTrugDiscovery(char* mac) {} @@ -397,6 +410,7 @@ void MiBandDiscovery(char* mac) {} void InkBirdDiscovery(char* mac) {} void LYWSD03MMCDiscovery(char* mac) {} void MHO_C401Discovery(char* mac) {} +void INodeEMDiscovery(char* mac) {} # endif # ifdef ESP32 @@ -871,6 +885,7 @@ void launchDiscovery() { if (p->sensorModel == INKBIRD) InkBirdDiscovery((char*)macWOdots.c_str()); if (p->sensorModel == LYWSD03MMC || p->sensorModel == LYWSD03MMC_ATC) LYWSD03MMCDiscovery((char*)macWOdots.c_str()); if (p->sensorModel == MHO_C401) MHO_C401Discovery((char*)macWOdots.c_str()); + if (p->sensorModel == INODE_EM) INodeEMDiscovery((char*)macWOdots.c_str()); createOrUpdateDevice(p->macAdr, device_flags_isDisc, p->sensorModel); } else { Log.trace(F("Device already discovered or UNKNOWN_MODEL" CR)); @@ -1060,6 +1075,14 @@ JsonObject& process_bledata(JsonObject& BLEdata) { return process_inkbird(BLEdata); } } + Log.trace(F("Is it a iNode Energy Meter?" CR)); + if (strlen(manufacturerdata) == 26 && ((long)value_from_service_data(manufacturerdata, 0, 4, true) & 0xFFF9) == 0x8290) { + Log.trace(F("iNode Energy Meter data reading" CR)); + BLEdata.set("model", "INODE_EM"); + if (device->sensorModel == -1) + createOrUpdateDevice(mac, device_flags_init, INODE_EM); + return process_inode_em(BLEdata); + } # if !pubBLEManufacturerData Log.trace(F("Remove manufacturer data" CR)); BLEdata.remove("manufacturerdata"); @@ -1236,6 +1259,22 @@ JsonObject& process_atc(JsonObject& BLEdata) { return BLEdata; } +JsonObject& process_inode_em(JsonObject& BLEdata) { + const char* manufacturerdata = BLEdata["manufacturerdata"].as(); + + long impPerKWh = value_from_service_data(manufacturerdata, 16, 4, true) & 0x3FFF; + double power = ((double)value_from_service_data(manufacturerdata, 4, 4, true) / impPerKWh) * 60000; + double energy = (double)value_from_service_data(manufacturerdata, 8, 8, true) / impPerKWh; + long battery = ((value_from_service_data(manufacturerdata, 20, 2, true) >> 4) - 2) * 10; + + //Set Json values + BLEdata.set("power", (double)power); + BLEdata.set("energy", (double)energy); + BLEdata.set("batt", battery); + + return BLEdata; +} + # ifdef subjectHomePresence void haRoomPresence(JsonObject& HomePresence) { int BLErssi = HomePresence["rssi"]; diff --git a/main/config_BT.h b/main/config_BT.h index 1c9660a..11c25a1 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -102,6 +102,7 @@ enum ble_sensor_model { LYWSD03MMC, MHO_C401, LYWSD03MMC_ATC, + INODE_EM }; /*-------------------PIN DEFINITIONS----------------------*/ diff --git a/main/config_mqttDiscovery.h b/main/config_mqttDiscovery.h index c8b61e6..28dd25f 100644 --- a/main/config_mqttDiscovery.h +++ b/main/config_mqttDiscovery.h @@ -66,6 +66,7 @@ extern void createDiscovery(char* sensor_type, # define jsonVolt "{{ value_json.volt }}" # define jsonCurrent "{{ value_json.current }}" # define jsonPower "{{ value_json.power }}" +# define jsonEnergy "{{ value_json.energy }}" # define jsonGpio "{{ value_json.gpio }}" # define jsonFtcd "{{ value_json.ftcd }}" # define jsonWm2 "{{ value_json.wattsm2 }}" @@ -93,6 +94,7 @@ extern void createDiscovery(char* sensor_type, # define jsonVolt "{{ value_json.volt | is_defined }}" # define jsonCurrent "{{ value_json.current | is_defined }}" # define jsonPower "{{ value_json.power | is_defined }}" +# define jsonEnergy "{{ value_json.energy | is_defined }}" # define jsonGpio "{{ value_json.gpio | is_defined }}" # define jsonFtcd "{{ value_json.ftcd | is_defined }}" # define jsonWm2 "{{ value_json.wattsm2 | is_defined }}"