Files
docker-configs/linkwarden/data/archives/3/63_readability.json

1 line
54 KiB
JSON
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"title":"","byline":"mguyard","dir":null,"lang":null,"content":"<div id=\"readability-page-1\" class=\"page\"><div data-hpc=\"true\"><article><p dir=\"auto\">\n <a href=\"https://raw.githubusercontent.com/mguyard/appdaemon-coversmanager/main/CoversManager-Logo.png\" rel=\"noopener noreferrer nofollow\"><img width=\"400\" src=\"https://raw.githubusercontent.com/mguyard/appdaemon-coversmanager/main/CoversManager-Logo.png\"></a>\n</p>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">AppDaemon - Covers Manager</h2><a href=\"#appdaemon---covers-manager\" aria-label=\"Permalink: AppDaemon - Covers Manager\" id=\"user-content-appdaemon---covers-manager\"></a></p>\n\n<p dir=\"auto\">\n <em><code>All you need to manage your covers !</code></em>\n</p>\n<p dir=\"auto\">\n\t<a href=\"https://camo.githubusercontent.com/57dde6d59986a1b24f3909e7d47551f30e6f8d5f5b425743bd977420b64a65b8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/license/mguyard/appdaemon-coversmanager?style=default&amp;color=0080ff\" alt=\"license\" src=\"https://camo.githubusercontent.com/57dde6d59986a1b24f3909e7d47551f30e6f8d5f5b425743bd977420b64a65b8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\"></a>\n\t<a href=\"https://camo.githubusercontent.com/af2cfcc4896c88e217afbe8867030110e44a0bcfc83bb08b1ad34144d52ecde2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/last-commit/mguyard/appdaemon-coversmanager?style=default&amp;color=0080ff\" alt=\"last-commit\" src=\"https://camo.githubusercontent.com/af2cfcc4896c88e217afbe8867030110e44a0bcfc83bb08b1ad34144d52ecde2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\"></a>\n\t<a href=\"https://camo.githubusercontent.com/04d0d5c3cfa4bbfc1af32880265e4c81fe7bd4dccaa988f5fddee2441d420663/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/languages/top/mguyard/appdaemon-coversmanager?style=default&amp;color=0080ff\" alt=\"repo-top-language\" src=\"https://camo.githubusercontent.com/04d0d5c3cfa4bbfc1af32880265e4c81fe7bd4dccaa988f5fddee2441d420663/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\"></a>\n\t<a href=\"https://camo.githubusercontent.com/4c2d2f5b880663bccbf69b157bdc1dd603e18cfa97fc72ad23832c86528b4bc7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/languages/count/mguyard/appdaemon-coversmanager?style=default&amp;color=0080ff\" alt=\"repo-language-count\" src=\"https://camo.githubusercontent.com/4c2d2f5b880663bccbf69b157bdc1dd603e18cfa97fc72ad23832c86528b4bc7/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f6d6775796172642f6170706461656d6f6e2d636f766572736d616e616765723f7374796c653d64656661756c7426636f6c6f723d303038306666\"></a>\n</p><p dir=\"auto\">\n <a href=\"https://camo.githubusercontent.com/2163f42c412c73b8035afa6b6fc57b8769d8fa9a2c6cb7dad982cd472be24d4e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e61676572\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/v/release/mguyard/appdaemon-coversmanager\" alt=\"Last Release\" src=\"https://camo.githubusercontent.com/2163f42c412c73b8035afa6b6fc57b8769d8fa9a2c6cb7dad982cd472be24d4e/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e61676572\"></a>\n <a href=\"https://camo.githubusercontent.com/3693cdf12def7fb51a3f28a947a5546f77904d88dae57f61b738a517cc8aa920/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e61676572\" rel=\"noopener noreferrer nofollow\"><img data-canonical-src=\"https://img.shields.io/github/release-date/mguyard/appdaemon-coversmanager\" alt=\"Last Release Date\" src=\"https://camo.githubusercontent.com/3693cdf12def7fb51a3f28a947a5546f77904d88dae57f61b738a517cc8aa920/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652d646174652f6d6775796172642f6170706461656d6f6e2d636f766572736d616e61676572\"></a>\n <a href=\"https://github.com/mguyard/appdaemon-coversmanager/actions/workflows/lint.yaml\">\n <img alt=\"Python Lint Action\" src=\"https://github.com/mguyard/appdaemon-coversmanager/actions/workflows/lint.yaml/badge.svg\">\n </a>\n <a href=\"https://github.com/mguyard/appdaemon-coversmanager/actions/workflows/hacs_validate.yaml\">\n <img alt=\"Container Build Action\" src=\"https://github.com/mguyard/appdaemon-coversmanager/actions/workflows/hacs_validate.yaml/badge.svg\">\n </a>\n</p>\n<hr>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">🔗 Quick Links</h2><a href=\"#-quick-links\" aria-label=\"Permalink: 🔗 Quick Links\" id=\"user-content--quick-links\"></a></p>\n<blockquote>\n<ul dir=\"auto\">\n<li><a href=\"#-overview\">📍 Overview</a></li>\n<li><a href=\"#-features\">📦 Features</a></li>\n<li><a href=\"#-how-this-works\">❔ How this works</a></li>\n<li><a href=\"#-getting-started\">🚀 Getting Started</a>\n<ul dir=\"auto\">\n<li><a href=\"#-requirements\">🔝 Requirements</a></li>\n<li><a href=\"#%EF%B8%8F-installation\">⚙️ Installation</a></li>\n</ul>\n</li>\n<li><a href=\"#-configuration\">🏷️ Configuration</a>\n<ul dir=\"auto\">\n<li><a href=\"#-appdaemon\">🤖 AppDaemon</a></li>\n<li><a href=\"#-covers-manager\">🪟 Covers Manager</a></li>\n<li><a href=\"#-parameters\">🧩 Parameters</a></li>\n<li><a href=\"#-full-configuration-example\">📄 Full Configuration Example</a></li>\n</ul>\n</li>\n<li><a href=\"#-debug\">🪲 Debug</a></li>\n<li><a href=\"#-contributing\">🤝 Contributing</a></li>\n</ul>\n</blockquote>\n<hr>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">📍 Overview</h2><a href=\"#-overview\" aria-label=\"Permalink: 📍 Overview\" id=\"user-content--overview\"></a></p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Objective</h3><a href=\"#objective\" aria-label=\"Permalink: Objective\" id=\"user-content-objective\"></a></p>\n<p dir=\"auto\">The objective of the Covers Manager project is to provide a comprehensive solution for managing covers. The project aims to simplify and streamline the process of managing covers by automating various tasks and providing an efficient tool for users.\nThe Covers Manager project is designed to address the specific needs of managing covers, such as those used in home automation systems or other applications. It offers a range of features and functionalities to facilitate the management of covers, including opening, closing or manage covers position depending of sun position and temperature (indoor and outdoor).\nOverall, the objective of the Covers Manager project is to simplify and optimize the management of covers, providing users with a powerful and efficient tool for controlling their covers.</p>\n<div dir=\"auto\"><p dir=\"auto\">Note</p>\n<p dir=\"auto\">It's important to note that the Covers Manager project is under development.\nProject is open-source, and users are encouraged to adapt it to their own needs if necessary and purpose all evolutions by <a href=\"#-contributing\">submitting a PR</a>.</p>\n</div>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Motivation</h3><a href=\"#motivation\" aria-label=\"Permalink: Motivation\" id=\"user-content-motivation\"></a></p>\n<p dir=\"auto\">This AppDaemon application was born out of the need to manage roller shutters as I did on Jeedom before migrating to Home Assistant.\nThe aim was simple: recover the automatic opening and closing functions, as well as the ability to close the shutters proportionally according to the position of the sun.</p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Inspiration</h3><a href=\"#inspiration\" aria-label=\"Permalink: Inspiration\" id=\"user-content-inspiration\"></a></p>\n<p dir=\"auto\">I was greatly inspired by the Volets plugin on Jeedom by mika-nt28 as well as the work of BasBrus and Langestefan (<a rel=\"nofollow\" href=\"https://community.home-assistant.io/t/custom-component-adaptive-cover/712626\">https://community.home-assistant.io/t/custom-component-adaptive-cover/712626</a>).</p>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">📦 Features</h2><a href=\"#-features\" aria-label=\"Permalink: 📦 Features\" id=\"user-content--features\"></a></p>\n<p dir=\"auto\">CoversManager is developped to help you with these features :</p>\n<ul dir=\"auto\">\n<li>Opening covers (based on time, lux, sunrise hour)</li>\n<li>Closing covers (based on time, lux, sunset hour)</li>\n<li>Adaptive covers management based on sun position, indoor and outdoor temperature (optional)</li>\n<li>Block adaptive changes when manual position change is detected</li>\n</ul>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">❔ How this works</h2><a href=\"#-how-this-works\" aria-label=\"Permalink: ❔ How this works\" id=\"user-content--how-this-works\"></a></p>\n<p dir=\"auto\">CoversManager works in 3 modes :</p>\n<ul dir=\"auto\">\n<li>Opening (who manage covers opening - most of the time the morning)</li>\n<li>Closing (who manage covers closing - most of the time the evening)</li>\n<li>Adaptive (open or close covers fully or partially depending of sun position and indoor/outdoor temperature)</li>\n</ul>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Opening</h3><a href=\"#opening\" aria-label=\"Permalink: Opening\" id=\"user-content-opening\"></a></p>\n<p dir=\"auto\">In your configuration, you can define one of the multiple type of opening supported.</p>\n<ul dir=\"auto\">\n<li>Off (you don't want CoversManager manage your opening)</li>\n<li>Time (you define at which time CoversManager will open your covers)</li>\n<li>Sunrise (your covers will open at sunrise time - calculated internaly by AppDaemon)</li>\n<li>Lux (you define a minimal lux to open covers)</li>\n<li>Prefer-Lux (it's a combinaison of lux and custom time - useful in case of issue with your lux sensor, custom time will be your backup)</li>\n</ul>\n<div dir=\"auto\"><p dir=\"auto\">Warning</p>\n<p dir=\"auto\">When using prefer-lux, you need to configure a time that will be later than the possible time where required lux will be triggered. Otherwise, opening will be used based on time as it will be the first triggered.</p>\n</div>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Closing</h3><a href=\"#closing\" aria-label=\"Permalink: Closing\" id=\"user-content-closing\"></a></p>\n<p dir=\"auto\">In your configuration, you can define one of the multiple type of opening supported.</p>\n<ul dir=\"auto\">\n<li>Off (you don't want CoversManager manage your opening)</li>\n<li>Time (you define at which time CoversManager will open your covers)</li>\n<li>Sunset (your covers will open at sunset time - calculated internaly by AppDaemon)</li>\n<li>Lux (you define a minimal lux to open covers)</li>\n<li>Prefer-Lux (it's a combinaison of lux and custom time or dusk - useful in case of issue with your lux sensor, custom time or dusk will be your backup)</li>\n</ul>\n<div dir=\"auto\"><p dir=\"auto\">Warning</p>\n<p dir=\"auto\">When using prefer-lux, you need to configure a time that will be later than the possible time where required lux will be triggered. Otherwise, closing will be used based on time as it will be the first triggered.</p>\n</div>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">Adaptive</h3><a href=\"#adaptive\" aria-label=\"Permalink: Adaptive\" id=\"user-content-adaptive\"></a></p>\n<p dir=\"auto\">When adaptive mode is enable, each time the sun position change (based on sun.sun/azimuth), if sun is in window, CoversManager define the better cover position to :</p>\n<ul dir=\"auto\">\n<li>let in the sun (if indoor temperature is less than the setpoint defined or outdoor temperature is less than indoor temperature) - Open 100%</li>\n<li>keep the sun out but not the light (if indoor temperature is greater than the setpoint defined) - Partially open calculated with sun position and window parameters</li>\n<li>keep the sun out (if outdoor temperature is greater than outdoor high temperature defined) - Close 100%</li>\n</ul>\n<div dir=\"auto\"><p dir=\"auto\">Note</p>\n<p dir=\"auto\">To prevent covers from constantly moving as the sun does, there are two parameters (min_ratio_change and min_time_change) that define the minimum percent of position change to be executed, and the minimum time between two movements. Please look in <a href=\"#-parameters\">parameters</a> to know defaults values.</p>\n<p dir=\"auto\">If manual configuration is enabled, each time you move manually a cover (not by CoversManager), Adaptive mode is disable for the time configured.</p>\n</div>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">🚀 Getting Started</h2><a href=\"#-getting-started\" aria-label=\"Permalink: 🚀 Getting Started\" id=\"user-content--getting-started\"></a></p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">🔝 Requirements</h3><a href=\"#-requirements\" aria-label=\"Permalink: 🔝 Requirements\" id=\"user-content--requirements\"></a></p>\n<ul dir=\"auto\">\n<li>A valid and functional deployment of <a rel=\"nofollow\" href=\"https://community.home-assistant.io/t/home-assistant-community-add-on-appdaemon-4/163259\"><code>AppDaemon Addon</code> connected to Home Assistant</a></li>\n<li>A valid and functional <a rel=\"nofollow\" href=\"https://hacs.xyz/docs/setup/download\"><code>HACS</code> (Home Assistant Community Store) integration</a></li>\n</ul>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">⚙️ Installation</h3><a href=\"#-installation\" aria-label=\"Permalink: ⚙️ Installation\" id=\"user-content--installation\"></a></p>\n<ul dir=\"auto\">\n<li><a rel=\"nofollow\" href=\"https://hacs.xyz/docs/categories/appdaemon_apps/\">Enable AppDaemon Apps in HACS</a></li>\n<li><a rel=\"nofollow\" href=\"https://my.home-assistant.io/redirect/hacs_repository/?owner=mguyard&amp;repository=appdaemon-coversmanager&amp;category=appdaemon\">Add Automation repository</a> in HACS as AppDaemon repo : <a href=\"https://github.com/mguyard/appdaemon-coversmanager\">https://github.com/mguyard/appdaemon-coversmanager</a></li>\n<li>Install Covers Manager in HACS</li>\n<li><a rel=\"nofollow\" href=\"https://my.home-assistant.io/redirect/supervisor_store/\">Install <code>Studio Code Server</code> addon</a> to edit your AppDaemon &amp; CoversManager configuration (optional if your prefer another method to modify your configuration)</li>\n</ul>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">🏷️ Configuration</h2><a href=\"#-configuration\" aria-label=\"Permalink: 🏷️ Configuration\" id=\"user-content--configuration\"></a></p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">🤖 AppDaemon</h3><a href=\"#-appdaemon\" aria-label=\"Permalink: 🤖 AppDaemon\" id=\"user-content--appdaemon\"></a></p>\n<p dir=\"auto\">Firstly you need to configure your newly AppDaemon installation.</p>\n<div dir=\"auto\"><p dir=\"auto\">Note</p>\n<p dir=\"auto\">Please continue to next chapter if AppDaemon was already configured before this App</p>\n</div>\n<p dir=\"auto\"><a rel=\"nofollow\" href=\"https://appdaemon.readthedocs.io/en/latest/CONFIGURE.html#appdaemon\">AppDaemon Main configuration</a> is available in file <code>appdaemon.yaml</code> most of the time stored in <code>/add_config/&lt;guid&gt;_appdaemon/</code></p>\n<p dir=\"auto\">Please find below an example of basic configuration (It may need to be adapted to suit your configuration) :</p>\n<div dir=\"auto\"><pre>---\n<span>secrets</span>: <span>/homeassistant/secrets.yaml</span>\n<span>appdaemon</span>:\n <span>app_dir</span>: <span>/homeassistant/appdaemon/apps</span>\n <span>latitude</span>: <span>48.80506979319244</span>\n <span>longitude</span>: <span>2.12031248278925</span>\n <span>elevation</span>: <span>130</span>\n <span>time_zone</span>: <span>Europe/Paris</span>\n <span>plugins</span>:\n <span>HASS</span>:\n <span>type</span>: <span>hass</span>\n<span>http</span>:\n <span>url</span>: <span>http://127.0.0.1:5050</span>\n<span>admin</span>:\n<span>api</span>:\n<span>hadashboard</span>:\n\n<span>logs</span>:\n <span>main_log</span>:\n <span>filename</span>: <span>/config/logs/appdaemon.log</span>\n <span>error_log</span>:\n <span>filename</span>: <span>/config/logs/error.log</span></pre></div>\n<div dir=\"auto\"><p dir=\"auto\">Warning</p>\n<p dir=\"auto\">Starting with the AppDaemon v0.15.0 addon, configuration of AppDaemon was moved to /addon_configs folder. But <a data-hovercard-url=\"/hacs/integration/issues/3408/hovercard\" data-hovercard-type=\"issue\" href=\"https://github.com/hacs/integration/issues/3408\">HACS still continue to download AppDaemon apps to /config (old folder)</a>.\nTo resolve this, we add <code>app_dir</code> directive in <code>appdaemon:</code> section to use HACS supported folder.\nIf you already have existing apps not coming from HACS, <strong>I recommend to upload manually iopool Pump Manager in your actual app_dir or copying all your existing app before modifying app_dir directive</strong>.</p>\n</div>\n<p dir=\"auto\">Create folder logs (if not already exist) in <code>/add_config/&lt;guid&gt;_appdaemon/</code> and add in <code>appdaemon.yaml</code> logs section, the log for Covers Manager :</p>\n<div dir=\"auto\"><pre><span>logs</span>:\n <span>[...]</span>\n <span>CoversManager</span>:\n <span>name</span>: <span>CoversManager</span>\n <span>filename</span>: <span>/config/logs/CoversManager.log</span></pre></div>\n<p dir=\"auto\">Following the configuration change, you need to restart your AppDaemon addon.</p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">AppDaemon dependancies</h3><a href=\"#appdaemon-dependancies\" aria-label=\"Permalink: AppDaemon dependancies\" id=\"user-content-appdaemon-dependancies\"></a></p>\n<p dir=\"auto\">You need to add a python package to AppDaemon for this application to work.\nTo do this, go to your AppDaemon add-on configuration and add <code>pydantic</code> in the <code>package python</code> field.\n<code>pydantic</code> should appear as a tag above the <code>package python</code> field.</p>\n<p dir=\"auto\"><a rel=\"nofollow\" href=\"https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_appdaemon\"><img data-canonical-src=\"https://my.home-assistant.io/badges/supervisor_addon.svg\" alt=\"Open your Home Assistant instance and show the dashboard of an add-on.\" src=\"https://camo.githubusercontent.com/a54868bd2c4edb2d623ab2fef3d074fe711b45c2c1cdc0fbe4dfd296faa594f8/68747470733a2f2f6d792e686f6d652d617373697374616e742e696f2f6261646765732f73757065727669736f725f6164646f6e2e737667\"></a></p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">🪟 Covers Manager</h3><a href=\"#-covers-manager\" aria-label=\"Permalink: 🪟 Covers Manager\" id=\"user-content--covers-manager\"></a></p>\n<p dir=\"auto\">To configure Covers Manager app you need to edit <code>apps.yaml</code> configuration most of the time stored in <code>/add_config/&lt;guid&gt;_appdaemon/apps/</code></p>\n<p dir=\"auto\">Please find below an simple example of configuration to add in file :</p>\n<div dir=\"auto\"><pre><span>CoversManager</span>:\n <span>module</span>: <span>covers_manager</span>\n <span>class</span>: <span>CoversManager</span>\n <span>use_dictionary_unpacking</span>: <span>true</span>\n <span>log</span>: <span>CoversManager</span>\n <span>config</span>:\n <span>common</span>:\n <span>opening</span>:\n <span>type</span>: <span><span>\"</span>lux<span>\"</span></span>\n <span>closing</span>:\n <span>type</span>: <span><span>\"</span>lux<span>\"</span></span>\n <span>adaptive</span>: <span>True</span>\n <span>temperature</span>:\n <span>indoor</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.indoor_temperature<span>\"</span></span>\n <span>setpoint</span>: <span>23</span>\n <span>outdoor</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.outdoor_temperature<span>\"</span></span>\n <span>high_temperature</span>: <span>28</span>\n <span>lux</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.outdoor_sensor_illuminance_lux<span>\"</span></span>\n <span>open_lux</span>: <span>23</span>\n <span>close_lux</span>: <span>5</span>\n <span>covers</span>:\n <span>cover.roller_shutter_1</span>:\n <span>window_heigh </span>: <span>210</span> \n <span>window_azimuth</span>: <span>180</span>\n <span>cover.roller_shutter_2</span>:\n <span>window_heigh </span>: <span>210</span>\n <span>window_azimuth</span>: <span>320</span></pre></div>\n<p dir=\"auto\">You have more configuration available. All is detailled in next chapter <a href=\"#-parameters\">🧩 Parameters</a></p>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">🧩 Parameters</h3><a href=\"#-parameters\" aria-label=\"Permalink: 🧩 Parameters\" id=\"user-content--parameters\"></a></p>\n<p dir=\"auto\">Please find below all configuration parameters who don't apply to covers directly</p>\n<table>\n<thead>\n<tr>\n<th>Parent</th>\n<th>Parameters</th>\n<th>Description</th>\n<th>Configuration Path</th>\n<th>Default</th>\n<th>Type</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>-</td>\n<td>dryrun</td>\n<td>Enable a dryrun mode that don't execute open or close functions</td>\n<td>config.dryrun</td>\n<td>False</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>-</td>\n<td>locker</td>\n<td>A binary sensor who block opening for open and close when state is On (including all moves by adaptive mode)</td>\n<td>config.locker</td>\n<td>None</td>\n<td>Binary Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>position</td>\n<td>opened</td>\n<td>Define the max position allowed (%) when cover is open</td>\n<td>config.common.position.opened</td>\n<td>100</td>\n<td>Integer</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>position</td>\n<td>closed</td>\n<td>Define the min position allowed (%) when cover is closed</td>\n<td>config.common.position.opened</td>\n<td>0</td>\n<td>Integer</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>position</td>\n<td>min_ratio_change</td>\n<td>Define minimum percent of move to allow action</td>\n<td>config.common.position.min_ratio_change</td>\n<td>5</td>\n<td>Integer</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>position</td>\n<td>min_time_change</td>\n<td>Define minimum time in minutes allowed between move</td>\n<td>config.common.position.min_time_change</td>\n<td>10</td>\n<td>Integer</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>opening</td>\n<td>type</td>\n<td>Define method to open covers the morning (Allowed value : off</td>\n<td>time</td>\n<td>sunrise</td>\n<td>lux</td>\n<td>prefer-lux)</td>\n</tr>\n<tr>\n<td>opening</td>\n<td>time</td>\n<td>Time to open covers - Only work with time or prefer-lux type</td>\n<td>config.common.opening.time</td>\n<td>None</td>\n<td>Time</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>opening</td>\n<td>locker</td>\n<td>A binary sensor who block opening when state is On (including opening by adaptive mode)</td>\n<td>config.common.opening.locker</td>\n<td>None</td>\n<td>Binary Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>closing</td>\n<td>type</td>\n<td>Define method to open covers the morning (Allowed value : off</td>\n<td>time</td>\n<td>sunrise</td>\n<td>lux</td>\n<td>prefer-lux)</td>\n</tr>\n<tr>\n<td>closing</td>\n<td>time</td>\n<td>Time to open covers - Only work with time or prefer-lux type</td>\n<td>config.common.closing.time</td>\n<td>None</td>\n<td>Time</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>closing</td>\n<td>locker</td>\n<td>A binary sensor who block closing when state is On (including all moves by adaptive mode)</td>\n<td>config.common.closing.locker</td>\n<td>None</td>\n<td>Binary Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>closing</td>\n<td>secure_dusk</td>\n<td>Close at dusk in 2 layer if first closing method failed - Only work with time or prefer-lux type</td>\n<td>config.common.closing.secure_dusk</td>\n<td>False</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>closing</td>\n<td>adaptive</td>\n<td>Enable adaptive mode who close/open covers based on Sun position and indoor/outdoor temperature</td>\n<td>config.common.closing.adaptive</td>\n<td>False</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>manual</td>\n<td>allow</td>\n<td>Enable or Disable detection of manual position change of covers</td>\n<td>config.common.manual.allow</td>\n<td>False</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>manual</td>\n<td>timer</td>\n<td>Time to block movements when manual position change is detected. Required if config.common.manual.allow is True</td>\n<td>config.common.manual.timer</td>\n<td>None</td>\n<td>TimeDelta</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>temperature.indoor</td>\n<td>sensor</td>\n<td>Sensor who provide indoor temperature (Positive Integer - No Float)</td>\n<td>config.common.temperature.indoor.sensor</td>\n<td>None</td>\n<td>Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>temperature.indoor</td>\n<td>setpoint</td>\n<td>Indoor temperature setpoint. Below =&gt; We need to heat with sun / Above =&gt; We need to block sun</td>\n<td>config.common.temperature.indoor.setpoint</td>\n<td>None</td>\n<td>PositiveInt</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>temperature.outdoor</td>\n<td>sensor</td>\n<td>Sensor who provide outdoor temperature (Positive Integer - No Float)</td>\n<td>config.common.temperature.outdoor.sensor</td>\n<td>None</td>\n<td>Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>temperature.outdoor</td>\n<td>low_temperature</td>\n<td>Outdoor temperature to trigger to enable adaptive mode in addition to indoor_temperature</td>\n<td>config.common.temperature.outdoor.low_temperature</td>\n<td>None</td>\n<td>PositiveInt</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>temperature.outdoor</td>\n<td>high_temperature</td>\n<td>Outdoor temperature to trigger when we need to totally close cover to protect from heat. Required when Outdoor sensor is configured</td>\n<td>config.common.temperature.outdoor.high_temperature</td>\n<td>None</td>\n<td>PositiveInt</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>lux</td>\n<td>sensor</td>\n<td>Sensor who provide outside Lux</td>\n<td>config.common.lux.sensor</td>\n<td>None</td>\n<td>Sensor Entity</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>lux</td>\n<td>open_lux</td>\n<td>Trigger in lux to open covers. Required if type of opening is lux or prefer-lux</td>\n<td>config.common.lux.open_lux</td>\n<td>None</td>\n<td>PositiveInt</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>lux</td>\n<td>close_lux</td>\n<td>Trigger in lux to close covers. Required if type of closing is lux or prefer-lux</td>\n<td>config.common.lux.close_lux</td>\n<td>None</td>\n<td>PositiveInt</td>\n<td>Optional</td>\n</tr>\n</tbody>\n</table>\n<p dir=\"auto\">Parameters for covers are :</p>\n<table>\n<thead>\n<tr>\n<th>Parent</th>\n<th>Parameters</th>\n<th>Description</th>\n<th>Configuration Path</th>\n<th>Default</th>\n<th>Type</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>config.covers.</td>\n<td>window_heigh</td>\n<td>Window Heigh in centimeters</td>\n<td>config.covers..window_heigh</td>\n<td></td>\n<td>PositiveInt</td>\n<td>Required</td>\n</tr>\n<tr>\n<td>config.covers.</td>\n<td>window_azimuth</td>\n<td>Window Azimuth in the middle of window</td>\n<td>config.covers..window_azimuth</td>\n<td></td>\n<td>Int between 0-360</td>\n<td>Required</td>\n</tr>\n<tr>\n<td>config.covers..positional</td>\n<td>action</td>\n<td>True if cover is positional</td>\n<td>config.covers..positional.action</td>\n<td>True</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>config.covers..positional</td>\n<td>status</td>\n<td>True if cover provide is position</td>\n<td>config.covers..positional.status</td>\n<td>True</td>\n<td>Boolean</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>config.covers..fov</td>\n<td>left</td>\n<td>What is the left FOV angle between window_azimuth and the sun azimuth entering in window</td>\n<td>config.covers..fov.left</td>\n<td>90</td>\n<td>Int between 0-180</td>\n<td>Optional</td>\n</tr>\n<tr>\n<td>config.covers..fov</td>\n<td>right</td>\n<td>What is the right FOV angle between window_azimuth and the sun azimuth leaving in window</td>\n<td>config.covers..fov.right</td>\n<td>90</td>\n<td>Int between 0-180</td>\n<td>Optional</td>\n</tr>\n</tbody>\n</table>\n<div dir=\"auto\"><p dir=\"auto\">Tip</p>\n<p dir=\"auto\">You can declare multiple covers in the same configuration.\nIf you need a specific global configuration for one or more covers, you can also create a new application configuration for these covers.</p>\n</div>\n<p dir=\"auto\"><h3 dir=\"auto\" tabindex=\"-1\">📄 Full Configuration Example</h3><a href=\"#-full-configuration-example\" aria-label=\"Permalink: 📄 Full Configuration Example\" id=\"user-content--full-configuration-example\"></a></p>\n<div dir=\"auto\"><pre><span>CoversManager</span>:\n <span>module</span>: <span>covers_manager</span>\n <span>class</span>: <span>CoversManager</span>\n <span>use_dictionary_unpacking</span>: <span>true</span>\n <span>log</span>: <span>CoversManager</span>\n <span>config</span>:\n <span>common</span>:\n <span>locker</span>: <span><span>\"</span>binary_sensor.alarm_status<span>\"</span></span>\n <span>position</span>:\n <span>opened</span>: <span>100</span>\n <span>closed</span>: <span>0</span>\n <span>min_ratio_change</span>: <span>5</span>\n <span>min_time_change</span>: <span>10</span>\n <span>opening</span>:\n <span>type</span>: <span><span>\"</span>prefer-lux<span>\"</span></span>\n <span>time</span>: <span><span>\"</span>10:00:00<span>\"</span></span>\n <span>locker</span>: <span><span>\"</span>binary_sensor.locker_opening<span>\"</span></span> <span><span>#</span> If at least one of opening and global locker are True, lock is True</span>\n <span>closing</span>:\n <span>type</span>: <span><span>\"</span>prefer-lux<span>\"</span></span>\n <span>secure_dusk</span>: <span>True</span>\n <span>adaptive</span>: <span>True</span>\n <span>locker</span>: <span><span>\"</span>binary_sensor.locker_closing<span>\"</span></span> <span><span>#</span> If at least one of closing and global locker are True, lock is True</span>\n <span>manual</span>:\n <span>allow</span>: <span>true</span>\n <span>timer</span>: <span>01:00:00</span>\n <span>temperature</span>:\n <span>indoor</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.indoor_temperature<span>\"</span></span>\n <span>setpoint</span>: <span>23</span>\n <span>outdoor</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.outdoor_sensor_temperature<span>\"</span></span>\n <span>low_temperature</span>: <span>25</span>\n <span>high_temperature</span>: <span>28</span>\n <span>lux</span>:\n <span>sensor</span>: <span><span>\"</span>sensor.outdoor_sensor_illuminance_lux<span>\"</span></span>\n <span>open_lux</span>: <span>23</span>\n <span>close_lux</span>: <span>5</span>\n <span>covers</span>:\n <span>cover.roller_1</span>:\n <span>window_heigh </span>: <span>210</span>\n <span>window_azimuth</span>: <span>180</span>\n <span>positional</span>:\n <span>action </span>: <span>True</span>\n <span>status</span>: <span>True</span>\n <span>fov</span>:\n <span>left</span>: <span>60</span>\n <span>right</span>: <span>70</span>\n <span>cover.roller_shutter_2</span>:\n <span>window_heigh </span>: <span>210</span>\n <span>window_azimuth</span>: <span>320</span>\n <span>positional</span>:\n <span>action </span>: <span>True</span>\n <span>status</span>: <span>True</span>\n <span>fov</span>:\n <span>left</span>: <span>90</span>\n <span>right</span>: <span>90</span></pre></div>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">🪲 Debug</h2><a href=\"#-debug\" aria-label=\"Permalink: 🪲 Debug\" id=\"user-content--debug\"></a></p>\n<p dir=\"auto\">To help to debug and understand an issue, you can enable the debug mode in app.\nFor this, edit the app configuration and set <code>log_level</code> to DEBUG</p>\n<div dir=\"auto\"><pre><span>CoversManager</span>:\n <span>[...]</span>\n <span>log</span>: <span>CoversManager</span>\n <span>log_level</span>: <span>DEBUG &lt;---- HERE</span>\n <span>config</span>:\n <span>[...]</span></pre></div>\n<p dir=\"auto\">If you need some assistance, you can open a topic in <a href=\"https://github.com/mguyard/appdaemon-coversmanager/discussions\">Discussions</a> or by <a href=\"https://github.com/mguyard/appdaemon-coversmanager/issues/new?assignees=&amp;labels=Bug&amp;projects=&amp;template=bug_report.yml\">opening an Issue</a></p>\n<p dir=\"auto\"><h2 dir=\"auto\" tabindex=\"-1\">🤝 Contributing</h2><a href=\"#-contributing\" aria-label=\"Permalink: 🤝 Contributing\" id=\"user-content--contributing\"></a></p>\n<p dir=\"auto\">Contributions are welcome! Here are several ways you can contribute:</p>\n<ul dir=\"auto\">\n<li><strong><a href=\"https://github.com/mguyard/appdaemon-coversmanager/pulls\">Submit Pull Requests</a></strong>: Review open PRs, and submit your own PRs.</li>\n<li><strong><a href=\"https://github.com/mguyard/appdaemon-coversmanager/issues/new?assignees=&amp;labels=Bug&amp;projects=&amp;template=bug_report.yml\">Report Issues</a></strong>: Submit bugs found or log feature requests.</li>\n</ul>\n<details>\n <summary>Contributing Guidelines</summary>\n<ol dir=\"auto\">\n<li><strong>Fork the Repository</strong>: Start by forking the project repository to your GitHub account.</li>\n<li><strong>Clone Locally</strong>: Clone the forked repository to your local machine using a Git client.\n<div dir=\"auto\"><pre>git clone https://github.com/mguyard/appdaemon-coversmanager</pre></div>\n</li>\n<li><strong>Create a New Branch</strong>: Always work on a new branch, giving it a descriptive name.\n<div dir=\"auto\"><pre>git checkout -b new-feature-x</pre></div>\n</li>\n<li><strong>Make Your Changes</strong>: Develop and test your changes locally.</li>\n<li><strong>Commit Your Changes</strong>: Commit with a clear message describing your updates.\n<div dir=\"auto\"><pre>git commit -m <span><span>'</span>Implemented new feature x.<span>'</span></span></pre></div>\n</li>\n<li><strong>Push to GitHub</strong>: Push the changes to your forked repository.\n<div dir=\"auto\"><pre>git push origin new-feature-x</pre></div>\n</li>\n<li><strong>Submit a Pull Request</strong>: Create a PR against the original project repository. Clearly describe the changes and their motivations.</li>\n</ol>\n<p dir=\"auto\">Once your PR is reviewed and approved, it will be merged into the dev branch.</p>\n</details>\n<div dir=\"auto\"><p dir=\"auto\">Warning</p>\n<p dir=\"auto\">Only PR to <code>dev</code> branch will be accepted.</p>\n</div>\n</article></div></div>","textContent":"\n \n\nAppDaemon - Covers Manager\n\n\n All you need to manage your covers !\n\n\n\t\n\t\n\t\n\t\n\n \n \n \n \n \n \n \n \n\n\n🔗 Quick Links\n\n\n📍 Overview\n📦 Features\n❔ How this works\n🚀 Getting Started\n\n🔝 Requirements\n⚙ Installation\n\n\n🏷 Configuration\n\n🤖 AppDaemon\n🪟 Covers Manager\n🧩 Parameters\n📄 Full Configuration Example\n\n\n🪲 Debug\n🤝 Contributing\n\n\n\n📍 Overview\nObjective\nThe objective of the Covers Manager project is to provide a comprehensive solution for managing covers. The project aims to simplify and streamline the process of managing covers by automating various tasks and providing an efficient tool for users.\nThe Covers Manager project is designed to address the specific needs of managing covers, such as those used in home automation systems or other applications. It offers a range of features and functionalities to facilitate the management of covers, including opening, closing or manage covers position depending of sun position and temperature (indoor and outdoor).\nOverall, the objective of the Covers Manager project is to simplify and optimize the management of covers, providing users with a powerful and efficient tool for controlling their covers.\nNote\nIt's important to note that the Covers Manager project is under development.\nProject is open-source, and users are encouraged to adapt it to their own needs if necessary and purpose all evolutions by submitting a PR.\n\nMotivation\nThis AppDaemon application was born out of the need to manage roller shutters as I did on Jeedom before migrating to Home Assistant.\nThe aim was simple: recover the automatic opening and closing functions, as well as the ability to close the shutters proportionally according to the position of the sun.\nInspiration\nI was greatly inspired by the Volets plugin on Jeedom by mika-nt28 as well as the work of BasBrus and Langestefan (https://community.home-assistant.io/t/custom-component-adaptive-cover/712626).\n📦 Features\nCoversManager is developped to help you with these features :\n\nOpening covers (based on time, lux, sunrise hour)\nClosing covers (based on time, lux, sunset hour)\nAdaptive covers management based on sun position, indoor and outdoor temperature (optional)\nBlock adaptive changes when manual position change is detected\n\n❔ How this works\nCoversManager works in 3 modes :\n\nOpening (who manage covers opening - most of the time the morning)\nClosing (who manage covers closing - most of the time the evening)\nAdaptive (open or close covers fully or partially depending of sun position and indoor/outdoor temperature)\n\nOpening\nIn your configuration, you can define one of the multiple type of opening supported.\n\nOff (you don't want CoversManager manage your opening)\nTime (you define at which time CoversManager will open your covers)\nSunrise (your covers will open at sunrise time - calculated internaly by AppDaemon)\nLux (you define a minimal lux to open covers)\nPrefer-Lux (it's a combinaison of lux and custom time - useful in case of issue with your lux sensor, custom time will be your backup)\n\nWarning\nWhen using prefer-lux, you need to configure a time that will be later than the possible time where required lux will be triggered. Otherwise, opening will be used based on time as it will be the first triggered.\n\nClosing\nIn your configuration, you can define one of the multiple type of opening supported.\n\nOff (you don't want CoversManager manage your opening)\nTime (you define at which time CoversManager will open your covers)\nSunset (your covers will open at sunset time - calculated internaly by AppDaemon)\nLux (you define a minimal lux to open covers)\nPrefer-Lux (it's a combinaison of lux and custom time or dusk - useful in case of issue with your lux sensor, custom time or dusk will be your backup)\n\nWarning\nWhen using prefer-lux, you need to configure a time that will be later than the possible time where required lux will be triggered. Otherwise, closing will be used based on time as it will be the first triggered.\n\nAdaptive\nWhen adaptive mode is enable, each time the sun position change (based on sun.sun/azimuth), if sun is in window, CoversManager define the better cover position to :\n\nlet in the sun (if indoor temperature is less than the setpoint defined or outdoor temperature is less than indoor temperature) - Open 100%\nkeep the sun out but not the light (if indoor temperature is greater than the setpoint defined) - Partially open calculated with sun position and window parameters\nkeep the sun out (if outdoor temperature is greater than outdoor high temperature defined) - Close 100%\n\nNote\nTo prevent covers from constantly moving as the sun does, there are two parameters (min_ratio_change and min_time_change) that define the minimum percent of position change to be executed, and the minimum time between two movements. Please look in parameters to know defaults values.\nIf manual configuration is enabled, each time you move manually a cover (not by CoversManager), Adaptive mode is disable for the time configured.\n\n🚀 Getting Started\n🔝 Requirements\n\nA valid and functional deployment of AppDaemon Addon connected to Home Assistant\nA valid and functional HACS (Home Assistant Community Store) integration\n\n⚙ Installation\n\nEnable AppDaemon Apps in HACS\nAdd Automation repository in HACS as AppDaemon repo : https://github.com/mguyard/appdaemon-coversmanager\nInstall Covers Manager in HACS\nInstall Studio Code Server addon to edit your AppDaemon & CoversManager configuration (optional if your prefer another method to modify your configuration)\n\n🏷 Configuration\n🤖 AppDaemon\nFirstly you need to configure your newly AppDaemon installation.\nNote\nPlease continue to next chapter if AppDaemon was already configured before this App\n\nAppDaemon Main configuration is available in file appdaemon.yaml most of the time stored in /add_config/<guid>_appdaemon/\nPlease find below an example of basic configuration (It may need to be adapted to suit your configuration) :\n---\nsecrets: /homeassistant/secrets.yaml\nappdaemon:\n app_dir: /homeassistant/appdaemon/apps\n latitude: 48.80506979319244\n longitude: 2.12031248278925\n elevation: 130\n time_zone: Europe/Paris\n plugins:\n HASS:\n type: hass\nhttp:\n url: http://127.0.0.1:5050\nadmin:\napi:\nhadashboard:\n\nlogs:\n main_log:\n filename: /config/logs/appdaemon.log\n error_log:\n filename: /config/logs/error.log\nWarning\nStarting with the AppDaemon v0.15.0 addon, configuration of AppDaemon was moved to /addon_configs folder. But HACS still continue to download AppDaemon apps to /config (old folder).\nTo resolve this, we add app_dir directive in appdaemon: section to use HACS supported folder.\nIf you already have existing apps not coming from HACS, I recommend to upload manually iopool Pump Manager in your actual app_dir or copying all your existing app before modifying app_dir directive.\n\nCreate folder logs (if not already exist) in /add_config/<guid>_appdaemon/ and add in appdaemon.yaml logs section, the log for Covers Manager :\nlogs:\n [...]\n CoversManager:\n name: CoversManager\n filename: /config/logs/CoversManager.log\nFollowing the configuration change, you need to restart your AppDaemon addon.\nAppDaemon dependancies\nYou need to add a python package to AppDaemon for this application to work.\nTo do this, go to your AppDaemon add-on configuration and add pydantic in the package python field.\npydantic should appear as a tag above the package python field.\n\n🪟 Covers Manager\nTo configure Covers Manager app you need to edit apps.yaml configuration most of the time stored in /add_config/<guid>_appdaemon/apps/\nPlease find below an simple example of configuration to add in file :\nCoversManager:\n module: covers_manager\n class: CoversManager\n use_dictionary_unpacking: true\n log: CoversManager\n config:\n common:\n opening:\n type: \"lux\"\n closing:\n type: \"lux\"\n adaptive: True\n temperature:\n indoor:\n sensor: \"sensor.indoor_temperature\"\n setpoint: 23\n outdoor:\n sensor: \"sensor.outdoor_temperature\"\n high_temperature: 28\n lux:\n sensor: \"sensor.outdoor_sensor_illuminance_lux\"\n open_lux: 23\n close_lux: 5\n covers:\n cover.roller_shutter_1:\n window_heigh : 210 \n window_azimuth: 180\n cover.roller_shutter_2:\n window_heigh : 210\n window_azimuth: 320\nYou have more configuration available. All is detailled in next chapter 🧩 Parameters\n🧩 Parameters\nPlease find below all configuration parameters who don't apply to covers directly\n\n\n\nParent\nParameters\nDescription\nConfiguration Path\nDefault\nType\nStatus\n\n\n\n\n-\ndryrun\nEnable a dryrun mode that don't execute open or close functions\nconfig.dryrun\nFalse\nBoolean\nOptional\n\n\n-\nlocker\nA binary sensor who block opening for open and close when state is On (including all moves by adaptive mode)\nconfig.locker\nNone\nBinary Sensor Entity\nOptional\n\n\nposition\nopened\nDefine the max position allowed (%) when cover is open\nconfig.common.position.opened\n100\nInteger\nOptional\n\n\nposition\nclosed\nDefine the min position allowed (%) when cover is closed\nconfig.common.position.opened\n0\nInteger\nOptional\n\n\nposition\nmin_ratio_change\nDefine minimum percent of move to allow action\nconfig.common.position.min_ratio_change\n5\nInteger\nOptional\n\n\nposition\nmin_time_change\nDefine minimum time in minutes allowed between move\nconfig.common.position.min_time_change\n10\nInteger\nOptional\n\n\nopening\ntype\nDefine method to open covers the morning (Allowed value : off\ntime\nsunrise\nlux\nprefer-lux)\n\n\nopening\ntime\nTime to open covers - Only work with time or prefer-lux type\nconfig.common.opening.time\nNone\nTime\nOptional\n\n\nopening\nlocker\nA binary sensor who block opening when state is On (including opening by adaptive mode)\nconfig.common.opening.locker\nNone\nBinary Sensor Entity\nOptional\n\n\nclosing\ntype\nDefine method to open covers the morning (Allowed value : off\ntime\nsunrise\nlux\nprefer-lux)\n\n\nclosing\ntime\nTime to open covers - Only work with time or prefer-lux type\nconfig.common.closing.time\nNone\nTime\nOptional\n\n\nclosing\nlocker\nA binary sensor who block closing when state is On (including all moves by adaptive mode)\nconfig.common.closing.locker\nNone\nBinary Sensor Entity\nOptional\n\n\nclosing\nsecure_dusk\nClose at dusk in 2 layer if first closing method failed - Only work with time or prefer-lux type\nconfig.common.closing.secure_dusk\nFalse\nBoolean\nOptional\n\n\nclosing\nadaptive\nEnable adaptive mode who close/open covers based on Sun position and indoor/outdoor temperature\nconfig.common.closing.adaptive\nFalse\nBoolean\nOptional\n\n\nmanual\nallow\nEnable or Disable detection of manual position change of covers\nconfig.common.manual.allow\nFalse\nBoolean\nOptional\n\n\nmanual\ntimer\nTime to block movements when manual position change is detected. Required if config.common.manual.allow is True\nconfig.common.manual.timer\nNone\nTimeDelta\nOptional\n\n\ntemperature.indoor\nsensor\nSensor who provide indoor temperature (Positive Integer - No Float)\nconfig.common.temperature.indoor.sensor\nNone\nSensor Entity\nOptional\n\n\ntemperature.indoor\nsetpoint\nIndoor temperature setpoint. Below => We need to heat with sun / Above => We need to block sun\nconfig.common.temperature.indoor.setpoint\nNone\nPositiveInt\nOptional\n\n\ntemperature.outdoor\nsensor\nSensor who provide outdoor temperature (Positive Integer - No Float)\nconfig.common.temperature.outdoor.sensor\nNone\nSensor Entity\nOptional\n\n\ntemperature.outdoor\nlow_temperature\nOutdoor temperature to trigger to enable adaptive mode in addition to indoor_temperature\nconfig.common.temperature.outdoor.low_temperature\nNone\nPositiveInt\nOptional\n\n\ntemperature.outdoor\nhigh_temperature\nOutdoor temperature to trigger when we need to totally close cover to protect from heat. Required when Outdoor sensor is configured\nconfig.common.temperature.outdoor.high_temperature\nNone\nPositiveInt\nOptional\n\n\nlux\nsensor\nSensor who provide outside Lux\nconfig.common.lux.sensor\nNone\nSensor Entity\nOptional\n\n\nlux\nopen_lux\nTrigger in lux to open covers. Required if type of opening is lux or prefer-lux\nconfig.common.lux.open_lux\nNone\nPositiveInt\nOptional\n\n\nlux\nclose_lux\nTrigger in lux to close covers. Required if type of closing is lux or prefer-lux\nconfig.common.lux.close_lux\nNone\nPositiveInt\nOptional\n\n\n\nParameters for covers are :\n\n\n\nParent\nParameters\nDescription\nConfiguration Path\nDefault\nType\nStatus\n\n\n\n\nconfig.covers.\nwindow_heigh\nWindow Heigh in centimeters\nconfig.covers..window_heigh\n\nPositiveInt\nRequired\n\n\nconfig.covers.\nwindow_azimuth\nWindow Azimuth in the middle of window\nconfig.covers..window_azimuth\n\nInt between 0-360\nRequired\n\n\nconfig.covers..positional\naction\nTrue if cover is positional\nconfig.covers..positional.action\nTrue\nBoolean\nOptional\n\n\nconfig.covers..positional\nstatus\nTrue if cover provide is position\nconfig.covers..positional.status\nTrue\nBoolean\nOptional\n\n\nconfig.covers..fov\nleft\nWhat is the left FOV angle between window_azimuth and the sun azimuth entering in window\nconfig.covers..fov.left\n90\nInt between 0-180\nOptional\n\n\nconfig.covers..fov\nright\nWhat is the right FOV angle between window_azimuth and the sun azimuth leaving in window\nconfig.covers..fov.right\n90\nInt between 0-180\nOptional\n\n\n\nTip\nYou can declare multiple covers in the same configuration.\nIf you need a specific global configuration for one or more covers, you can also create a new application configuration for these covers.\n\n📄 Full Configuration Example\nCoversManager:\n module: covers_manager\n class: CoversManager\n use_dictionary_unpacking: true\n log: CoversManager\n config:\n common:\n locker: \"binary_sensor.alarm_status\"\n position:\n opened: 100\n closed: 0\n min_ratio_change: 5\n min_time_change: 10\n opening:\n type: \"prefer-lux\"\n time: \"10:00:00\"\n locker: \"binary_sensor.locker_opening\" # If at least one of opening and global locker are True, lock is True\n closing:\n type: \"prefer-lux\"\n secure_dusk: True\n adaptive: True\n locker: \"binary_sensor.locker_closing\" # If at least one of closing and global locker are True, lock is True\n manual:\n allow: true\n timer: 01:00:00\n temperature:\n indoor:\n sensor: \"sensor.indoor_temperature\"\n setpoint: 23\n outdoor:\n sensor: \"sensor.outdoor_sensor_temperature\"\n low_temperature: 25\n high_temperature: 28\n lux:\n sensor: \"sensor.outdoor_sensor_illuminance_lux\"\n open_lux: 23\n close_lux: 5\n covers:\n cover.roller_1:\n window_heigh : 210\n window_azimuth: 180\n positional:\n action : True\n status: True\n fov:\n left: 60\n right: 70\n cover.roller_shutter_2:\n window_heigh : 210\n window_azimuth: 320\n positional:\n action : True\n status: True\n fov:\n left: 90\n right: 90\n🪲 Debug\nTo help to debug and understand an issue, you can enable the debug mode in app.\nFor this, edit the app configuration and set log_level to DEBUG\nCoversManager:\n [...]\n log: CoversManager\n log_level: DEBUG <---- HERE\n config:\n [...]\nIf you need some assistance, you can open a topic in Discussions or by opening an Issue\n🤝 Contributing\nContributions are welcome! Here are several ways you can contribute:\n\nSubmit Pull Requests: Review open PRs, and submit your own PRs.\nReport Issues: Submit bugs found or log feature requests.\n\n\n Contributing Guidelines\n\nFork the Repository: Start by forking the project repository to your GitHub account.\nClone Locally: Clone the forked repository to your local machine using a Git client.\ngit clone https://github.com/mguyard/appdaemon-coversmanager\n\nCreate a New Branch: Always work on a new branch, giving it a descriptive name.\ngit checkout -b new-feature-x\n\nMake Your Changes: Develop and test your changes locally.\nCommit Your Changes: Commit with a clear message describing your updates.\ngit commit -m 'Implemented new feature x.'\n\nPush to GitHub: Push the changes to your forked repository.\ngit push origin new-feature-x\n\nSubmit a Pull Request: Create a PR against the original project repository. Clearly describe the changes and their motivations.\n\nOnce your PR is reviewed and approved, it will be merged into the dev branch.\n\nWarning\nOnly PR to dev branch will be accepted.\n\n","length":16979,"excerpt":"","siteName":null}