Added read_message_ids() to read the message ids (state.msgId) of sensors with one request.
A message id other than 0 means that the sensor is not in use, e.g. not connected (Issue #67)
Added has_message_id and message_id_path to Endpoint for all 31 confirmed values.actValue sensors
Added the optional position argument to has_mixer() of the heating circuit and has_fresh_water_module()
of the hot water tank
Added async with support and close() to KebaKeEnergyAPI. Without a passed session, all requests share
one session instead of opening a new connection per request. A passed session is left open
Added APITimeoutError, raised when a request times out. It inherits from APIError and TimeoutError
Added a constants page to the documentation with all endpoints (path, type, writable, values), the value enums
and the other public constants of keba_keenergy_api.constants
Added a preview image to the documentation for links shared on social media and removed the search page
from the documentation sitemap
Added an errors section to the usage page of the documentation
Dropped support for Python 3.10 (end of life). Python 3.11 is now the minimum
Changed SectionPrefix to a StrEnum
Read the heating curve points without attributes (attr="0") for a smaller response
Renamed SolarCircuitPriority1Before2StringEndpoint.helper() to extra_writes()
Simplified the internal endpoint code (no changes to the public API)
Converted all docstrings to the NumPy style
Added the Apache-2.0 license expression and the Typing :: Typed / Framework :: AsyncIO classifiers
to the package metadata
write_data() and the setters no longer send a request if there is nothing to write
read_data(), read_message_ids() and filter_request() without a position read the installed devices
only on the first call and reuse them afterwards. Create a new KebaKeEnergyAPI to read them again
filter_request() checks all variables with one request (plus one per unknown variable) instead of one
request per section and device, e.g. 2 instead of 226 requests (0.8 s instead of 28 s). It raises an
APIError if the Web HMI rejects the request without naming a requested variable
read_data() with extra attributes and get_heating_curve_points() with a heating curve name only read the
points of the heating curves in use or requested, instead of all heating curves
get_available_heating_curves() reads the heating curve names without attributes (attr="0"), as only the
names are used
Shortened the README.md to a quick start and moved the detailed examples and write warnings to the
Usage page
Applied the request timeout of API_DEFAULT_TIMEOUT (10 seconds) also to the requests with a passed session,
which used the timeout of the session before (5 minutes by default in aiohttp)
Showed the documentation only in the dark theme with the colors of contributors.home-assistant.io, the brand logo
of the integration on the project card, a link to the website of the integration in the menu and a wider right
column on smaller screens
Focused the search of the documentation with / instead of Ctrl/Cmd + K, styled the search and the cards of
the category pages like contributors.home-assistant.io and made the header translucent
Fixed IndexError in single getters with a position greater than 1
Fixed InvalidJsonError not being raised for invalid JSON responses
Fixed timeouts not being raised as APIError (now APITimeoutError, also for the aiohttp timeouts
ServerTimeoutError, ConnectionTimeoutError and SocketTimeoutError)
Fixed UnboundLocalError for HTTP status codes between 301 and 399, e.g. a redirect of a reverse proxy.
Every HTTP status other than 2xx now raises an APIError
Fixed KeyError instead of APIError in single getters with a position lower than 1
Fixed write_data() writing a literal %s path for a single value of a device section
Fixed write_data() raising a TypeError instead of APIError for more than one value of a system-wide
section, and a TypeError for a single value of SolarCircuit.PRIORITY_1_BEFORE_2
Fixed KeyError in read_data() with extra attributes if the heating curve is not in the line table pool
Fixed IndexError in get_heating_curve_points() if the control unit reports more than 16 points
Fixed KeyError in get_info(), get_hmi_info() and get_device_info() if the response has no ret
Fixed the documented unit of the photovoltaics get_daily_energy() and get_total_energy() and of the heat pump
get_heating_energy(), get_cooling_energy(), get_hot_water_energy() and get_total_thermal_energy()
(J instead of kWh)
Fixed the documented unit of the pump and compressor speeds (a fraction from 0 to 1 instead of percent),
including set_compressor_night_speed() and the solar circuit get_pump_1_speed() and get_pump_2_speed()
Fixed the docstrings of get_away_end_date() and set_away_end_date() of the heating circuit, which described
the start date
Fixed an unclosed ClientSession per request if the shared session was already closed, e.g. an endpoint client
used after async with
Fixed the aiohttp deprecation warning "BasicAuth is deprecated and will be removed in aiohttp 4.0"
by sending the Authorization header with aiohttp.encode_basic_auth()
Added endpoint has_var_speed_pump() to the heating circuit
Added endpoint get_excess_energy_target_temperature() to the heating circuit
Added endpoint set_excess_energy_target_temperature() to the heating circuit
Added endpoint get_excess_energy_target_temperature_hysteresis() to the heating circuit
Added endpoint set_excess_energy_target_temperature_hysteresis() to the heating circuit
Added endpoint get_excess_energy_target_cooling_temperature() to the heating circuit
Added endpoint set_excess_energy_target_cooling_temperature() to the heating circuit
Added endpoint get_excess_energy_target_cooling_temperature_hysteresis() to the heating circuit
Added endpoint set_excess_energy_target_cooling_temperature_hysteresis() to the heating circuit
Added endpoint get_excess_energy_heating_limit_day() to the heating circuit
Added endpoint set_excess_energy_heating_limit_day() to the heating circuit
Added endpoint get_excess_energy_cooling_limit_day() to the heating circuit
Added endpoint set_excess_energy_cooling_limit_day() to the heating circuit
Added endpoint get_excess_energy_heating_limit_night() to the heating circuit
Added endpoint set_excess_energy_heating_limit_night() to the heating circuit
Added endpoint get_excess_energy_cooling_limit_night() to the heating circuit
Added endpoint set_excess_energy_cooling_limit_night() to the heating circuit
Added endpoint get_pump_state() to the heating circuit
Added endpoint get_mixer_position() to the heating circuit
Added endpoint get_excess_energy_mode() to the heating circuit
Added endpoint get_use_excess_energy() to the heating circuit
Added endpoint set_use_excess_energy() to the heating circuit
Added endpoint get_excess_energy_operating_time() to the heat pump
Added endpoint get_excess_energy_max_runtime() to the heat pump
Added endpoint get_excess_energy_activation_counter() to the heat pump
Added endpoint get_excess_energy_consumption() to the heat pump
Added endpoint get_heating_excess_energy_consumption() to the heat pump
Added endpoint get_cooling_excess_energy_consumption() to the heat pump
Added endpoint get_hot_water_excess_energy_consumption() to the heat pump
Added endpoint get_consuming_excess_energy() to the heat pump
Added endpoint get_excess_energy_target_temperature() to the buffer tank
Added endpoint set_excess_energy_target_temperature() to the buffer tank
Added endpoint get_excess_energy_target_temperature_hysteresis() to the buffer tank
Added endpoint set_excess_energy_target_temperature_hysteresis() to the buffer tank
Added endpoint get_outdoor_temperature_excess_energy_limit() to the buffer tank
Added endpoint set_outdoor_temperature_excess_energy_limit() to the buffer tank
Added endpoint get_excess_energy_mode() to the buffer tank
Added endpoint get_use_excess_energy() to the buffer tank
Added endpoint set_use_excess_energy() to the buffer tank
Added endpoint get_excess_energy_target_temperature() to the hot water tank
Added endpoint set_excess_energy_target_temperature() to the hot water tank
Added endpoint get_excess_energy_target_temperature_hysteresis() to the hot water tank
Added endpoint set_excess_energy_target_temperature_hysteresis() to the hot water tank
Added endpoint get_excess_energy_mode() to the hot water tank
Added endpoint get_use_excess_energy() to the hot water tank
Added endpoint set_use_excess_energy() to the hot water tank
Added endpoint get_use_excess_energy() to the external heat source
Added endpoint set_use_excess_energy() to the external heat source
Added endpoint get_excess_energy_operating_time() to the external heat source
Added endpoint get_excess_energy_max_runtime() to the external heat source
Added endpoint get_excess_energy_activation_counter() to the external heat source
Added endpoint get_consuming_excess_energy() to the external heat source
Added endpoint get_min_runtime_excess_energy() to the external heat source
Added endpoint set_min_runtime_excess_energy() to the external heat source
Added endpoint get_excess_energy_active() to the photovoltaics
Added endpoint get_mixer_position() to the passive cooling
Added the meter type constants HeatPump.ELECTRIC_ENERGY_METER_TYPE, HeatPump.HEAT_METER_TYPE,
HeatPump.COOL_METER_TYPE and HeatPump.HOT_WATER_METER_TYPE
Breaking: Renamed Photovoltaic to Photovoltaics and SectionPrefix.PHOTOVOLTAIC to
SectionPrefix.PHOTOVOLTAICS, so read_data() returns the photovoltaics values under photovoltaics
Breaking: Replaced EndpointProperties with FloatEndpoint, IntegerEndpoint and StringEndpoint, and
renamed SolarCircuitPriority1Before2EndpointProperties to SolarCircuitPriority1Before2StringEndpoint
Breaking: Renamed the hot water tank endpoint get_hot_water_flow() to get_fresh_water_flow()
Breaking: Renamed the constants HeatCircuit.FLOW_TEMPERATURE to HeatCircuit.MIXER_FLOW_TEMPERATURE,
HeatPump.CIRCULATION_PUMP to HeatPump.CIRCULATION_PUMP_SPEED and HotWaterTank.HOT_WATER_FLOW
to HotWaterTank.FRESH_WATER_FLOW
Added a note to the endpoint documentation: writing values should remain within normal limits,
as is the case with typical use of the Web HMI. Permanent and very frequent writing of values reduces the lifetime
of the built-in flash memory.
Reverted get_target_temperature() of the heating circuit to the behaviour before 2.7.1.
The selected target temperature is now available with get_selected_target_temperature()
Breaking: Renamed the heating circuit endpoint get_flow_temperature() to get_mixer_flow_temperature()
Breaking: Removed the deprecated heat pump endpoints get_circulation_pump() and get_compressor(),
use get_circulation_pump_speed() and get_compressor_speed() instead
Breaking: Replaced the on/off enums (e.g. HeatPumpHeatRequest, HotWaterTankHotWaterFlow,
SystemHasPhotovoltaics) with BoolEnum
Breaking: Removed the unused heat pump meter constants, e.g. HeatPump.DAILY_HEATING_ENERGY
get_lower_limit_temperature() to get_min_target_temperature()
get_upper_limit_temperature() to get_max_target_temperature()
get_min_temperature() / set_min_temperature() to get_standby_temperature() / set_standby_temperature()
get_max_temperature() / set_max_temperature() to get_target_temperature() / set_target_temperature()
Breaking: Renamed the heat pump endpoints:
get_inflow_temperature() to get_flow_temperature()
get_reflux_temperature() to get_return_flow_temperature()
get_electrical_power() to get_compressor_power()
get_heating_electrical_energy() to get_heating_energy_consumption()
get_cooling_electrical_energy() to get_cooling_energy_consumption()
get_domestic_hot_water_energy() to get_hot_water_energy()
get_domestic_hot_water_electrical_energy() to get_hot_water_energy_consumption()
get_domestic_hot_water_spf() to get_hot_water_spf()
get_total_energy() to get_total_thermal_energy()
get_total_electrical_energy() to get_total_energy_consumption()
get_spf() to get_total_spf()
Breaking: Renamed the heating circuit endpoints:
get_temperature() to get_target_temperature()
get_day_temperature() / set_day_temperature() to get_target_temperature_day() / set_target_temperature_day()
get_night_temperature() / set_night_temperature() to get_target_temperature_night() /
set_target_temperature_night()
get_holiday_temperature() / set_holiday_temperature() to get_target_temperature_away() /
set_target_temperature_away()
get_temperature_offset() / set_temperature_offset() to get_target_temperature_offset() /
set_target_temperature_offset()
get_day_temperature_threshold() to get_heating_limit_day()
get_night_temperature_threshold() to get_heating_limit_night()
Breaking: Renamed the endpoint constants accordingly, e.g. HotWaterTank.TEMPERATURE to
HotWaterTank.CURRENT_TEMPERATURE
Breaking: Renamed HeatCircuitOperatingMode.EXTERN to HeatCircuitOperatingMode.EXTERNAL and
HeatCircuitHeatRequest.OUTDOOR_TEMPERATURE_OFF to HeatCircuitHeatRequest.OUTDOOR_OFF
Breaking: Changed the values of the on/off enums (e.g. HeatPumpHeatRequest) from "true" / "false"
to 1 / 0
Breaking: Merged the device and options sections into the new system section:
device.get_device_info() to system.get_device_info()
device.get_system_info() to system.get_info()
options.get_number_of_*() to system.get_number_of_*()
get_outdoor_temperature() of the client to system.get_outdoor_temperature()
removed device.get_name(), device.get_serial_number(), device.get_revision_number() and
device.get_variant_number(), use system.get_device_info() instead
Breaking: Replaced read_values() and read_values_grouped_by_section() with read_data(),
which returns the values grouped by section
Breaking: Renamed write_values() to write_data()
Breaking: Renamed the heat pump endpoint get_status() to get_state() and HeatPumpStatus to HeatPumpState,
with AUTO renamed to AUTO_HEAT
Breaking: Renamed SystemPrefix to SectionPrefix and the section enum Options / Outdoor to System