# pylint: disable=line-too-long """ Tests de EMA calculation""" from datetime import datetime, timedelta from homeassistant.core import HomeAssistant from custom_components.versatile_thermostat.ema import ExponentialMovingAverage from .commons import get_tz def test_ema_basics(hass: HomeAssistant): """Test the EMA calculation with basic features""" tz = get_tz(hass) # pylint: disable=invalid-name now: datetime = datetime.now(tz=tz) the_ema = ExponentialMovingAverage( "test", # 5 minutes 300, # Needed for time calculation get_tz(hass), 1, ) assert the_ema current_timestamp = now # First initialization assert the_ema.calculate_ema(20, current_timestamp) == 20 current_timestamp = current_timestamp + timedelta(minutes=1) # One minute later, same temperature. EMA temperature should not have change assert the_ema.calculate_ema(20, current_timestamp) == 20 # Too short measurement should be ignored assert the_ema.calculate_ema(2000, current_timestamp) == 20 current_timestamp = current_timestamp + timedelta(seconds=4) assert the_ema.calculate_ema(20, current_timestamp) == 20 # a new normal measurement 5 minutes later current_timestamp = current_timestamp + timedelta(minutes=5) ema = the_ema.calculate_ema(25, current_timestamp) assert ema > 20 assert ema == 22.5 # a big change in a short time does have a limited effect current_timestamp = current_timestamp + timedelta(seconds=5) ema = the_ema.calculate_ema(30, current_timestamp) assert ema > 22.5 assert ema < 23 assert ema == 22.6