From caecc5cb3347f2976225f780e14f1fd92e504b30 Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:57:57 -0500 Subject: [PATCH 1/5] TuyaMCU Precise Temperature Sensor packetValue now interpreted as float based on configuration of TempRes command. Beware TempRes default may be 1 thus a TuyaMCU device may need TempRes set to 0 after this change if it's currently working. See https://github.com/arendst/Tasmota/issues/10917 --- tasmota/xdrv_16_tuyamcu.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 5f94e576d..a66f6e170 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -1295,7 +1295,7 @@ void TuyaSensorsShow(bool json) GetTextIndexed(sname, sizeof(sname), (sensor-71), kTuyaSensors); ResponseAppend_P(PSTR("\"%s\":%s"), sname, - (Tuya.SensorsValid[sensor-71] ? dtostrfd(Tuya.Sensors[sensor-71], res, tempval) : PSTR("null"))); + (Tuya.SensorsValid[sensor-71] ? dtostrfd((float)Tuya.Sensors[sensor-71] / pow(10, res), res, tempval) : PSTR("null"))); added = true; } #ifdef USE_WEBSERVER @@ -1303,11 +1303,11 @@ void TuyaSensorsShow(bool json) if (TuyaGetDpId(sensor) != 0) { switch (sensor) { case 71: - WSContentSend_Temp("", Tuya.Sensors[0]); + WSContentSend_Temp("", (float)Tuya.Sensors[0] / pow(10, Settings.flag2.temperature_resolution)); break; case 72: WSContentSend_PD(PSTR("{s}" D_TEMPERATURE " Set{m}%s " D_UNIT_DEGREE "%c{e}"), - dtostrfd(Tuya.Sensors[1], Settings.flag2.temperature_resolution, tempval), TempUnit()); + dtostrfd((float)Tuya.Sensors[1] / pow(10, Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); break; case 73: WSContentSend_PD(HTTP_SNS_HUM, "", dtostrfd(Tuya.Sensors[2], Settings.flag2.temperature_resolution, tempval)); From 5e9fe677f387bcde7ad226cbb8ff5c03b9566aae Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 14:48:55 -0500 Subject: [PATCH 2/5] Precise temperature without pow Implement TuyaAdjustedTemperature which takes precision to offset the integer value. Using TempRes parameter as these should align --- tasmota/xdrv_16_tuyamcu.ino | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index a66f6e170..9c9221b07 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -318,6 +318,23 @@ int StrCmpNoCase(char const *Str1, char const *Str2) // Compare case sensistive } } +float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) +{ + switch (res) + { + case 1: + return packetValue/10; + break; + case 2: + return packetValue/100; + break; + case 3: + return packetValue/1000; + break; + default: + return (float)packetValue; + } +} /*********************************************************************************************\ * Internal Functions \*********************************************************************************************/ @@ -1295,7 +1312,7 @@ void TuyaSensorsShow(bool json) GetTextIndexed(sname, sizeof(sname), (sensor-71), kTuyaSensors); ResponseAppend_P(PSTR("\"%s\":%s"), sname, - (Tuya.SensorsValid[sensor-71] ? dtostrfd((float)Tuya.Sensors[sensor-71] / pow(10, res), res, tempval) : PSTR("null"))); + (Tuya.SensorsValid[sensor-71] ? dtostrfd(TuyaAdjustedTemperature(Tuya.Sensors[sensor-71], res), res, tempval) : PSTR("null"))); added = true; } #ifdef USE_WEBSERVER @@ -1303,11 +1320,11 @@ void TuyaSensorsShow(bool json) if (TuyaGetDpId(sensor) != 0) { switch (sensor) { case 71: - WSContentSend_Temp("", (float)Tuya.Sensors[0] / pow(10, Settings.flag2.temperature_resolution)); + WSContentSend_Temp("", TuyaAdjustedTemperature(Tuya.Sensors[0], Settings.flag2.temperature_resolution)); break; case 72: WSContentSend_PD(PSTR("{s}" D_TEMPERATURE " Set{m}%s " D_UNIT_DEGREE "%c{e}"), - dtostrfd((float)Tuya.Sensors[1] / pow(10, Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); + dtostrfd(TuyaAdjustedTemperature(Tuya.Sensors[1], Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); break; case 73: WSContentSend_PD(HTTP_SNS_HUM, "", dtostrfd(Tuya.Sensors[2], Settings.flag2.temperature_resolution, tempval)); From 5af6c1baeca03bfdb512ab145407b3f48c43c722 Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 14:55:33 -0500 Subject: [PATCH 3/5] Fix missing divisor Fix missing divisior --- tasmota/xdrv_16_tuyamcu.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 9c9221b07..2f4c17c1c 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -749,7 +749,7 @@ void TuyaProcessStatePacket(void) { } else { res = Settings.flag2.temperature_resolution; } GetTextIndexed(sname, sizeof(sname), (fnId-71), kTuyaSensors); ResponseClear(); // Clear retained message - Response_P(PSTR("{\"TuyaSNS\":{\"%s\":%s}}"), sname, dtostrfd(packetValue, res, tempval)); // sensor update is just on change + Response_P(PSTR("{\"TuyaSNS\":{\"%s\":%s}}"), sname, dtostrfd(TuyaAdjustedTemperature(packetValue, res), res, tempval)); // sensor update is just on change MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_CMND_SENSOR)); } } From acb2f6e1d93ce3e9b35e5ce407ad40b3b103ce0c Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 16:20:26 -0500 Subject: [PATCH 4/5] Fix loss of precision Fix loss of precision regression --- tasmota/xdrv_16_tuyamcu.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 2f4c17c1c..579a85234 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -323,16 +323,17 @@ float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) switch (res) { case 1: - return packetValue/10; + return (float)packetValue / 10; break; case 2: - return packetValue/100; + return (float)packetValue / 100; break; case 3: - return packetValue/1000; + return (float)packetValue / 1000; break; default: return (float)packetValue; + break; } } /*********************************************************************************************\ From e6757fed3d69e9d1f6803dc34b619452d230036d Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 16:49:59 -0500 Subject: [PATCH 5/5] Update xdrv_16_tuyamcu.ino Change type uint8_t to uint16_t on TuyaAdjustedTemperature to support temperatures over 25.5 or 255 degrees. --- tasmota/xdrv_16_tuyamcu.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 579a85234..8f4d8e8d8 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -318,18 +318,18 @@ int StrCmpNoCase(char const *Str1, char const *Str2) // Compare case sensistive } } -float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) +float TuyaAdjustedTemperature(uint16_t packetValue, uint8_t res) { switch (res) { case 1: - return (float)packetValue / 10; + return (float)packetValue / 10.0; break; case 2: - return (float)packetValue / 100; + return (float)packetValue / 100.0; break; case 3: - return (float)packetValue / 1000; + return (float)packetValue / 1000.0; break; default: return (float)packetValue;