Add command SetOption24

Add command SetOption24 0/1 to select pressure unit as hPa or mmHg (#4241)
This commit is contained in:
Theo Arends 2018-11-04 16:55:12 +01:00
parent 9fc701b649
commit 14a7424e9b
9 changed files with 35 additions and 37 deletions

View File

@ -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)

View File

@ -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&deg;%c{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_HUM[] PROGMEM = "%s{s}%s " D_HUMIDITY "{m}%s%%{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
#ifndef USE_MMHG
const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s " D_UNIT_PRESSURE "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s " D_UNIT_PRESSURE "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
#else
const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s " D_UNIT_MILLIMETER_MERCURY "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s " D_UNIT_MILLIMETER_MERCURY "{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
#endif
const char HTTP_SNS_PRESSURE[] PROGMEM = "%s{s}%s " D_PRESSURE "{m}%s %s{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_SEAPRESSURE[] PROGMEM = "%s{s}%s " D_PRESSUREATSEALEVEL "{m}%s %s{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
const char HTTP_SNS_ANALOG[] PROGMEM = "%s{s}%s " D_ANALOG_INPUT "%d{m}%d{e}"; // {s} = <tr><th>, {m} = </th><td>, {e} = </td></tr>
#if defined(USE_MHZ19) || defined(USE_SENSEAIR)

View File

@ -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

View File

@ -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

View File

@ -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) {

View File

@ -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());
}

View File

@ -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;

View File

@ -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) {

View File

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