137 lines
4.5 KiB
Python
137 lines
4.5 KiB
Python
# pylint: disable=unused-argument, line-too-long
|
|
""" Test the OpenWindow algorithm """
|
|
|
|
from datetime import datetime, timedelta
|
|
from custom_components.versatile_thermostat.open_window_algorithm import WindowOpenDetectionAlgorithm
|
|
|
|
from .commons import * # pylint: disable=wildcard-import, unused-wildcard-import
|
|
|
|
|
|
async def test_open_window_algo(
|
|
hass: HomeAssistant,
|
|
skip_hass_states_is_state,
|
|
):
|
|
"""Tests the Algo"""
|
|
|
|
the_algo = WindowOpenDetectionAlgorithm(1.0, 0.0)
|
|
assert the_algo.last_slope is None
|
|
|
|
tz = get_tz(hass) # pylint: disable=invalid-name
|
|
now = datetime.now(tz)
|
|
|
|
event_timestamp = now - timedelta(minutes=5)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=10, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# We need at least 2 measurement
|
|
assert last_slope is None
|
|
assert the_algo.last_slope is None
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
event_timestamp = now - timedelta(minutes=4)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=10, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# No slope because same temperature
|
|
assert last_slope == 0
|
|
assert the_algo.last_slope == 0
|
|
assert the_algo.is_window_close_detected() is True
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
event_timestamp = now - timedelta(minutes=3)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=9, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# A slope is calculated
|
|
assert last_slope == -0.5
|
|
assert the_algo.last_slope == -0.5
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
# A new temperature with 2 degre less in one minute (value will be rejected)
|
|
event_timestamp = now - timedelta(minutes=2)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=7, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# A slope is calculated
|
|
assert last_slope == -0.5 / 2.0 - 2.0 / 2.0
|
|
assert the_algo.last_slope == -1.25
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is True
|
|
|
|
# A new temperature with 1 degre less
|
|
event_timestamp = now - timedelta(minutes=1)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=6, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# A slope is calculated
|
|
assert last_slope == -1.25 / 2 - 1.0 / 2.0
|
|
assert the_algo.last_slope == -1.125
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is True
|
|
|
|
# A new temperature with 0 degre less
|
|
event_timestamp = now - timedelta(minutes=0)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=6, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# A slope is calculated
|
|
assert last_slope == -1.125 / 2
|
|
assert the_algo.last_slope == -1.125 / 2
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
# A new temperature with 1 degre more
|
|
event_timestamp = now + timedelta(minutes=1)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=7, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# A slope is calculated
|
|
assert last_slope == -1.125 / 4 + 0.5
|
|
assert the_algo.last_slope == 0.21875
|
|
assert the_algo.is_window_close_detected() is True
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
|
|
async def test_open_window_algo_wrong(
|
|
hass: HomeAssistant,
|
|
skip_hass_states_is_state,
|
|
):
|
|
"""Tests the Algo with wrong date"""
|
|
the_algo = WindowOpenDetectionAlgorithm(1.0, 0.0)
|
|
assert the_algo.last_slope is None
|
|
|
|
tz = get_tz(hass) # pylint: disable=invalid-name
|
|
now = datetime.now(tz)
|
|
|
|
event_timestamp = now - timedelta(minutes=5)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=10, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# We need at least 2 measurement
|
|
assert last_slope is None
|
|
assert the_algo.last_slope is None
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is False
|
|
|
|
# The next datetime_measurement cannot be in the past
|
|
event_timestamp = now - timedelta(minutes=6)
|
|
last_slope = the_algo.add_temp_measurement(
|
|
temperature=18, datetime_measure=event_timestamp
|
|
)
|
|
|
|
# No slope because same temperature
|
|
assert last_slope is None
|
|
assert the_algo.last_slope is None
|
|
assert the_algo.is_window_close_detected() is False
|
|
assert the_algo.is_window_open_detected() is False
|