Merge branch 'current' into nagyrobi-patch-3
@ -2,7 +2,7 @@
|
||||
{
|
||||
"name": "ESPHome - docs",
|
||||
"image": "mcr.microsoft.com/vscode/devcontainers/python:0-3.11",
|
||||
"postCreateCommand": "pip3 install -r requirements.txt -r requirements_test.txt",
|
||||
"postCreateCommand": ".devcontainer/postCreate.sh",
|
||||
"postAttachCommand": "make live-html",
|
||||
"forwardPorts": [8000],
|
||||
"features": {
|
||||
|
5
.devcontainer/postCreate.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
pip3 install -r requirements.txt -r requirements_test.txt
|
||||
curl -L https://github.com/CloudCannon/pagefind/releases/download/v1.1.0/pagefind-v1.1.0-x86_64-unknown-linux-musl.tar.gz | tar -xz -C ~/.local/bin
|
2
.gitignore
vendored
@ -11,3 +11,5 @@ venv
|
||||
.vscode
|
||||
*.DS_Store
|
||||
/.idea/
|
||||
|
||||
_pagefind/
|
||||
|
14
Dockerfile
@ -9,8 +9,22 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
software-properties-common \
|
||||
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*
|
||||
|
||||
ENV PAGEFIND_VERSION="1.1.0"
|
||||
ARG TARGETARCH
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
RUN <<EOF
|
||||
export TARGETARCH=${TARGETARCH/arm64/aarch64}
|
||||
export TARGETARCH=${TARGETARCH/amd64/x86_64}
|
||||
curl -o pagefind.tar.gz https://github.com/CloudCannon/pagefind/releases/download/v$PAGEFIND_VERSION/pagefind-v$PAGEFIND_VERSION-$TARGETARCH-unknown-linux-musl.tar.gz -L
|
||||
tar xzf pagefind.tar.gz
|
||||
rm pagefind.tar.gz
|
||||
mv pagefind /usr/bin
|
||||
chmod +x /usr/bin/pagefind
|
||||
EOF
|
||||
|
||||
RUN useradd -ms /bin/bash esphome
|
||||
|
||||
|
||||
USER esphome
|
||||
|
||||
WORKDIR /workspaces/esphome-docs
|
||||
|
2
Doxygen
@ -38,7 +38,7 @@ PROJECT_NAME = "ESPHome"
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = 2024.5.4
|
||||
PROJECT_NUMBER = 2024.5.5
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
30
Makefile
@ -1,24 +1,24 @@
|
||||
ESPHOME_PATH = ../esphome
|
||||
ESPHOME_REF = 2024.5.4
|
||||
ESPHOME_REF = 2024.5.5
|
||||
PAGEFIND_VERSION=1.1.0
|
||||
PAGEFIND=pagefind
|
||||
NET_PAGEFIND=../pagefindbin/pagefind
|
||||
|
||||
.PHONY: html html-strict cleanhtml deploy help live-html live-pagefind Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify
|
||||
.PHONY: pagefind build-html html html-strict cleanhtml deploy help live-html live-pagefind Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify
|
||||
|
||||
html:
|
||||
html: pagefind
|
||||
sphinx-build -M html . _build -j auto -n $(O) -Dhtml_extra_path=_redirects,_pagefind
|
||||
|
||||
pagefind:
|
||||
sphinx-build -M html . _build -j auto -n $(O)
|
||||
mkdir -p _pagefind/pagefind
|
||||
${PAGEFIND}
|
||||
|
||||
live-html: html
|
||||
sphinx-autobuild . _build -j auto -n $(O) --host 0.0.0.0
|
||||
|
||||
live-pagefind: html
|
||||
${PAGEFIND} --serve
|
||||
live-html: pagefind
|
||||
sphinx-autobuild . _build -j auto -n $(O) --host 0.0.0.0 -Dhtml_extra_path=_redirects,_pagefind
|
||||
|
||||
html-strict:
|
||||
sphinx-build -M html . _build -W -j auto -n $(O)
|
||||
${PAGEFIND}
|
||||
|
||||
minify:
|
||||
minify _static/webserver-v1.js > _static/webserver-v1.min.js
|
||||
@ -43,7 +43,9 @@ api:
|
||||
|
||||
net-html:
|
||||
sphinx-build -M html . _build -j auto -n $(O)
|
||||
mkdir -p _pagefind/pagefind
|
||||
${NET_PAGEFIND}
|
||||
sphinx-build -M html . _build -j auto -n $(O) -Dhtml_extra_path=_redirects,_pagefind
|
||||
|
||||
netlify-api: netlify-dependencies
|
||||
mkdir -p _build/html/api
|
||||
@ -60,9 +62,9 @@ netlify-dependencies: pagefind-binary
|
||||
|
||||
pagefind-binary:
|
||||
mkdir -p ../pagefindbin
|
||||
curl -o pagefind-v$(PAGEFIND_VERSION)-x86_64-unknown-linux-musl.tar.gz https://github.com/CloudCannon/pagefind/releases/download/v$(PAGEFIND_VERSION)/pagefind-v$(PAGEFIND_VERSION)-x86_64-unknown-linux-musl.tar.gz -L
|
||||
tar xzf pagefind-v$(PAGEFIND_VERSION)-x86_64-unknown-linux-musl.tar.gz
|
||||
rm pagefind-v$(PAGEFIND_VERSION)-x86_64-unknown-linux-musl.tar.gz
|
||||
curl -o pagefind.tar.gz https://github.com/CloudCannon/pagefind/releases/download/v$(PAGEFIND_VERSION)/pagefind-v$(PAGEFIND_VERSION)-x86_64-unknown-linux-musl.tar.gz -L
|
||||
tar xzf pagefind.tar.gz
|
||||
rm pagefind.tar.gz
|
||||
mv pagefind ${NET_PAGEFIND}
|
||||
|
||||
|
||||
@ -74,6 +76,10 @@ netlify: netlify-dependencies netlify-api net-html copy-svg2png
|
||||
lint: html-strict
|
||||
python3 lint.py
|
||||
|
||||
clean:
|
||||
rm -rf _pagefind/
|
||||
sphinx-build -M clean . _build $(O)
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 17 KiB |
@ -3,7 +3,7 @@
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square150x150logo src="/_static/mstile-150x150.png"/>
|
||||
<TileColor>#dfdfdf</TileColor>
|
||||
<TileColor>#18bcf2</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
||||
|
@ -1,3 +1,9 @@
|
||||
/* provide this to be queried in JS. Sadly can't be used in media-queries just yet*/
|
||||
|
||||
:root {
|
||||
--mobile-width-stop: 875;
|
||||
}
|
||||
|
||||
.row-odd {
|
||||
background-color: #f3f6f6;
|
||||
}
|
||||
@ -263,9 +269,8 @@ div.body p, div.body dd, div.body li, div.body blockquote {
|
||||
.search-results {
|
||||
background-color: #f8f8f8;
|
||||
box-shadow: 0 6px 10px rgb(0 0 0 / 0.2);
|
||||
position: absolute;
|
||||
position: fixed;
|
||||
z-index: 1500;
|
||||
margin-top: 4px;
|
||||
padding-right: 6px;
|
||||
padding-left: 6px;
|
||||
border-radius: 12px;
|
||||
@ -277,6 +282,42 @@ div.body p, div.body dd, div.body li, div.body blockquote {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* New branding changes */
|
||||
|
||||
div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6, div.sphinxsidebar h3, div.sphinxsidebar h4, div.admonition p.admonition-title {
|
||||
font-family: Figtree, system, -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
div.body h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "Instrument Sans", system, -apple-system, ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif;
|
||||
line-height: 1.5;
|
||||
letter-spacing: 0.01rem;
|
||||
}
|
||||
|
||||
div.body p, div.body dd, div.body li {
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 875px) {
|
||||
/* hide search result thumbnails on mobile */
|
||||
.pagefind-modular-list-thumb {
|
||||
width: 0;
|
||||
}
|
||||
/* reduce height of search box */
|
||||
.pagefind-modular-input-wrapper {
|
||||
scale: 90%;
|
||||
}
|
||||
.logo {
|
||||
scale: 60%;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* dark theme */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
|
||||
@ -383,6 +424,7 @@ div.body p, div.body dd, div.body li, div.body blockquote {
|
||||
.pagefind-ui__form, .pagefind-modular-input, .search-results {
|
||||
color: #ececec !important;
|
||||
}
|
||||
|
||||
:root {
|
||||
--pagefind-ui-primary: #eeeeee;
|
||||
--pagefind-ui-text: #eeeeee;
|
||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 695 B After Width: | Height: | Size: 311 B |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 495 B |
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1,10 @@
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1066.667" height="1066.667" viewBox="0 0 800 800"><path d="M266.5 149.6c-12.4 3.1-19.4 8.1-24.5 17.5l-3.5 6.4-.3 17.6-.4 17.6-4.3.6c-6.1.9-11.1 4.2-14.3 9.6l-2.7 4.6-.3 160.2L216 544H94v-15h49c34.4 0 49.6-.3 51.4-1.1 5-2.3 5.7-6.1 5.4-27.4l-.3-19.5-2.8-2.7-2.7-2.8-50-.3-50-.3V460h99l3.2-2.9 3.3-2.9V412l-2.8-2.7-2.7-2.8-50-.3-50-.3v-14.8l50-.3 50-.3 2.7-2.8 2.8-2.7v-42.2l-3.3-2.9-3.2-2.9H94v-99.8l-2.6-3.1c-3.6-4.3-9.3-4.4-13.5-.2l-2.9 2.9v113.4l2.9 2.9 2.9 2.9H180v16H80.8l-2.9 2.9-2.9 2.9v41.4l2.9 2.9 2.9 2.9H180v16H80.8l-2.9 2.9-2.9 2.9v41l2.6 3.1 2.6 3.1H180v16H81.1l-2.8 2.4-2.8 2.4-.3 21-.3 21 3 3.4 2.9 3.3 67.5.3 67.5.2.7 4.3c.4 2.3 1.3 5.3 2 6.7 2.8 5.4 10.1 10 15.9 10h3.5l.3 19.7c.3 19 .4 20 3 25.5 5.4 11.6 15.2 18.1 28.3 18.6 9.8.5 17.1-1.9 23.7-7.7 9.3-8.2 11.8-17 11.8-41.4V585h12v15.3c0 8.4.5 18 1.1 21.3 2.2 11.9 9.9 21.4 20.8 25.5 7.8 2.9 19.4 2.4 26.6-1.3 6.4-3.4 12.8-10 15.7-16.3 2.1-4.6 2.3-6.7 2.6-24.8l.4-19.7h12.6l.4 19.7c.3 17.7.6 20.3 2.5 24.5 2.9 6.3 9.7 13.4 15.8 16.6 7.2 3.7 18.8 4.2 26.6 1.3 7.9-3 14.1-8.8 18.1-16.9l3.3-6.7.3-19.3.4-19.3 6.1.3 6.2.3.5 20c.5 19.5.6 20.1 3.3 25.3 3.5 6.7 9 12.2 15.3 15.3 4.1 2 6.4 2.4 14.4 2.4 8.1 0 10.3-.4 14.5-2.4 6.3-3.2 12.4-9.3 15.6-15.6 2.2-4.7 2.4-6.3 2.9-25l.5-20 6.1-.3 6.2-.3.3 19.3.4 19.3 3.3 6.7c4 8.1 10.2 13.9 18.1 16.9 7.8 2.9 19.4 2.4 26.6-1.3 6.1-3.2 12.9-10.3 15.8-16.6 2-4.2 2.2-6.7 2.5-24.5l.4-19.7h12.6l.4 19.7c.3 22.6 1.3 26.1 9.1 34.1 6.4 6.7 12.7 9.5 22.2 10 9.8.5 17-1.9 23.7-7.7 9.2-8.2 11.8-17 11.8-41.2v-14.6l4.5-.5c5.4-.7 10.2-3.7 13.6-8.7l2.4-3.6.3-173c.2-121 0-174.1-.8-176.7-2.1-7.2-10.2-13.7-17.1-13.8h-2.6l-.5-16.9c-.4-16.6-.5-17-3.6-23.4-5.9-12-16.9-19-29.6-19-13.6 0-24.8 7-30.4 19.1-2.5 5.4-2.7 6.7-3 22.9l-.4 17.3H623v-15.3c0-17.2-1.1-22.4-6.1-30.1-6.5-9.7-20.5-15.8-31.9-13.8-11.9 2.1-20.7 8.9-25.7 19.7-2.6 5.6-2.7 7-3.1 22.7l-.4 16.8H543v-16.5c0-14.1-.3-17.2-2-21.9-2.9-7.6-8.8-13.9-16.6-17.7-5.7-2.8-7.6-3.3-14.4-3.3-6.8 0-8.7.5-14.4 3.3-7.1 3.5-12.2 8.6-15.8 16-2.1 4.2-2.3 6.3-2.6 22.3l-.4 17.8h-12.6l-.4-16.8c-.6-19.7-1.7-23.7-8.8-31.5-8.6-9.5-20.5-13.2-32.1-10.2-10.5 2.6-18.2 9-22.8 18.5-2.4 5.1-2.6 6.6-2.9 22.7l-.4 17.3H384v-15.3c0-17.2-1.1-22.4-6.1-30.1-6.5-9.7-20.5-15.8-31.9-13.8-11.9 2.1-20.7 9-25.8 20.1-2.4 5.1-2.6 7-3 22.3l-.5 16.8H305v-12.3c0-21.3-2.8-30.7-11.3-38.4-7-6.2-20-10.4-27.2-8.7zm11.5 20.9c1.5.8 3.8 3 4.9 4.8 1.9 3.1 2.1 4.9 2.1 18.6V209h-28v-13.9c0-7.7.5-15.2 1.1-16.8 1.3-3.4 4.7-7.2 7.4-8.3 3.2-1.4 9.4-1.1 12.5.5zm81.6 1.6c4.6 4.2 5.4 7.6 5.4 22.9v14h-28v-15c0-16.9.8-19.6 6.3-23.1 4.5-2.8 12.7-2.2 16.3 1.2zm77.5-1.6c6 3.1 6.9 6.3 6.9 23.2V209h-28.2l.4-15.3c.2-12.7.6-15.8 2.1-18 4-6.1 12.4-8.4 18.8-5.2zm80.4.5c5.5 3.4 6.5 6.9 6.5 23.4V209h-28v-14.6c0-13 .2-15 2.1-18.3 1.1-2.1 3.3-4.5 4.7-5.4 3.7-2.3 10.7-2.2 14.7.3zm81.5 1.5c4.1 4 5 7.9 5 23.2V209h-28v-15c0-16.9.8-19.6 6.3-23.1 4.8-3 12.7-2.2 16.7 1.6zm77.1-2c6 3.1 6.9 6.3 6.9 23.2V209h-28v-13.9c0-7.7.5-15.2 1.1-16.8 1.3-3.4 4.7-7.2 7.4-8.3 3.3-1.4 9.4-1.1 12.6.5zm26.7 226.7l-.3 166.3-232.2.3-232.3.2V231h465l-.2 166.2zM285 602.3c0 14.8-.3 17.7-1.8 20.6-3.7 6.8-12.9 9.1-19.3 4.8-6.1-4-6.9-7.1-6.9-26V585h28v17.3zm79.5.7c0 19.5-.5 21.2-6.8 25-6.4 3.9-15.4 1.5-18.9-5.1-1.5-2.9-1.8-5.8-1.8-20.7v-17.3l13.8.3 13.7.3V603zm79.5-.3c0 15.7-.2 18.2-1.9 20.9-3.7 6.1-13.4 8.1-19.6 4-5-3.3-6-6.8-6.3-23.9-.2-8.7-.1-16.4.2-17.2.4-1.2 3.2-1.5 14.1-1.5H444v17.7zm80-.5c0 15.5-.2 17.6-2 20.6-4.3 7-12.8 9.2-19.1 4.9-6.1-4-6.9-7.1-6.9-26V585h28v17.2zm79.5.8c0 19.5-.5 21.2-6.8 25-6.1 3.8-14.9 1.7-18.7-4.5-1.8-2.9-2-4.9-2-20.9v-17.7l13.8.3 13.7.3V603zm79.5-.7c0 14.8-.3 17.7-1.8 20.6-3.7 6.8-12.9 9.1-19.3 4.8-6-4-6.9-7.1-6.9-25.3 0-8.8.3-16.4.7-16.7.3-.4 6.6-.7 14-.7H683v17.3z"/><path d="M413.7 359.8c-39.5 39.5-53.7 54.3-53.7 56 0 3.5 2.8 8.1 5.3 8.7 1.2.3 6.3.6 11.2.8l9 .2.5 32.3.5 32.4 2.4 1.9c2.2 1.8 5.1 1.9 82.1 1.9s79.9-.1 82.1-1.9l2.4-1.9.5-32.4.5-32.3 9-.2c11.8-.4 13.2-.8 15-4.3 2.8-5.4 2.1-6.6-11.5-20.5l-13-13.2v-22.4c-.1-16-.4-22.9-1.3-24-2.4-3.1-5.6-3.9-15.7-3.9-9.9 0-10.2.1-13.1 2.9-2.4 2.5-2.9 3.7-2.9 8 0 2.8-.3 5.1-.8 5.1-.4 0-11.3-10.6-24.2-23.5-21.8-21.8-23.7-23.5-27-23.5-3.3 0-6.6 3.1-57.3 53.8z"/></svg>
|
||||
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_2_408)">
|
||||
<path d="M372.68 238.9L267.32 133.52C261.1 127.3 250.92 127.3 244.7 133.52L139.32 238.9C133.1 245.12 128 257.42 128 266.22V362.22C128 371.02 135.2 378.22 144 378.22H206.94V218.92C206.94 215.38 209.8 212.52 213.34 212.52H298.68C302.22 212.52 305.08 215.38 305.08 218.92V244.52C305.08 248.06 302.22 250.92 298.68 250.92H245.34V263.72H298.68C302.22 263.72 305.08 266.58 305.08 270.12V295.72C305.08 299.26 302.22 302.12 298.68 302.12H245.34V314.92H298.68C302.22 314.92 305.08 317.78 305.08 321.32V346.92C305.08 350.46 302.22 353.32 298.68 353.32H238.94C235.4 353.32 232.54 350.46 232.54 346.92C232.54 343.38 235.4 340.52 238.94 340.52H292.28V327.72H238.94C235.4 327.72 232.54 324.86 232.54 321.32V295.72C232.54 292.18 235.4 289.32 238.94 289.32H292.28V276.52H238.94C235.4 276.52 232.54 273.66 232.54 270.12V244.52C232.54 240.98 235.4 238.12 238.94 238.12H292.28V225.32H219.74V378.22H368C376.8 378.22 384 371.02 384 362.22V266.22C384 257.42 378.9 245.12 372.68 238.9Z" fill="#F2F4F9"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_2_408">
|
||||
<rect width="256" height="256" fill="white" transform="translate(128 128.62)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 1.2 KiB |
@ -33,8 +33,8 @@
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#dfdfdf",
|
||||
"background_color": "#dfdfdf",
|
||||
"theme_color": "#18bcf2",
|
||||
"background_color": "#18bcf2",
|
||||
"start_url": "https://esphome.io/",
|
||||
"display": "standalone"
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
2024.5.4
|
||||
2024.5.5
|
@ -16,17 +16,18 @@
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/_static/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/_static/favicon-16x16.png">
|
||||
<link rel="manifest" href="/_static/site.webmanifest">
|
||||
<link rel="mask-icon" href="/_static/safari-pinned-tab.svg" color="#646464">
|
||||
<link rel="mask-icon" href="/_static/safari-pinned-tab.svg" color="#18bcf2">
|
||||
<link rel="me" href="https://fosstodon.org/@esphome">
|
||||
<meta name="apple-mobile-web-app-title" content="ESPHome">
|
||||
<meta name="application-name" content="ESPHome">
|
||||
<meta name="msapplication-TileColor" content="#dfdfdf">
|
||||
<meta name="msapplication-TileColor" content="#18bcf2">
|
||||
<meta name="msapplication-config" content="/_static/browserconfig.xml">
|
||||
<meta name="theme-color" content="#dfdfdf">
|
||||
<meta name="theme-color" content="#18bcf2">
|
||||
<meta name="HandheldFriendly" content="True">
|
||||
<meta name="MobileOptimized" content="320">
|
||||
<meta property="og:site_name" content="ESPHome">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
|
||||
<meta name="viewport"
|
||||
content="width=device-width, initial-scale=1, maximum-scale=3, interactive-widget=overlays-content">
|
||||
{% endblock %}
|
||||
|
||||
{% block relbar_top %}
|
||||
@ -39,7 +40,6 @@
|
||||
|
||||
{% endif %}
|
||||
</ul>
|
||||
<div class="search-results" id="search-results"></div>
|
||||
{% endblock %}
|
||||
|
||||
{% block footer %}
|
||||
|
@ -1,42 +1,150 @@
|
||||
<script src="/pagefind/pagefind-modular-ui.js"></script>
|
||||
<div class="pagefind-ui__form" id="search"></div>
|
||||
<div class="search-results" id="mobile-search-results"></div>
|
||||
<script>
|
||||
let callbackAdded = null;
|
||||
|
||||
|
||||
class El {
|
||||
constructor(tagname) {
|
||||
this.element = document.createElement(tagname);
|
||||
}
|
||||
|
||||
id(s) {
|
||||
this.element.id = s;
|
||||
return this;
|
||||
}
|
||||
|
||||
class(s) {
|
||||
this.element.classList.add(s);
|
||||
return this;
|
||||
}
|
||||
|
||||
attrs(obj) {
|
||||
for (const [k,v] of Object.entries(obj)) {
|
||||
this.element.setAttribute(k, v);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
text(t) {
|
||||
this.element.innerText = t;
|
||||
return this;
|
||||
}
|
||||
|
||||
html(t) {
|
||||
this.element.innerHTML = t;
|
||||
return this;
|
||||
}
|
||||
|
||||
handle(e, f) {
|
||||
this.element.addEventListener(e, f);
|
||||
return this;
|
||||
}
|
||||
|
||||
addTo(el) {
|
||||
if (el instanceof El) {
|
||||
el.element.appendChild(this.element);
|
||||
} else {
|
||||
el.appendChild(this.element);
|
||||
}
|
||||
return this.element;
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('DOMContentLoaded', (event) => {
|
||||
const std_target = document.getElementById("search-results");
|
||||
const mobile_target = document.getElementById("mobile-search-results");
|
||||
|
||||
const targetClass = "search-results";
|
||||
const docel = document.getElementsByClassName("document");
|
||||
if (docel.length === 0)
|
||||
return;
|
||||
const inpel = document.getElementById("search");
|
||||
if (!inpel)
|
||||
return;
|
||||
|
||||
var mobileWidth = getComputedStyle(document.body).getPropertyValue("--mobile-width-stop");
|
||||
|
||||
function isMobile() {
|
||||
return window.innerWidth <= mobileWidth;
|
||||
}
|
||||
|
||||
const target = document.createElement("div");
|
||||
target.classList.add(targetClass);
|
||||
target.id = targetClass;
|
||||
target.style.display = "none";
|
||||
docel.item(0).appendChild(target);
|
||||
|
||||
const margin = 20;
|
||||
|
||||
const resultTemplate = (result) => {
|
||||
let wrapper = new El("li").class("pagefind-modular-list-result");
|
||||
|
||||
let thumb = new El("div").class("pagefind-modular-list-thumb").addTo(wrapper);
|
||||
if (result?.meta?.image) {
|
||||
new El("img").class("pagefind-modular-list-image").attrs({
|
||||
src: result.meta.image,
|
||||
alt: result.meta.image_alt || result.meta.title
|
||||
}).addTo(thumb);
|
||||
}
|
||||
|
||||
let inner = new El("div").class("pagefind-modular-list-inner").addTo(wrapper);
|
||||
let title = new El("p").class("pagefind-modular-list-title").addTo(inner);
|
||||
new El("a").class("pagefind-modular-list-link").text(result.meta?.title).attrs({
|
||||
href: result.meta?.url || result.url
|
||||
}).addTo(title);
|
||||
|
||||
let excerpt = new El("p").class("pagefind-modular-list-excerpt").addTo(inner);
|
||||
new El("a").class("pagefind-modular-list-link").html(result.excerpt).attrs({
|
||||
href: result.meta?.url || result.url
|
||||
}).addTo(excerpt);
|
||||
|
||||
return wrapper.element;
|
||||
}
|
||||
|
||||
|
||||
function resizeTarget() {
|
||||
const searchPos = inpel.getBoundingClientRect();
|
||||
var leftPos;
|
||||
var topPos;
|
||||
var maxWidth = 650;
|
||||
target.style.width = "auto;"
|
||||
target.style.height = "fit-content";
|
||||
target.style.maxWidth = maxWidth + "px";
|
||||
let rightPos = margin;
|
||||
if (isMobile()) {
|
||||
// position search results left aligned with the search box, and below.
|
||||
leftPos = margin / 2;
|
||||
topPos = searchPos.bottom + margin / 2;
|
||||
rightPos = margin / 2;
|
||||
} else {
|
||||
// position search results top aligned with the search box, and to its right.
|
||||
leftPos = searchPos.right + margin * 2;
|
||||
topPos = searchPos.top;
|
||||
if (rightPos - leftPos > maxWidth)
|
||||
rightPos = leftPos + maxWidth;
|
||||
}
|
||||
target.style.right = rightPos + "px";
|
||||
target.style.top = topPos + "px";
|
||||
target.style.left = leftPos + "px";
|
||||
let twidth = window.innerWidth - margin - leftPos;
|
||||
if (twidth > maxWidth)
|
||||
twidth = maxWidth;
|
||||
target.style.width = twidth + "px";
|
||||
target.style.maxHeight = (window.innerHeight - margin - topPos) + "px";
|
||||
}
|
||||
|
||||
window.addEventListener("resize", (event) => { resizeTarget(); });
|
||||
|
||||
function showTarget() {
|
||||
var target = std_target;
|
||||
if (window.innerWidth <= 875) {
|
||||
target = mobile_target;
|
||||
std_target.style.display = "none";
|
||||
} else {
|
||||
mobile_target.style.display = "none";
|
||||
}
|
||||
target.style.display = "block";
|
||||
const rect = target.getBoundingClientRect();
|
||||
const height = window.innerHeight;
|
||||
target.style.width = "100%";
|
||||
target.style.height = "fit-content";
|
||||
target.style.maxHeight = (height - rect.top - 10) + "px";
|
||||
if (!callbackAdded) {
|
||||
callbackAdded = true;
|
||||
if (target.style.display !== "block") {
|
||||
target.style.display = "block";
|
||||
document.addEventListener('click', clickCallback);
|
||||
}
|
||||
resizeTarget();
|
||||
}
|
||||
|
||||
function hideTargets() {
|
||||
std_target.style.display = "none";
|
||||
mobile_target.style.display = "none";
|
||||
std_target.style.height = "0";
|
||||
mobile_target.style.height = "0";
|
||||
if (callbackAdded) {
|
||||
if (target.style.display !== "none") {
|
||||
target.style.display = "none";
|
||||
document.removeEventListener('click', clickCallback);
|
||||
callbackAdded = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -57,19 +165,17 @@
|
||||
}));
|
||||
|
||||
instance.add(new PagefindModularUI.ResultList({
|
||||
containerElement: "#search-results"
|
||||
}));
|
||||
instance.add(new PagefindModularUI.ResultList({
|
||||
containerElement: "#mobile-search-results"
|
||||
containerElement: "#search-results",
|
||||
resultTemplate: resultTemplate
|
||||
}));
|
||||
|
||||
const clickCallback = (event) => {
|
||||
const path = event.composedPath();
|
||||
if (path.includes(std_target) || path.includes(mobile_target) || path.includes(inpel))
|
||||
if (path.includes(target) || path.includes(inpel))
|
||||
return;
|
||||
hideTargets();
|
||||
};
|
||||
if (std_target && mobile_target) {
|
||||
if (target) {
|
||||
instance.on("results", (results) => {
|
||||
if (results.results.length) {
|
||||
showTarget();
|
||||
|
@ -78,6 +78,14 @@ Release 2024.5.4 - May 28
|
||||
- [helpers] Move Base64 string to cpp :esphomepr:`6819` by :ghuser:`gabest11`
|
||||
|
||||
|
||||
Release 2024.5.5 - June 5
|
||||
-------------------------
|
||||
|
||||
- [voice_assistant] Half the microphone ringbuffer size :esphomepr:`6830` by :ghuser:`jesserockz`
|
||||
- [i2s_speaker] Add buffer allocation failure checks :esphomepr:`6829` by :ghuser:`jesserockz`
|
||||
- [improv_serial] Fix for IDF 4.4.7 :esphomepr:`6855` by :ghuser:`kbx81`
|
||||
|
||||
|
||||
Full list of changes
|
||||
--------------------
|
||||
|
||||
|
@ -10,8 +10,7 @@ The ``bang_bang`` climate platform allows you to regulate a value with a
|
||||
|
||||
.. note::
|
||||
|
||||
A number of people have asked about the behavior of the bang-bang controller. In version 1.15, a
|
||||
:doc:`thermostat <thermostat>` component was added which behaves more like a common thermostat; it is
|
||||
The :doc:`thermostat <thermostat>` component behaves more like a common thermostat; it is
|
||||
essentially two bang-bang controllers in one. Please see the `Bang-bang vs. Thermostat`_ section below
|
||||
if you are not sure which is appropriate for your application.
|
||||
|
||||
|
@ -44,7 +44,7 @@ submit a feature request (see FAQ).
|
||||
+---------------------------------------+---------------------+----------------------+
|
||||
| :ref:`LG<climate_ir_lg>` | ``climate_ir_lg`` | yes |
|
||||
+---------------------------------------+---------------------+----------------------+
|
||||
| Midea | ``midea_ir`` | yes |
|
||||
| :ref:`Midea<midea_ir>` | ``midea_ir`` | yes |
|
||||
+---------------------------------------+---------------------+----------------------+
|
||||
| :ref:`Mitsubishi<mitsubishi>` | ``mitsubishi`` | yes |
|
||||
+---------------------------------------+---------------------+----------------------+
|
||||
@ -169,35 +169,6 @@ IR receiver.
|
||||
name: "Living Room AC"
|
||||
receiver_id: rcvr
|
||||
|
||||
.. _midea_ir:
|
||||
|
||||
``midea_ir`` Climate
|
||||
-------------------------
|
||||
|
||||
These air conditioners support two protocols: Midea and Coolix. Therefore, when using an IR receiver, it considers both protocols and publishes the received states.
|
||||
|
||||
Additional configuration is available for this platform
|
||||
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **use_fahrenheit** (*Optional*, boolean): Allows you to transfer the temperature to the air conditioner in degrees Fahrenheit. The air conditioner display also shows the temperature in Fahrenheit. Defaults to ``false``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
climate:
|
||||
- platform: midea_ir
|
||||
name: "AC"
|
||||
sensor: room_temperature
|
||||
use_fahrenheit: true
|
||||
|
||||
.. note::
|
||||
|
||||
- See :ref:`Transmit Midea<remote_transmitter-transmit_midea>` to send custom commands, including Follow Me mode.
|
||||
- See :ref:`Toshiba<toshiba>` below if you are looking for compatibility with Midea model MAP14HS1TBL or similar.
|
||||
|
||||
|
||||
.. _climate_ir_lg:
|
||||
|
||||
``climate_ir_lg`` Climate
|
||||
@ -272,6 +243,34 @@ Known working with:
|
||||
|
||||
- Delonghi PAC WE 120HP
|
||||
|
||||
.. _midea_ir:
|
||||
|
||||
``midea_ir`` Climate
|
||||
-------------------------
|
||||
|
||||
These air conditioners support two protocols: Midea and Coolix. Therefore, when using an IR receiver, it considers both protocols and publishes the received states.
|
||||
|
||||
Additional configuration is available for this platform
|
||||
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **use_fahrenheit** (*Optional*, boolean): Allows you to transfer the temperature to the air conditioner in degrees Fahrenheit. The air conditioner display also shows the temperature in Fahrenheit. Defaults to ``false``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
climate:
|
||||
- platform: midea_ir
|
||||
name: "AC"
|
||||
sensor: room_temperature
|
||||
use_fahrenheit: true
|
||||
|
||||
.. note::
|
||||
|
||||
- See :ref:`Transmit Midea<remote_transmitter-transmit_midea>` to send custom commands, including Follow Me mode.
|
||||
- See :ref:`Toshiba<toshiba>` below if you are looking for compatibility with Midea model MAP14HS1TBL or similar.
|
||||
|
||||
.. _mitsubishi:
|
||||
|
||||
``mitsubishi`` Climate
|
||||
|
@ -62,7 +62,6 @@ Configuration variables:
|
||||
of hiding one of them. Defaults to ``false``.
|
||||
- **has_position** (*Optional*, boolean): Whether this cover will publish its position as a floating point number.
|
||||
By default (``false``), the cover only publishes OPEN/CLOSED position.
|
||||
Parameter useless if you set the POSITION_ACTION (is set to TRUE).
|
||||
- **tilt_action** (*Optional*, :ref:`Action <config-action>`): The action that should
|
||||
be performed when the remote (like Home Assistant's frontend) requests the cover be set to a specific
|
||||
tilt position. The desired tilt is available in the lambda in the ``tilt`` variable.
|
||||
@ -71,6 +70,7 @@ Configuration variables:
|
||||
- **position_action** (*Optional*, :ref:`Action <config-action>`): The action that should
|
||||
be performed when the remote (like Home Assistant's frontend) requests the cover be set to a specific
|
||||
position. The desired position is available in the lambda in the ``pos`` variable.
|
||||
Useless if `has_position` is not set to ``true``.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- All other options from :ref:`Cover <config-cover>`.
|
||||
|
||||
|
@ -86,14 +86,17 @@ This can be handled at the **stop_action** by using the following lambda functio
|
||||
|
||||
stop_action:
|
||||
- lambda: !lambda |-
|
||||
if (id(cover).last_operation() == CoverOperation::COVER_OPERATION_OPENING) {
|
||||
if (id(cover).get_last_operation() == CoverOperation::COVER_OPERATION_OPENING) {
|
||||
// Cover is currently opening
|
||||
id(cover_button_down).press();
|
||||
} else if (id(cover).last_operation() == CoverOperation::COVER_OPERATION_CLOSING) {
|
||||
} else if (id(cover).get_last_operation() == CoverOperation::COVER_OPERATION_CLOSING) {
|
||||
// Cover is currently closing
|
||||
id(cover_button_up).press();
|
||||
}
|
||||
|
||||
Be aware that ``get_last_operation`` will only return the last opening or closing operation, but not the last idle operation.
|
||||
This issue is tracked `here <https://github.com/esphome/issues/issues/4252#issuecomment-2132727377>`_.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -103,12 +103,12 @@ The ``date`` provided can be in one of 3 formats:
|
||||
|
||||
# String date
|
||||
- datetime.date.set:
|
||||
id: my_date
|
||||
id: my_datetime_date
|
||||
date: "2023-12-04"
|
||||
|
||||
# Individual date parts
|
||||
- datetime.date.set:
|
||||
id: my_date
|
||||
id: my_datetime_date
|
||||
date:
|
||||
year: 2023
|
||||
month: 12
|
||||
@ -116,7 +116,7 @@ The ``date`` provided can be in one of 3 formats:
|
||||
|
||||
# Using a lambda
|
||||
- datetime.date.set:
|
||||
id: my_date
|
||||
id: my_datetime_date
|
||||
date: !lambda |-
|
||||
// Return an ESPTime struct
|
||||
return {.day_of_month: 4, .month: 12, .year: 2023};
|
||||
@ -142,7 +142,7 @@ advanced stuff (see the full API Reference for more info).
|
||||
.. code-block:: cpp
|
||||
|
||||
// Within lambda, set the date to 2024-02-25
|
||||
auto call = id(my_date).make_call();
|
||||
auto call = id(my_datetime_date).make_call();
|
||||
call.set_date("2024-02-25");
|
||||
call.perform();
|
||||
|
||||
@ -174,12 +174,12 @@ The ``time`` provided can be in one of 3 formats:
|
||||
|
||||
# String time
|
||||
- datetime.time.set:
|
||||
id: my_time
|
||||
id: my_datetime_time
|
||||
time: "12:34:56"
|
||||
|
||||
# Individual time parts
|
||||
- datetime.time.set:
|
||||
id: my_time
|
||||
id: my_datetime_time
|
||||
time:
|
||||
hour: 12
|
||||
minute: 34
|
||||
@ -187,7 +187,7 @@ The ``time`` provided can be in one of 3 formats:
|
||||
|
||||
# Using a lambda
|
||||
- datetime.time.set:
|
||||
id: my_time
|
||||
id: my_datetime_time
|
||||
time: !lambda |-
|
||||
// Return an ESPTime struct
|
||||
return {.second: 56, .minute: 34, .hour: 12};
|
||||
@ -212,7 +212,7 @@ advanced stuff (see the full API Reference for more info).
|
||||
.. code-block:: cpp
|
||||
|
||||
// Within lambda, set the time to 12:34:56
|
||||
auto call = id(my_time).make_call();
|
||||
auto call = id(my_datetime_time).make_call();
|
||||
call.set_time("12:34:56");
|
||||
call.perform();
|
||||
|
||||
@ -227,7 +227,7 @@ advanced stuff (see the full API Reference for more info).
|
||||
.. code-block:: cpp
|
||||
|
||||
// For example, create a custom log message when a value is received:
|
||||
ESP_LOGI("main", "Value of my datetime: %0d:%02d:%02d", id(my_time).hour, id(my_time).minute, id(my_time).second);
|
||||
ESP_LOGI("main", "Value of my datetime: %0d:%02d:%02d", id(my_datetime_time).hour, id(my_datetime_time).minute, id(my_datetime_time).second);
|
||||
|
||||
|
||||
DateTime Automation
|
||||
|
@ -13,7 +13,7 @@ using :ref:`lambdas <config-lambda>`.
|
||||
datetime:
|
||||
# Example Date
|
||||
- platform: template
|
||||
id: my_date
|
||||
id: my_datetime_date
|
||||
type: date
|
||||
name: Pick a Date
|
||||
optimistic: yes
|
||||
@ -22,7 +22,7 @@ using :ref:`lambdas <config-lambda>`.
|
||||
|
||||
# Example Time
|
||||
- platform: template
|
||||
id: my_time
|
||||
id: my_datetime_time
|
||||
type: time
|
||||
name: Pick a Time
|
||||
optimistic: yes
|
||||
|
@ -360,8 +360,7 @@ You can display current time using a time component. Please see the example :ref
|
||||
Screen Clipping
|
||||
---------------
|
||||
|
||||
Screen clipping is a new set of methods since version 2023.2.0 of esphome. It could be useful when you just want to show
|
||||
a part of an image or make sure that what you draw on the screen does not go outside a specific region on the screen.
|
||||
Screen clipping can be useful when you just want to show a part of an image or make sure that what you draw on the screen does not go outside a specific region on the screen.
|
||||
|
||||
With ``start_clipping(left, top, right, bottom);`` start you the clipping process and when you are done drawing in that region
|
||||
you can stop the clipping process with ``end_clipping();`` . You can nest as many ``start_clipping();`` as you want as long
|
||||
|
@ -174,8 +174,10 @@ Test Setting:
|
||||
Camera uses PWM timer #1. If you need PWM (via the ``ledc`` platform) you need to manually specify
|
||||
a channel there (with the ``channel: 2`` parameter)
|
||||
|
||||
Configuration for Ai-Thinker Camera
|
||||
-----------------------------------
|
||||
Configuration examples
|
||||
----------------------
|
||||
|
||||
**Ai-Thinker Camera**:
|
||||
|
||||
.. warning::
|
||||
|
||||
@ -203,8 +205,7 @@ Configuration for Ai-Thinker Camera
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for M5Stack Camera
|
||||
--------------------------------
|
||||
**M5Stack Camera**:
|
||||
|
||||
.. warning::
|
||||
|
||||
@ -235,8 +236,7 @@ Configuration for M5Stack Camera
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for M5Stack Timer Camera X/F
|
||||
------------------------------------------
|
||||
**M5Stack Timer Camera X/F**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -258,8 +258,7 @@ Configuration for M5Stack Timer Camera X/F
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Confguration for M5Stack M5CameraF New
|
||||
--------------------------------------
|
||||
**M5Stack M5CameraF New**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -277,8 +276,7 @@ Confguration for M5Stack M5CameraF New
|
||||
pixel_clock_pin: GPIO21
|
||||
reset_pin: GPIO15
|
||||
|
||||
Configuration for Wrover Kit Boards
|
||||
-----------------------------------
|
||||
**Wrover Kit Boards**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -299,8 +297,7 @@ Configuration for Wrover Kit Boards
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for TTGO T-Camera V05
|
||||
-----------------------------------
|
||||
**TTGO T-Camera V05**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -322,8 +319,7 @@ Configuration for TTGO T-Camera V05
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for TTGO T-Camera V162
|
||||
------------------------------------
|
||||
**TTGO T-Camera V162**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -346,8 +342,7 @@ Configuration for TTGO T-Camera V162
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for TTGO T-Camera V17
|
||||
-----------------------------------
|
||||
**TTGO T-Camera V17**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -371,8 +366,7 @@ Configuration for TTGO T-Camera V17
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for TTGO T-Journal
|
||||
--------------------------------
|
||||
**TTGO T-Journal**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -394,8 +388,7 @@ Configuration for TTGO T-Journal
|
||||
# ...
|
||||
|
||||
|
||||
Configuration for TTGO-Camera Plus
|
||||
----------------------------------
|
||||
**TTGO-Camera Plus**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -418,8 +411,7 @@ Configuration for TTGO-Camera Plus
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for TTGO-Camera Mini
|
||||
----------------------------------
|
||||
**TTGO-Camera Mini**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -440,8 +432,7 @@ Configuration for TTGO-Camera Mini
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for ESP-EYE
|
||||
----------------------------------
|
||||
**ESP-EYE**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -462,8 +453,7 @@ Configuration for ESP-EYE
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
Configuration for ESP32S3_EYE on `Freenove ESP32-S3-DevKitC-1 <https://github.com/Freenove/Freenove_ESP32_S3_WROOM_Board>`_
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
**ESP32S3_EYE** on `Freenove ESP32-S3-DevKitC-1 <https://github.com/Freenove/Freenove_ESP32_S3_WROOM_Board>`__:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -490,6 +480,26 @@ Configuration for ESP32S3_EYE on `Freenove ESP32-S3-DevKitC-1 <https://github.co
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
**Seeed Studio XIAO ESP32S3 Sense**:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp32_camera:
|
||||
external_clock:
|
||||
pin: GPIO10
|
||||
frequency: 20MHz
|
||||
i2c_pins:
|
||||
sda: GPIO40
|
||||
scl: GPIO39
|
||||
data_pins: [GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48]
|
||||
vsync_pin: GPIO38
|
||||
href_pin: GPIO47
|
||||
pixel_clock_pin: GPIO13
|
||||
|
||||
# Image settings
|
||||
name: My Camera
|
||||
# ...
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -233,7 +233,7 @@ Configuration examples
|
||||
|
||||
.. note::
|
||||
|
||||
Revision 5 and below of the wESP32 board use the LAN8720 Ethernet PHY. Revision 7 and newer of it use the RTL8201 Ethernet PHY. Support for RTL8201 is available from ESPHome version 2022.12 upwards.
|
||||
Revision 5 and below of the wESP32 board use the LAN8720 Ethernet PHY. Revision 7 and newer of it use the RTL8201 Ethernet PHY.
|
||||
|
||||
|
||||
**OpenHacks LAN8720**:
|
||||
|
@ -92,6 +92,7 @@ Event Automation
|
||||
************
|
||||
|
||||
This automation will be triggered when an event of the specified types is triggered.
|
||||
In :ref:`Lambdas <config-lambda>` you can get the event type from the trigger with ``event_type``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -100,7 +101,8 @@ This automation will be triggered when an event of the specified types is trigge
|
||||
# ...
|
||||
on_event:
|
||||
then:
|
||||
- logger.log: "Event Triggered"
|
||||
- lambda: |-
|
||||
ESP_LOGD("main", "Event %s triggered.", event_type.c_str());
|
||||
|
||||
Configuration variables: see :ref:`Automation <automation>`.
|
||||
|
||||
|
38
components/host.rst
Normal file
@ -0,0 +1,38 @@
|
||||
HOST Platform
|
||||
=============
|
||||
|
||||
.. seo::
|
||||
:description: Configuration for the host platform for ESPHome.
|
||||
:image: host.svg
|
||||
|
||||
The ``host`` platform allows ESPHome configurations to be compiled and run on a desktop computer. This is known
|
||||
to work on MacOS and Linux. On Windows `WSL <https://learn.microsoft.com/en-us/windows/wsl/install>`_ (Windows Subsystem for Linux) can be used to create a Linux environment that will run ESPHome.
|
||||
|
||||
The only configuration required is to optionally set a dummy MAC address that will be used to identify the
|
||||
configuration to Home Assistant (the native MAC address is not readily available.)
|
||||
|
||||
.. note::
|
||||
|
||||
HA will not automatically discover an ESPHome instance running on ``host`` using MDNS, and you will need
|
||||
to add it explicitly using the IP address of your host computer.
|
||||
|
||||
Many components, especially those interfacing to actual hardware, will not be available when using ``host``. Do not
|
||||
configure wifi - network will automatically be available using the host computer.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
host:
|
||||
mac_address: "98:35:69:ab:f6:79"
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **mac_address** (**Optional**, MAC address): A dummy MAC address to use when communicating with HA.
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`esphome`
|
||||
- :ghedit:`Edit`
|
@ -702,14 +702,14 @@ the strip and shifts them forward every ``add_led_interval``.
|
||||
- red: 100%
|
||||
green: 100%
|
||||
blue: 100%
|
||||
num_leds: 1
|
||||
num_leds: 5
|
||||
gradient: true
|
||||
- red: 0%
|
||||
green: 0%
|
||||
blue: 0%
|
||||
num_leds: 1
|
||||
add_led_interval: 100ms
|
||||
reverse: false
|
||||
gradient: false
|
||||
|
||||
Configuration variables:
|
||||
|
||||
|
@ -58,7 +58,7 @@ Microphone Triggers
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This trigger will fire when new data is received from the microphone.
|
||||
The data is available as a ``std::vector<uint8_t>`` in the variable ``x``.
|
||||
The data is available as a ``std::vector<int16_t>`` in the variable ``x``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
|
@ -31,6 +31,7 @@ required to be set up in your configuration for this sensor to work.
|
||||
tvoc:
|
||||
name: "ENS160 Total Volatile Organic Compounds"
|
||||
aqi:
|
||||
id: ens160_air_quality_index
|
||||
name: "ENS160 Air Quality Index"
|
||||
update_interval: 60s
|
||||
address: 0x53
|
||||
|
@ -72,12 +72,12 @@ Advanced:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **compensation** (*Optional*): The block containing sensors used for compensation.
|
||||
- **compensation** (*Optional*): The block containing sensors used for compensation. Both values must be supplied in order to be able to generate the absolute humidity to be reported to the sensor.
|
||||
|
||||
- **temperature_source** (*Optional*, :ref:`config-id`): Give an external temperature sensor ID
|
||||
here. This can improve the sensor's internal calculations.
|
||||
here. The data must be in Celsius. This can improve the sensor's internal calculations.
|
||||
|
||||
- **humidity_source** (*Optional*, :ref:`config-id`): Give an external humidity sensor ID
|
||||
- **humidity_source** (*Optional*, :ref:`config-id`): Give an external relative humidity sensor ID
|
||||
here. This can improve the sensor's internal calculations.
|
||||
|
||||
.. _sgp30-calibrating:
|
||||
|
@ -54,6 +54,24 @@ Configuration variables:
|
||||
but can also increase temperature readings and decrease humidity readings as a side effect.
|
||||
Defaults to ``false``.
|
||||
|
||||
I²C Configuration when using Higher I²C Frequencies
|
||||
---------------------------------------------------
|
||||
|
||||
When using the **IDF framework** and **I²C frequencies greater than 50-100kHz**, the I²C configuration needs to include a **timeout** option.
|
||||
On an ESP32, the Arduino framework has a default I²C timeout of 50ms whereas on IDF framework, the default timeout is 100us.
|
||||
At these higher I²C frequencies, the default I²C timeout on IDF framework causes a "Communication with SHT3xD failed" error on setup.
|
||||
A solution that has been tested on ESP32 at 800kHz, is to increase the I²C timeout to 10ms as per the following example.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example I²C configuration
|
||||
i2c:
|
||||
sda: 21
|
||||
scl: 22
|
||||
scan: true
|
||||
frequency: 800khz
|
||||
timeout: 10ms
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -11,7 +11,6 @@ Once configured, you can use any of the 8 pins for your projects. Up-to 256 shif
|
||||
to provide more pins, without using more GPIO pins on the controller. They are linked by connecting pin Q of the closer
|
||||
shift register to the pin QH of the next shift register.
|
||||
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
@ -28,12 +27,11 @@ Configuration variables:
|
||||
|
||||
- **id** (**Required**, :ref:`config-id`): The id to use for this SN74HC165 component.
|
||||
- **data_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Serial Output (QH) input.
|
||||
- **clock_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Clock (CLK) pin
|
||||
- **load_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Load input (SH/LD) pin
|
||||
- **clock_inhibit_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Clock Inhibit (CLK INH) pin
|
||||
- **clock_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Clock (CLK) pin.
|
||||
- **load_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Load input (SH/LD) pin.
|
||||
- **clock_inhibit_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): Pin connected to SN74HC165 Clock Inhibit (CLK INH) pin. The use of it is optional, as it can be directly connected to ground.
|
||||
- **sr_count** (*Optional*, int): Number of daisy-chained shift registers, up-to 256. Defaults to ``1``.
|
||||
|
||||
|
||||
Pin configuration variables:
|
||||
****************************
|
||||
|
||||
@ -62,7 +60,6 @@ Pin configuration variables:
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
||||
- :doc:`binary_sensor/gpio`
|
||||
- :apiref:`SN74HC165/SN74HC165.h`
|
||||
- :ghedit:`Edit`
|
||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 6.1 KiB |
@ -10,7 +10,6 @@ was compiled against as a text sensor.
|
||||
|
||||
.. figure:: images/version-ui.png
|
||||
:align: center
|
||||
:width: 80.0%
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -40,7 +39,7 @@ Disabling the compilation timestamp:
|
||||
|
||||
This will, for example, change the output of the sensor from:
|
||||
|
||||
``1.15.0-dev (Jun 8 2020, 18:53:16)`` to ``1.15.0-dev``
|
||||
``2024.6.0-dev May 30 2024, 09:07:35`` to just ``2024.6.0-dev``
|
||||
|
||||
|
||||
See Also
|
||||
|
@ -181,6 +181,15 @@ In the ``seconds:``, ``minutes:``, ... fields you can use the following operator
|
||||
then:
|
||||
- switch.toggle: my_switch
|
||||
|
||||
.. note::
|
||||
|
||||
``on_time`` does not re-schedule events for times that are skipped or duplicated due to local Daylight
|
||||
Saving Time or other local time-adjustments like leap seconds. In regions with Daylight Saving Time, this
|
||||
means that events located between 01:00 - 02:00 may trigger twice, and events scheduled between 02:00 - 03:00 may
|
||||
be skipped once a year. This differs from `cron <https://man7.org/linux/man-pages/man8/cron.8.html>`__ behavior
|
||||
despite allowing the use of similar `crontab` syntax. Similarly, triggers on days of the month that do not exist
|
||||
("every 31st of the month") will be skipped when those dates do not exist.
|
||||
|
||||
.. _time-on_time_sync:
|
||||
|
||||
``on_time_sync`` Trigger
|
||||
|
@ -64,7 +64,7 @@ Configuration variables:
|
||||
- **ota** (*Optional*, boolean): Turn on or off the OTA feature inside webserver. Strongly not suggested without enabled authentication settings. Defaults to ``true``. Cannot be used with the ``esp-idf`` framework.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **local** (*Optional*, boolean): Include supporting javascript locally allowing it to work without internet access. Defaults to ``false``.
|
||||
- **version** (*Optional*, string): ``1`` or ``2``. Version 1 displays as a table. Version 2 uses web components and has more functionality. Defaults to ``2``.
|
||||
- **version** (*Optional*, string): ``1``, ``2`` or ``3``. Version 1 displays as a table. Version 2 uses web components and has more functionality. Version 3 uses HA-Styling. Defaults to ``2``.
|
||||
|
||||
To conserve flash size, the CSS and JS files used on the root page to show a simple user
|
||||
interface are hosted by esphome.io. If you want to use your own service, use the
|
||||
|
@ -75,7 +75,7 @@ Configuration variables:
|
||||
Defaults to ``.local``.
|
||||
- **reboot_timeout** (*Optional*, :ref:`config-time`): The amount of time to wait before rebooting when no
|
||||
WiFi connection exists. Can be disabled by setting this to ``0s``, but note that the low level IP stack currently
|
||||
seems to have issues with WiFi where a full reboot is required to get the interface back working. Defaults to ``15min``.
|
||||
seems to have issues with WiFi where a full reboot is required to get the interface back working. Defaults to ``15min``. Does not apply when in access point mode.
|
||||
- **power_save_mode** (*Optional*, string): The power save mode for the WiFi interface.
|
||||
See :ref:`wifi-power_save_mode`
|
||||
|
||||
@ -193,7 +193,7 @@ power saving mode.
|
||||
Connecting to Multiple Networks
|
||||
-------------------------------
|
||||
|
||||
Starting with version 1.10.0, you can give ESPHome a number of WiFi networks to connect to.
|
||||
You can give ESPHome a number of WiFi networks to connect to.
|
||||
ESPHome will then attempt to connect to the one with the highest signal strength.
|
||||
|
||||
To enable this mode, remove the ``ssid`` and ``password`` options from your wifi configuration
|
||||
|
2
conf.py
@ -69,7 +69,7 @@ author = "ESPHome"
|
||||
# The short X.Y version.
|
||||
version = "2024.5"
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = "2024.5.4"
|
||||
release = "2024.5.5"
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -168,8 +168,8 @@ There are several ways of doing this. See below examples to see how you can spec
|
||||
Substitutions
|
||||
-------------
|
||||
|
||||
Starting with version 1.10.0, ESPHome has a powerful new way to reduce repetition in configuration files:
|
||||
Substitutions. With substitutions, you can have a single generic source file for all nodes of one kind and
|
||||
ESPHome has a powerful new way to reduce repetition in configuration files: Substitutions.
|
||||
With substitutions, you can have a single generic source file for all nodes of one kind and
|
||||
substitute expressions in.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
@ -39,8 +39,7 @@ For all projects
|
||||
- Network configuration must assume defaults (no static IPs or DNS configured)
|
||||
- It **must** compile successfully without any user changes after adopting it.
|
||||
- All configuration is contained within a single YAML file. Fully remote packages are permitted if using ``import_full_config: true``.
|
||||
|
||||
- Your product name cannot contain **ESPHome** except in the case of *ending with* **for ESPHome**
|
||||
- Your product name cannot contain "**ESPHome**" except in the case of *ending with* "**for ESPHome**"
|
||||
|
||||
When your project matches all requirements of the Made for ESPHome program,
|
||||
you can apply for permission to carry the logo by emailing esphome@nabucasa.com
|
||||
|
@ -449,7 +449,6 @@ Contributors
|
||||
- `Eenoo (@Eenoo) <https://github.com/Eenoo>`__
|
||||
- `Eli Fidler (@efidler) <https://github.com/efidler>`__
|
||||
- `egandro (@egandro) <https://github.com/egandro>`__
|
||||
- `Erwin Kooi (@egeltje) <https://github.com/egeltje>`__
|
||||
- `Maxime Michel (@Egglestron) <https://github.com/Egglestron>`__
|
||||
- `Eike (@ei-ke) <https://github.com/ei-ke>`__
|
||||
- `Elazar Leibovich (@elazarl) <https://github.com/elazarl>`__
|
||||
@ -1048,6 +1047,7 @@ Contributors
|
||||
- `Mike Lynch (@Prow7) <https://github.com/Prow7>`__
|
||||
- `Peter Sarossy (@psarossy) <https://github.com/psarossy>`__
|
||||
- `Peter Tatrai (@ptatrai) <https://github.com/ptatrai>`__
|
||||
- `Pieter Viljoen (@ptr727) <https://github.com/ptr727>`__
|
||||
- `Leandro Puerari (@puerari) <https://github.com/puerari>`__
|
||||
- `puuu (@puuu) <https://github.com/puuu>`__
|
||||
- `Pascal Vizeli (@pvizeli) <https://github.com/pvizeli>`__
|
||||
@ -1374,4 +1374,4 @@ Contributors
|
||||
- `Christian Zufferey (@zuzu59) <https://github.com/zuzu59>`__
|
||||
- `Zynth-dev (@Zynth-dev) <https://github.com/Zynth-dev>`__
|
||||
|
||||
*This page was last updated May 28, 2024.*
|
||||
*This page was last updated June 5, 2024.*
|
||||
|
19
images/host.svg
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg height="300px" width="300px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
viewBox="0 0 34.418 34.418" xml:space="preserve">
|
||||
<g>
|
||||
<path style="fill:#010002;" d="M32.335,11.606h-6.533v-1.009h6.533V11.606z M32.335,12.264h-6.533v1.011h6.533V12.264z
|
||||
M32.331,7.687h-6.523V9.91h6.523V7.687z M34.418,5.297v23.827c-0.001,0.357-0.292,0.648-0.65,0.648h-9.397
|
||||
c-0.359,0-0.649-0.291-0.649-0.649V5.297c0-0.358,0.29-0.65,0.649-0.65h9.397C34.127,4.647,34.418,4.939,34.418,5.297z
|
||||
M33.119,5.944h-8.1v22.53h8.1V5.944z M32.335,13.932h-6.533v1.008h6.533V13.932z M31.272,21.45c0,1.162-0.939,2.099-2.097,2.099
|
||||
c-1.16,0-2.099-0.938-2.099-2.099c0-1.158,0.94-2.098,2.099-2.098C30.333,19.352,31.272,20.293,31.272,21.45z M30.515,21.45
|
||||
c0-0.739-0.6-1.341-1.341-1.341c-0.742,0-1.342,0.601-1.342,1.341s0.6,1.34,1.342,1.34C29.915,22.79,30.515,22.19,30.515,21.45z
|
||||
M21.937,9.218v13.505c0,0.814-0.655,1.473-1.461,1.473H13.18c0,0-0.414,2.948,2.212,2.948v1.475H13.18H8.758H6.546v-1.473
|
||||
c2.529,0,2.212-2.948,2.212-2.948H1.465C0.656,24.198,0,23.539,0,22.725V9.218c0-0.814,0.656-1.47,1.465-1.47h19.01
|
||||
C21.282,7.748,21.937,8.404,21.937,9.218z M12.332,22.394c0-0.698-0.566-1.263-1.264-1.263c-0.699,0-1.266,0.565-1.266,1.263
|
||||
s0.566,1.265,1.266,1.265C11.767,23.659,12.332,23.092,12.332,22.394z M20.371,9.311H1.568v11.387H20.37h0.001
|
||||
C20.371,20.698,20.371,9.311,20.371,9.311z M11.081,21.603c-0.434,0-0.785,0.352-0.785,0.785s0.352,0.785,0.785,0.785
|
||||
s0.785-0.352,0.785-0.785S11.515,21.603,11.081,21.603z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 3.6 KiB |
@ -131,6 +131,7 @@ Supported Microcontrollers
|
||||
RP2040, components/rp2040, rp2040.svg
|
||||
BK72xx, components/libretiny, bk72xx.svg
|
||||
RTL87xx, components/libretiny, rtl87xx.svg
|
||||
host, components/host, host.svg, dark-invert
|
||||
|
||||
Microcontroller Peripherals
|
||||
---------------------------
|
||||
|
2
lint.py
@ -251,7 +251,7 @@ def lint_ext_check(fname: str, stat: os.stat_result):
|
||||
)
|
||||
|
||||
|
||||
@lint_file_check(exclude=["script/*", "lint.py"])
|
||||
@lint_file_check(exclude=["script/*", ".devcontainer/*", "lint.py"])
|
||||
def lint_executable_bit(fname: str, stat: os.stat_result):
|
||||
ex = EXECUTABLE_BIT[fname]
|
||||
if ex != 100644:
|
||||
|
@ -1,4 +1,5 @@
|
||||
site: _build/html
|
||||
output_path: _pagefind/pagefind
|
||||
exclude_selectors:
|
||||
- "a.headerlink"
|
||||
- ".toctree-wrapper"
|
||||
|
@ -5,7 +5,7 @@ Web Server API
|
||||
:description: Information on Web Server APIs, including Event Source APIs and REST APIs.
|
||||
:image: logo-text.svg
|
||||
|
||||
Since version 1.3, ESPHome includes a built-in web server that can be used to view states
|
||||
ESPHome includes a built-in web server that can be used to view states
|
||||
and send commands. In addition to the web-frontend available under the root index of the
|
||||
web server, there's also two other features the web server currently offers: A real time event
|
||||
source and REST API.
|
||||
|