diff --git a/sonoff/_changelog.ino b/sonoff/_changelog.ino
index b3eb22098..48f133a61 100644
--- a/sonoff/_changelog.ino
+++ b/sonoff/_changelog.ino
@@ -1,5 +1,6 @@
/* 6.3.0.2 20181101
* Add minutes to commands Timezone to allow all possible world timezones
+ * Add command SetOption24 0/1 to select pressure unit as hPa or mmHg (#4241)
*
* 6.3.0.1 20181031
* Add wifi status to Tuya (#4221)
diff --git a/sonoff/i18n.h b/sonoff/i18n.h
index 20d5bdfa7..587987c4d 100644
--- a/sonoff/i18n.h
+++ b/sonoff/i18n.h
@@ -99,6 +99,7 @@
#define D_JSON_REACTIVE_POWERUSAGE "ReactivePower"
#define D_JSON_PRESSURE "Pressure"
#define D_JSON_PRESSUREATSEALEVEL "SeaPressure"
+#define D_JSON_PRESSURE_UNIT "PressureUnit"
#define D_JSON_PROGRAMFLASHSIZE "ProgramFlashSize"
#define D_JSON_PROGRAMSIZE "ProgramSize"
#define D_JSON_RESET "Reset"
@@ -529,13 +530,8 @@ const char kOptionBlinkOff[] PROGMEM = "BLINKOFF|" D_BLINKOFF ;
#ifdef USE_WEBSERVER
const char HTTP_SNS_TEMP[] PROGMEM = "%s{s}%s " D_TEMPERATURE "{m}%s°%c{e}"; // {s} =
, {m} = | , {e} = |
const char HTTP_SNS_HUM[] PROGMEM = "%s{s}%s " D_HUMIDITY "{m}%s%%{e}"; // {s} = , {m} = | , {e} = |
-#ifndef USE_MMHG
-const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s " D_UNIT_PRESSURE "{e}"; // {s} = , {m} = | , {e} = |
-const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s " D_UNIT_PRESSURE "{e}"; // {s} = , {m} = | , {e} = |
-#else
-const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s " D_UNIT_MILLIMETER_MERCURY "{e}"; // {s} = , {m} = | , {e} = |
-const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s " D_UNIT_MILLIMETER_MERCURY "{e}"; // {s} = , {m} = | , {e} = |
-#endif
+const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s %s{e}"; // {s} = , {m} = | , {e} = |
+const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s %s{e}"; // {s} = , {m} = | , {e} = |
const char HTTP_SNS_ANALOG[] PROGMEM = "%s{s}%s " D_ANALOG_INPUT "%d{m}%d{e}"; // {s} = , {m} = | , {e} = |
#if defined(USE_MHZ19) || defined(USE_SENSEAIR)
diff --git a/sonoff/my_user_config.h b/sonoff/my_user_config.h
index 20d1e1eed..e1f6e364a 100644
--- a/sonoff/my_user_config.h
+++ b/sonoff/my_user_config.h
@@ -174,11 +174,11 @@
#define WS2812_LEDS 30 // [Pixels] Number of WS2812 LEDs to start with (max is 512)
#define TEMP_CONVERSION 0 // [SetOption8] Return temperature in (0 = Celsius or 1 = Fahrenheit)
+#define PRESSURE_CONVERSION 0 // [SetOption24] Return pressure in (0 = hPa or 1 = mmHg)
#define TEMP_RESOLUTION 1 // [TempRes] Maximum number of decimals (0 - 3) showing sensor Temperature
#define HUMIDITY_RESOLUTION 1 // [HumRes] Maximum number of decimals (0 - 3) showing sensor Humidity
#define PRESSURE_RESOLUTION 1 // [PressRes] Maximum number of decimals (0 - 3) showing sensor Pressure
#define ENERGY_RESOLUTION 3 // [EnergyRes] Maximum number of decimals (0 - 5) showing energy usage in kWh
-//#define USE_MMHG // Use mmHg instead of hPa
/*********************************************************************************************\
* END OF SECTION 1
diff --git a/sonoff/settings.h b/sonoff/settings.h
index 4af58db81..677a02bf3 100644
--- a/sonoff/settings.h
+++ b/sonoff/settings.h
@@ -48,8 +48,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu
uint32_t not_power_linked : 1; // bit 20 (v5.11.1f)
uint32_t no_power_on_check : 1; // bit 21 (v5.11.1i)
uint32_t mqtt_serial : 1; // bit 22 (v5.12.0f)
- uint32_t mqtt_serial_raw : 1; // bit 23 (v6.1.1c)
- uint32_t rules_once : 1; // bit 24 (v5.12.0k) - free since v5.14.0b
+ uint32_t mqtt_serial_raw : 1; // bit 23 (v6.1.1c) // Was rules_enabled until 5.14.0b
+ uint32_t pressure_conversion : 1; // bit 24 (v6.3.0.2) // Was rules_once until 5.14.0b
uint32_t knx_enabled : 1; // bit 25 (v5.12.0l) KNX
uint32_t device_index_enable : 1; // bit 26 (v5.13.1a)
uint32_t knx_enable_enhancement : 1; // bit 27 (v5.14.0a) KNX
diff --git a/sonoff/settings.ino b/sonoff/settings.ino
index fc3bf8887..072cabf2f 100644
--- a/sonoff/settings.ino
+++ b/sonoff/settings.ino
@@ -563,14 +563,15 @@ void SettingsDefaultSet2()
// Sensor
Settings.flag.temperature_conversion = TEMP_CONVERSION;
+ Settings.flag.pressure_conversion = PRESSURE_CONVERSION;
Settings.flag2.pressure_resolution = PRESSURE_RESOLUTION;
Settings.flag2.humidity_resolution = HUMIDITY_RESOLUTION;
Settings.flag2.temperature_resolution = TEMP_RESOLUTION;
// Settings.altitude = 0;
// Rules
-// Settings.flag.rules_enabled = 0;
-// Settings.flag.rules_once = 0;
+// Settings.rule_enabled = 0;
+// Settings.rule_once = 0;
// for (byte i = 1; i < MAX_RULE_SETS; i++) { Settings.rules[i][0] = '\0'; }
// Home Assistant
@@ -804,8 +805,8 @@ void SettingsDelta()
}
if (Settings.version < 0x050E0002) {
for (byte i = 1; i < MAX_RULE_SETS; i++) { Settings.rules[i][0] = '\0'; }
- Settings.rule_enabled = Settings.flag.mqtt_serial_raw;
- Settings.rule_once = Settings.flag.rules_once;
+ Settings.rule_enabled = Settings.flag.mqtt_serial_raw; // Was rules_enabled until 5.14.0b
+ Settings.rule_once = Settings.flag.pressure_conversion; // Was rules_once until 5.14.0b
}
if (Settings.version < 0x06000000) {
Settings.cfg_size = sizeof(SYSCFG);
@@ -826,8 +827,8 @@ void SettingsDelta()
}
}
if (Settings.version < 0x06000003) {
- Settings.flag.mqtt_serial_raw = 0;
- Settings.flag.rules_once = 0;
+ Settings.flag.mqtt_serial_raw = 0; // Was rules_enabled until 5.14.0b
+ Settings.flag.pressure_conversion = 0; // Was rules_once until 5.14.0b
Settings.flag3.data = 0;
}
if (Settings.version < 0x06010103) {
diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino
index dd84fbc47..97d03f218 100755
--- a/sonoff/sonoff.ino
+++ b/sonoff/sonoff.ino
@@ -1613,6 +1613,9 @@ boolean MqttShowSensor()
}
XsnsCall(FUNC_JSON_APPEND);
boolean json_data_available = (strlen(mqtt_data) - json_data_start);
+ if (strstr_P(mqtt_data, PSTR(D_JSON_PRESSURE))) {
+ snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_PRESSURE_UNIT "\":\"%s\""), mqtt_data, PressureUnit().c_str());
+ }
if (strstr_P(mqtt_data, PSTR(D_JSON_TEMPERATURE))) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), mqtt_data, TempUnit());
}
diff --git a/sonoff/support.ino b/sonoff/support.ino
index ef16b0bbc..c2469627c 100644
--- a/sonoff/support.ino
+++ b/sonoff/support.ino
@@ -475,16 +475,21 @@ char TempUnit()
return (Settings.flag.temperature_conversion) ? 'F' : 'C';
}
-float ConvertPress(float p)
+float ConvertPressure(float p)
{
float result = p;
- if (!isnan(p)) {
+ if (!isnan(p) && Settings.flag.pressure_conversion) {
result = p * 0.75006375541921; // mmHg
}
return result;
}
+String PressureUnit()
+{
+ return (Settings.flag.pressure_conversion) ? String(D_UNIT_MILLIMETER_MERCURY) : String(D_UNIT_PRESSURE);
+}
+
void SetGlobalValues(float temperature, float humidity)
{
global_update = uptime;
diff --git a/sonoff/xsns_09_bmp.ino b/sonoff/xsns_09_bmp.ino
index 6a77c2fd1..36070578a 100755
--- a/sonoff/xsns_09_bmp.ino
+++ b/sonoff/xsns_09_bmp.ino
@@ -49,8 +49,6 @@ struct BMPSTRUCT {
char bmp_name[7]; // Sensor name - "BMPXXX"
uint8_t bmp_type = 0;
uint8_t bmp_model = 0;
-
- uint8_t bmp_valid = 0;
#ifdef USE_BME680
uint8_t bme680_state = 0;
float bmp_gas_resistance = 0.0;
@@ -473,17 +471,8 @@ void BmpRead()
break;
#endif // USE_BME680
}
- if (bmp_sensors[bmp_idx].bmp_temperature != 0.0) {
- bmp_sensors[bmp_idx].bmp_temperature = ConvertTemp(bmp_sensors[bmp_idx].bmp_temperature);
- }
-#ifdef USE_MMHG
- if (bmp_sensors[bmp_idx].bmp_pressure != 0.0) {
- bmp_sensors[bmp_idx].bmp_pressure = ConvertPress(bmp_sensors[bmp_idx].bmp_pressure);
- }
-#endif // USE_MMHG
}
-
- SetGlobalValues(bmp_sensors[0].bmp_temperature, bmp_sensors[0].bmp_humidity);
+ SetGlobalValues(ConvertTemp(bmp_sensors[0].bmp_temperature), bmp_sensors[0].bmp_humidity);
}
void BmpEverySecond()
@@ -511,15 +500,18 @@ void BmpShow(boolean json)
if (bmp_sensors[bmp_idx].bmp_pressure != 0.0) {
bmp_sealevel = (bmp_sensors[bmp_idx].bmp_pressure / FastPrecisePow(1.0 - ((float)Settings.altitude / 44330.0), 5.255)) - 21.6;
+ bmp_sealevel = ConvertPressure(bmp_sealevel);
}
+ float bmp_temperature = ConvertTemp(bmp_sensors[bmp_idx].bmp_temperature);
+ float bmp_pressure = ConvertPressure(bmp_sensors[bmp_idx].bmp_pressure);
snprintf(name, sizeof(name), bmp_sensors[bmp_idx].bmp_name);
if (bmp_count > 1) {
snprintf_P(name, sizeof(name), PSTR("%s-%02X"), name, bmp_sensors[bmp_idx].bmp_address); // BMXXXX-XX
}
- dtostrfd(bmp_sensors[bmp_idx].bmp_temperature, Settings.flag2.temperature_resolution, temperature);
- dtostrfd(bmp_sensors[bmp_idx].bmp_pressure, Settings.flag2.pressure_resolution, pressure);
+ dtostrfd(bmp_temperature, Settings.flag2.temperature_resolution, temperature);
+ dtostrfd(bmp_pressure, Settings.flag2.pressure_resolution, pressure);
dtostrfd(bmp_sealevel, Settings.flag2.pressure_resolution, sea_pressure);
dtostrfd(bmp_sensors[bmp_idx].bmp_humidity, Settings.flag2.humidity_resolution, humidity);
#ifdef USE_BME680
@@ -563,7 +555,7 @@ void BmpShow(boolean json)
#ifdef USE_KNX
if (0 == tele_period) {
- KnxSensor(KNX_TEMPERATURE, bmp_sensors[bmp_idx].bmp_temperature);
+ KnxSensor(KNX_TEMPERATURE, bmp_temperature);
KnxSensor(KNX_HUMIDITY, bmp_sensors[bmp_idx].bmp_humidity);
}
#endif // USE_KNX
@@ -574,9 +566,9 @@ void BmpShow(boolean json)
if (bmp_sensors[bmp_idx].bmp_model >= 2) {
snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_HUM, mqtt_data, name, humidity);
}
- snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_PRESSURE, mqtt_data, name, pressure);
+ snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_PRESSURE, mqtt_data, name, pressure, PressureUnit().c_str());
if (Settings.altitude != 0) {
- snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SEAPRESSURE, mqtt_data, name, sea_pressure);
+ snprintf_P(mqtt_data, sizeof(mqtt_data), HTTP_SNS_SEAPRESSURE, mqtt_data, name, sea_pressure, PressureUnit().c_str());
}
#ifdef USE_BME680
if (bmp_sensors[bmp_idx].bmp_model >= 3) {
diff --git a/tools/decode-status.py b/tools/decode-status.py
index efa060ecd..3fad3c5c6 100644
--- a/tools/decode-status.py
+++ b/tools/decode-status.py
@@ -75,7 +75,7 @@ a_setoption = [[
"Energy monitoring while powered off",
"MQTT serial",
"MQTT serial binary",
- "Rules once mode until 5.14.0b",
+ "Convert pressure to mmHg",
"KNX enabled",
"Use Power device index on single relay devices",
"KNX enhancement",
@@ -87,7 +87,7 @@ a_setoption = [[
"Timers enabled",
"Generic ESP8285 GPIO enabled",
"Add UTC time offset to JSON message",
- "",
+ "Show hostname and IP address in GUI",
"","","","",
"","","","",
"","","","",