**Features**
- Apps can now use a simplified version of the import statement e.g.
`import hassapi as hass` or `import mqttapi as mqtt`. The existing
import method will continue to work.
- Apps can now use multiple plugin APIs with the `get_plugin_api()`
function
- Added `ADBase` superclass for apps that want to use the
`get_plugin_api()` style of coding
- Scheduler rewritten to be more efficiant and allow for microsecond
resolution
- `listen_log()` now sends AppDaemon system messages and has the
option to set a log level.
- Bumped aiohttp to v3.4.4
- Added callback locking decorators
- Rearchitected the work Q to allow App pinning and avoid re-entrant
and concurrent code if desired
- Implemented multiple worker Ques to avoid Head of Line blocking
- API Calls to control app pinning
- Added the `run_in_thread()` api call - with assistance from
[Odianosen Ejale](https://github.com/Odianosen25)
- reworked log listening functions to be more robust and added the
ability to have multiple callbacks per app
- Refactored plugin APIs to remove duplication
- Moved `constrain_days` from being Hass only to all app, regardless
of plugin used
- Added checking for overdue threads
- Added error checking for callback signatures
- Added app attributes that allows to access AD\'s `config` and `apps`
directories within apps
- Added `parse_datetime()`
- `run_once()`, `run_at()` and `run_daily()` now optionally take
`parse_time()` or `parse_datetime()` style arguments for specifying
time
- Refactored appdaemon.py for greater readability and easier
maintenance
- Expanded on the ability to trigger `listen_state` callbacks
immediately using the `immediate` flag, without need of specifying
the `new` nor `duration` parameter.
- Allowed to make use of `attribute` when using the `immediate` flag
in `listen_state`
- Added initial version of the Admin Interface
- Added User Defined Namespaces
- Rewrote logging to include user defined logs and formats
- Added a unified http component to handle API, ADMIN and DASHBOARD
access on a single port
- Added startup conditions to the HASS plugin
- Added duplicate filtering for logs
- Added standalone pidfile functionality
- Added the ability to delete an AD app generated entity from any
namespace
- Added the ability to get the history of entities from HASS database
- Added the ability to force a start of the MQTT plugin, even if not
connected to broker at startup
- Added the ability to set AD\'s `production_mode` from within apps
- Added the ability to start, stop, restart and reload apps from
either other apps or REST API
- Added the ability to register app services
- Added sensors for different internal state of AD, that can be read
by apps
- Added Person widget
- Much reworking of docs
- Added `register_dependency()` for dynamic dependencies in apps
- Added MQTT support for setting TLS version - contributed by
[Miguel](https://github.com/mdps)
- Added support for socketio for older tablet devices - inspired by
[algirdasc](https://github.com/algirdasc) and
[zarya](https://github.com/zarya)
- Added support for `default` and `copy` parameters in `get_state()`
api call - contributed by [Robert
Schindler](https://github.com/efficiosoft)
- added a switch to disable the encoding of every log message to
ascii - contributed by [Ben Lebherz](https://github.com/benleb)
- Various YAML fixes and refactoring - contributed by [Rolf
Schäuble](https://github.com/rschaeuble)
- Allow more natural addition of commandline arguments to Docker and
allow spaces - contributed by [Christoph
Roeder](https://github.com/brightdroid)
- Allowed for subscribing to MQTT events using wildcards. e.g.
`homeassistant/` - contributed by [Odianosen
Ejale](https://github.com/Odianosen25)
- Allow to specify a MQTT message to be sent when AD shutdowns cleanly
e.g. `offline`
- MQTT Retain setting for birth and will messages - contributed by
[Clifford W. Hansen](https://github.com/cliffordwhansen)
- Added Note on long lived tokens for Docker users - contributed by
[Bob Anderson](https://github.com/rwa)
- Documentation fixes - contributed by [Johann
Schmitz](https://github.com/ercpe)
- Documentation fixes - contributed by [Brendon
Baumgartner](https://github.com/bbrendon)
- Documentation fixes - contributed by [Quentin
Favrie](https://github.com/tseho)
- Documentation fixes, updating and cleaning - contributed by
[Humberto Rodríguez A.](https://github.com/rhumbertgz)
- Added the ability to set title 2 as friendly name in widgets -
contributed by [Radim](https://github.com/rds76)
- Added the ability to listen to `state_change` events, without using
listen_state() - contributed by [Thomas
Delaet](https://github.com/thomasdelaet)
- APIAI updated to dialog flow - contributed by
[engrbm87](https://github.com/engrbm87)
**Fixes**
- Fixes to listen_state() oneshot function
- Fixes to listen_state() oneshot function when duration is used
- Fixes to listen_state() function when it fires even when new and old
states are same
- Fixed an issue causing incorrect busy thread counts when app
callbacks had exceptions
- Fixed an issue of when MQTT Plugin not connected to broker, and it
holds up AD startup
- Fix to Forecast min/max in weather widget - contributed by
[adipose](https://github.com/adipose)
- Fix climate widget docs - contributed by [Rene
Tode](https://github.com/ReneTode)
- Fix to harmonize `units` vs `unit` - contributed by [Rene
Tode](https://github.com/ReneTode)
- Added missing import in sound.py example - contributed by
[cclaus](https://github.com/cclauss)
- Fix for run_once() - contributed by
[engrbm87](https://github.com/engrbm87)
- Fix for onclick not working on IE11 - contributed by
[jgrieger1](https://github.com/jgrieger1)
- Fixed issue of AppDaemon loading all `.yaml` files, even those
starting with a `.` which are hidden or binary files. Contributed by
[fhirschmann](https://github.com/fhirschmann)
- Fix for error generated when a none existent schedule timer is
passed to `info_timer`
- Fix for `log_type` flag in `listen_log` callback
- Relative paths for appdaemon\'s config directory now work correctly
- Fix to Dialogflow after format changes
- MQTT fix to subscribing using wildcards - contributed by [Daniel
Lashua](https://github.com/dlashua)
**Breaking Changes**
- appapi.py has been renamed to adbase.py, and the contained
superclass ha been renamed from AppDaemon to ADBase. This should
only be a breaking change if you were using unpublished interfaces!
- Time travel semantics have changed to support faster scheduling.
- `plugin_started` and `plugin_stopped` now go to the appropriate
namespace for the plugin and are no longer global
- Apps are no longer concurrent or re-entrant by default. This is most
likely a good thing.
- Changed the signature of `listen_log()` callbacks
- `cancel_listen_log()` now requires a handle supplied by the initial
`listen_log()`
- Removed Daemonize support - please use sysctl instead
- `set_app_state()` is deprecated - use `set_state()` instead and it
should do the right thing
- `dash_compile_on_start` now defaults to true
- The `log` section of appdaemon.yaml has been deprecated and must be
replaced by the new `logs` section which has a different format to
allow for user defined logs and greater flexibility in formatting
etc.
- API no longer has a separate port, all access is configured via the
new unified http component
- API has its own top level configuration section
- Some dashboard parameters moved to the `HTTP` section and renamed
- `dash_compile_on_start` renamed to `compile_on_start`
- `dash_force_compile` renamed to `force_compile`
- Due to the new `log` parameter to allow apps to use user defined
logs, any previous parameters named `log` should be renamed
- Due to a fix for `info_timer`, this function can now return `None`
if the timer handle is invalid
- As a result of a change in the way AD auto generates MQTT client
status topic, if not defined previously the new topic needs to be
used
- In the appdaemon configuration section, `latitude`, `longitude`,
`elevation` and `timezone` are now mandatory
- MQTT client status api change from `clientConnected` to
`is_client_connected`