appdaemon 4.5.7__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.7/appdaemon.egg-info → appdaemon-4.5.8}/PKG-INFO +1 -1
  2. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/app_management.py +50 -35
  3. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/dependency_manager.py +3 -2
  4. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/events.py +3 -3
  5. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/plugin.py +1 -1
  6. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/app_management.py +1 -0
  7. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassapi.py +35 -37
  8. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/hassplugin.py +266 -214
  9. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/threads.py +2 -2
  10. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/utils.py +5 -0
  11. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/version.py +1 -1
  12. {appdaemon-4.5.7 → appdaemon-4.5.8/appdaemon.egg-info}/PKG-INFO +1 -1
  13. {appdaemon-4.5.7 → appdaemon-4.5.8}/LICENSE.md +0 -0
  14. {appdaemon-4.5.7 → appdaemon-4.5.8}/MANIFEST.in +0 -0
  15. {appdaemon-4.5.7 → appdaemon-4.5.8}/README.md +0 -0
  16. {appdaemon-4.5.7 → appdaemon-4.5.8}/README.rst +0 -0
  17. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/__init__.py +0 -0
  18. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/__main__.py +0 -0
  19. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/adapi.py +0 -0
  20. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/adbase.py +0 -0
  21. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/admin.py +0 -0
  22. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/admin_loop.py +0 -0
  23. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/appdaemon.py +0 -0
  24. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/appdaemon.png +0 -0
  25. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/css/app.css +0 -0
  26. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/css/chunk-vendors.css +0 -0
  27. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/favicon.ico +0 -0
  28. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/index.html +0 -0
  29. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js +0 -0
  30. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/js/app.js.map +0 -0
  31. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js +0 -0
  32. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/aui/js/chunk-vendors.js.map +0 -0
  33. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/all.css +0 -0
  34. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/climacons-font.css +0 -0
  35. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/default/dashboard.css +0 -0
  36. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/default/variables.yaml +0 -0
  37. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/fontawesome.min.css +0 -0
  38. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/fonts.css +0 -0
  39. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/dashboard.css +0 -0
  40. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon1.jpg +0 -0
  41. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon2.jpg +0 -0
  42. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon3.jpg +0 -0
  43. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/carbon4.jpg +0 -0
  44. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/img/glassic_bg.jpg +0 -0
  45. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/glassic/variables.yaml +0 -0
  46. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_444444_256x240.png +0 -0
  47. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_555555_256x240.png +0 -0
  48. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777620_256x240.png +0 -0
  49. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_777777_256x240.png +0 -0
  50. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_cc0000_256x240.png +0 -0
  51. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/images/ui-icons_ffffff_256x240.png +0 -0
  52. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/jquery-ui.css +0 -0
  53. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/jquery.gridster.css +0 -0
  54. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/main.css +0 -0
  55. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/materialdesignicons.min.css +0 -0
  56. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/non_dashboard.css +0 -0
  57. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/dashboard.css +0 -0
  58. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_bg.jpg +0 -0
  59. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidian_w_bg.jpg +0 -0
  60. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/obsidianbg.jpg +0 -0
  61. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/img/widgetbg.jpg +0 -0
  62. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/obsidian/variables.yaml +0 -0
  63. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/rickshaw.min.css +0 -0
  64. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/dashboard.css +0 -0
  65. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldgradient.png +0 -0
  66. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/img/goldtexture.jpg +0 -0
  67. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/js/timer.js +0 -0
  68. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/simplyred/variables.yaml +0 -0
  69. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/v4-shims.min.css +0 -0
  70. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/zen/dashboard.css +0 -0
  71. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg.jpg +0 -0
  72. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_bg2.jpg +0 -0
  73. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/zen/img/zen_weatherbg.jpg +0 -0
  74. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/css/zen/variables.yaml +0 -0
  75. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/TickingTimebombBB.ttf +0 -0
  76. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.eot +0 -0
  77. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.svg +0 -0
  78. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.ttf +0 -0
  79. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/climacons-webfont.woff +0 -0
  80. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.eot +0 -0
  81. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/digital-7-mono.ttf +0 -0
  82. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.eot +0 -0
  83. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.ttf +0 -0
  84. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff +0 -0
  85. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/materialdesignicons-webfont.woff2 +0 -0
  86. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/fonts/repetition.ttf +0 -0
  87. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/Blank.gif +0 -0
  88. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-192x192.png +0 -0
  89. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/android-chrome-512x512.png +0 -0
  90. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/apple-touch-icon.png +0 -0
  91. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/browserconfig.xml +0 -0
  92. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-16x16.png +0 -0
  93. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/favicon-32x32.png +0 -0
  94. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/favicon.ico +0 -0
  95. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/manifest.json +0 -0
  96. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-144x144.png +0 -0
  97. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-150x150.png +0 -0
  98. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x150.png +0 -0
  99. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-310x310.png +0 -0
  100. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/images/mstile-70x70.png +0 -0
  101. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/admin.js +0 -0
  102. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.layout.min.js +0 -0
  103. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/d3.min.js +0 -0
  104. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/dashboard.js +0 -0
  105. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/gauge.min.js +0 -0
  106. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-3.1.1.min.js +0 -0
  107. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery-ui.js +0 -0
  108. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/jquery.gridster.js +0 -0
  109. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/justgage.js +0 -0
  110. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/knockout-3.4.1.js +0 -0
  111. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/list.min.js +0 -0
  112. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/plotly.min.js +0 -0
  113. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/raphael-2.1.4.min.js +0 -0
  114. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/reconnecting-websocket.min.js +0 -0
  115. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/rickshaw.min.js +0 -0
  116. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/socket.io.js +0 -0
  117. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/sockjs.min.js +0 -0
  118. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/javascript/stream.js +0 -0
  119. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/admin.jinja2 +0 -0
  120. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/body_include.jinja2 +0 -0
  121. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/dashboard.jinja2 +0 -0
  122. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/dashinit.jinja2 +0 -0
  123. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/error.jinja2 +0 -0
  124. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/head_include.jinja2 +0 -0
  125. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/list.jinja2 +0 -0
  126. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/templates/logon.jinja2 +0 -0
  127. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.eot +0 -0
  128. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.svg +0 -0
  129. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.ttf +0 -0
  130. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff +0 -0
  131. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-brands-400.woff2 +0 -0
  132. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.eot +0 -0
  133. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.svg +0 -0
  134. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.ttf +0 -0
  135. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff +0 -0
  136. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-regular-400.woff2 +0 -0
  137. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.eot +0 -0
  138. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.svg +0 -0
  139. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.ttf +0 -0
  140. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff +0 -0
  141. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/assets/webfonts/fa-solid-900.woff2 +0 -0
  142. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/callbacks.py +0 -0
  143. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/dashboard.py +0 -0
  144. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/dependency.py +0 -0
  145. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/entity.py +0 -0
  146. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/exceptions.py +0 -0
  147. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/futures.py +0 -0
  148. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/http.py +0 -0
  149. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/logging.py +0 -0
  150. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/__init__.py +0 -0
  151. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/__init__.py +0 -0
  152. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/api.py +0 -0
  153. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/app.py +0 -0
  154. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/appdaemon.py +0 -0
  155. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/common.py +0 -0
  156. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/dashboard.py +0 -0
  157. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/http.py +0 -0
  158. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/log.py +0 -0
  159. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/misc.py +0 -0
  160. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/sequence.py +0 -0
  161. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/config/yaml.py +0 -0
  162. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/__init__.py +0 -0
  163. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/file_check.py +0 -0
  164. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/plugin.py +0 -0
  165. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/state.py +0 -0
  166. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/internal/threading.py +0 -0
  167. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/notification/__init__.py +0 -0
  168. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/notification/android.py +0 -0
  169. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/notification/base.py +0 -0
  170. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/models/notification/iOS.py +0 -0
  171. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugin_management.py +0 -0
  172. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/__init__.py +0 -0
  173. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyapi.py +0 -0
  174. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/dummy/dummyplugin.py +0 -0
  175. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/__init__.py +0 -0
  176. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/exceptions.py +0 -0
  177. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/models.py +0 -0
  178. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/notifications.py +0 -0
  179. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/hass/utils.py +0 -0
  180. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/__init__.py +0 -0
  181. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttapi.py +0 -0
  182. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/plugins/mqtt/mqttplugin.py +0 -0
  183. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/pyversions.py +0 -0
  184. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/scheduler.py +0 -0
  185. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/sequences.py +0 -0
  186. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/services.py +0 -0
  187. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/state.py +0 -0
  188. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/stream/__init__.py +0 -0
  189. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/stream/adstream.py +0 -0
  190. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/stream/socketio_handler.py +0 -0
  191. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/stream/sockjs_handler.py +0 -0
  192. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/stream/ws_handler.py +0 -0
  193. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/thread_async.py +0 -0
  194. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/utility_loop.py +0 -0
  195. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/AdminLog.yaml +0 -0
  196. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/AdminSummary.yaml +0 -0
  197. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/AdminTable.yaml +0 -0
  198. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/alarm.yaml +0 -0
  199. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.css +0 -0
  200. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.html +0 -0
  201. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basealarm/basealarm.js +0 -0
  202. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.css +0 -0
  203. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.html +0 -0
  204. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basecamera/basecamera.js +0 -0
  205. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.css +0 -0
  206. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.html +0 -0
  207. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclimate/baseclimate.js +0 -0
  208. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.css +0 -0
  209. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.html +0 -0
  210. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseclock/baseclock.js +0 -0
  211. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.css +0 -0
  212. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.html +0 -0
  213. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedatetime/basedatetime.js +0 -0
  214. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.css +0 -0
  215. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.html +0 -0
  216. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basedisplay/basedisplay.js +0 -0
  217. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.css +0 -0
  218. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.html +0 -0
  219. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseentitypicture/baseentitypicture.js +0 -0
  220. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.css +0 -0
  221. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.html +0 -0
  222. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseerror/baseerror.js +0 -0
  223. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.css +0 -0
  224. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.html +0 -0
  225. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basefan/basefan.js +0 -0
  226. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.css +0 -0
  227. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.html +0 -0
  228. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basegauge/basegauge.js +0 -0
  229. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.css +0 -0
  230. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.html +0 -0
  231. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseheater/baseheater.js +0 -0
  232. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.css +0 -0
  233. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.html +0 -0
  234. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseicon/baseicon.js +0 -0
  235. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.css +0 -0
  236. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.html +0 -0
  237. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseiframe/baseiframe.js +0 -0
  238. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.css +0 -0
  239. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.html +0 -0
  240. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseinputnumber/baseinputnumber.js +0 -0
  241. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.css +0 -0
  242. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.html +0 -0
  243. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basejavascript/basejavascript.js +0 -0
  244. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.css +0 -0
  245. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.html +0 -0
  246. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baselight/baselight.js +0 -0
  247. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.css +0 -0
  248. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.html +0 -0
  249. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basemedia/basemedia.js +0 -0
  250. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.css +0 -0
  251. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.html +0 -0
  252. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseradial/baseradial.js +0 -0
  253. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.css +0 -0
  254. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.html +0 -0
  255. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baserss/baserss.js +0 -0
  256. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.css +0 -0
  257. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.html +0 -0
  258. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseselect/baseselect.js +0 -0
  259. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.css +0 -0
  260. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.html +0 -0
  261. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseslider/baseslider.js +0 -0
  262. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.css +0 -0
  263. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.html +0 -0
  264. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseswitch/baseswitch.js +0 -0
  265. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.css +0 -0
  266. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.html +0 -0
  267. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetemperature/basetemperature.js +0 -0
  268. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.css +0 -0
  269. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.html +0 -0
  270. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/basetext/basetext.js +0 -0
  271. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.css +0 -0
  272. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.html +0 -0
  273. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/baseweather/baseweather.js +0 -0
  274. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/binary_sensor.yaml +0 -0
  275. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/camera.yaml +0 -0
  276. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/climate.yaml +0 -0
  277. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/clock.yaml +0 -0
  278. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/cover.yaml +0 -0
  279. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/device_tracker.yaml +0 -0
  280. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/entitypicture.yaml +0 -0
  281. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/fan.yaml +0 -0
  282. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/gauge.yaml +0 -0
  283. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/group.yaml +0 -0
  284. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/heater.yaml +0 -0
  285. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/icon.yaml +0 -0
  286. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/iframe.yaml +0 -0
  287. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_boolean.yaml +0 -0
  288. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_datetime.yaml +0 -0
  289. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_number.yaml +0 -0
  290. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_select.yaml +0 -0
  291. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_slider.yaml +0 -0
  292. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/input_text.yaml +0 -0
  293. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/javascript.yaml +0 -0
  294. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/label.yaml +0 -0
  295. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/light.yaml +0 -0
  296. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/lock.yaml +0 -0
  297. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/london_underground.yaml +0 -0
  298. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/media_player.yaml +0 -0
  299. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/mode.yaml +0 -0
  300. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/navigate.yaml +0 -0
  301. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/person.yaml +0 -0
  302. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/pirateweather.yaml +0 -0
  303. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/radial.yaml +0 -0
  304. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/reload.yaml +0 -0
  305. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/rss.yaml +0 -0
  306. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/scene.yaml +0 -0
  307. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/script.yaml +0 -0
  308. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/sensor.yaml +0 -0
  309. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/sequence.yaml +0 -0
  310. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/switch.yaml +0 -0
  311. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/temperature.yaml +0 -0
  312. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/text_sensor.yaml +0 -0
  313. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/weather.yaml +0 -0
  314. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon/widgets/weather_summary.yaml +0 -0
  315. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon.egg-info/SOURCES.txt +0 -0
  316. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon.egg-info/dependency_links.txt +0 -0
  317. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon.egg-info/entry_points.txt +0 -0
  318. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon.egg-info/requires.txt +0 -0
  319. {appdaemon-4.5.7 → appdaemon-4.5.8}/appdaemon.egg-info/top_level.txt +0 -0
  320. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/apps/hello.py +0 -0
  321. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/general_app_functions.py +0 -0
  322. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/ObjectTracker/objectcontrole.py +0 -0
  323. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/alexa.py +0 -0
  324. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/battery.py +0 -0
  325. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/bysykkel.py +0 -0
  326. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/commute.py +0 -0
  327. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/dark_day.py +0 -0
  328. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/door_notification.py +0 -0
  329. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/eventCache.py +0 -0
  330. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/eventMonitor.py +0 -0
  331. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/globals.py +0 -0
  332. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/grandfather.py +0 -0
  333. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/hwcheck.py +0 -0
  334. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/ical.py +0 -0
  335. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/minimote.py +0 -0
  336. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/modes.py +0 -0
  337. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/momentary_switch.py +0 -0
  338. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/motion_lights.py +0 -0
  339. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/motion_notification.py +0 -0
  340. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/occusim.py +0 -0
  341. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/outside_lights.py +0 -0
  342. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/presence.py +0 -0
  343. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/ruter.py +0 -0
  344. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/secure.py +0 -0
  345. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/sensor_notification.py +0 -0
  346. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/sensor_notify.py +0 -0
  347. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/sequence.py +0 -0
  348. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/smart_heat.py +0 -0
  349. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/sound.py +0 -0
  350. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/switch_reset.py +0 -0
  351. {appdaemon-4.5.7 → appdaemon-4.5.8}/conf/example_apps/yr.py +0 -0
  352. {appdaemon-4.5.7 → appdaemon-4.5.8}/pyproject.toml +0 -0
  353. {appdaemon-4.5.7 → appdaemon-4.5.8}/setup.cfg +0 -0
  354. {appdaemon-4.5.7 → 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.7
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
@@ -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(