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", "","","","", "","","","", "","","","",