appdaemon 4.5.2__tar.gz → 4.5.4__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 (355) hide show
  1. {appdaemon-4.5.2/appdaemon.egg-info → appdaemon-4.5.4}/PKG-INFO +1 -1
  2. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/adapi.py +18 -10
  3. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/app_management.py +9 -6
  4. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/entity.py +1 -3
  5. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/plugin.py +0 -1
  6. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugin_management.py +8 -2
  7. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/hassapi.py +23 -13
  8. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/hassplugin.py +2 -2
  9. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/stream/adstream.py +12 -10
  10. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/stream/ws_handler.py +4 -3
  11. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/threads.py +6 -1
  12. appdaemon-4.5.4/appdaemon/version.py +2 -0
  13. {appdaemon-4.5.2 → appdaemon-4.5.4/appdaemon.egg-info}/PKG-INFO +1 -1
  14. appdaemon-4.5.2/appdaemon/version.py +0 -2
  15. {appdaemon-4.5.2 → appdaemon-4.5.4}/LICENSE.md +0 -0
  16. {appdaemon-4.5.2 → appdaemon-4.5.4}/MANIFEST.in +0 -0
  17. {appdaemon-4.5.2 → appdaemon-4.5.4}/README.md +0 -0
  18. {appdaemon-4.5.2 → appdaemon-4.5.4}/README.rst +0 -0
  19. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/__init__.py +0 -0
  20. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/__main__.py +0 -0
  21. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/adbase.py +0 -0
  22. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/admin.py +0 -0
  23. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/admin_loop.py +0 -0
  24. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/appdaemon.py +0 -0
  25. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/appdaemon.png +0 -0
  26. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/css/app.css +0 -0
  27. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/css/chunk-vendors.css +0 -0
  28. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/favicon.ico +0 -0
  29. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/index.html +0 -0
  30. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/js/app.js +0 -0
  31. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/js/app.js.map +0 -0
  32. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/js/chunk-vendors.js +0 -0
  33. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/aui/js/chunk-vendors.js.map +0 -0
  34. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/all.css +0 -0
  35. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/climacons-font.css +0 -0
  36. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/default/dashboard.css +0 -0
  37. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/default/variables.yaml +0 -0
  38. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/fontawesome.min.css +0 -0
  39. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/fonts.css +0 -0
  40. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/dashboard.css +0 -0
  41. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/img/carbon1.jpg +0 -0
  42. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/img/carbon2.jpg +0 -0
  43. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/img/carbon3.jpg +0 -0
  44. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/img/carbon4.jpg +0 -0
  45. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/img/glassic_bg.jpg +0 -0
  46. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/glassic/variables.yaml +0 -0
  47. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_444444_256x240.png +0 -0
  48. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_555555_256x240.png +0 -0
  49. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_777620_256x240.png +0 -0
  50. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_777777_256x240.png +0 -0
  51. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_cc0000_256x240.png +0 -0
  52. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/images/ui-icons_ffffff_256x240.png +0 -0
  53. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/jquery-ui.css +0 -0
  54. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/jquery.gridster.css +0 -0
  55. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/main.css +0 -0
  56. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/materialdesignicons.min.css +0 -0
  57. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/non_dashboard.css +0 -0
  58. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/dashboard.css +0 -0
  59. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/img/obsidian_bg.jpg +0 -0
  60. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/img/obsidian_w_bg.jpg +0 -0
  61. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/img/obsidianbg.jpg +0 -0
  62. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/img/widgetbg.jpg +0 -0
  63. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/obsidian/variables.yaml +0 -0
  64. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/rickshaw.min.css +0 -0
  65. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/simplyred/dashboard.css +0 -0
  66. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/simplyred/img/goldgradient.png +0 -0
  67. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/simplyred/img/goldtexture.jpg +0 -0
  68. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/simplyred/js/timer.js +0 -0
  69. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/simplyred/variables.yaml +0 -0
  70. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/v4-shims.min.css +0 -0
  71. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/zen/dashboard.css +0 -0
  72. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/zen/img/zen_bg.jpg +0 -0
  73. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/zen/img/zen_bg2.jpg +0 -0
  74. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/zen/img/zen_weatherbg.jpg +0 -0
  75. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/css/zen/variables.yaml +0 -0
  76. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/TickingTimebombBB.ttf +0 -0
  77. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/climacons-webfont.eot +0 -0
  78. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/climacons-webfont.svg +0 -0
  79. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/climacons-webfont.ttf +0 -0
  80. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/climacons-webfont.woff +0 -0
  81. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/digital-7-mono.eot +0 -0
  82. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/digital-7-mono.ttf +0 -0
  83. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/materialdesignicons-webfont.eot +0 -0
  84. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/materialdesignicons-webfont.ttf +0 -0
  85. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/materialdesignicons-webfont.woff +0 -0
  86. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/materialdesignicons-webfont.woff2 +0 -0
  87. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/fonts/repetition.ttf +0 -0
  88. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/Blank.gif +0 -0
  89. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/android-chrome-192x192.png +0 -0
  90. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/android-chrome-512x512.png +0 -0
  91. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/apple-touch-icon.png +0 -0
  92. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/browserconfig.xml +0 -0
  93. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/favicon-16x16.png +0 -0
  94. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/favicon-32x32.png +0 -0
  95. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/favicon.ico +0 -0
  96. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/manifest.json +0 -0
  97. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/mstile-144x144.png +0 -0
  98. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/mstile-150x150.png +0 -0
  99. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/mstile-310x150.png +0 -0
  100. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/mstile-310x310.png +0 -0
  101. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/images/mstile-70x70.png +0 -0
  102. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/admin.js +0 -0
  103. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/d3.layout.min.js +0 -0
  104. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/d3.min.js +0 -0
  105. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/dashboard.js +0 -0
  106. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/gauge.min.js +0 -0
  107. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/jquery-3.1.1.min.js +0 -0
  108. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/jquery-ui.js +0 -0
  109. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/jquery.gridster.js +0 -0
  110. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/justgage.js +0 -0
  111. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/knockout-3.4.1.js +0 -0
  112. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/list.min.js +0 -0
  113. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/plotly.min.js +0 -0
  114. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/raphael-2.1.4.min.js +0 -0
  115. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/reconnecting-websocket.min.js +0 -0
  116. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/rickshaw.min.js +0 -0
  117. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/socket.io.js +0 -0
  118. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/sockjs.min.js +0 -0
  119. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/javascript/stream.js +0 -0
  120. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/admin.jinja2 +0 -0
  121. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/body_include.jinja2 +0 -0
  122. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/dashboard.jinja2 +0 -0
  123. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/dashinit.jinja2 +0 -0
  124. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/error.jinja2 +0 -0
  125. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/head_include.jinja2 +0 -0
  126. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/list.jinja2 +0 -0
  127. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/templates/logon.jinja2 +0 -0
  128. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-brands-400.eot +0 -0
  129. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-brands-400.svg +0 -0
  130. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-brands-400.ttf +0 -0
  131. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-brands-400.woff +0 -0
  132. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-brands-400.woff2 +0 -0
  133. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-regular-400.eot +0 -0
  134. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-regular-400.svg +0 -0
  135. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-regular-400.ttf +0 -0
  136. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-regular-400.woff +0 -0
  137. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-regular-400.woff2 +0 -0
  138. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-solid-900.eot +0 -0
  139. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-solid-900.svg +0 -0
  140. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-solid-900.ttf +0 -0
  141. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-solid-900.woff +0 -0
  142. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/assets/webfonts/fa-solid-900.woff2 +0 -0
  143. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/callbacks.py +0 -0
  144. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/dashboard.py +0 -0
  145. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/dependency.py +0 -0
  146. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/dependency_manager.py +0 -0
  147. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/events.py +0 -0
  148. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/exceptions.py +0 -0
  149. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/futures.py +0 -0
  150. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/http.py +0 -0
  151. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/logging.py +0 -0
  152. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/__init__.py +0 -0
  153. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/__init__.py +0 -0
  154. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/api.py +0 -0
  155. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/app.py +0 -0
  156. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/appdaemon.py +0 -0
  157. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/common.py +0 -0
  158. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/dashboard.py +0 -0
  159. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/http.py +0 -0
  160. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/log.py +0 -0
  161. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/misc.py +0 -0
  162. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/sequence.py +0 -0
  163. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/config/yaml.py +0 -0
  164. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/__init__.py +0 -0
  165. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/app_management.py +0 -0
  166. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/file_check.py +0 -0
  167. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/plugin.py +0 -0
  168. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/state.py +0 -0
  169. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/internal/threading.py +0 -0
  170. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/notification/__init__.py +0 -0
  171. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/notification/android.py +0 -0
  172. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/notification/base.py +0 -0
  173. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/models/notification/iOS.py +0 -0
  174. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/__init__.py +0 -0
  175. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/dummy/dummyapi.py +0 -0
  176. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/dummy/dummyplugin.py +0 -0
  177. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/__init__.py +0 -0
  178. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/exceptions.py +0 -0
  179. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/models.py +0 -0
  180. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/notifications.py +0 -0
  181. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/hass/utils.py +0 -0
  182. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/mqtt/__init__.py +0 -0
  183. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/mqtt/mqttapi.py +0 -0
  184. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/plugins/mqtt/mqttplugin.py +0 -0
  185. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/pyversions.py +0 -0
  186. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/scheduler.py +0 -0
  187. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/sequences.py +0 -0
  188. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/services.py +0 -0
  189. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/state.py +0 -0
  190. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/stream/__init__.py +0 -0
  191. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/stream/socketio_handler.py +0 -0
  192. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/stream/sockjs_handler.py +0 -0
  193. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/thread_async.py +0 -0
  194. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/utility_loop.py +0 -0
  195. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/utils.py +0 -0
  196. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/AdminLog.yaml +0 -0
  197. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/AdminSummary.yaml +0 -0
  198. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/AdminTable.yaml +0 -0
  199. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/alarm.yaml +0 -0
  200. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basealarm/basealarm.css +0 -0
  201. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basealarm/basealarm.html +0 -0
  202. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basealarm/basealarm.js +0 -0
  203. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basecamera/basecamera.css +0 -0
  204. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basecamera/basecamera.html +0 -0
  205. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basecamera/basecamera.js +0 -0
  206. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclimate/baseclimate.css +0 -0
  207. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclimate/baseclimate.html +0 -0
  208. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclimate/baseclimate.js +0 -0
  209. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclock/baseclock.css +0 -0
  210. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclock/baseclock.html +0 -0
  211. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseclock/baseclock.js +0 -0
  212. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedatetime/basedatetime.css +0 -0
  213. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedatetime/basedatetime.html +0 -0
  214. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedatetime/basedatetime.js +0 -0
  215. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedisplay/basedisplay.css +0 -0
  216. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedisplay/basedisplay.html +0 -0
  217. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basedisplay/basedisplay.js +0 -0
  218. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseentitypicture/baseentitypicture.css +0 -0
  219. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseentitypicture/baseentitypicture.html +0 -0
  220. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseentitypicture/baseentitypicture.js +0 -0
  221. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseerror/baseerror.css +0 -0
  222. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseerror/baseerror.html +0 -0
  223. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseerror/baseerror.js +0 -0
  224. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basefan/basefan.css +0 -0
  225. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basefan/basefan.html +0 -0
  226. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basefan/basefan.js +0 -0
  227. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basegauge/basegauge.css +0 -0
  228. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basegauge/basegauge.html +0 -0
  229. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basegauge/basegauge.js +0 -0
  230. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseheater/baseheater.css +0 -0
  231. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseheater/baseheater.html +0 -0
  232. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseheater/baseheater.js +0 -0
  233. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseicon/baseicon.css +0 -0
  234. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseicon/baseicon.html +0 -0
  235. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseicon/baseicon.js +0 -0
  236. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseiframe/baseiframe.css +0 -0
  237. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseiframe/baseiframe.html +0 -0
  238. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseiframe/baseiframe.js +0 -0
  239. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseinputnumber/baseinputnumber.css +0 -0
  240. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseinputnumber/baseinputnumber.html +0 -0
  241. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseinputnumber/baseinputnumber.js +0 -0
  242. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basejavascript/basejavascript.css +0 -0
  243. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basejavascript/basejavascript.html +0 -0
  244. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basejavascript/basejavascript.js +0 -0
  245. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baselight/baselight.css +0 -0
  246. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baselight/baselight.html +0 -0
  247. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baselight/baselight.js +0 -0
  248. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basemedia/basemedia.css +0 -0
  249. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basemedia/basemedia.html +0 -0
  250. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basemedia/basemedia.js +0 -0
  251. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseradial/baseradial.css +0 -0
  252. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseradial/baseradial.html +0 -0
  253. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseradial/baseradial.js +0 -0
  254. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baserss/baserss.css +0 -0
  255. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baserss/baserss.html +0 -0
  256. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baserss/baserss.js +0 -0
  257. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseselect/baseselect.css +0 -0
  258. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseselect/baseselect.html +0 -0
  259. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseselect/baseselect.js +0 -0
  260. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseslider/baseslider.css +0 -0
  261. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseslider/baseslider.html +0 -0
  262. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseslider/baseslider.js +0 -0
  263. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseswitch/baseswitch.css +0 -0
  264. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseswitch/baseswitch.html +0 -0
  265. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseswitch/baseswitch.js +0 -0
  266. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetemperature/basetemperature.css +0 -0
  267. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetemperature/basetemperature.html +0 -0
  268. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetemperature/basetemperature.js +0 -0
  269. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetext/basetext.css +0 -0
  270. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetext/basetext.html +0 -0
  271. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/basetext/basetext.js +0 -0
  272. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseweather/baseweather.css +0 -0
  273. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseweather/baseweather.html +0 -0
  274. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/baseweather/baseweather.js +0 -0
  275. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/binary_sensor.yaml +0 -0
  276. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/camera.yaml +0 -0
  277. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/climate.yaml +0 -0
  278. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/clock.yaml +0 -0
  279. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/cover.yaml +0 -0
  280. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/device_tracker.yaml +0 -0
  281. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/entitypicture.yaml +0 -0
  282. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/fan.yaml +0 -0
  283. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/gauge.yaml +0 -0
  284. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/group.yaml +0 -0
  285. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/heater.yaml +0 -0
  286. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/icon.yaml +0 -0
  287. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/iframe.yaml +0 -0
  288. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_boolean.yaml +0 -0
  289. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_datetime.yaml +0 -0
  290. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_number.yaml +0 -0
  291. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_select.yaml +0 -0
  292. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_slider.yaml +0 -0
  293. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/input_text.yaml +0 -0
  294. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/javascript.yaml +0 -0
  295. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/label.yaml +0 -0
  296. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/light.yaml +0 -0
  297. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/lock.yaml +0 -0
  298. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/london_underground.yaml +0 -0
  299. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/media_player.yaml +0 -0
  300. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/mode.yaml +0 -0
  301. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/navigate.yaml +0 -0
  302. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/person.yaml +0 -0
  303. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/pirateweather.yaml +0 -0
  304. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/radial.yaml +0 -0
  305. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/reload.yaml +0 -0
  306. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/rss.yaml +0 -0
  307. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/scene.yaml +0 -0
  308. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/script.yaml +0 -0
  309. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/sensor.yaml +0 -0
  310. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/sequence.yaml +0 -0
  311. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/switch.yaml +0 -0
  312. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/temperature.yaml +0 -0
  313. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/text_sensor.yaml +0 -0
  314. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/weather.yaml +0 -0
  315. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon/widgets/weather_summary.yaml +0 -0
  316. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon.egg-info/SOURCES.txt +0 -0
  317. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon.egg-info/dependency_links.txt +0 -0
  318. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon.egg-info/entry_points.txt +0 -0
  319. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon.egg-info/requires.txt +0 -0
  320. {appdaemon-4.5.2 → appdaemon-4.5.4}/appdaemon.egg-info/top_level.txt +0 -0
  321. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/apps/hello.py +0 -0
  322. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/ObjectTracker/general_app_functions.py +0 -0
  323. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/ObjectTracker/objectcontrole.py +0 -0
  324. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/alexa.py +0 -0
  325. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/battery.py +0 -0
  326. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/bysykkel.py +0 -0
  327. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/commute.py +0 -0
  328. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/dark_day.py +0 -0
  329. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/door_notification.py +0 -0
  330. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/eventCache.py +0 -0
  331. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/eventMonitor.py +0 -0
  332. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/globals.py +0 -0
  333. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/grandfather.py +0 -0
  334. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/hwcheck.py +0 -0
  335. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/ical.py +0 -0
  336. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/minimote.py +0 -0
  337. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/modes.py +0 -0
  338. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/momentary_switch.py +0 -0
  339. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/motion_lights.py +0 -0
  340. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/motion_notification.py +0 -0
  341. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/occusim.py +0 -0
  342. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/outside_lights.py +0 -0
  343. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/presence.py +0 -0
  344. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/ruter.py +0 -0
  345. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/secure.py +0 -0
  346. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/sensor_notification.py +0 -0
  347. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/sensor_notify.py +0 -0
  348. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/sequence.py +0 -0
  349. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/smart_heat.py +0 -0
  350. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/sound.py +0 -0
  351. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/switch_reset.py +0 -0
  352. {appdaemon-4.5.2 → appdaemon-4.5.4}/conf/example_apps/yr.py +0 -0
  353. {appdaemon-4.5.2 → appdaemon-4.5.4}/pyproject.toml +0 -0
  354. {appdaemon-4.5.2 → appdaemon-4.5.4}/setup.cfg +0 -0
  355. {appdaemon-4.5.2 → appdaemon-4.5.4}/tests/test_main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: appdaemon
3
- Version: 4.5.2
3
+ Version: 4.5.4
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
@@ -489,7 +489,8 @@ class ADAPI:
489
489
  # Threading
490
490
  #
491
491
 
492
- def set_app_pin(self, pin: bool) -> None:
492
+ @utils.sync_decorator
493
+ async def set_app_pin(self, pin: bool) -> None:
493
494
  """Sets an App to be pinned or unpinned.
494
495
 
495
496
  Args:
@@ -506,7 +507,8 @@ class ADAPI:
506
507
  """
507
508
  self.AD.app_management.set_app_pin(self.name, pin)
508
509
 
509
- def get_app_pin(self) -> bool:
510
+ @utils.sync_decorator
511
+ async def get_app_pin(self) -> bool:
510
512
  """Finds out if the current App is currently pinned or not.
511
513
 
512
514
  Returns:
@@ -519,7 +521,8 @@ class ADAPI:
519
521
  """
520
522
  return self.AD.app_management.get_app_pin(self.name)
521
523
 
522
- def set_pin_thread(self, thread: int) -> None:
524
+ @utils.sync_decorator
525
+ async def set_pin_thread(self, thread: int) -> None:
523
526
  """Sets the thread that the App will be pinned to.
524
527
 
525
528
  Args:
@@ -537,7 +540,8 @@ class ADAPI:
537
540
  """
538
541
  self.AD.app_management.set_pin_thread(self.name, thread)
539
542
 
540
- def get_pin_thread(self) -> int:
543
+ @utils.sync_decorator
544
+ async def get_pin_thread(self) -> int:
541
545
  """Finds out which thread the App is pinned to.
542
546
 
543
547
  Returns:
@@ -590,7 +594,8 @@ class ADAPI:
590
594
  # Keeping namespace get/set functions for legacy compatibility
591
595
  return self.namespace
592
596
 
593
- def namespace_exists(self, namespace: str) -> bool:
597
+ @utils.sync_decorator
598
+ async def namespace_exists(self, namespace: str) -> bool:
594
599
  """Check the existence of a namespace in AppDaemon.
595
600
 
596
601
  See the `namespace documentation <APPGUIDE.html#namespaces>`__ for more information.
@@ -668,7 +673,8 @@ class ADAPI:
668
673
 
669
674
  return await self.AD.state.remove_namespace(namespace)
670
675
 
671
- def list_namespaces(self) -> list[str]:
676
+ @utils.sync_decorator
677
+ async def list_namespaces(self) -> list[str]:
672
678
  """Get a list of all the namespaces in AppDaemon.
673
679
 
674
680
  Examples:
@@ -909,7 +915,8 @@ class ADAPI:
909
915
  """
910
916
  return devices.split(",")
911
917
 
912
- def get_plugin_config(self, namespace: str | None = None) -> Any:
918
+ @utils.sync_decorator
919
+ async def get_plugin_config(self, namespace: str | None = None) -> Any:
913
920
  """Gets any useful metadata that the plugin may have available.
914
921
 
915
922
  For instance, for the HASS plugin, this will return Home Assistant configuration
@@ -931,7 +938,8 @@ class ADAPI:
931
938
  namespace = namespace or self.namespace
932
939
  return self.AD.plugins.get_plugin_meta(namespace)
933
940
 
934
- def friendly_name(self, entity_id: str, namespace: str | None = None) -> str:
941
+ @utils.sync_decorator
942
+ async def friendly_name(self, entity_id: str, namespace: str | None = None) -> str:
935
943
  """Gets the Friendly Name of an entity.
936
944
 
937
945
  Args:
@@ -1380,7 +1388,7 @@ class ADAPI:
1380
1388
  # State
1381
1389
  #
1382
1390
 
1383
- @overload
1391
+ @overload # single entity
1384
1392
  @utils.sync_decorator
1385
1393
  async def listen_state(
1386
1394
  self,
@@ -1399,7 +1407,7 @@ class ADAPI:
1399
1407
  **kwargs: Any
1400
1408
  ) -> str: ...
1401
1409
 
1402
- @overload
1410
+ @overload # multiple entities
1403
1411
  @utils.sync_decorator
1404
1412
  async def listen_state(
1405
1413
  self,
@@ -191,10 +191,11 @@ class AppManagement:
191
191
  def app_rel_path(self, app_name: str) -> Path:
192
192
  return self.app_config.root[app_name].config_path.relative_to(self.AD.app_dir.parent)
193
193
 
194
- def mod_rel_path(self, app_obj: object) -> Path:
194
+ def err_app_path(self, app_obj: object) -> Path:
195
195
  module_path = Path(sys.modules[app_obj.__module__].__file__)
196
- rel_path = module_path.relative_to(self.AD.app_dir.parent)
197
- return rel_path
196
+ if module_path.is_relative_to(self.AD.app_dir.parent):
197
+ return module_path.relative_to(self.AD.app_dir.parent)
198
+ return module_path
198
199
 
199
200
  async def init_admin_stats(self):
200
201
  # create sensors
@@ -266,16 +267,18 @@ class AppManagement:
266
267
  async def initialize_app(self, app_name: str):
267
268
  assert app_name in self.objects, 'Something is very wrong'
268
269
  app_obj = self.objects[app_name].object
269
- rel_path = self.mod_rel_path(app_obj)
270
+
271
+ # Get the path that will be used for the exception
272
+ err_path = self.err_app_path(app_obj)
270
273
 
271
274
  try:
272
275
  init_func = app_obj.initialize
273
276
  except AttributeError:
274
- raise ade.NoInitializeMethod(app_obj.__class__, rel_path)
277
+ raise ade.NoInitializeMethod(app_obj.__class__, err_path)
275
278
 
276
279
  signature = inspect.signature(init_func)
277
280
  if len(signature.parameters) != 0:
278
- raise ade.BadInitializeMethod(app_obj.__class__, rel_path, signature)
281
+ raise ade.BadInitializeMethod(app_obj.__class__, err_path, signature)
279
282
 
280
283
  # Call its initialize function
281
284
  await self.set_state(app_name, state="initializing")
@@ -355,8 +355,6 @@ class Entity:
355
355
 
356
356
  Args:
357
357
  service (str): The service name, without the domain (e.g "toggle")
358
- return_result(bool, option): If `return_result` is provided and set to `True` AD will attempt
359
- to wait for the result, and return it after execution
360
358
  callback: The non-async callback to be executed when complete.
361
359
  **kwargs: Each service has different parameter requirements. This argument
362
360
  allows you to specify a comma-separated list of keyword value pairs, e.g.,
@@ -437,7 +435,7 @@ class Entity:
437
435
  self.logger.warning(f"State Wait for {self.entity_id} Timed Out")
438
436
  raise TimeOutException("The entity timed out") from e
439
437
  finally:
440
- self._async_events.pop(wait_id)
438
+ self._async_events.pop(wait_id, None) # Ignore if already removed
441
439
 
442
440
  async def entity_state_changed(self, *args, wait_id: str, **kwargs) -> None:
443
441
  """The entity state changed"""
@@ -100,7 +100,6 @@ class HASSConfig(PluginConfig):
100
100
  BeforeValidator(utils.parse_timedelta)
101
101
  ] = Field(default_factory=lambda: timedelta(seconds=10))
102
102
  """Default timeout for waiting for responses from the websocket connection"""
103
- # return_result: bool | None = None
104
103
  suppress_log_messages: bool = False
105
104
  retry_secs: int = 5
106
105
  services_sleep_time: int = 60
@@ -126,8 +126,14 @@ class PluginBase(abc.ABC):
126
126
  pass
127
127
 
128
128
  # @abc.abstractmethod
129
- async def set_plugin_state(self):
130
- raise NotImplementedError
129
+ # async def set_plugin_state(
130
+ # self,
131
+ # namespace: str,
132
+ # entity_id: str,
133
+ # state: Any | None = None,
134
+ # attributes: Any | None = None,
135
+ # ) -> dict[str, Any] | None:
136
+ # pass
131
137
 
132
138
  # @abc.abstractmethod
133
139
  async def fire_plugin_event(self):
@@ -260,7 +260,8 @@ class Hass(ADBase, ADAPI):
260
260
  """
261
261
  return self.get_state(*args, **kwargs)
262
262
 
263
- def anyone_home(self, person: bool = True, namespace: str | None = None) -> bool:
263
+ @utils.sync_decorator
264
+ async def anyone_home(self, person: bool = True, namespace: str | None = None) -> bool:
264
265
  """Determines if the house/apartment is occupied.
265
266
 
266
267
  A convenience function to determine if one or more person is home. Use
@@ -285,10 +286,11 @@ class Hass(ADBase, ADAPI):
285
286
  >>> do something
286
287
 
287
288
  """
288
- details = self.get_tracker_details(person, namespace, copy=False)
289
+ details = await self.get_tracker_details(person, namespace, copy=False)
289
290
  return any(state['state'] == 'home' for state in details.values())
290
291
 
291
- def everyone_home(self, person: bool = True, namespace: str | None = None) -> bool:
292
+ @utils.sync_decorator
293
+ async def everyone_home(self, person: bool = True, namespace: str | None = None) -> bool:
292
294
  """Determine if all family's members at home.
293
295
 
294
296
  A convenience function to determine if everyone is home. Use this in
@@ -312,10 +314,11 @@ class Hass(ADBase, ADAPI):
312
314
  >>> do something
313
315
 
314
316
  """
315
- details = self.get_tracker_details(person, namespace, copy=False)
317
+ details = await self.get_tracker_details(person, namespace, copy=False)
316
318
  return all(state['state'] == 'home' for state in details.values())
317
319
 
318
- def noone_home(self, person: bool = True, namespace: str | None = None) -> bool:
320
+ @utils.sync_decorator
321
+ async def noone_home(self, person: bool = True, namespace: str | None = None) -> bool:
319
322
  """Determines if the house/apartment is empty.
320
323
 
321
324
  A convenience function to determine if no people are at home. Use this
@@ -340,7 +343,7 @@ class Hass(ADBase, ADAPI):
340
343
  >>> do something
341
344
 
342
345
  """
343
- return not self.anyone_home(person, namespace)
346
+ return not await self.anyone_home(person, namespace)
344
347
 
345
348
  #
346
349
  # Built-in constraints
@@ -408,7 +411,7 @@ class Hass(ADBase, ADAPI):
408
411
  case str():
409
412
  constraints = [value]
410
413
 
411
- assert isinstance(value, list) and all(isinstance(v, str) for v in value)
414
+ assert isinstance(constraints, list) and all(isinstance(v, str) for v in constraints)
412
415
 
413
416
  for constraint in constraints:
414
417
  # using re.split allows for an arbitrary amount of whitespace after the comma
@@ -1340,7 +1343,7 @@ class Hass(ADBase, ADAPI):
1340
1343
  # Functions that use self.render_template
1341
1344
 
1342
1345
  @utils.sync_decorator
1343
- async def render_template(self, template: str, namespace: str | None = None) -> Any:
1346
+ async def render_template(self, template: str, namespace: str | None = None, **kwargs) -> Any:
1344
1347
  """Renders a Home Assistant Template.
1345
1348
 
1346
1349
  See the documentation for the `Template Integration <https://www.home-assistant.io/integrations/template>`__ and
@@ -1348,9 +1351,9 @@ class Hass(ADBase, ADAPI):
1348
1351
 
1349
1352
  Args:
1350
1353
  template (str): The Home Assistant template to be rendered.
1351
- namespace (str, optional): Namespace to use for the call. See the section on
1352
- `namespaces <APPGUIDE.html#namespaces>`__ for a detailed description.
1353
- In most cases it is safe to ignore this parameter.
1354
+ namespace (str, optional): Optional namespace to use. Defaults to using the app's current namespace. See the
1355
+ `namespace documentation <APPGUIDE.html#namespaces>`__ for more information.
1356
+ **kwargs (optional): Zero or more keyword arguments that get passed to the template rendering.
1354
1357
 
1355
1358
  Returns:
1356
1359
  The rendered template in a native Python type.
@@ -1365,17 +1368,20 @@ class Hass(ADBase, ADAPI):
1365
1368
  >>> self.render_template("{{ states('sensor.outside_temp') }}")
1366
1369
  97.2
1367
1370
 
1371
+ >>> self.render_template("hello {{ name }}", variables={"name": "bob"})
1372
+ hello bob
1373
+
1368
1374
  """
1369
1375
  plugin: "HassPlugin" = self.AD.plugins.get_plugin_object(
1370
1376
  namespace or self.namespace
1371
1377
  )
1372
- result = await plugin.render_template(self.namespace, template)
1378
+ result = await plugin.render_template(self.namespace, template, **kwargs)
1373
1379
  try:
1374
1380
  return literal_eval(result)
1375
1381
  except (SyntaxError, ValueError):
1376
1382
  return result
1377
1383
 
1378
- def _template_command(self, command: str, *args: tuple[str, ...]) -> str | list[str]:
1384
+ def _template_command(self, command: str, *args: str) -> str | list[str]:
1379
1385
  """Internal AppDaemon function to format calling a single template command correctly."""
1380
1386
  if len(args) == 0:
1381
1387
  return self.render_template(f'{{{{ {command}() }}}}')
@@ -1478,6 +1484,10 @@ class Hass(ADBase, ADAPI):
1478
1484
  <https://www.home-assistant.io/docs/configuration/templating/#entities-for-an-integration>`_ for more
1479
1485
  information.
1480
1486
  """
1487
+ entities = self._template_command('integration_entities', integration)
1488
+ assert isinstance(entities, list) and all(isinstance(e, str) for e in entities), \
1489
+ 'Invalid return type from integration_entities'
1490
+ return entities
1481
1491
 
1482
1492
  # Labels
1483
1493
  # https://www.home-assistant.io/docs/configuration/templating/#labels
@@ -888,7 +888,7 @@ class HassPlugin(PluginBase):
888
888
  return result
889
889
 
890
890
  @utils.warning_decorator(error_text='Unexpected error rendering template')
891
- async def render_template(self, namespace: str, template: str):
891
+ async def render_template(self, namespace: str, template: str, **kwargs):
892
892
  self.logger.debug(
893
893
  "render_template() namespace=%s data=%s",
894
894
  namespace,
@@ -897,4 +897,4 @@ class HassPlugin(PluginBase):
897
897
 
898
898
  # if we get a request for not our namespace something has gone very wrong
899
899
  assert namespace == self.namespace
900
- return await self.http_method("post", "/api/template", template=template)
900
+ return await self.http_method("post", "/api/template", template=template, **kwargs)
@@ -1,15 +1,16 @@
1
+ import asyncio
2
+ import threading
1
3
  import traceback
2
- import bcrypt
3
4
  import uuid
4
- import threading
5
- import asyncio
6
5
 
7
- from appdaemon.appdaemon import AppDaemon
6
+ import bcrypt
7
+
8
8
  import appdaemon.utils as utils
9
+ from appdaemon.appdaemon import AppDaemon
10
+ from appdaemon.exceptions import RequestHandlerException
9
11
  from appdaemon.stream.socketio_handler import SocketIOHandler
10
- from appdaemon.stream.ws_handler import WSHandler
11
12
  from appdaemon.stream.sockjs_handler import SockJSHandler
12
- from appdaemon.exceptions import RequestHandlerException
13
+ from appdaemon.stream.ws_handler import WSHandler
13
14
 
14
15
 
15
16
  class ADStream:
@@ -51,7 +52,7 @@ class ADStream:
51
52
  rh = RequestHandler(self.AD, self, handle, request)
52
53
  with self.handlers_lock:
53
54
  self.handlers[handle] = rh
54
- await rh.stream.run()
55
+ return await rh.stream.run()
55
56
 
56
57
  async def on_disconnect(self, handle):
57
58
  with self.handlers_lock:
@@ -98,9 +99,7 @@ class RequestHandler:
98
99
 
99
100
  # Create a stream
100
101
  #
101
- self.stream = self.adstream.stream_handler.makeStream(
102
- self.AD, request, on_message=self._on_message, on_disconnect=self._on_disconnect
103
- )
102
+ self.stream = self.adstream.stream_handler.makeStream(self.AD, request, on_message=self._on_message, on_disconnect=self._on_disconnect)
104
103
  #
105
104
 
106
105
  async def _on_message(self, data):
@@ -331,6 +330,9 @@ class RequestHandler:
331
330
 
332
331
  service_data = data["data"]
333
332
 
333
+ if "__name" in service_data:
334
+ del service_data["__name"]
335
+
334
336
  return await self.AD.services.call_service(
335
337
  namespace=data["namespace"],
336
338
  domain=domain,
@@ -1,9 +1,9 @@
1
- import traceback
1
+ import asyncio
2
2
  import json
3
+ import traceback
3
4
 
4
5
  import aiohttp
5
6
  from aiohttp import web
6
- import asyncio
7
7
 
8
8
  from appdaemon import utils as utils
9
9
 
@@ -24,7 +24,7 @@ class WSHandler:
24
24
  # We have a connection
25
25
  #
26
26
  # Add handler
27
- await self.ADStream.on_connect(request)
27
+ return await self.ADStream.on_connect(request)
28
28
 
29
29
  def makeStream(self, ad, request, **kwargs):
30
30
  return WSStream(ad, request, **kwargs)
@@ -76,6 +76,7 @@ class WSStream:
76
76
  self.logger.debug("Closing websocket ...")
77
77
  await self.ws.close()
78
78
  self.logger.debug("Done")
79
+ return self.ws
79
80
 
80
81
  async def sendclient(self, data):
81
82
  try:
@@ -78,10 +78,15 @@ class Threading:
78
78
  self.callback_list = []
79
79
 
80
80
  @property
81
- def pin_apps(self):
81
+ def pin_apps(self) -> bool:
82
82
  "Whether each app should be pinned to a thread"
83
83
  return self.AD.config.pin_apps
84
84
 
85
+ @pin_apps.setter
86
+ def pin_apps(self, new: bool) -> None:
87
+ """Set whether each app should be pinned to a thread"""
88
+ self.AD.config.pin_apps = new
89
+
85
90
  @property
86
91
  def total_threads(self) -> int:
87
92
  """Number of threads created for apps.
@@ -0,0 +1,2 @@
1
+ __version__ = "4.5.4"
2
+ __version_comments__ = ""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: appdaemon
3
- Version: 4.5.2
3
+ Version: 4.5.4
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
@@ -1,2 +0,0 @@
1
- __version__ = "4.5.2"
2
- __version_comments__ = "dev"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes