From 489ce99659565866391fcc1250913ac5cc639e6f Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Tue, 12 May 2020 15:05:37 -0500 Subject: [PATCH] Implement OpenHAB autodiscovery (#612) --- docs/img/OpenMQTTgateway_OpenHAB_Control.png | Bin 0 -> 13460 bytes docs/integrate/openhab2.md | 13 ++++ main/ZgatewayBT.ino | 52 +++++++------- main/ZmqttDiscovery.ino | 72 +++++++++---------- main/config_mqttDiscovery.h | 56 +++++++++++++++ 5 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 docs/img/OpenMQTTgateway_OpenHAB_Control.png diff --git a/docs/img/OpenMQTTgateway_OpenHAB_Control.png b/docs/img/OpenMQTTgateway_OpenHAB_Control.png new file mode 100644 index 0000000000000000000000000000000000000000..50a2a7926a0c0b33f6b3eca18e25ac6626b506ee GIT binary patch literal 13460 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.4 You should have a mqtt broker installed (either mosquitto or the OpenHAB2 embedded one) diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index ad5d587..f10d02b 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -149,10 +149,10 @@ void MiFloraDiscovery(char *mac) #define MiFloraparametersCount 4 Log.trace(F("MiFloraDiscovery" CR)); char *MiFlorasensor[MiFloraparametersCount][8] = { - {"sensor", "MiFlora-lux", mac, "illuminance", "{{ value_json.lux | is_defined }}", "", "", "lu"}, - {"sensor", "MiFlora-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "MiFlora-fer", mac, "", "{{ value_json.fer | is_defined }}", "", "", "µS/cm"}, - {"sensor", "MiFlora-moi", mac, "", "{{ value_json.moi | is_defined }}", "", "", "%"} + {"sensor", "MiFlora-lux", mac, "illuminance", jsonLux, "", "", "lu"}, + {"sensor", "MiFlora-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "MiFlora-fer", mac, "", jsonFer, "", "", "µS/cm"}, + {"sensor", "MiFlora-moi", mac, "", jsonMoi, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -165,10 +165,10 @@ void VegTrugDiscovery(char *mac) #define VegTrugparametersCount 4 Log.trace(F("VegTrugDiscovery" CR)); char *VegTrugsensor[VegTrugparametersCount][8] = { - {"sensor", "VegTrug-lux", mac, "illuminance", "{{ value_json.lux | is_defined }}", "", "", "lu"}, - {"sensor", "VegTrug-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "VegTrug-fer", mac, "", "{{ value_json.fer | is_defined }}", "", "", "µS/cm"}, - {"sensor", "VegTrug-moi", mac, "", "{{ value_json.moi | is_defined }}", "", "", "%"} + {"sensor", "VegTrug-lux", mac, "illuminance", jsonLux, "", "", "lu"}, + {"sensor", "VegTrug-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "VegTrug-fer", mac, "", jsonFer, "", "", "µS/cm"}, + {"sensor", "VegTrug-moi", mac, "", jsonMoi, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -181,9 +181,9 @@ void MiJiaDiscovery(char *mac) #define MiJiaparametersCount 3 Log.trace(F("MiJiaDiscovery" CR)); char *MiJiasensor[MiJiaparametersCount][8] = { - {"sensor", "MiJia-batt", mac, "battery", "{{ value_json.batt | is_defined }}", "", "", "%"}, - {"sensor", "MiJia-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "MiJia-hum", mac, "humidity", "{{ value_json.hum | is_defined }}", "", "", "%"} + {"sensor", "MiJia-batt", mac, "battery", jsonBatt, "", "", "%"}, + {"sensor", "MiJia-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "MiJia-hum", mac, "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -196,9 +196,9 @@ void LYWSD02Discovery(char *mac) #define LYWSD02parametersCount 3 Log.trace(F("LYWSD02Discovery" CR)); char *LYWSD02sensor[LYWSD02parametersCount][8] = { - {"sensor", "LYWSD02-batt", mac, "battery", "{{ value_json.batt | is_defined }}", "", "", "V"}, - {"sensor", "LYWSD02-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "LYWSD02-hum", mac, "humidity", "{{ value_json.hum | is_defined }}", "", "", "%"} + {"sensor", "LYWSD02-batt", mac, "battery", jsonBatt, "", "", "V"}, + {"sensor", "LYWSD02-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "LYWSD02-hum", mac, "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -211,9 +211,9 @@ void CLEARGRASSTRHDiscovery(char *mac) #define CLEARGRASSTRHparametersCount 3 Log.trace(F("CLEARGRASSTRHDiscovery" CR)); char *CLEARGRASSTRHsensor[CLEARGRASSTRHparametersCount][8] = { - {"sensor", "CLEARGRASSTRH-batt", mac, "battery", "{{ value_json.batt | is_defined }}", "", "", "V"}, - {"sensor", "CLEARGRASSTRH-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "CLEARGRASSTRH-hum", mac, "humidity", "{{ value_json.hum | is_defined }}", "", "", "%"} + {"sensor", "CLEARGRASSTRH-batt", mac, "battery", jsonBatt, "", "", "V"}, + {"sensor", "CLEARGRASSTRH-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "CLEARGRASSTRH-hum", mac, "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -226,9 +226,9 @@ void CLEARGRASSCGD1Discovery(char *mac) #define CLEARGRASSCGD1parametersCount 3 Log.trace(F("CLEARGRASSCGD1Discovery" CR)); char *CLEARGRASSCGD1sensor[CLEARGRASSCGD1parametersCount][8] = { - {"sensor", "CLEARGRASSCGD1-batt", mac, "battery", "{{ value_json.batt | is_defined }}", "", "", "V"}, - {"sensor", "CLEARGRASSCGD1-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "CLEARGRASSCGD1-hum", mac, "humidity", "{{ value_json.hum | is_defined }}", "", "", "%"} + {"sensor", "CLEARGRASSCGD1-batt", mac, "battery", jsonBatt, "", "", "V"}, + {"sensor", "CLEARGRASSCGD1-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "CLEARGRASSCGD1-hum", mac, "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -241,9 +241,9 @@ void CLEARGRASSTRHKPADiscovery(char *mac) #define CLEARGRASSTRHKPAparametersCount 3 Log.trace(F("CLEARGRASSTRHKPADiscovery" CR)); char *CLEARGRASSTRHKPAsensor[CLEARGRASSTRHKPAparametersCount][8] = { - {"sensor", "CLEARGRASSTRHKPA-pres", mac, "pressure", "{{ value_json.pres | is_defined }}", "", "", "kPa"}, - {"sensor", "CLEARGRASSTRHKPA-tem", mac, "temperature", "{{ value_json.tem | is_defined }}", "", "", "°C"}, - {"sensor", "CLEARGRASSTRHKPA-hum", mac, "humidity", "{{ value_json.hum | is_defined }}", "", "", "%"} + {"sensor", "CLEARGRASSTRHKPA-pres", mac, "pressure", jsonPres, "", "", "kPa"}, + {"sensor", "CLEARGRASSTRHKPA-tem", mac, "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "CLEARGRASSTRHKPA-hum", mac, "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -256,7 +256,7 @@ void MiScaleDiscovery(char *mac) #define MiScaleparametersCount 1 Log.trace(F("MiScaleDiscovery" CR)); char *MiScalesensor[MiScaleparametersCount][8] = { - {"sensor", "MiScale-weight", mac, "", "{{ value_json.weight | is_defined }}", "", "", "kg"}, + {"sensor", "MiScale-weight", mac, "", jsonWeight, "", "", "kg"}, //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -269,7 +269,7 @@ void MiLampDiscovery(char *mac) #define MiLampparametersCount 1 Log.trace(F("MiLampDiscovery" CR)); char *MiLampsensor[MiLampparametersCount][8] = { - {"sensor", "MiLamp-presence", mac, "", "{{ value_json.presence}}", "", "", "d"}, + {"sensor", "MiLamp-presence", mac, "", jsonPresence, "", "", "d"}, //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -282,7 +282,7 @@ void MiBandDiscovery(char *mac) #define MiBandparametersCount 1 Log.trace(F("MiBandDiscovery" CR)); char *MiBandsensor[MiBandparametersCount][8] = { - {"sensor", "MiBand-steps", mac, "", "{{ value_json.steps | is_defined }}", "", "", "nb"}, + {"sensor", "MiBand-steps", mac, "", jsonStep, "", "", "nb"}, //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; diff --git a/main/ZmqttDiscovery.ino b/main/ZmqttDiscovery.ino index ed43adc..51ed4d7 100644 --- a/main/ZmqttDiscovery.ino +++ b/main/ZmqttDiscovery.ino @@ -109,14 +109,6 @@ void createDiscovery(char *sensor_type, sensor.set("cmd_t", command_topic); //command_topic } - /*if (strcmp(s_name, Gateway_Name) == 0){ - JsonArray &json_attributes = sensor.createNestedArray("json_attributes"); - json_attributes.add("uptime"); - json_attributes.add("freemem"); - json_attributes.add("rssi"); - json_attributes.add("SSID"); -}*/ - if (child_device) { StaticJsonBuffer jsonDeviceBuffer; @@ -161,12 +153,12 @@ void pubMqttDiscovery() #define BMEparametersCount 6 Log.trace(F("bme280Discovery" CR)); char *BMEsensor[BMEparametersCount][8] = { - {"sensor", "tempc", "bme", "temperature", "{{ value_json.tempc }}", "", "", "°C"}, - {"sensor", "tempf", "bme", "temperature", "{{ value_json.tempf }}", "", "", "°F"}, - {"sensor", "pa", "bme", "", "{{ float(value_json.pa) * 0.01 }}", "", "", "hPa"}, - {"sensor", "hum", "bme", "humidity", "{{ value_json.hum }}", "", "", "%"}, - {"sensor", "altim", "bme", "", "{{ value_json.altim }}", "", "", "m"}, - {"sensor", "altift", "bme", "", "{{ value_json.altift }}", "", "", "ft"} + {"sensor", "tempc", "bme", "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "tempf", "bme", "temperature", jsonTempf, "", "", "°F"}, + {"sensor", "pa", "bme", "", jsonPa, "", "", "hPa"}, + {"sensor", "hum", "bme", "humidity", jsonHum, "", "", "%"}, + {"sensor", "altim", "bme", "", jsonAltim, "", "", "m"}, + {"sensor", "altift", "bme", "", jsonAltif, "", "", "ft"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -186,9 +178,9 @@ void pubMqttDiscovery() #define HTUparametersCount 3 Log.trace(F("htu21Discovery" CR)); char *HTUsensor[HTUparametersCount][8] = { - {"sensor", "tempc", "htu", "temperature", "{{ value_json.tempc }}", "", "", "°C"}, - {"sensor", "tempf", "htu", "temperature", "{{ value_json.tempf }}", "", "", "°F"}, - {"sensor", "hum", "htu", "humidity", "{{ value_json.hum }}", "", "", "%"} + {"sensor", "tempc", "htu", "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "tempf", "htu", "temperature", jsonTempf, "", "", "°F"}, + {"sensor", "hum", "htu", "humidity", jsonHum, "", "", "%"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -208,8 +200,8 @@ void pubMqttDiscovery() #define DHTparametersCount 2 Log.trace(F("DHTDiscovery" CR)); char *DHTsensor[DHTparametersCount][8] = { - {"sensor", "tempc", "dht", "temperature", "{{ value_json.temp }}", "", "", "°C"}, - {"sensor", "hum", "dht", "humidity", "{{ value_json.hum }}", "", "", "%"}}; + {"sensor", "tempc", "dht", "temperature", jsonTemp, "", "", "°C"}, + {"sensor", "hum", "dht", "humidity", jsonHum, "", "", "%"}}; for (int i = 0; i < DHTparametersCount; i++) { @@ -225,7 +217,7 @@ void pubMqttDiscovery() #ifdef ZsensorADC Log.trace(F("ADCDiscovery" CR)); - char *ADCsensor[8] = {"sensor", "adc", "", "", "{{ value_json.adc }}", "", "", ""}; + char *ADCsensor[8] = {"sensor", "adc", "", "", jsonAdc, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -241,9 +233,9 @@ void pubMqttDiscovery() #define BH1750parametersCount 3 Log.trace(F("BH1750Discovery" CR)); char *BH1750sensor[BH1750parametersCount][8] = { - {"sensor", "lux", "BH1750", "illuminance", "{{ value_json.lux }}", "", "", "lu"}, - {"sensor", "ftCd", "BH1750", "", "{{ value_json.ftCd }}", "", "", ""}, - {"sensor", "wattsm2", "BH1750", "", "{{ value_json.wattsm2 }}", "", "", "wm²"} + {"sensor", "lux", "BH1750", "illuminance", jsonLux, "", "", "lu"}, + {"sensor", "ftCd", "BH1750", "", jsonFtcd, "", "", ""}, + {"sensor", "wattsm2", "BH1750", "", jsonWm2, "", "", "wm²"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -263,9 +255,9 @@ void pubMqttDiscovery() #define TSL2561parametersCount 3 Log.trace(F("TSL2561Discovery" CR)); char *TSL2561sensor[TSL2561parametersCount][8] = { - {"sensor", "lux", "TSL2561", "illuminance", "{{ value_json.lux }}", "", "", "lu"}, - {"sensor", "ftcd", "TSL2561", "", "{{ value_json.ftcd }}", "", "", ""}, - {"sensor", "wattsm2", "TSL2561", "", "{{ value_json.wattsm2 }}", "", "", "wm²"} + {"sensor", "lux", "TSL2561", "illuminance", jsonLux, "", "", "lu"}, + {"sensor", "ftcd", "TSL2561", "", jsonFtcd, "", "", ""}, + {"sensor", "wattsm2", "TSL2561", "", jsonWm2, "", "", "wm²"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -283,7 +275,7 @@ void pubMqttDiscovery() #ifdef ZsensorHCSR501 Log.trace(F("HCSR501Discovery" CR)); - char *HCSR501sensor[8] = {"binary_sensor", "hcsr501", "", "", "{{value_json.hcsr501}}", "true", "false", ""}; + char *HCSR501sensor[8] = {"binary_sensor", "hcsr501", "", "", jsonPresence, "true", "false", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -297,7 +289,7 @@ void pubMqttDiscovery() #ifdef ZsensorGPIOInput Log.trace(F("GPIOInputDiscovery" CR)); - char *GPIOInputsensor[8] = {"binary_sensor", "GPIOInput", "", "", "{{value_json.gpio}}", "HIGH", "LOW", ""}; + char *GPIOInputsensor[8] = {"binary_sensor", "GPIOInput", "", "", jsonGpio, "HIGH", "LOW", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -313,9 +305,9 @@ void pubMqttDiscovery() #define INA226parametersCount 3 Log.trace(F("INA226Discovery" CR)); char *INA226sensor[INA226parametersCount][8] = { - {"sensor", "volt", "INA226", "", "{{ value_json.volt }}", "", "", "V"}, - {"sensor", "current", "INA226", "", "{{ value_json.current }}", "", "", "A"}, - {"sensor", "power", "INA226", "", "{{ value_json.power }}", "", "", "W"} + {"sensor", "volt", "INA226", "", jsonVolt, "", "", "V"}, + {"sensor", "current", "INA226", "", jsonCurrent, "", "", "A"}, + {"sensor", "power", "INA226", "", jsonPower, "", "", "W"} //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement }; @@ -348,7 +340,7 @@ void pubMqttDiscovery() #ifdef ZgatewayRF // Sensor to display RF received value Log.trace(F("gatewayRFDiscovery" CR)); - char *gatewayRF[8] = {"sensor", "gatewayRF", "", "", "{{ value_json.value }}", "", "", ""}; + char *gatewayRF[8] = {"sensor", "gatewayRF", "", "", jsonVal, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -363,7 +355,7 @@ void pubMqttDiscovery() #ifdef ZgatewayRF2 // Sensor to display RF received value Log.trace(F("gatewayRF2Discovery" CR)); - char *gatewayRF2[8] = {"sensor", "gatewayRF2", "", "", "{{ value_json.value }}", "", "", ""}; + char *gatewayRF2[8] = {"sensor", "gatewayRF2", "", "", jsonVal, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -378,7 +370,7 @@ void pubMqttDiscovery() #ifdef ZgatewayRFM69 // Sensor to display RF received value Log.trace(F("gatewayRFM69Discovery" CR)); - char *gatewayRFM69[8] = {"sensor", "gatewayRFM69", "", "", "{{ value_json.value }}", "", "", ""}; + char *gatewayRFM69[8] = {"sensor", "gatewayRFM69", "", "", jsonVal, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -393,7 +385,7 @@ void pubMqttDiscovery() #ifdef ZgatewayLORA // Sensor to display RF received value Log.trace(F("gatewayLORADiscovery" CR)); - char *gatewayLORA[8] = {"sensor", "gatewayLORA", "", "", "{{ value_json.message }}", "", "", ""}; + char *gatewayLORA[8] = {"sensor", "gatewayLORA", "", "", jsonMsg, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -408,7 +400,7 @@ void pubMqttDiscovery() #ifdef ZgatewaySRFB // Sensor to display RF received value Log.trace(F("gatewaySRFBDiscovery" CR)); - char *gatewaySRFB[8] = {"sensor", "gatewaySRFB", "", "", "{{ value_json.value }}", "", "", ""}; + char *gatewaySRFB[8] = {"sensor", "gatewaySRFB", "", "", jsonVal, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -423,7 +415,7 @@ void pubMqttDiscovery() #ifdef ZgatewayPilight // Sensor to display RF received value Log.trace(F("gatewayPilightDiscovery" CR)); - char *gatewayPilight[8] = {"sensor", "gatewayPilight", "", "", "{{ value_json.message }}", "", "", ""}; + char *gatewayPilight[8] = {"sensor", "gatewayPilight", "", "", jsonMsg, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -438,7 +430,7 @@ void pubMqttDiscovery() #ifdef ZgatewayIR // Sensor to display IR received value Log.trace(F("gatewayIRDiscovery" CR)); - char *gatewayIR[8] = {"sensor", "gatewayIR", "", "", "{{ value_json.value }}", "", "", ""}; + char *gatewayIR[8] = {"sensor", "gatewayIR", "", "", jsonVal, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -453,7 +445,7 @@ void pubMqttDiscovery() #ifdef Zgateway2G // Sensor to display 2G received value Log.trace(F("gateway2GDiscovery" CR)); - char *gateway2G[8] = {"sensor", "gateway2G", "", "", "{{ value_json.message }}", "", "", ""}; + char *gateway2G[8] = {"sensor", "gateway2G", "", "", jsonMsg, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); @@ -468,7 +460,7 @@ void pubMqttDiscovery() #ifdef ZgatewayBT // Sensor to display BT received value Log.trace(F("gatewayBTDiscovery" CR)); - char *gatewayBT[8] = {"sensor", "gatewayBT", "", "", "{{ value_json.id }}", "", "", ""}; + char *gatewayBT[8] = {"sensor", "gatewayBT", "", "", jsonId, "", "", ""}; //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement Log.trace(F("CreateDiscoverySensor" CR)); diff --git a/main/config_mqttDiscovery.h b/main/config_mqttDiscovery.h index cfb2072..d740618 100644 --- a/main/config_mqttDiscovery.h +++ b/main/config_mqttDiscovery.h @@ -41,4 +41,60 @@ extern void createDiscovery(char * sensor_type, #define DEVICEMANUFACTURER "OMG_community" +/*-------------- Auto discovery macros-----------------*/ +// Set the line below to true so as to have autodiscovery working with OpenHAB +#define OpenHABDiscovery false + +#if OpenHABDiscovery // OpenHAB autodiscovery value key definition (is defined command is not supported by OpenHAB) +#define jsonBatt "{{ value_json.batt }}" +#define jsonLux "{{ value_json.lux }}" +#define jsonPres "{{ value_json.pres }}" +#define jsonFer "{{ value_json.fer }}" +#define jsonMoi "{{ value_json.moi }}" +#define jsonHum "{{ value_json.hum }}" +#define jsonTemp "{{ value_json.tem }}" +#define jsonStep "{{ value_json.steps }}" +#define jsonWeight "{{ value_json.weight }}" +#define jsonPresence "{{ value_json.presence }}" +#define jsonAltim "{{ value_json.altim }}" +#define jsonAltif "{{ value_json.altift }}" +#define jsonTempf "{{ value_json.tempf }}" +#define jsonMsg "{{ value_json.message }}" +#define jsonVal "{{ value_json.value }}" +#define jsonVolt "{{ value_json.volt }}" +#define jsonCurrent "{{ value_json.current }}" +#define jsonPower "{{ value_json.power }}" +#define jsonGpio "{{ value_json.gpio }}" +#define jsonFtcd "{{ value_json.ftcd }}" +#define jsonWm2 "{{ value_json.wattsm2 }}" +#define jsonAdc "{{ value_json.adc }}" +#define jsonPa "{{ float(value_json.pa) * 0.01 }}" +#define jsonId "{{ value_json.id }}" +#else // Home assistant autodiscovery value key definition +#define jsonBatt "{{ value_json.batt | is_defined }}" +#define jsonLux "{{ value_json.lux | is_defined }}" +#define jsonPres "{{ value_json.pres | is_defined }}" +#define jsonFer "{{ value_json.fer | is_defined }}" +#define jsonMoi "{{ value_json.moi | is_defined }}" +#define jsonHum "{{ value_json.hum | is_defined }}" +#define jsonTemp "{{ value_json.tem | is_defined }}" +#define jsonStep "{{ value_json.steps | is_defined }}" +#define jsonWeight "{{ value_json.weight | is_defined }}" +#define jsonPresence "{{ value_json.presence | is_defined }}" +#define jsonAltim "{{ value_json.altim | is_defined }}" +#define jsonAltif "{{ value_json.altift | is_defined }}" +#define jsonTempf "{{ value_json.tempf | is_defined }}" +#define jsonMsg "{{ value_json.message | is_defined }}" +#define jsonVal "{{ value_json.value | is_defined }}" +#define jsonVolt "{{ value_json.volt | is_defined }}" +#define jsonCurrent "{{ value_json.current | is_defined }}" +#define jsonPower "{{ value_json.power | is_defined }}" +#define jsonGpio "{{ value_json.gpio | is_defined }}" +#define jsonFtcd "{{ value_json.ftcd | is_defined }}" +#define jsonWm2 "{{ value_json.wattsm2 | is_defined }}" +#define jsonAdc "{{ value_json.adc | is_defined }}" +#define jsonPa "{{ float(value_json.pa) * 0.01 | is_defined }}" +#define jsonId "{{ value_json.id | is_defined }}" +#endif + #endif \ No newline at end of file