External Components =================== .. seo:: :description: Instructions for setting up ESPHome External Components. :keywords: External, Custom, Components, ESPHome You can easily import community or personal components using the external components feature. Bundled components can be overridden using this feature. You can find some basic documentation on creating your own components at :ref:`contributing_to_esphome`. .. code-block:: yaml external_components: # use rtttl and dfplayer from ESPHome's dev branch in GitHub - source: type: git url: https://github.com/esphome/esphome ref: dev components: [ rtttl, dfplayer ] # equivalent shorthand for GitHub - source: github://esphome/esphome@dev components: [ rtttl ] # equivalent shorthand for GitHub pull request - source: github://pr#2639 components: [ rtttl ] # use all components from a local folder - source: type: local path: my_components # use a component from a local git repository - source: type: git url: file:///Users/user/path_to_repo ref: my_awesome_branch components: [my_awesome_component] Configuration variables: - **source**: The location of the components you want to retrieve. See :ref:`external-components_local` and :ref:`external-components_git`. - **type** (**Required**): Repository type. One of ``local``, ``git``. git options: - **url** (**Required**, url): Git repository url. See :ref:`external-components_git`. - **ref** (*Optional*, string): Git ref (branch or tag). If not specified the default branch is used. - **username** (*Optional*, string): Username for the Git server, if one is required - **password** (*Optional*, string): Password for the Git server, if one is required - **path** (*Optional*, string): Path inside the repo, if different from ``components`` or ``esphome/components`` local options: - **path** (**Required**): Path to use when using local components. See :ref:`external-components_local`. - **components** (*Optional*, list): The list of components to use from the external source. By default, all available components are used. - **refresh** (*Optional*, :ref:`config-time`): The interval the source will be checked. Has no effect on ``local``. See :ref:`external-components_refresh`. for more info. Defaults to ``1day``. .. _external-components_local: Local ----- You can specify a local path containing external components. This is most useful when developing a component or if you want to manually control the origin of the files. .. code-block:: yaml external_components: - source: path: /copied_components # shorthand external_components: - source: my_components Notice that relative paths are supported, so you can enter ``my_components`` as the source path and then ESPHome will load components from a ``my_components`` folder in the same folder where your YAML configuration is. Example of local components *************************** Given the above example of ``my_components``, the folder structure must look like: .. code-block:: text ├── node1.yaml ├── node2.yaml └── my_components ├── my_component1 │ ├── __init__.py │ ├── component1.cpp │ ├── component1.h │ └── sensor.py └── my_component2 ├── __init__.py ├── component2.cpp ├── component2.h └── switch.py .. _external-components_git: Git --- Retrieving components from git is the easiest way to use components not included in ESPHome by default. The source components should be inside a ``components`` folder or inside an ``esphome/components`` folder. The latter makes sharing a component from a forked ESPHome repository easier. The url to the repository may be remote (``http:`` or ``https:`` scheme) or local (``file:`` scheme with an absolute path.) Example of git repositories *************************** For repositories where you share one or a few components: .. code-block:: text components ├── my_component1 │ ├── __init__.py │ ├── component1.cpp │ ├── component1.h │ └── sensor.py └── my_component2 ├── __init__.py ├── component2.cpp ├── component2.h └── switch.py example_component1.yaml <- not required but recommended README.md or, this structure is also supported, which makes handy to share components from a **forked** ESPHome repository: .. code-block:: text esphome ├── components │ ├── my_component1 │ │ ├── __init__.py │ │ ├── component1.cpp │ │ ├── component1.h │ │ └── sensor.py │ ├── my_component2 │ │ ├── __init__.py │ │ ├── component2.cpp │ │ ├── component2.h │ │ └── switch.py │ ... ... HTTP git repositories in general are supported with this configuration: .. code-block:: yaml external_components: source: type: git url: http://repository_url/ ref: branch_or_tag source: type: git url: file:///Users/user/path_to_repo ref: branch_or_tag The source field accepts a short hand **github://** resource: .. code-block:: yaml external_components: # shorthand source: github:///[@] The source field also accepts a short hand **github://** pull request from the ESPHome repository: .. code-block:: yaml external_components: # shorthand source: github://pr# Under the hood, during validation, ESPHome will clone the git repository into the hidden ``.esphome`` folder and components will then be loaded from this local copy. The local path of the cloned repository varies per repository name and ref name, so repositories with different refs are considered different repositories and updated independently. If required, you can supply a username and password to use when authenticating with the remote git server using the ``username`` and ``password`` fields. This is most useful when combined with the ``!secret`` feature, to load the values in from a ``secrets.yaml`` file. This is not a comprehensive security measure; your username and password will necessarily be stored in clear text within the ``.esphome`` directory. .. _external-components_refresh: Refresh ******* Components are initially cloned into a cache directory, then the repository is checked for updates (via *git pull*) after the ``refresh:`` time passes since last check. You can make ESPHome check the repository every time by setting this option to ``0s``, however since ESPHome is validating the configuration continuously while using the dashboard or the vscode extension, it is not recommended to set this value to less than a few minutes to avoid validation slow down and excessive repository checks. Likewise, you can set this setting to ``never`` and ESPHome will never **update** the repository, useful e.g. when ``ref`` points to a **tag**. See Also -------- - :ghedit:`Edit`