Closer to Home Assistant and more disciplined about exceptions
- dedicated submodule for exceptions (still exposed at module level through
`aioairq.__all__`)
- `core.DeviceInfo`:
- **breaking:** `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`