Use explicit byte literals.
AES encryption padding broken with commit f7e30344c5 under Python 3.
Python 3 support when using pyaes (instead of Crypto.Cipher.AES) now works.
* Initial support for Hysen heating controller device. Only gets current temperature.
* Add switch_to_auto() to put the controller in (pre-programmed) timed mode
* Add set_temp() to manually set temperature. Now requires PyCRC (payload needs modbus CRC16)
* Remove test script
* Get current timer schedule
* Get much more data from device
* Add PyCRC to install_requires setup.py
* Rewrite based on better understanding. Allow setting schedule and changing 'loop mode'
* Add set_time function
* Support advanced settings and perform CRC check on responses
* Explain remaining unknowns for Hyson thermostat
The room_temp_adj (or simply 'adj') only applies to the room_temp. It's limited to -5.0..+5.0, but uses a 2 byte data type.
This leads to the assumption that external_temp could also use this data type, maybe for showing temperatures below 0 - but I cannot test this currently. Maybe I have to place it near a fridge to confirm.
* Fix get_temp and add get_external_temp for Hysen
Again: maybe payload[17] also belongs to the external temperature...
* remove comment about first 2 bytes and raise error if CRC check on response fails
* Remove comment about guessed meaning of unknown
Just confirmed, that lowest outside temp is 0. So it seems to only need 1 byte, as room temp does.
* add ability to toogle hysen device power
Turn display power on/off
* Update set_power() to support remote_lock for Hysen
Sorry, there was still one thing missing: set/unset remote_lock.
I captured again and changed the set_power accordingly.
* fix comments
There's a small race condition in the discover() method. If recv() returns
before the socket timeout is reached, but we hit the top of the loop after
the timeout is reached, we'll return None rather than the set of devices.
UDP doesn't guarantee delivery, so reattempt packet transmission if we don't
get a response and timeout if we still don't have anything after (by
default) 10 seconds.
Look at the device ID and figure out what type of device it is, and provide
appropriate classes for each that only support the functionality available
on that device.
Add a check_temperature() function that'll work for both the RM2 and the A1
sensor platform, and a check_sensors() function that returns the full set of
sensor data for the A1 as a dict.