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.
Files changed (354) hide show
  1. {appdaemon-4.5.6/appdaemon.egg-info → appdaemon-4.5.8}/PKG-INFO +1 -1
  2. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/adapi.py +40 -5
  3. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/adbase.py +22 -8
  4. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/app_management.py +50 -35
  5. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dependency_manager.py +3 -2
  6. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/events.py +3 -3
  7. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/plugin.py +1 -1
  8. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/app_management.py +1 -0
  9. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassapi.py +35 -37
  10. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassplugin.py +266 -214
  11. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/threads.py +2 -2
  12. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/utils.py +5 -0
  13. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/version.py +1 -1
  14. {appdaemon-4.5.6 → appdaemon-4.5.8/appdaemon.egg-info}/PKG-INFO +1 -1
  15. {appdaemon-4.5.6 → appdaemon-4.5.8}/LICENSE.md +0 -0
  16. {appdaemon-4.5.6 → appdaemon-4.5.8}/MANIFEST.in +0 -0
  17. {appdaemon-4.5.6 → appdaemon-4.5.8}/README.md +0 -0
  18. {appdaemon-4.5.6 → appdaemon-4.5.8}/README.rst +0 -0
  19. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/__init__.py +0 -0
  20. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/__main__.py +0 -0
  21. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/admin.py +0 -0
  22. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/admin_loop.py +0 -0
  23. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/appdaemon.py +0 -0
  24. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/appdaemon.png +0 -0
  25. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/css/app.css +0 -0
  26. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/css/chunk-vendors.css +0 -0
  27. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/favicon.ico +0 -0
  28. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/index.html +0 -0
  29. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js +0 -0
  30. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js.map +0 -0
  31. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js +0 -0
  32. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js.map +0 -0
  33. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/all.css +0 -0
  34. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/climacons-font.css +0 -0
  35. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/default/dashboard.css +0 -0
  36. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/default/variables.yaml +0 -0
  37. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/fontawesome.min.css +0 -0
  38. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/fonts.css +0 -0
  39. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/dashboard.css +0 -0
  40. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon1.jpg +0 -0
  41. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon2.jpg +0 -0
  42. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon3.jpg +0 -0
  43. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon4.jpg +0 -0
  44. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/glassic_bg.jpg +0 -0
  45. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/variables.yaml +0 -0
  46. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_444444_256x240.png +0 -0
  47. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_555555_256x240.png +0 -0
  48. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777620_256x240.png +0 -0
  49. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777777_256x240.png +0 -0
  50. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_cc0000_256x240.png +0 -0
  51. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_ffffff_256x240.png +0 -0
  52. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/jquery-ui.css +0 -0
  53. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/jquery.gridster.css +0 -0
  54. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/main.css +0 -0
  55. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/materialdesignicons.min.css +0 -0
  56. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/non_dashboard.css +0 -0
  57. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/dashboard.css +0 -0
  58. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_bg.jpg +0 -0
  59. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_w_bg.jpg +0 -0
  60. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidianbg.jpg +0 -0
  61. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/widgetbg.jpg +0 -0
  62. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/variables.yaml +0 -0
  63. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/rickshaw.min.css +0 -0
  64. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/dashboard.css +0 -0
  65. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldgradient.png +0 -0
  66. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldtexture.jpg +0 -0
  67. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/js/timer.js +0 -0
  68. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/variables.yaml +0 -0
  69. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/v4-shims.min.css +0 -0
  70. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/dashboard.css +0 -0
  71. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg.jpg +0 -0
  72. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg2.jpg +0 -0
  73. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_weatherbg.jpg +0 -0
  74. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/css/zen/variables.yaml +0 -0
  75. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/TickingTimebombBB.ttf +0 -0
  76. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.eot +0 -0
  77. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.svg +0 -0
  78. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.ttf +0 -0
  79. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.woff +0 -0
  80. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.eot +0 -0
  81. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.ttf +0 -0
  82. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.eot +0 -0
  83. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.ttf +0 -0
  84. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff +0 -0
  85. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff2 +0 -0
  86. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/fonts/repetition.ttf +0 -0
  87. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/Blank.gif +0 -0
  88. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-192x192.png +0 -0
  89. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-512x512.png +0 -0
  90. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/apple-touch-icon.png +0 -0
  91. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/browserconfig.xml +0 -0
  92. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-16x16.png +0 -0
  93. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-32x32.png +0 -0
  94. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/favicon.ico +0 -0
  95. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/manifest.json +0 -0
  96. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-144x144.png +0 -0
  97. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-150x150.png +0 -0
  98. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x150.png +0 -0
  99. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x310.png +0 -0
  100. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-70x70.png +0 -0
  101. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/admin.js +0 -0
  102. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.layout.min.js +0 -0
  103. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.min.js +0 -0
  104. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/dashboard.js +0 -0
  105. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/gauge.min.js +0 -0
  106. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-3.1.1.min.js +0 -0
  107. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-ui.js +0 -0
  108. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery.gridster.js +0 -0
  109. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/justgage.js +0 -0
  110. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/knockout-3.4.1.js +0 -0
  111. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/list.min.js +0 -0
  112. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/plotly.min.js +0 -0
  113. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/raphael-2.1.4.min.js +0 -0
  114. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/reconnecting-websocket.min.js +0 -0
  115. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/rickshaw.min.js +0 -0
  116. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/socket.io.js +0 -0
  117. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/sockjs.min.js +0 -0
  118. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/javascript/stream.js +0 -0
  119. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/admin.jinja2 +0 -0
  120. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/body_include.jinja2 +0 -0
  121. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/dashboard.jinja2 +0 -0
  122. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/dashinit.jinja2 +0 -0
  123. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/error.jinja2 +0 -0
  124. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/head_include.jinja2 +0 -0
  125. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/list.jinja2 +0 -0
  126. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/templates/logon.jinja2 +0 -0
  127. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.eot +0 -0
  128. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.svg +0 -0
  129. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.ttf +0 -0
  130. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff +0 -0
  131. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff2 +0 -0
  132. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.eot +0 -0
  133. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.svg +0 -0
  134. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.ttf +0 -0
  135. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff +0 -0
  136. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff2 +0 -0
  137. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.eot +0 -0
  138. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.svg +0 -0
  139. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.ttf +0 -0
  140. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff +0 -0
  141. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff2 +0 -0
  142. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/callbacks.py +0 -0
  143. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dashboard.py +0 -0
  144. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/dependency.py +0 -0
  145. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/entity.py +0 -0
  146. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/exceptions.py +0 -0
  147. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/futures.py +0 -0
  148. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/http.py +0 -0
  149. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/logging.py +0 -0
  150. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/__init__.py +0 -0
  151. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/__init__.py +0 -0
  152. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/api.py +0 -0
  153. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/app.py +0 -0
  154. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/appdaemon.py +0 -0
  155. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/common.py +0 -0
  156. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/dashboard.py +0 -0
  157. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/http.py +0 -0
  158. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/log.py +0 -0
  159. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/misc.py +0 -0
  160. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/sequence.py +0 -0
  161. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/config/yaml.py +0 -0
  162. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/__init__.py +0 -0
  163. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/file_check.py +0 -0
  164. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/plugin.py +0 -0
  165. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/state.py +0 -0
  166. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/internal/threading.py +0 -0
  167. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/__init__.py +0 -0
  168. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/android.py +0 -0
  169. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/base.py +0 -0
  170. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/models/notification/iOS.py +0 -0
  171. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugin_management.py +0 -0
  172. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/__init__.py +0 -0
  173. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyapi.py +0 -0
  174. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyplugin.py +0 -0
  175. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/__init__.py +0 -0
  176. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/exceptions.py +0 -0
  177. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/models.py +0 -0
  178. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/notifications.py +0 -0
  179. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/hass/utils.py +0 -0
  180. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/__init__.py +0 -0
  181. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttapi.py +0 -0
  182. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttplugin.py +0 -0
  183. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/pyversions.py +0 -0
  184. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/scheduler.py +0 -0
  185. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/sequences.py +0 -0
  186. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/services.py +0 -0
  187. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/state.py +0 -0
  188. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/__init__.py +0 -0
  189. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/adstream.py +0 -0
  190. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/socketio_handler.py +0 -0
  191. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/sockjs_handler.py +0 -0
  192. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/stream/ws_handler.py +0 -0
  193. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/thread_async.py +0 -0
  194. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/utility_loop.py +0 -0
  195. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminLog.yaml +0 -0
  196. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminSummary.yaml +0 -0
  197. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/AdminTable.yaml +0 -0
  198. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/alarm.yaml +0 -0
  199. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.css +0 -0
  200. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.html +0 -0
  201. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.js +0 -0
  202. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.css +0 -0
  203. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.html +0 -0
  204. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.js +0 -0
  205. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.css +0 -0
  206. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.html +0 -0
  207. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.js +0 -0
  208. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.css +0 -0
  209. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.html +0 -0
  210. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.js +0 -0
  211. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.css +0 -0
  212. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.html +0 -0
  213. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.js +0 -0
  214. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.css +0 -0
  215. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.html +0 -0
  216. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.js +0 -0
  217. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.css +0 -0
  218. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.html +0 -0
  219. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.js +0 -0
  220. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.css +0 -0
  221. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.html +0 -0
  222. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.js +0 -0
  223. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.css +0 -0
  224. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.html +0 -0
  225. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.js +0 -0
  226. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.css +0 -0
  227. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.html +0 -0
  228. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.js +0 -0
  229. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.css +0 -0
  230. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.html +0 -0
  231. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.js +0 -0
  232. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.css +0 -0
  233. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.html +0 -0
  234. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.js +0 -0
  235. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.css +0 -0
  236. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.html +0 -0
  237. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.js +0 -0
  238. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.css +0 -0
  239. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.html +0 -0
  240. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.js +0 -0
  241. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.css +0 -0
  242. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.html +0 -0
  243. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.js +0 -0
  244. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.css +0 -0
  245. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.html +0 -0
  246. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.js +0 -0
  247. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.css +0 -0
  248. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.html +0 -0
  249. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.js +0 -0
  250. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.css +0 -0
  251. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.html +0 -0
  252. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.js +0 -0
  253. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.css +0 -0
  254. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.html +0 -0
  255. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.js +0 -0
  256. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.css +0 -0
  257. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.html +0 -0
  258. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.js +0 -0
  259. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.css +0 -0
  260. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.html +0 -0
  261. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.js +0 -0
  262. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.css +0 -0
  263. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.html +0 -0
  264. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.js +0 -0
  265. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.css +0 -0
  266. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.html +0 -0
  267. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.js +0 -0
  268. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.css +0 -0
  269. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.html +0 -0
  270. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.js +0 -0
  271. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.css +0 -0
  272. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.html +0 -0
  273. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.js +0 -0
  274. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/binary_sensor.yaml +0 -0
  275. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/camera.yaml +0 -0
  276. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/climate.yaml +0 -0
  277. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/clock.yaml +0 -0
  278. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/cover.yaml +0 -0
  279. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/device_tracker.yaml +0 -0
  280. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/entitypicture.yaml +0 -0
  281. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/fan.yaml +0 -0
  282. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/gauge.yaml +0 -0
  283. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/group.yaml +0 -0
  284. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/heater.yaml +0 -0
  285. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/icon.yaml +0 -0
  286. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/iframe.yaml +0 -0
  287. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_boolean.yaml +0 -0
  288. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_datetime.yaml +0 -0
  289. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_number.yaml +0 -0
  290. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_select.yaml +0 -0
  291. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_slider.yaml +0 -0
  292. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/input_text.yaml +0 -0
  293. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/javascript.yaml +0 -0
  294. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/label.yaml +0 -0
  295. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/light.yaml +0 -0
  296. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/lock.yaml +0 -0
  297. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/london_underground.yaml +0 -0
  298. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/media_player.yaml +0 -0
  299. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/mode.yaml +0 -0
  300. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/navigate.yaml +0 -0
  301. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/person.yaml +0 -0
  302. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/pirateweather.yaml +0 -0
  303. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/radial.yaml +0 -0
  304. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/reload.yaml +0 -0
  305. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/rss.yaml +0 -0
  306. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/scene.yaml +0 -0
  307. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/script.yaml +0 -0
  308. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/sensor.yaml +0 -0
  309. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/sequence.yaml +0 -0
  310. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/switch.yaml +0 -0
  311. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/temperature.yaml +0 -0
  312. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/text_sensor.yaml +0 -0
  313. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/weather.yaml +0 -0
  314. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon/widgets/weather_summary.yaml +0 -0
  315. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/SOURCES.txt +0 -0
  316. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/dependency_links.txt +0 -0
  317. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/entry_points.txt +0 -0
  318. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/requires.txt +0 -0
  319. {appdaemon-4.5.6 → appdaemon-4.5.8}/appdaemon.egg-info/top_level.txt +0 -0
  320. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/apps/hello.py +0 -0
  321. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/general_app_functions.py +0 -0
  322. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/objectcontrole.py +0 -0
  323. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/alexa.py +0 -0
  324. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/battery.py +0 -0
  325. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/bysykkel.py +0 -0
  326. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/commute.py +0 -0
  327. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/dark_day.py +0 -0
  328. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/door_notification.py +0 -0
  329. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/eventCache.py +0 -0
  330. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/eventMonitor.py +0 -0
  331. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/globals.py +0 -0
  332. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/grandfather.py +0 -0
  333. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/hwcheck.py +0 -0
  334. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ical.py +0 -0
  335. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/minimote.py +0 -0
  336. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/modes.py +0 -0
  337. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/momentary_switch.py +0 -0
  338. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/motion_lights.py +0 -0
  339. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/motion_notification.py +0 -0
  340. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/occusim.py +0 -0
  341. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/outside_lights.py +0 -0
  342. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/presence.py +0 -0
  343. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/ruter.py +0 -0
  344. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/secure.py +0 -0
  345. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sensor_notification.py +0 -0
  346. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sensor_notify.py +0 -0
  347. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sequence.py +0 -0
  348. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/smart_heat.py +0 -0
  349. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/sound.py +0 -0
  350. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/switch_reset.py +0 -0
  351. {appdaemon-4.5.6 → appdaemon-4.5.8}/conf/example_apps/yr.py +0 -0
  352. {appdaemon-4.5.6 → appdaemon-4.5.8}/pyproject.toml +0 -0
  353. {appdaemon-4.5.6 → appdaemon-4.5.8}/setup.cfg +0 -0
  354. {appdaemon-4.5.6 → appdaemon-4.5.8}/tests/test_main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: appdaemon
3
- Version: 4.5.6
3
+ Version: 4.5.8
4
4
  Summary: Apps for the Home Assistant home automation package.
5
5
  Author-email: Andrew I Cockburn <appdaemon@acockburn.com>
6
6
  Project-URL: documentation, https://appdaemon.readthedocs.io
@@ -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
- apps |= set(name for name, cfg in self.app_config.root.items()
517
- if isinstance(cfg, GlobalModule))
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(self,
1289
- namespace: str,
1290
- domain: str,
1291
- service: str,
1292
- app: str | None = None,
1293
- __name: str | None = None,
1294
- **kwargs):
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.app_config:
1311
+ if app not in self.get_managed_app_names(include_globals=False):
1307
1312
  self.logger.warning(
1308
- "Specified App '%s' is not a valid App from %s", app, __name)
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.ensure_future(self.start_app(app))
1314
- case "stop":
1315
- asyncio.ensure_future(self.stop_app(app, delete=False))
1316
- case "restart":
1317
- asyncio.ensure_future(self.restart_app(app))
1318
- case "reload":
1319
- asyncio.ensure_future(
1320
- self.check_app_updates(mode=UpdateMode.INIT))
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 depend on the given apps. Includes
177
- the transitive closure by default.
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, event_name: str, data: dict[str, Any], **kwargs: Any) -> None: ...
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:%s:", data["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 | None = None
95
+ cert_verify: bool = True
96
96
  commtype: str = "WS"
97
97
  q_timeout: int = 30
98
98
  ws_timeout: Annotated[
@@ -24,6 +24,7 @@ class UpdateMode(Enum):
24
24
 
25
25
  INIT = auto()
26
26
  NORMAL = auto()
27
+ RELOAD_APPS = auto()
27
28
  PLUGIN_FAILED = auto()
28
29
  PLUGIN_RESTART = auto()
29
30
  TERMINATE = auto()
@@ -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
- return (await plugin.ping())['ad_duration']
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
- if (plugin := self._plugin) is not None:
545
- domain, service_name = service.split("/", 2)
546
- for service_def in plugin.services:
547
- if service_def.get("domain") == domain:
548
- if (services := service_def.get("services")) is not None:
549
- return deepcopy(services.get(service_name))
550
- else:
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: "HassPlugin" = self.AD.plugins.get_plugin_object(
760
- namespace or self.namespace
761
- )
762
-
763
- if plugin is not None:
764
- coro = plugin.get_history(
765
- filter_entity_id=entity_id,
766
- timestamp=start_time,
767
- end_time=end_time,
768
- minimal_response=minimal_response,
769
- no_attributes=no_attributes,
770
- significant_changes_only=significant_changes_only,
771
- )
772
-
773
- if callback is not None and callable(callback):
774
- self.create_task(coro, callback)
775
- else:
776
- return await coro
777
-
778
- else:
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(