Release v0.3.0 - dedicated submodule for exceptions (still exposed at module level through `aioairq.__all__`) - `core.DeviceInfo`: - room_type -> suggested_area to further consistency with home assistant - all fields, except for `id` are optional (much like with `homeassistant.helpers.entity.DeviceInfo`) - `core.AirQ.get`: - limited to an explicit set of queries / webserver routes (namely `AirQ._supported_routes = ["log", "config", "data", "average", "ping"]). Other routes return objects with different structure, which aren't consistent with the current decoding steps - Error handling for JSONDecodeError and KeyError, which ought not to happen with the aforementioned routes (added as a precaution against unexpected firmware behaviour) - `encrypt.AESCipher`: - failed authentication is now inferred as close to the point of failure as possible. The success or failure of the authentication is based on the ability to decode the response from the device, thus the error `InvalidAuth` is raised in `AESCipher.decode`