Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: fix bug where indoor absolute humidity would have wrong value #999

Merged
merged 1 commit into from
Jun 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ecowitt2mqtt/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
DATA_POINT_HUMIDEX: Final = "humidex"
DATA_POINT_HUMIDEX_PERCEPTION: Final = "humidex_perception"
DATA_POINT_HUMIDITY: Final = "humidity"
DATA_POINT_HUMIDITYIN: Final = "humidityin"
DATA_POINT_HUMIDITY_ABS: Final = "humidityabs"
DATA_POINT_HUMIDITY_ABS_IN: Final = "humidityabsin"
DATA_POINT_HUMI_CO2: Final = "humi_co2"
Expand All @@ -116,6 +117,7 @@
DATA_POINT_SOLARRADIATION: Final = "solarradiation"
DATA_POINT_SOLARRADIATION_PERCEIVED: Final = "solarradiation_perceived"
DATA_POINT_TEMP: Final = "temp"
DATA_POINT_TEMPIN: Final = "tempin"
DATA_POINT_TF_CO2: Final = "tf_co2"
DATA_POINT_THERMAL_PERCEPTION: Final = "thermalperception"
DATA_POINT_TOTAL_RAIN: Final = "totalrain"
Expand Down
3 changes: 2 additions & 1 deletion ecowitt2mqtt/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
from ecowitt2mqtt.helpers.calculator.heap import HeapCalculator
from ecowitt2mqtt.helpers.calculator.humidity import (
AbsoluteHumidityCalculator,
IndoorAbsoluteHumidityCalculator,
RelativeHumidityCalculator,
)
from ecowitt2mqtt.helpers.calculator.illuminance import (
Expand Down Expand Up @@ -158,7 +159,7 @@
DATA_POINT_HUMIDEX_PERCEPTION: HumidexPerceptionCalculator,
DATA_POINT_HUMIDITY: RelativeHumidityCalculator,
DATA_POINT_HUMIDITY_ABS: AbsoluteHumidityCalculator,
DATA_POINT_HUMIDITY_ABS_IN: AbsoluteHumidityCalculator,
DATA_POINT_HUMIDITY_ABS_IN: IndoorAbsoluteHumidityCalculator,
DATA_POINT_HUMI_CO2: RelativeHumidityCalculator,
DATA_POINT_INTERVAL: UpdateIntervalCalculator,
DATA_POINT_LIGHTNING: LightningStrikeDistanceCalculator,
Expand Down
35 changes: 30 additions & 5 deletions ecowitt2mqtt/helpers/calculator/humidity.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
from ecowitt2mqtt.const import (
CONF_OUTPUT_UNIT_HUMIDITY,
DATA_POINT_HUMIDITY,
DATA_POINT_HUMIDITYIN,
DATA_POINT_TEMP,
DATA_POINT_TEMPIN,
PERCENTAGE,
UnitOfVolume,
)
Expand Down Expand Up @@ -48,6 +50,15 @@ def output_unit_metric(self) -> str:
"""
return UnitOfVolume.GRAMS_PER_CUBIC_METER

def _calculate_value(self, temp: float, humidity: float) -> CalculatedDataPoint:
"""Calculate the absolute humidity."""
temp_obj = get_temperature_meteocalc_object(
temp, self._config.input_unit_system
)

value = get_absolute_humidity_in_metric(temp_obj, humidity)
return self.get_calculated_data_point(value, unit_converter=VolumeConverter)

@Calculator.requires_keys(DATA_POINT_TEMP, DATA_POINT_HUMIDITY)
def calculate_from_payload(
self, payload: dict[str, PreCalculatedValueType]
Expand All @@ -62,13 +73,27 @@ def calculate_from_payload(
"""
temp = cast(float, payload[DATA_POINT_TEMP])
humidity = cast(float, payload[DATA_POINT_HUMIDITY])
return self._calculate_value(temp, humidity)

temp_obj = get_temperature_meteocalc_object(
temp, self._config.input_unit_system
)

value = get_absolute_humidity_in_metric(temp_obj, humidity)
return self.get_calculated_data_point(value, unit_converter=VolumeConverter)
class IndoorAbsoluteHumidityCalculator(AbsoluteHumidityCalculator):
"""Define an absolute humidity calculator."""

@Calculator.requires_keys(DATA_POINT_TEMPIN, DATA_POINT_HUMIDITYIN)
def calculate_from_payload(
self, payload: dict[str, PreCalculatedValueType]
) -> CalculatedDataPoint:
"""Perform the calculation.

Args:
payload: An Ecowitt data payload.

Returns:
A parsed CalculatedDataPoint object.
"""
temp = cast(float, payload[DATA_POINT_TEMPIN])
humidity = cast(float, payload[DATA_POINT_HUMIDITY])
return self._calculate_value(temp, humidity)


class RelativeHumidityCalculator(SimpleCalculator):
Expand Down
6 changes: 3 additions & 3 deletions tests/data/test_battery.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ def test_battery_config(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0010682941088042506,
value=0.0006792489921019872,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -741,7 +741,7 @@ def test_default_battery_strategy(
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0010682941088042506,
value=0.0006792489921019872,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -1110,7 +1110,7 @@ def test_unknown_battery(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.001501643470436062,
value=0.0009950279348870004,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down
20 changes: 10 additions & 10 deletions tests/data/test_data_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ def test_missing_distance(device_data: dict[str, Any], ecowitt: Ecowitt) -> None
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0006244952780717129,
value=0.0005621776693578237,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -960,7 +960,7 @@ def test_nonnumeric_value(device_data: dict[str, Any], ecowitt: Ecowitt) -> None
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.001501643470436062,
value=0.0009950279348870004,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -1745,7 +1745,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.001501643470436062,
value=0.0009950279348870004,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -2075,7 +2075,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0000665641018299439,
value=0.00038568684485373834,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -2468,7 +2468,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0010682941088042506,
value=0.0006792489921019872,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -2872,7 +2872,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0006244952780717129,
value=0.0005621776693578237,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -3625,7 +3625,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0005325592736717602,
value=0.000820898950357005,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -4103,7 +4103,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.00020514236695062975,
value=0.000575127755994321,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -4478,7 +4478,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0007588986415738014,
value=0.0006467356391665706,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -4800,7 +4800,7 @@ def test_precision(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.0002045744433384171,
value=0.0012629214620876999,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down
8 changes: 4 additions & 4 deletions tests/data/test_units.py
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ def test_output_units(device_data: dict[str, Any], ecowitt: Ecowitt) -> None:
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=24.054020931926463,
value=15.938818531054617,
unit=UnitOfVolume.GRAMS_PER_CUBIC_METER,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -765,7 +765,7 @@ def test_unit_conversion_to_imperial(
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=0.00016449986246231337,
value=0.0011505010497130945,
unit=UnitOfVolume.POUNDS_PER_CUBIC_FOOT,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -1159,7 +1159,7 @@ def test_unit_conversion_to_imperial(
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=24.054020931926463,
value=15.938818531054617,
unit=UnitOfVolume.GRAMS_PER_CUBIC_METER,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down Expand Up @@ -1489,7 +1489,7 @@ def test_unit_conversion_to_imperial(
),
"humidityabsin": CalculatedDataPoint(
data_point_key="humidityabsin",
value=1.0662546271835098,
value=6.178110598107857,
unit=UnitOfVolume.GRAMS_PER_CUBIC_METER,
attributes={},
data_type=DataPointType.NON_BOOLEAN,
Expand Down
8 changes: 4 additions & 4 deletions tests/helpers/publisher/mqtt/test_hass_discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -1992,7 +1992,7 @@ async def test_publish(
),
call(
"homeassistant/sensor/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/humidityabsin/state",
payload=b"0.0005325592736717602",
payload=b"0.000820898950357005",
retain=False,
),
call(
Expand Down Expand Up @@ -4226,7 +4226,7 @@ async def test_publish_custom_entity_id_prefix(
),
call(
"homeassistant/sensor/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/humidityabsin/state",
payload=b"0.0005325592736717602",
payload=b"0.000820898950357005",
retain=False,
),
call(
Expand Down Expand Up @@ -6486,7 +6486,7 @@ async def test_publish_numeric_battery_strategy(
),
call(
"homeassistant/sensor/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/humidityabsin/state",
payload=b"0.0005325592736717602",
payload=b"0.000820898950357005",
retain=False,
),
call(
Expand Down Expand Up @@ -8736,7 +8736,7 @@ async def test_no_entity_description(
),
call(
"homeassistant/sensor/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/humidityabsin/state",
payload=b"0.0005325592736717602",
payload=b"0.000820898950357005",
retain=False,
),
call(
Expand Down
2 changes: 1 addition & 1 deletion tests/helpers/publisher/mqtt/test_topic_publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ async def test_publish_processed(
await publishers[0].async_publish(device_data)
mock_aiomqtt_client.publish.assert_awaited_with(
TEST_MQTT_TOPIC,
payload=b'{"runtime": 319206.0, "tempin": 79.52, "humidityin": 31.0, "baromrel": 24.74, "baromabs": 24.74, "temp": 93.2, "humidity": 64.0, "winddir": 139.0, "windspeed": 20.89, "windgust": 1.12, "maxdailygust": 8.05, "solarradiation": 264.61, "uv": 2.0, "rainrate": 0.0, "eventrain": 0.0, "hourlyrain": 0.0, "dailyrain": 0.0, "weeklyrain": 0.0, "monthlyrain": 2.177, "yearlyrain": 4.441, "lightning_num": 13.0, "lightning": 0.6213711922373341, "lightning_time": "2022-04-20T17:17:17+00:00", "wh65batt": "OFF", "beaufortscale": 5, "dewpoint": 79.19328776816637, "feelslike": 111.0553021896001, "frostpoint": 70.28882284994654, "frostrisk": "No risk", "heatindex": 111.0553021896001, "humidex": 48, "humidex_perception": "Dangerous", "humidityabs": 0.001501643470436062, "humidityabsin": 0.001501643470436062, "relative_strain_index": 0.54, "relative_strain_index_perception": "Extreme discomfort", "safe_exposure_time_skin_type_1": 83.3, "safe_exposure_time_skin_type_2": 100.0, "safe_exposure_time_skin_type_3": 133.3, "safe_exposure_time_skin_type_4": 166.7, "safe_exposure_time_skin_type_5": 266.7, "safe_exposure_time_skin_type_6": 433.3, "simmerindex": 113.90619200000002, "simmerzone": "Danger of heatstroke", "solarradiation_perceived": 90.49958322993245, "thermalperception": "Severely high", "windchill": null, "winddir_name": "SE"}', # noqa: E501
payload=b'{"runtime": 319206.0, "tempin": 79.52, "humidityin": 31.0, "baromrel": 24.74, "baromabs": 24.74, "temp": 93.2, "humidity": 64.0, "winddir": 139.0, "windspeed": 20.89, "windgust": 1.12, "maxdailygust": 8.05, "solarradiation": 264.61, "uv": 2.0, "rainrate": 0.0, "eventrain": 0.0, "hourlyrain": 0.0, "dailyrain": 0.0, "weeklyrain": 0.0, "monthlyrain": 2.177, "yearlyrain": 4.441, "lightning_num": 13.0, "lightning": 0.6213711922373341, "lightning_time": "2022-04-20T17:17:17+00:00", "wh65batt": "OFF", "beaufortscale": 5, "dewpoint": 79.19328776816637, "feelslike": 111.0553021896001, "frostpoint": 70.28882284994654, "frostrisk": "No risk", "heatindex": 111.0553021896001, "humidex": 48, "humidex_perception": "Dangerous", "humidityabs": 0.001501643470436062, "humidityabsin": 0.0009950279348870004, "relative_strain_index": 0.54, "relative_strain_index_perception": "Extreme discomfort", "safe_exposure_time_skin_type_1": 83.3, "safe_exposure_time_skin_type_2": 100.0, "safe_exposure_time_skin_type_3": 133.3, "safe_exposure_time_skin_type_4": 166.7, "safe_exposure_time_skin_type_5": 266.7, "safe_exposure_time_skin_type_6": 433.3, "simmerindex": 113.90619200000002, "simmerzone": "Danger of heatstroke", "solarradiation_perceived": 90.49958322993245, "thermalperception": "Severely high", "windchill": null, "winddir_name": "SE"}',
retain=False,
)

Expand Down
Loading
Loading