appdaemon 4.5.6__tar.gz → 4.5.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {appdaemon-4.5.6/appdaemon.egg-info → appdaemon-4.5.8}/PKG-INFO +1 -1
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/adapi.py +40 -5
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/adbase.py +22 -8
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/app_management.py +50 -35
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dependency_manager.py +3 -2
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/events.py +3 -3
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/plugin.py +1 -1
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/app_management.py +1 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassapi.py +35 -37
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassplugin.py +266 -214
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/threads.py +2 -2
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/utils.py +5 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/version.py +1 -1
- {appdaemon-4.5.6 → appdaemon-4.5.8/appdaemon.egg-info}/PKG-INFO +1 -1
- {appdaemon-4.5.6 → appdaemon-4.5.8}/LICENSE.md +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/MANIFEST.in +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/README.md +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/README.rst +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/__main__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/admin.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/admin_loop.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/appdaemon.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/appdaemon.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/css/app.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/css/chunk-vendors.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/favicon.ico +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/index.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js.map +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js.map +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/all.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/climacons-font.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/default/dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/default/variables.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/fontawesome.min.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/fonts.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon1.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon2.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon3.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon4.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/glassic_bg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/variables.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_444444_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_555555_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777620_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777777_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_cc0000_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_ffffff_256x240.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/jquery-ui.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/jquery.gridster.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/main.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/materialdesignicons.min.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/non_dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_bg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_w_bg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidianbg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/widgetbg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/variables.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/rickshaw.min.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldgradient.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldtexture.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/js/timer.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/variables.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/v4-shims.min.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/dashboard.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg2.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_weatherbg.jpg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/variables.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/TickingTimebombBB.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.svg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.woff +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/repetition.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/Blank.gif +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-192x192.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-512x512.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/apple-touch-icon.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/browserconfig.xml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-16x16.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-32x32.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon.ico +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/manifest.json +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-144x144.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-150x150.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x150.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x310.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-70x70.png +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/admin.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.layout.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/dashboard.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/gauge.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-3.1.1.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-ui.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery.gridster.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/justgage.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/knockout-3.4.1.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/list.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/plotly.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/raphael-2.1.4.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/reconnecting-websocket.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/rickshaw.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/socket.io.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/sockjs.min.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/stream.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/admin.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/body_include.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/dashboard.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/dashinit.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/error.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/head_include.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/list.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/logon.jinja2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.svg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.svg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.eot +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.svg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.ttf +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff2 +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/callbacks.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dashboard.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dependency.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/entity.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/exceptions.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/futures.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/http.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/logging.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/api.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/app.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/appdaemon.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/common.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/dashboard.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/http.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/log.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/misc.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/sequence.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/yaml.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/file_check.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/plugin.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/state.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/threading.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/android.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/base.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/iOS.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugin_management.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyapi.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyplugin.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/exceptions.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/models.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/notifications.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/utils.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttapi.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttplugin.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/pyversions.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/scheduler.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/sequences.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/services.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/state.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/__init__.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/adstream.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/socketio_handler.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/sockjs_handler.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/ws_handler.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/thread_async.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/utility_loop.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminLog.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminSummary.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminTable.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/alarm.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.css +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.html +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.js +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/binary_sensor.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/camera.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/climate.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/clock.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/cover.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/device_tracker.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/entitypicture.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/fan.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/gauge.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/group.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/heater.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/icon.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/iframe.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_boolean.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_datetime.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_number.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_select.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_slider.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_text.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/javascript.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/label.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/light.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/lock.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/london_underground.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/media_player.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/mode.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/navigate.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/person.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/pirateweather.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/radial.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/reload.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/rss.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/scene.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/script.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/sensor.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/sequence.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/switch.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/temperature.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/text_sensor.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/weather.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/weather_summary.yaml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/SOURCES.txt +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/dependency_links.txt +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/entry_points.txt +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/requires.txt +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/top_level.txt +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/apps/hello.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/general_app_functions.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/objectcontrole.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/alexa.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/battery.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/bysykkel.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/commute.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/dark_day.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/door_notification.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/eventCache.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/eventMonitor.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/globals.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/grandfather.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/hwcheck.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ical.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/minimote.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/modes.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/momentary_switch.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/motion_lights.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/motion_notification.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/occusim.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/outside_lights.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/presence.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ruter.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/secure.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sensor_notification.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sensor_notify.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sequence.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/smart_heat.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sound.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/switch_reset.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/yr.py +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/pyproject.toml +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/setup.cfg +0 -0
- {appdaemon-4.5.6 → appdaemon-4.5.8}/tests/test_main.py +0 -0
|
@@ -17,6 +17,7 @@ from typing import TYPE_CHECKING, Any, Literal, TypeVar, overload
|
|
|
17
17
|
from appdaemon import dependency, utils
|
|
18
18
|
from appdaemon import exceptions as ade
|
|
19
19
|
from appdaemon.appdaemon import AppDaemon
|
|
20
|
+
from appdaemon.models.config.app import AppConfig
|
|
20
21
|
from appdaemon.entity import Entity
|
|
21
22
|
from appdaemon.events import EventCallback
|
|
22
23
|
from appdaemon.logging import Logging
|
|
@@ -76,11 +77,6 @@ class ADAPI:
|
|
|
76
77
|
def __init__(self, ad: AppDaemon, config_model: "AppConfig"):
|
|
77
78
|
self.AD = ad
|
|
78
79
|
self.config_model = config_model
|
|
79
|
-
|
|
80
|
-
self.config = self.AD.config.model_dump(by_alias=True, exclude_unset=True)
|
|
81
|
-
self.app_config = self.AD.app_management.app_config.model_dump(by_alias=True, exclude_unset=True)
|
|
82
|
-
self.args = config_model.model_dump(by_alias=True, exclude_unset=True)
|
|
83
|
-
|
|
84
80
|
self.dashboard_dir = None
|
|
85
81
|
|
|
86
82
|
if self.AD.http is not None:
|
|
@@ -134,17 +130,44 @@ class ADAPI:
|
|
|
134
130
|
directory, but can be overridden in ``appdaemon.app_dir`` in the ``appdaemon.yaml`` file."""
|
|
135
131
|
return self.AD.app_dir
|
|
136
132
|
|
|
133
|
+
@app_dir.setter
|
|
134
|
+
def app_dir(self, value: Path) -> None:
|
|
135
|
+
self.logger.warning('app_dir is read-only and needs to be set before AppDaemon starts')
|
|
136
|
+
|
|
137
137
|
@property
|
|
138
138
|
def callback_counter(self) -> int:
|
|
139
139
|
return self.AD.app_management.objects[self.name].callback_counter
|
|
140
140
|
|
|
141
|
+
@callback_counter.setter
|
|
142
|
+
def callback_counter(self, value: Path) -> None:
|
|
143
|
+
self.logger.warning('callback_counter is read-only and is set internally by AppDaemon')
|
|
144
|
+
|
|
141
145
|
@property
|
|
142
146
|
def config_dir(self) -> Path:
|
|
143
147
|
"""Directory that contains the ``appdaemon.yaml`` file."""
|
|
144
148
|
return self.AD.config_dir
|
|
145
149
|
|
|
150
|
+
@config_dir.setter
|
|
151
|
+
def config_dir(self, value: Path) -> None:
|
|
152
|
+
self.logger.warning('config_dir is read-only and needs to be set before AppDaemon starts')
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def config_model(self) -> AppConfig:
|
|
156
|
+
"""The AppConfig model only for this app."""
|
|
157
|
+
return self._config_model
|
|
158
|
+
|
|
159
|
+
@config_model.setter
|
|
160
|
+
def config_model(self, new_config: Any) -> None:
|
|
161
|
+
match new_config:
|
|
162
|
+
case AppConfig():
|
|
163
|
+
self._config_model = new_config
|
|
164
|
+
case _:
|
|
165
|
+
self._config_model = AppConfig.model_validate(new_config)
|
|
166
|
+
self.args = self._config_model.model_dump(by_alias=True, exclude_unset=True)
|
|
167
|
+
|
|
146
168
|
@property
|
|
147
169
|
def global_vars(self) -> Any:
|
|
170
|
+
"""Globally locked attribute that can be used to share data between apps."""
|
|
148
171
|
with self.AD.global_lock:
|
|
149
172
|
return self.AD.global_vars
|
|
150
173
|
|
|
@@ -158,16 +181,28 @@ class ADAPI:
|
|
|
158
181
|
"""Reference to the AppDaemon Logging subsystem object."""
|
|
159
182
|
return self.AD.logging
|
|
160
183
|
|
|
184
|
+
@_logging.setter
|
|
185
|
+
def _logging(self, value: Logging) -> None:
|
|
186
|
+
self.logger.warning('The _logging property is read-only')
|
|
187
|
+
|
|
161
188
|
@property
|
|
162
189
|
def name(self) -> str:
|
|
163
190
|
"""The name for the app, as defined by it's key in the corresponding YAML file."""
|
|
164
191
|
return self.config_model.name
|
|
165
192
|
|
|
193
|
+
@name.setter
|
|
194
|
+
def name(self, value: str) -> None:
|
|
195
|
+
self.logger.warning("The name property is read-only and is defined by the app's key in the YAML file")
|
|
196
|
+
|
|
166
197
|
@property
|
|
167
198
|
def plugin_config(self) -> dict:
|
|
168
199
|
self.get_plugin_config()
|
|
169
200
|
return self.AD.plugins.config
|
|
170
201
|
|
|
202
|
+
@plugin_config.setter
|
|
203
|
+
def plugin_config(self, value: dict) -> None:
|
|
204
|
+
self.logger.warning("The plugin_config property is read-only and is set by the plugin itself")
|
|
205
|
+
|
|
171
206
|
#
|
|
172
207
|
# Logging
|
|
173
208
|
#
|
|
@@ -2,11 +2,11 @@ import threading
|
|
|
2
2
|
from functools import wraps
|
|
3
3
|
from logging import Logger
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
6
|
|
|
7
7
|
from appdaemon import adapi
|
|
8
8
|
from appdaemon import utils
|
|
9
|
-
from appdaemon.models.config.app import AppConfig
|
|
9
|
+
from appdaemon.models.config.app import AppConfig, AllAppConfig
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
# Check if the module is being imported using the legacy method
|
|
@@ -73,8 +73,6 @@ def global_lock(f):
|
|
|
73
73
|
|
|
74
74
|
class ADBase:
|
|
75
75
|
AD: "AppDaemon"
|
|
76
|
-
config_model: "AppConfig"
|
|
77
|
-
|
|
78
76
|
config: dict
|
|
79
77
|
"""Dictionary of the AppDaemon configuration
|
|
80
78
|
"""
|
|
@@ -96,10 +94,7 @@ class ADBase:
|
|
|
96
94
|
def __init__(self, ad: "AppDaemon", config_model: "AppConfig"):
|
|
97
95
|
self.AD = ad
|
|
98
96
|
self.config_model = config_model
|
|
99
|
-
|
|
100
97
|
self.config = self.AD.config.model_dump(by_alias=True, exclude_unset=True)
|
|
101
|
-
self.args = self.config_model.model_dump(by_alias=True, exclude_unset=True)
|
|
102
|
-
|
|
103
98
|
self.namespace = "default"
|
|
104
99
|
self.dashboard_dir = None
|
|
105
100
|
|
|
@@ -136,9 +131,28 @@ class ADBase:
|
|
|
136
131
|
# Sometimes this will be None. Namespaces are not guaranteed to be associated with a plugin
|
|
137
132
|
|
|
138
133
|
@property
|
|
139
|
-
def app_config(self):
|
|
134
|
+
def app_config(self) -> AllAppConfig:
|
|
135
|
+
"""The full app configuration model for all the apps."""
|
|
140
136
|
return self.AD.app_management.app_config
|
|
141
137
|
|
|
138
|
+
@app_config.setter
|
|
139
|
+
def app_config(self, new_config: AppConfig) -> None:
|
|
140
|
+
self.logger.warning("The full app configuration model is read-only")
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def config_model(self) -> AppConfig:
|
|
144
|
+
"""The AppConfig model only for this app."""
|
|
145
|
+
return self._config_model
|
|
146
|
+
|
|
147
|
+
@config_model.setter
|
|
148
|
+
def config_model(self, new_config: Any) -> None:
|
|
149
|
+
match new_config:
|
|
150
|
+
case AppConfig():
|
|
151
|
+
self._config_model = new_config
|
|
152
|
+
case _:
|
|
153
|
+
self._config_model = AppConfig.model_validate(new_config)
|
|
154
|
+
self.args = self._config_model.model_dump(by_alias=True, exclude_unset=True)
|
|
155
|
+
|
|
142
156
|
@property
|
|
143
157
|
def app_dir(self) -> Path:
|
|
144
158
|
return self.AD.app_dir
|
|
@@ -15,7 +15,7 @@ from copy import copy
|
|
|
15
15
|
from functools import partial, reduce, wraps
|
|
16
16
|
from logging import Logger
|
|
17
17
|
from pathlib import Path
|
|
18
|
-
from typing import TYPE_CHECKING, Literal, TypeVar
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Literal, TypeVar
|
|
19
19
|
|
|
20
20
|
from pydantic import ValidationError
|
|
21
21
|
|
|
@@ -432,7 +432,7 @@ class AppManagement:
|
|
|
432
432
|
else:
|
|
433
433
|
return True
|
|
434
434
|
|
|
435
|
-
async def restart_app(self, app):
|
|
435
|
+
async def restart_app(self, app: str) -> None:
|
|
436
436
|
await self.stop_app(app, delete=False)
|
|
437
437
|
try:
|
|
438
438
|
await self.start_app(app)
|
|
@@ -513,8 +513,11 @@ class AppManagement:
|
|
|
513
513
|
def get_managed_app_names(self, include_globals: bool = False) -> set[str]:
|
|
514
514
|
apps = set(name for name, o in self.objects.items() if o.type == "app")
|
|
515
515
|
if include_globals:
|
|
516
|
-
|
|
517
|
-
|
|
516
|
+
globals = set(
|
|
517
|
+
name for name, cfg in self.app_config.root.items()
|
|
518
|
+
if isinstance(cfg, GlobalModule)
|
|
519
|
+
)
|
|
520
|
+
apps |= globals
|
|
518
521
|
return apps
|
|
519
522
|
|
|
520
523
|
def add_plugin_object(self, name: str, object: "PluginBase", use_dictionary_unpacking: bool = False) -> None:
|
|
@@ -763,7 +766,7 @@ class AppManagement:
|
|
|
763
766
|
return wrapper
|
|
764
767
|
|
|
765
768
|
# @utils.timeit
|
|
766
|
-
async def check_app_updates(self, plugin_ns: str = None, mode: UpdateMode = UpdateMode.NORMAL):
|
|
769
|
+
async def check_app_updates(self, plugin_ns: str | None = None, mode: UpdateMode = UpdateMode.NORMAL):
|
|
767
770
|
"""Checks the states of the Python files that define the apps, reloading when necessary.
|
|
768
771
|
|
|
769
772
|
Called as part of :meth:`.utility_loop.Utility.loop`
|
|
@@ -778,12 +781,18 @@ class AppManagement:
|
|
|
778
781
|
async with self.check_updates_lock:
|
|
779
782
|
await self._process_filters()
|
|
780
783
|
|
|
781
|
-
if mode == UpdateMode.INIT:
|
|
782
|
-
await self._process_import_paths()
|
|
783
|
-
await self._init_dep_manager()
|
|
784
|
-
|
|
785
784
|
update_actions = UpdateActions()
|
|
786
785
|
|
|
786
|
+
match mode:
|
|
787
|
+
case UpdateMode.INIT:
|
|
788
|
+
await self._process_import_paths()
|
|
789
|
+
await self._init_dep_manager()
|
|
790
|
+
case UpdateMode.RELOAD_APPS:
|
|
791
|
+
all_apps = self.get_managed_app_names(include_globals=False)
|
|
792
|
+
modules = self.dependency_manager.modules_from_apps(all_apps)
|
|
793
|
+
update_actions.apps.reload |= all_apps
|
|
794
|
+
update_actions.modules.reload |= modules
|
|
795
|
+
|
|
787
796
|
await self.check_app_config_files(update_actions)
|
|
788
797
|
|
|
789
798
|
await self._handle_sequence_change(update_actions, mode)
|
|
@@ -1285,40 +1294,39 @@ class AppManagement:
|
|
|
1285
1294
|
self.get_state(app, attribute="config_path")
|
|
1286
1295
|
)
|
|
1287
1296
|
|
|
1288
|
-
async def manage_services(
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1297
|
+
async def manage_services(
|
|
1298
|
+
self,
|
|
1299
|
+
namespace: str,
|
|
1300
|
+
domain: str,
|
|
1301
|
+
service: Literal["start", "stop", "restart", "reload", "enable", "disable", "create", "edit", "remove"],
|
|
1302
|
+
app: str | None = None,
|
|
1303
|
+
__name: str | None = None,
|
|
1304
|
+
**kwargs
|
|
1305
|
+
) -> None | bool | Any:
|
|
1295
1306
|
assert namespace == 'admin' and domain == 'app'
|
|
1296
|
-
|
|
1297
|
-
if app is None and service != "reload":
|
|
1298
|
-
self.logger.warning(
|
|
1299
|
-
"App not specified when calling '%s' service from %s. Specify App", service, __name)
|
|
1300
|
-
return
|
|
1301
|
-
|
|
1302
1307
|
match service:
|
|
1303
1308
|
case "reload" | "create":
|
|
1304
1309
|
pass
|
|
1305
1310
|
case _:
|
|
1306
|
-
if app not in self.
|
|
1311
|
+
if app not in self.get_managed_app_names(include_globals=False):
|
|
1307
1312
|
self.logger.warning(
|
|
1308
|
-
"Specified
|
|
1313
|
+
"Specified app '%s' for service '%s' is not valid from %s",
|
|
1314
|
+
app,
|
|
1315
|
+
service,
|
|
1316
|
+
__name
|
|
1317
|
+
)
|
|
1309
1318
|
return
|
|
1310
1319
|
|
|
1311
|
-
match service:
|
|
1312
|
-
case "start":
|
|
1313
|
-
asyncio.
|
|
1314
|
-
case "stop":
|
|
1315
|
-
asyncio.
|
|
1316
|
-
case "restart":
|
|
1317
|
-
asyncio.
|
|
1318
|
-
case "reload":
|
|
1319
|
-
asyncio.
|
|
1320
|
-
|
|
1321
|
-
case _:
|
|
1320
|
+
match (service, app):
|
|
1321
|
+
case ("start", str()):
|
|
1322
|
+
asyncio.create_task(self.start_app(app))
|
|
1323
|
+
case ("stop", str()):
|
|
1324
|
+
asyncio.create_task(self.stop_app(app, delete=False))
|
|
1325
|
+
case ("restart", str()):
|
|
1326
|
+
asyncio.create_task(self.restart_app(app))
|
|
1327
|
+
case ("reload", _):
|
|
1328
|
+
asyncio.create_task(self.check_app_updates(mode=UpdateMode.RELOAD_APPS))
|
|
1329
|
+
case (_, str()):
|
|
1322
1330
|
# first the check app updates needs to be stopped if on
|
|
1323
1331
|
mode = copy.deepcopy(self.AD.production_mode)
|
|
1324
1332
|
|
|
@@ -1343,3 +1351,10 @@ class AppManagement:
|
|
|
1343
1351
|
self.AD.production_mode = mode
|
|
1344
1352
|
|
|
1345
1353
|
return result
|
|
1354
|
+
case _:
|
|
1355
|
+
self.logger.warning(
|
|
1356
|
+
"Invalid app service call '%s' with app '%s' from app %s.",
|
|
1357
|
+
service,
|
|
1358
|
+
app,
|
|
1359
|
+
__name
|
|
1360
|
+
)
|
|
@@ -173,8 +173,9 @@ class DependencyManager:
|
|
|
173
173
|
return self.python_deps.get_dependents(modules)
|
|
174
174
|
|
|
175
175
|
def modules_from_apps(self, apps: str | Iterable[str], dependents: bool = True) -> set[str]:
|
|
176
|
-
"""Find the importable names of all the python modules that
|
|
177
|
-
|
|
176
|
+
"""Find the importable names of all the python modules that the given apps depend on.
|
|
177
|
+
|
|
178
|
+
This includes the transitive closure by default.
|
|
178
179
|
|
|
179
180
|
Args:
|
|
180
181
|
apps (str | Iterable[str]):
|
|
@@ -15,7 +15,7 @@ if TYPE_CHECKING:
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class EventCallback(Protocol):
|
|
18
|
-
def __call__(self,
|
|
18
|
+
def __call__(self, event_type: str, data: dict[str, Any], **kwargs: Any) -> None: ...
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class Events:
|
|
@@ -214,8 +214,8 @@ class Events:
|
|
|
214
214
|
# if data["event_type"] == "__AD_ENTITY_REMOVED":
|
|
215
215
|
# print("process event")
|
|
216
216
|
|
|
217
|
-
self.logger.debug("Event type
|
|
218
|
-
self.logger.debug(data["data"])
|
|
217
|
+
self.logger.debug("Event type: %s:", data["event_type"])
|
|
218
|
+
# self.logger.debug(data["data"])
|
|
219
219
|
|
|
220
220
|
# Kick the scheduler so it updates it's clock
|
|
221
221
|
if self.AD.sched is not None and self.AD.sched.realtime is False and namespace != "admin":
|
|
@@ -92,7 +92,7 @@ class HASSConfig(PluginConfig):
|
|
|
92
92
|
enable_started_event: bool = True
|
|
93
93
|
"""If true, the plugin will wait for the 'homeassistant_started' event before starting the plugin."""
|
|
94
94
|
cert_path: CoercedPath | None = None
|
|
95
|
-
cert_verify: bool
|
|
95
|
+
cert_verify: bool = True
|
|
96
96
|
commtype: str = "WS"
|
|
97
97
|
q_timeout: int = 30
|
|
98
98
|
ws_timeout: Annotated[
|
|
@@ -58,10 +58,14 @@ class Hass(ADBase, ADAPI):
|
|
|
58
58
|
self.register_constraint("constrain_input_select")
|
|
59
59
|
|
|
60
60
|
@utils.sync_decorator
|
|
61
|
-
async def ping(self) -> float:
|
|
61
|
+
async def ping(self) -> float | None:
|
|
62
62
|
"""Gets the number of seconds """
|
|
63
63
|
if (plugin := self._plugin) is not None:
|
|
64
|
-
|
|
64
|
+
match await plugin.ping():
|
|
65
|
+
case {"ad_status": "OK", "ad_duration": ad_duration}:
|
|
66
|
+
return ad_duration
|
|
67
|
+
case _:
|
|
68
|
+
return None
|
|
65
69
|
|
|
66
70
|
@utils.sync_decorator
|
|
67
71
|
async def check_for_entity(self, entity_id: str, namespace: str | None = None) -> bool:
|
|
@@ -539,16 +543,14 @@ class Hass(ADBase, ADAPI):
|
|
|
539
543
|
Returns:
|
|
540
544
|
Information about the service in a dict with the following keys: ``name``, ``description``, ``target``, and
|
|
541
545
|
``fields``.
|
|
542
|
-
|
|
543
546
|
"""
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
if
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
self.logger.warning("Service info not found for domain '%s", domain)
|
|
547
|
+
match self._plugin:
|
|
548
|
+
case HassPlugin() as plugin:
|
|
549
|
+
domain, service_name = service.split("/", 2)
|
|
550
|
+
if info := plugin.services.get(domain, {}).get(service_name):
|
|
551
|
+
# Return a copy of the info dict to prevent accidental modification
|
|
552
|
+
return deepcopy(info)
|
|
553
|
+
self.logger.warning("Service info not found for domain '%s", domain)
|
|
552
554
|
|
|
553
555
|
# Methods that use self.call_service
|
|
554
556
|
|
|
@@ -680,7 +682,7 @@ class Hass(ADBase, ADAPI):
|
|
|
680
682
|
significant_changes_only: bool | None = None,
|
|
681
683
|
callback: Callable | None = None,
|
|
682
684
|
namespace: str | None = None,
|
|
683
|
-
) -> list[list[dict[str, Any]]]:
|
|
685
|
+
) -> list[list[dict[str, Any]]] | None:
|
|
684
686
|
"""Gets access to the HA Database.
|
|
685
687
|
This is a convenience function that allows accessing the HA Database, so the
|
|
686
688
|
history state of a device can be retrieved. It allows for a level of flexibility
|
|
@@ -755,31 +757,27 @@ class Hass(ADBase, ADAPI):
|
|
|
755
757
|
end_time = end_time or await self.get_now()
|
|
756
758
|
start_time = end_time - timedelta(days=days)
|
|
757
759
|
|
|
758
|
-
|
|
759
|
-
plugin:
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
self.logger.warning(
|
|
780
|
-
"Wrong Namespace selected, as %s has no database plugin attached to it",
|
|
781
|
-
namespace,
|
|
782
|
-
)
|
|
760
|
+
plugin = self.AD.plugins.get_plugin_object(namespace or self.namespace)
|
|
761
|
+
match plugin:
|
|
762
|
+
case HassPlugin():
|
|
763
|
+
coro = plugin.get_history(
|
|
764
|
+
filter_entity_id=entity_id,
|
|
765
|
+
timestamp=start_time,
|
|
766
|
+
end_time=end_time,
|
|
767
|
+
minimal_response=minimal_response,
|
|
768
|
+
no_attributes=no_attributes,
|
|
769
|
+
significant_changes_only=significant_changes_only,
|
|
770
|
+
)
|
|
771
|
+
|
|
772
|
+
if callback is not None and callable(callback):
|
|
773
|
+
self.create_task(coro, callback)
|
|
774
|
+
else:
|
|
775
|
+
return await coro
|
|
776
|
+
case _:
|
|
777
|
+
self.logger.warning(
|
|
778
|
+
"Wrong Namespace selected, as %s has no database plugin attached to it",
|
|
779
|
+
namespace,
|
|
780
|
+
)
|
|
783
781
|
|
|
784
782
|
@utils.sync_decorator
|
|
785
783
|
async def get_logbook(
|