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 = 2022.1.4
|
||||
PROJECT_NUMBER = 2022.2.0
|
||||
|
||||
# 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
|
||||
|
2
Makefile
@ -1,5 +1,5 @@
|
||||
ESPHOME_PATH = ../esphome
|
||||
ESPHOME_REF = 2022.1.4
|
||||
ESPHOME_REF = 2022.2.0
|
||||
|
||||
.PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify
|
||||
|
||||
|
BIN
_static/changelog-2022.2.0.png
Normal file
After Width: | Height: | Size: 120 KiB |
@ -1 +1 @@
|
||||
2022.1.4
|
||||
2022.2.0
|
@ -2,25 +2,40 @@ const source = new EventSource("/events");
|
||||
|
||||
source.addEventListener('log', function (e) {
|
||||
const log = document.getElementById("log");
|
||||
let log_prefs = [
|
||||
["\u001b[1;31m", 'e'],
|
||||
["\u001b[0;33m", 'w'],
|
||||
["\u001b[0;32m", 'i'],
|
||||
["\u001b[0;35m", 'c'],
|
||||
["\u001b[0;36m", 'd'],
|
||||
["\u001b[0;37m", 'v'],
|
||||
];
|
||||
|
||||
let klass = '';
|
||||
if (e.data.startsWith("[1;31m")) {
|
||||
klass = 'e';
|
||||
} else if (e.data.startsWith("[0;33m")) {
|
||||
klass = 'w';
|
||||
} else if (e.data.startsWith("[0;32m")) {
|
||||
klass = 'i';
|
||||
} else if (e.data.startsWith("[0;35m")) {
|
||||
klass = 'c';
|
||||
} else if (e.data.startsWith("[0;36m")) {
|
||||
klass = 'd';
|
||||
} else if (e.data.startsWith("[0;37m")) {
|
||||
klass = 'v';
|
||||
} else {
|
||||
for (const log_pref of log_prefs){
|
||||
if (e.data.startsWith(log_pref[0])) {
|
||||
klass = log_pref[1];
|
||||
}
|
||||
}
|
||||
if (klass == ''){
|
||||
log.innerHTML += e.data + '\n';
|
||||
}
|
||||
log.innerHTML += '<span class="' + klass + '">' + e.data.substr(7, e.data.length - 10) + "</span>\n";
|
||||
log.innerHTML += '<span class="' + klass + '">' + e.data.substr(7, e.data.length - 11) + "</span>\n";
|
||||
});
|
||||
|
||||
actions = [
|
||||
["switch", ["toggle"]],
|
||||
["light", ["toggle"]],
|
||||
["fan", ["toggle"]],
|
||||
["cover", ["open", "close"]],
|
||||
["button", ["press"]],
|
||||
["lock", ["lock", "unlock", "open"]],
|
||||
];
|
||||
multi_actions = [
|
||||
["select", "option"],
|
||||
["number", "value"],
|
||||
];
|
||||
|
||||
source.addEventListener('state', function (e) {
|
||||
const data = JSON.parse(e.data);
|
||||
document.getElementById(data.id).children[1].innerText = data.state;
|
||||
@ -32,73 +47,27 @@ for (; row = states.rows[i]; i++) {
|
||||
if (!row.children[2].children.length) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (row.classList.contains("switch")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/switch/' + id.substr(7) + '/toggle', true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("fan")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/fan/' + id.substr(4) + '/toggle', true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("light")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/light/' + id.substr(6) + '/toggle', true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("cover")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/cover/' + id.substr(6) + '/open', true);
|
||||
xhr.send();
|
||||
});
|
||||
row.children[2].children[1].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/cover/' + id.substr(6) + '/close', true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("select")) {
|
||||
(function(id) {
|
||||
|
||||
for (const domain of actions){
|
||||
if (row.classList.contains(domain[0])) {
|
||||
let id = row.id.substr(domain[0].length+1);
|
||||
for (let j=0;j<row.children[2].children.length && j < domain[1].length; j++){
|
||||
row.children[2].children[j].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/'+domain[0]+'/' + id + '/' + domain[1][j], true);
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const domain of multi_actions){
|
||||
if (row.classList.contains(domain[0])) {
|
||||
let id = row.id.substr(domain[0].length+1);
|
||||
row.children[2].children[0].addEventListener('change', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/select/' + id.substr(7) + '/set?option=' + encodeURIComponent(this.value), true);
|
||||
xhr.open("POST", '/'+domain[0]+'/' + id + '/set?'+domain[1]+'=' + encodeURIComponent(this.value), true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("number")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('change', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/number/' + id.substr(7) + '/set?value=' + encodeURIComponent(this.value), true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
if (row.classList.contains("button")) {
|
||||
(function(id) {
|
||||
row.children[2].children[0].addEventListener('click', function () {
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", '/button/' + id.substr(7) + '/press', true);
|
||||
xhr.send();
|
||||
});
|
||||
})(row.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
2
_static/webserver-v1.min.js
vendored
@ -1 +1 @@
|
||||
const source=new EventSource("/events");source.addEventListener("log",(function(t){const n=document.getElementById("log");let e="";t.data.startsWith("[1;31m")?e="e":t.data.startsWith("[0;33m")?e="w":t.data.startsWith("[0;32m")?e="i":t.data.startsWith("[0;35m")?e="c":t.data.startsWith("[0;36m")?e="d":t.data.startsWith("[0;37m")?e="v":n.innerHTML+=t.data+"\n",n.innerHTML+='<span class="'+e+'">'+t.data.substr(7,t.data.length-10)+"</span>\n"})),source.addEventListener("state",(function(t){const n=JSON.parse(t.data);document.getElementById(n.id).children[1].innerText=n.state}));const states=document.getElementById("states");let row,i=0;for(;row=states.rows[i];i++)row.children[2].children.length&&(row.classList.contains("switch")&&function(t){row.children[2].children[0].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/switch/"+t.substr(7)+"/toggle",!0),n.send()}))}(row.id),row.classList.contains("fan")&&function(t){row.children[2].children[0].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/fan/"+t.substr(4)+"/toggle",!0),n.send()}))}(row.id),row.classList.contains("light")&&function(t){row.children[2].children[0].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/light/"+t.substr(6)+"/toggle",!0),n.send()}))}(row.id),row.classList.contains("cover")&&function(t){row.children[2].children[0].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/cover/"+t.substr(6)+"/open",!0),n.send()})),row.children[2].children[1].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/cover/"+t.substr(6)+"/close",!0),n.send()}))}(row.id),row.classList.contains("select")&&function(t){row.children[2].children[0].addEventListener("change",(function(){const n=new XMLHttpRequest;n.open("POST","/select/"+t.substr(7)+"/set?option="+encodeURIComponent(this.value),!0),n.send()}))}(row.id),row.classList.contains("number")&&function(t){row.children[2].children[0].addEventListener("change",(function(){const n=new XMLHttpRequest;n.open("POST","/number/"+t.substr(7)+"/set?value="+encodeURIComponent(this.value),!0),n.send()}))}(row.id),row.classList.contains("button")&&function(t){row.children[2].children[0].addEventListener("click",(function(){const n=new XMLHttpRequest;n.open("POST","/button/"+t.substr(7)+"/press",!0),n.send()}))}(row.id));
|
||||
const source=new EventSource("/events");source.addEventListener("log",function(t){const e=document.getElementById("log");let n=[["[1;31m","e"],["[0;33m","w"],["[0;32m","i"],["[0;35m","c"],["[0;36m","d"],["[0;37m","v"]],o="";for(const e of n)t.data.startsWith(e[0])&&(o=e[1]);""==o&&(e.innerHTML+=t.data+"\n"),e.innerHTML+='<span class="'+o+'">'+t.data.substr(7,t.data.length-11)+"</span>\n"}),actions=[["switch",["toggle"]],["light",["toggle"]],["fan",["toggle"]],["cover",["open","close"]],["button",["press"]],["lock",["lock","unlock","open"]]],multi_actions=[["select","option"],["number","value"]],source.addEventListener("state",function(t){const e=JSON.parse(t.data);document.getElementById(e.id).children[1].innerText=e.state});const states=document.getElementById("states");let row,i=0;for(;row=states.rows[i];i++)if(row.children[2].children.length){for(const t of actions)if(row.classList.contains(t[0])){let e=row.id.substr(t[0].length+1);for(let n=0;n<row.children[2].children.length&&n<t[1].length;n++)row.children[2].children[n].addEventListener("click",function(){const o=new XMLHttpRequest;o.open("POST","/"+t[0]+"/"+e+"/"+t[1][n],!0),o.send()})}for(const t of multi_actions)if(row.classList.contains(t[0])){let e=row.id.substr(t[0].length+1);row.children[2].children[0].addEventListener("change",function(){const n=new XMLHttpRequest;n.open("POST","/"+t[0]+"/"+e+"/set?"+t[1]+"="+encodeURIComponent(this.value),!0),n.send()})}}
|
279
changelog/2022.2.0.rst
Normal file
@ -0,0 +1,279 @@
|
||||
ESPHome 2022.2.0 - 16th February 2022
|
||||
=====================================
|
||||
|
||||
.. seo::
|
||||
:description: Changelog for ESPHome 2022.2.0.
|
||||
:image: /_static/changelog-2022.2.0.png
|
||||
:author: Jesse Hills
|
||||
:author_twitter: @jesserockz
|
||||
|
||||
.. imgtable::
|
||||
:columns: 4
|
||||
|
||||
Lock Core, components/lock/index, folder-open.svg
|
||||
Generic Output Lock, components/lock/output, upload.svg
|
||||
Template Lock, components/lock/template, description.svg
|
||||
QR Code, components/display/index, qr-code.svg
|
||||
|
||||
Touchscreen Core, components/touchscreen/index, folder-open.svg
|
||||
EKTF2232, components/touchscreen/ektf2232, ektf2232.svg
|
||||
Lilygo T5 4.7", components/touchscreen/lilygo_t5_47, lilygo_t5_47_touch.png
|
||||
MLX90393, components/sensor/mlx90393, mlx90393.jpg
|
||||
|
||||
Wake-on-LAN Button, components/button/wake_on_lan, power_settings.svg
|
||||
Generic Output Button, components/button/output, upload.svg
|
||||
Xiaomi MHOC303, components/sensor/xiaomi_ble, xiaomi_mijia_logo.jpg
|
||||
RadonEye BLE, components/sensor/radon_eye_ble, radon_eye_logo.png
|
||||
|
||||
Modbus Select, components/select/modbus_controller, modbus.png
|
||||
MAX9611, components/sensor/max9611, max9611.jpg
|
||||
Inkplate 6 Plus, components/display/inkplate6, inkplate6.jpg
|
||||
|
||||
|
||||
Home Assistant Addon Repo
|
||||
-------------------------
|
||||
|
||||
In a future Supervisor version, the `ESPHome Home Assistant addon repository <https://github.com/esphome/home-assistant-addon>`__
|
||||
will be added by default to new Home Assistant installations.
|
||||
We have decided that we will deprecate the ESPHome addon inside the
|
||||
`Community Addons <https://github.com/hassio-addons/repository>`__
|
||||
and everyone should move to the ESPHome repo. It is safe to delete the
|
||||
ESPHome addon as your configuration YAML files are stored in the Home
|
||||
Assistant configuration folder.
|
||||
|
||||
You can add the repository here:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<a href="https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Fesphome%2Fhome-assistant-addon"
|
||||
target="_blank">
|
||||
<img src="https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg"
|
||||
alt="Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled." />
|
||||
</a>
|
||||
|
||||
And then install the latest ESPHome addon here:
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<a href="https://my.home-assistant.io/redirect/supervisor_addon/?addon=5c53de3b_esphome" target="_blank">
|
||||
<img src="https://my.home-assistant.io/badges/supervisor_addon.svg"
|
||||
alt="Open your Home Assistant instance and show the dashboard of a Supervisor add-on." />
|
||||
</a>
|
||||
|
||||
|
||||
ESP8266 recommended framework bump
|
||||
----------------------------------
|
||||
|
||||
The recommended (and therefore default) version of Arduino for ESP8266 devices
|
||||
has been bumped to 3.0.2 from 2.7.4. This brings many underlying changes to the
|
||||
ESP8266 SDK. The 3.0.2 release has been out since July 2021 but ESPHome just
|
||||
did not bump the default until now.
|
||||
|
||||
|
||||
FastLED
|
||||
-------
|
||||
|
||||
Due to the Arduino bump, the FastLED library suffers issues when running on ESP8266
|
||||
on Arduino 3+. Because of this there is now a restriction on the ``fastled_clockless``
|
||||
and ``fastled_spi`` components to only allow using them if you change the arduino version
|
||||
back to 2.7.4 or lower. This will be in place until the library can update and fix the
|
||||
issues. See the :doc:`documentation </components/light/fastled>` for information on how
|
||||
to continue using the lights.
|
||||
|
||||
|
||||
Improv serial Wi-Fi scan
|
||||
------------------------
|
||||
|
||||
Improv serial has been updated to be able to start a Wi-Fi scan and send the results
|
||||
back to the improv client so the user can select the network SSID instead of having to type it in.
|
||||
|
||||
|
||||
Tuya Multi multi-datapoint
|
||||
--------------------------
|
||||
|
||||
Some work was done on the tuya component to support devices that send all of their
|
||||
datapoints in a single message. This allows for more devices to be supported and should
|
||||
not cause issues with existing devices but please create an issue if it does.
|
||||
|
||||
|
||||
Debug Sensors Breaking change
|
||||
-----------------------------
|
||||
|
||||
The sub-sensors of the ``debug`` have been moved to their respective component platforms.
|
||||
Please see the :doc:`documentation </components/debug>` page for the new way to configure them.
|
||||
|
||||
|
||||
Full list of changes
|
||||
--------------------
|
||||
|
||||
New Features
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Add initial_run to regular lambda light effect :esphomepr:`3059` by :ghuser:`jesserockz` (new-feature)
|
||||
- Support simple transparent pngs for display :esphomepr:`3035` by :ghuser:`jesserockz` (new-feature)
|
||||
- Add restore_mode to fan component :esphomepr:`3051` by :ghuser:`joshuaspence` (new-feature)
|
||||
- slow_pwm: allow to restart a cycle on state change :esphomepr:`3004` by :ghuser:`Chupaka` (new-feature)
|
||||
- Command retain option for MQTT component :esphomepr:`3078` by :ghuser:`VitaliyKurokhtin` (new-feature)
|
||||
- Esp32cam full control :esphomepr:`3090` by :ghuser:`dav-id-org` (new-feature)
|
||||
- Configurable HTTP redirect following :esphomepr:`3100` by :ghuser:`guillempages` (new-feature)
|
||||
- Add IPv6 for esp-idf framework :esphomepr:`2953` by :ghuser:`HeMan` (new-feature)
|
||||
- Improv_serial scan and send wifi networks list :esphomepr:`3116` by :ghuser:`jesserockz` (new-feature)
|
||||
- Inkplate 6 PLUS :esphomepr:`3013` by :ghuser:`jesserockz` (new-feature)
|
||||
|
||||
New Components
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
- Add ektf2232 touchscreen support :esphomepr:`3027` by :ghuser:`jesserockz` (new-integration)
|
||||
- Wake-on-LAN button :esphomepr:`3030` by :ghuser:`willwill2will54` (new-integration)
|
||||
- Implement output button :esphomepr:`3109` by :ghuser:`oxan` (new-integration)
|
||||
- Create base touchscreen component and refactor ektf2232 :esphomepr:`3083` by :ghuser:`jesserockz` (new-integration)
|
||||
- Add qr code support for displays :esphomepr:`2952` by :ghuser:`wjtje` (new-integration)
|
||||
- Add Xiaomi MHOC303 sensor e-ink clock :esphomepr:`3115` by :ghuser:`drug123` (new-integration)
|
||||
- Add new Lock core component :esphomepr:`2958` by :ghuser:`kbickar` (new-integration)
|
||||
- Added RadonEye RD200 Component :esphomepr:`3119` by :ghuser:`jeffeb3` (new-integration)
|
||||
- MLX90393 three-axis magnetometer :esphomepr:`2770` by :ghuser:`functionpointer` (new-integration)
|
||||
- Add Lilygo t5 4.7 Touchscreen :esphomepr:`3084` by :ghuser:`jesserockz` (new-integration)
|
||||
- Add Select for modbus :esphomepr:`3032` by :ghuser:`stegm` (new-integration)
|
||||
- Add max9611 High Side Current Shunt ADC :esphomepr:`2705` by :ghuser:`mckaymatthew` (new-integration)
|
||||
|
||||
Breaking Changes
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
- [TCS34725] remove duplicated endian conversion :esphomepr:`3037` by :ghuser:`martgras` (breaking-change)
|
||||
- TSL2591 automatic gain control :esphomepr:`3071` by :ghuser:`Azimath` (breaking-change)
|
||||
- [debug] Refactor debug sensors to use the normal sensor model. :esphomepr:`3162` by :ghuser:`mknjc` (breaking-change)
|
||||
- Allow framework version validator to be maximum version :esphomepr:`3197` by :ghuser:`jesserockz` (breaking-change)
|
||||
|
||||
Notable Changes
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
- ESP8266 Set recommended framework to 3.0.2 :esphomepr:`2606` by :ghuser:`OttoWinter` (notable-change)
|
||||
- Handle Tuya multi-datapoint messages :esphomepr:`3159` by :ghuser:`ssieb` (notable-change)
|
||||
|
||||
Beta Changes
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Enable mDNS during OTA safe mode :esphomepr:`3146` by :ghuser:`OttoWinter`
|
||||
- Try fix canbus config validation :esphomepr:`3173` by :ghuser:`jesserockz`
|
||||
- Bump aioesphomeapi from 10.8.1 to 10.8.2 :esphomepr:`3182` by :ghuser:`dependabot[bot]`
|
||||
- Clamp rotary_encoder restored value to min and max :esphomepr:`3184` by :ghuser:`jesserockz`
|
||||
- Make generating combined binary output verbose :esphomepr:`3127` by :ghuser:`OttoWinter`
|
||||
- Allow framework version validator to be maximum version :esphomepr:`3197` by :ghuser:`jesserockz` (breaking-change)
|
||||
- Fix strlcpy() uses to make long SSIDs and passwords work :esphomepr:`3199` by :ghuser:`mmakaay`
|
||||
- Update HA addon token :esphomepr:`3200` by :ghuser:`jesserockz`
|
||||
|
||||
All changes
|
||||
^^^^^^^^^^^
|
||||
|
||||
- Bump pytest-asyncio from 0.16.0 to 0.17.0 :esphomepr:`3047` by :ghuser:`dependabot[bot]`
|
||||
- Fix argument order in gitpod config file :esphomepr:`3058` by :ghuser:`oxan`
|
||||
- Bump pytest-asyncio from 0.17.0 to 0.17.2 :esphomepr:`3064` by :ghuser:`dependabot[bot]`
|
||||
- Fix calibration parameter for bme680 humidity calculation :esphomepr:`3069` by :ghuser:`cwitting`
|
||||
- Bump improv library version :esphomepr:`3072` by :ghuser:`jesserockz`
|
||||
- API: Expect a name for connections :esphomepr:`2533` by :ghuser:`OttoWinter`
|
||||
- AM43: autoload "sensor" to avoid compile errors :esphomepr:`3077` by :ghuser:`buxtronix`
|
||||
- Add initial_run to regular lambda light effect :esphomepr:`3059` by :ghuser:`jesserockz` (new-feature)
|
||||
- Support simple transparent pngs for display :esphomepr:`3035` by :ghuser:`jesserockz` (new-feature)
|
||||
- Bump aioesphomeapi from 10.6.0 to 10.8.0 :esphomepr:`3081` by :ghuser:`dependabot[bot]`
|
||||
- Add ektf2232 touchscreen support :esphomepr:`3027` by :ghuser:`jesserockz` (new-integration)
|
||||
- Implement IPv6 sockets for lwIP :esphomepr:`3015` by :ghuser:`HeMan`
|
||||
- Allow multiple configs for cd74hc4067 :esphomepr:`3085` by :ghuser:`jesserockz`
|
||||
- Wake-on-LAN button :esphomepr:`3030` by :ghuser:`willwill2will54` (new-integration)
|
||||
- Add restore_mode to fan component :esphomepr:`3051` by :ghuser:`joshuaspence` (new-feature)
|
||||
- slow_pwm: allow to restart a cycle on state change :esphomepr:`3004` by :ghuser:`Chupaka` (new-feature)
|
||||
- Enable readability-const-return-type check :esphomepr:`3099` by :ghuser:`oxan`
|
||||
- Enable readability-qualified-auto check :esphomepr:`3095` by :ghuser:`oxan`
|
||||
- Enable readability-redundant-member-init check :esphomepr:`3097` by :ghuser:`oxan`
|
||||
- Enable readability-named-parameter check :esphomepr:`3098` by :ghuser:`oxan`
|
||||
- Enable readability-redundant-access-specifiers check :esphomepr:`3096` by :ghuser:`oxan`
|
||||
- Command retain option for MQTT component :esphomepr:`3078` by :ghuser:`VitaliyKurokhtin` (new-feature)
|
||||
- Refactor fan platform to resemble climate/cover platforms :esphomepr:`2848` by :ghuser:`oxan`
|
||||
- Rename WEBSERVER_PORT define to USE_WEBSERVER_PORT :esphomepr:`3102` by :ghuser:`oxan`
|
||||
- Fix path to extra_scripts in platformio.ini :esphomepr:`3093` by :ghuser:`oxan`
|
||||
- Generate ARDUINO_VERSION_CODE in Python code :esphomepr:`3101` by :ghuser:`oxan`
|
||||
- Add cv.require_esphome_version helper :esphomepr:`3103` by :ghuser:`oxan`
|
||||
- Bump aioesphomeapi from 10.8.0 to 10.8.1 :esphomepr:`3110` by :ghuser:`dependabot[bot]`
|
||||
- Remove unused polling_component_schema from modbus number :esphomepr:`3108` by :ghuser:`martgras`
|
||||
- Force braces around multi-line statements :esphomepr:`3094` by :ghuser:`oxan`
|
||||
- Make CallbackManager invocable :esphomepr:`3089` by :ghuser:`oxan`
|
||||
- Implement output button :esphomepr:`3109` by :ghuser:`oxan` (new-integration)
|
||||
- Add increment_day function to ESPTime :esphomepr:`2955` by :ghuser:`RebbePod`
|
||||
- [TCS34725] remove duplicated endian conversion :esphomepr:`3037` by :ghuser:`martgras` (breaking-change)
|
||||
- Perform merges when substituting dict keys :esphomepr:`3062` by :ghuser:`joshuaspence`
|
||||
- Esp32cam full control :esphomepr:`3090` by :ghuser:`dav-id-org` (new-feature)
|
||||
- Fix config merging with null :esphomepr:`3113` by :ghuser:`joshuaspence`
|
||||
- Configurable HTTP redirect following :esphomepr:`3100` by :ghuser:`guillempages` (new-feature)
|
||||
- Add IPv6 for esp-idf framework :esphomepr:`2953` by :ghuser:`HeMan` (new-feature)
|
||||
- Add support for additional colors on GROW R503 :esphomepr:`3087` by :ghuser:`Zebble`
|
||||
- Add Heap Sensors - free/max block/fragmentation :esphomepr:`1578` by :ghuser:`micronen`
|
||||
- Create base touchscreen component and refactor ektf2232 :esphomepr:`3083` by :ghuser:`jesserockz` (new-integration)
|
||||
- Add qr code support for displays :esphomepr:`2952` by :ghuser:`wjtje` (new-integration)
|
||||
- ESP8266 Set recommended framework to 3.0.2 :esphomepr:`2606` by :ghuser:`OttoWinter` (notable-change)
|
||||
- TSL2591 automatic gain control :esphomepr:`3071` by :ghuser:`Azimath` (breaking-change)
|
||||
- set adc width to 13 bits for esp32-s2 :esphomepr:`3117` by :ghuser:`martgras`
|
||||
- Fix lint for TSL2591 :esphomepr:`3118` by :ghuser:`OttoWinter`
|
||||
- Add Xiaomi MHOC303 sensor e-ink clock :esphomepr:`3115` by :ghuser:`drug123` (new-integration)
|
||||
- Logically group and document helper functions :esphomepr:`3112` by :ghuser:`oxan`
|
||||
- Add support for Waveshare 7.5in-bv2 :esphomepr:`3121` by :ghuser:`Eriner`
|
||||
- Bump docker dependencies :esphomepr:`3131` by :ghuser:`OttoWinter`
|
||||
- Bump pytest-mock from 3.6.1 to 3.7.0 :esphomepr:`3128` by :ghuser:`dependabot[bot]`
|
||||
- Improv_serial scan and send wifi networks list :esphomepr:`3116` by :ghuser:`jesserockz` (new-feature)
|
||||
- Disable platformio ldf for build :esphomepr:`3130` by :ghuser:`OttoWinter`
|
||||
- Bump esp-idf framework version from 4.3.0 to 4.3.2 :esphomepr:`3120` by :ghuser:`OttoWinter`
|
||||
- Bump pre-commit flake8 from 3.8.4 to 4.0.1 :esphomepr:`3149` by :ghuser:`OttoWinter`
|
||||
- Bump black from 21.12b0 to 22.1.0 :esphomepr:`3147` by :ghuser:`dependabot[bot]`
|
||||
- Fix ESP32C3 toolchain requires stdarg import in helpers :esphomepr:`3151` by :ghuser:`OttoWinter`
|
||||
- Add new Lock core component :esphomepr:`2958` by :ghuser:`kbickar` (new-integration)
|
||||
- Add device class support to Switch :esphomepr:`3012` by :ghuser:`frenck`
|
||||
- Handle Tuya multi-datapoint messages :esphomepr:`3159` by :ghuser:`ssieb` (notable-change)
|
||||
- Bump improv library to 1.2.1 :esphomepr:`3160` by :ghuser:`jesserockz`
|
||||
- Fix copy_file_if_changed src permissions copied too :esphomepr:`3161` by :ghuser:`OttoWinter`
|
||||
- [debug] Refactor debug sensors to use the normal sensor model. :esphomepr:`3162` by :ghuser:`mknjc` (breaking-change)
|
||||
- Added RadonEye RD200 Component :esphomepr:`3119` by :ghuser:`jeffeb3` (new-integration)
|
||||
- Text sensor schema generator similar to sensor :esphomepr:`3172` by :ghuser:`jesserockz`
|
||||
- wifi_info, reduce polling interval :esphomepr:`3165` by :ghuser:`jbergler`
|
||||
- MLX90393 three-axis magnetometer :esphomepr:`2770` by :ghuser:`functionpointer` (new-integration)
|
||||
- Enable mDNS during OTA safe mode :esphomepr:`3146` by :ghuser:`OttoWinter`
|
||||
- Dont warn on nonnull comparisons :esphomepr:`3123` by :ghuser:`jesserockz`
|
||||
- Add require response option for BLE binary output :esphomepr:`3091` by :ghuser:`AshtonKem`
|
||||
- Add Lilygo t5 4.7 Touchscreen :esphomepr:`3084` by :ghuser:`jesserockz` (new-integration)
|
||||
- Add Select for modbus :esphomepr:`3032` by :ghuser:`stegm` (new-integration)
|
||||
- Add max9611 High Side Current Shunt ADC :esphomepr:`2705` by :ghuser:`mckaymatthew` (new-integration)
|
||||
- Inkplate 6 PLUS :esphomepr:`3013` by :ghuser:`jesserockz` (new-feature)
|
||||
- Implement MQTT discovery object_id generator :esphomepr:`3114` by :ghuser:`akomelj`
|
||||
- Fix files CI after merging :esphomepr:`3175` by :ghuser:`jesserockz`
|
||||
- Try fix canbus config validation :esphomepr:`3173` by :ghuser:`jesserockz`
|
||||
- Bump pytest from 6.2.5 to 7.0.0 :esphomepr:`3163` by :ghuser:`dependabot[bot]`
|
||||
- Bump pytest-asyncio from 0.17.2 to 0.18.0 :esphomepr:`3168` by :ghuser:`dependabot[bot]`
|
||||
- Allow to set manufacturer data for BLEAdvertising :esphomepr:`3179` by :ghuser:`ashald`
|
||||
- Change most references from hassio to ha-addon :esphomepr:`3178` by :ghuser:`jesserockz`
|
||||
- Bump aioesphomeapi from 10.8.1 to 10.8.2 :esphomepr:`3182` by :ghuser:`dependabot[bot]`
|
||||
- Clamp rotary_encoder restored value to min and max :esphomepr:`3184` by :ghuser:`jesserockz`
|
||||
- Make generating combined binary output verbose :esphomepr:`3127` by :ghuser:`OttoWinter`
|
||||
- Allow framework version validator to be maximum version :esphomepr:`3197` by :ghuser:`jesserockz` (breaking-change)
|
||||
- Fix strlcpy() uses to make long SSIDs and passwords work :esphomepr:`3199` by :ghuser:`mmakaay`
|
||||
- Update HA addon token :esphomepr:`3200` by :ghuser:`jesserockz`
|
||||
|
||||
Past Changelogs
|
||||
---------------
|
||||
|
||||
- :doc:`2022.1.0`
|
||||
- :doc:`2021.12.0`
|
||||
- :doc:`2021.11.0`
|
||||
- :doc:`2021.10.0`
|
||||
- :doc:`2021.9.0`
|
||||
- :doc:`2021.8.0`
|
||||
- :doc:`v1.20.0`
|
||||
- :doc:`v1.19.0`
|
||||
- :doc:`v1.18.0`
|
||||
- :doc:`v1.17.0`
|
||||
- :doc:`v1.16.0`
|
||||
- :doc:`v1.15.0`
|
||||
- :doc:`v1.14.0`
|
||||
- :doc:`v1.13.0`
|
||||
- :doc:`v1.12.0`
|
||||
- :doc:`v1.11.0`
|
||||
- :doc:`v1.10.0`
|
||||
- :doc:`v1.9.0`
|
||||
- :doc:`v1.8.0`
|
||||
- :doc:`v1.7.0`
|
@ -2,7 +2,7 @@ Changelog
|
||||
=========
|
||||
|
||||
.. redirect::
|
||||
:url: /changelog/2022.1.0.html
|
||||
:url: /changelog/2022.2.0.html
|
||||
|
||||
.. toctree::
|
||||
:glob:
|
||||
|
BIN
components/button/images/generic-ui.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
49
components/button/output.rst
Normal file
@ -0,0 +1,49 @@
|
||||
Generic Output Button
|
||||
=====================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up generic output buttons in ESPHome that control an output component.
|
||||
:image: upload.svg
|
||||
|
||||
The ``output`` button platform allows you to use any output component as a button. This can for example be used to
|
||||
momentarily set a GPIO pin using a button.
|
||||
|
||||
.. figure:: images/generic-ui.png
|
||||
:align: center
|
||||
:width: 80.0%
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
output:
|
||||
- platform: gpio
|
||||
pin: 25
|
||||
id: output1
|
||||
|
||||
button:
|
||||
- platform: output
|
||||
name: "Generic Output"
|
||||
output: output1
|
||||
duration: 500ms
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name for the button.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **output** (**Required**, :ref:`config-id`): The ID of the output component to use.
|
||||
- **duration** (**Required**, :ref:`config-time`): How long the output should be set when the button is pressed.
|
||||
- All other options from :ref:`Button <config-button>`.
|
||||
|
||||
.. note::
|
||||
|
||||
When used with a :doc:`/components/output/gpio`, the pin will be low by default and pulled high when the button is
|
||||
pressed. To invert this behaviour and have the pin pulled low when the button is pressed, set the `inverted` option
|
||||
in the :ref:`config-pin_schema`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/components/output/index`
|
||||
- :apiref:`output/button/output_button.h`
|
||||
- :ghedit:`Edit`
|
32
components/button/wake_on_lan.rst
Normal file
@ -0,0 +1,32 @@
|
||||
Wake-on-LAN Button
|
||||
====================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up buttons that can send wakeup packets to computers on the network.
|
||||
:image: radio-tower.svg
|
||||
|
||||
The ``wake_on_lan`` button platform allows you to send a Wake-on-LAN magic packet to a computer on the network
|
||||
by specifying its MAC address.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
button:
|
||||
- platform: wake_on_lan
|
||||
name: "Start the Server"
|
||||
target_mac_address: E9:48:B8:CA:58:A1
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name for the button.
|
||||
- **target_mac_address** (**Required**, MAC Address): The MAC Address of the target computer.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- All other options from :ref:`Button <config-button>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`template`
|
||||
- :apiref:`wake_on_lan/wake_on_lan.h`
|
||||
- :ghedit:`Edit`
|
@ -7,6 +7,8 @@ Debug Component
|
||||
|
||||
The ``debug`` component can be used to debug problems with ESPHome. At startup, it prints
|
||||
a bunch of useful information like reset reason, free heap size, ESPHome version and so on.
|
||||
It also allows you get the same information as a text sensor, and to monitor the state of the
|
||||
ESP heap memory (free space, maximum free block size and fragmentation level) and the main-loop timing.
|
||||
|
||||
.. figure:: images/debug.png
|
||||
:align: center
|
||||
@ -17,16 +19,86 @@ a bunch of useful information like reset reason, free heap size, ESPHome version
|
||||
|
||||
# Example configuration entry
|
||||
debug:
|
||||
update_interval: 5s
|
||||
|
||||
text_sensor:
|
||||
- platform: debug
|
||||
device:
|
||||
name: "Device Info"
|
||||
|
||||
sensor:
|
||||
- platform: debug
|
||||
free:
|
||||
name: "Heap Free"
|
||||
fragmentation:
|
||||
name: "Heap Fragmentation"
|
||||
block:
|
||||
name: "Heap Max Block"
|
||||
loop_time:
|
||||
name: "Loop Time"
|
||||
|
||||
# Logger must be at least debug (default)
|
||||
logger:
|
||||
level: debug
|
||||
|
||||
No configuration variables.
|
||||
Text Sensor
|
||||
------------
|
||||
Configuration variables:
|
||||
|
||||
- **device** (*Optional*): Reports the following device information:
|
||||
|
||||
- ESPHome Version
|
||||
- Free heap size at startup
|
||||
- Flash chip size, speed and mode
|
||||
- ESP32:
|
||||
|
||||
- Chip model, cores, revision
|
||||
- Chip features (BLE / BT / WiFi_BGN / EMB_FLASH / ...)
|
||||
- ESP-IDF version
|
||||
- EFuse MAC
|
||||
- Reset reason
|
||||
- Wakeup reason
|
||||
- ESP8266:
|
||||
|
||||
- Chip id, frequency
|
||||
- Flash id
|
||||
- SDK, Core & Boot versions
|
||||
- Reset reason & information
|
||||
|
||||
Accepts these options:
|
||||
|
||||
- **name** (**Required**, string): The name of the sensor.
|
||||
- All other options from :ref:`Text Sensor <config-text_sensor>`.
|
||||
|
||||
Sensor
|
||||
-------
|
||||
Configuration variables:
|
||||
|
||||
- **free** (*Optional*): Reports the free heap size in bytes.
|
||||
|
||||
- **name** (**Required**, string): The name of the sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **fragmentation** (*Optional*): Reports the fragmentation metric of the heap
|
||||
(0% is clean, more than ~50% is not harmless). Only available on ESP8266 with Arduino 2.5.2+.
|
||||
|
||||
- **name** (**Required**, string): The name of the sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **block** (*Optional*): Reports the largest contiguous free RAM block on the heap in bytes.
|
||||
|
||||
- **name** (**Required**, string): The name of the sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **loop_time** (*Optional*): Reports the longest time between successive iterations of the main loop.
|
||||
|
||||
- **name** (**Required**, string): The name of the sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`logger`
|
||||
- :apiref:`debug/debug_component.h`
|
||||
- :ghedit:`Edit`
|
||||
|
@ -482,6 +482,42 @@ And then later in code:
|
||||
- Axis labels are currently not possible without manually placing them.
|
||||
- The grid and border color is set with it.graph(), while the traces are defined separately.
|
||||
|
||||
QR Codes
|
||||
********
|
||||
|
||||
Use this component to generate a QR-code containing a string on the device, which can then be drawn on compatible displays.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
qr_code:
|
||||
- id: homepage_qr
|
||||
value: esphome.io
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **id** (**Required**, :ref:`config-id`): The ID with which you will be able to reference the QR-code later
|
||||
in your display code.
|
||||
- **value** (**Required**, string): The string which you want to encode in the QR-code.
|
||||
- **ecc** (*Optional*, string): The error correction code level you want to use. Defaults to ``LOW``. You can use one of the following values:
|
||||
|
||||
- ``LOW`` - The QR Code can tolerate about 7% erroneous codewords
|
||||
- ``MEDIUM`` - The QR Code can tolerate about 15% erroneous codewords
|
||||
- ``QUARTILE`` - The QR Code can tolerate about 25% erroneous codewords
|
||||
- ``HIGH`` - The QR Code can tolerate about 30% erroneous codewords
|
||||
|
||||
To draw the QR-code, call the ``it.qr_code`` function from your render lambda:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
display:
|
||||
- platform: ...
|
||||
# ...
|
||||
pages:
|
||||
- id: page1
|
||||
lambda: |-
|
||||
// Draw the QR-code at position [x=50,y=0] with white color and a 2x scale
|
||||
it.qr_code(50, 0, id(homepage_qr), Color(255,255,255), 2);
|
||||
|
||||
Images
|
||||
******
|
||||
|
||||
@ -507,6 +543,8 @@ Configuration variables:
|
||||
per pixel, 8 pixels per byte.
|
||||
- ``GRAYSCALE``: Full scale grey. Uses 8 bits per pixel, 1 pixel per byte.
|
||||
- ``RGB24``: Full RGB color stored. Uses 3 bytes per pixel.
|
||||
- ``TRANSPARENT_BINARY``: One color, any pixel that is fully transparent will not be drawn, and any other pixel
|
||||
will be the on color. Uses 1 bit per pixel, 8 pixels per byte.
|
||||
|
||||
- **dither** (*Optional*): Specifies which dither method used to process the image, only used in GRAYSCALE and BINARY type image. Defaults to ``NONE``. You can read more about it `here <https://pillow.readthedocs.io/en/stable/reference/Image.html?highlight=Dither#PIL.Image.Image.convert>`__ and `here <https://en.wikipedia.org/wiki/Dither>`__.
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
Inkplate 6 and Inkplate 10
|
||||
==========================
|
||||
Inkplate 6, 10 and 6 Plus
|
||||
=========================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up Inkplate E-Paper displays in ESPHome.
|
||||
:image: inkplate6.jpg
|
||||
|
||||
All-in-one e-paper display ``Inkplate 6`` and ``Inkplate 10``.
|
||||
All-in-one e-paper display ``Inkplate 6``, ``Inkplate 10`` and ``Inkplate 6 Plus``.
|
||||
|
||||
The Inkplate 6 and Inkplate 10 are powerful, Wi-Fi enabled ESP32 based six-inch e-paper displays – recycled from a Kindle e-reader. Its main feature is simplicity.
|
||||
The Inkplate 6, 10 and 6 Plus are powerful, Wi-Fi enabled ESP32 based six-inch e-paper displays -
|
||||
recycled from a Kindle e-reader. Its main feature is simplicity.
|
||||
|
||||
Learn more at `Inkplate's website <https://inkplate.io/>`__
|
||||
|
||||
@ -73,7 +74,11 @@ Configuration variables:
|
||||
************************
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **model** (*Optional*, enum): Specify the model ``inkplate_6`` or ``inkplate_10``. Defaults to ``inkplate_6``.
|
||||
- **model** (*Optional*, enum): Specify the model. Defaults to ``inkplate_6``.
|
||||
- ``inkplate_6``
|
||||
- ``inkplate_10``
|
||||
- ``inkplate_6_plus``
|
||||
|
||||
- **greyscale** (*Optional*, boolean): Makes the screen display 3 bit colors. Defaults to ``false``
|
||||
- **partial_updating** (*Optional*, boolean): Makes the screen update partially, which is faster, but leaves burnin. Defaults to ``false``
|
||||
- **full_update_every** (*Optional*, int): When partial updating is enabled, forces a full screen update after chosen number of updates. Defaults to ``10``
|
||||
@ -113,8 +118,8 @@ Configuration variables:
|
||||
Defaults to GPIO27.
|
||||
|
||||
|
||||
Complete example
|
||||
****************
|
||||
Complete Inkplate 6 example
|
||||
***************************
|
||||
|
||||
The following is a complete example YAML configuration that does a few things beyond the usual
|
||||
Wi-Fi, API, and OTA configuration.
|
||||
@ -272,9 +277,33 @@ Wi-Fi, API, and OTA configuration.
|
||||
}
|
||||
|
||||
|
||||
Inkplate 6 Plus Touchscreen
|
||||
***************************
|
||||
|
||||
The Inkplate 6 Plus has a built in touchscreen supported by ESPHome.
|
||||
Below is a config example:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
touchscreen:
|
||||
- platform: ektf2232
|
||||
interrupt_pin: GPIO36
|
||||
rts_pin:
|
||||
mcp23xxx: mcp23017_hub
|
||||
number: 10
|
||||
on_touch:
|
||||
- logger.log:
|
||||
format: "Touch: {x}, {y}"
|
||||
args:
|
||||
- touch.x
|
||||
- touch.y
|
||||
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`index`
|
||||
- :doc:`/components/touchscreen/ektf2232`
|
||||
- `Arduino Inkplate 6 library <https://github.com/e-radionicacom/Inkplate-6-Arduino-library>`__ by `E-radionica.com <https://e-radionica.com/>`__
|
||||
- :ghedit:`Edit`
|
||||
|
@ -92,6 +92,7 @@ Configuration variables:
|
||||
- ``4.20in-bV2`` (B/W rendering only)
|
||||
- ``5.83in``
|
||||
- ``7.50in``
|
||||
- ``7.50in-bV2`` (also supports v3, B/W rendering only)
|
||||
- ``7.50in-bc`` (display with version sticker '(C)' on the back, B/W rendering only)
|
||||
- ``7.50inV2`` (Can't use with an ESP8266 as it runs out of RAM)
|
||||
|
||||
|
@ -74,6 +74,9 @@ Frame Settings:
|
||||
Up to 60Hz is possible (with reduced frame sizes), but beware of overheating. Defaults to ``10 fps``.
|
||||
- **idle_framerate** (*Optional*, float): The framerate to capture images at when no client
|
||||
is requesting a full stream. Defaults to ``0.1 fps``.
|
||||
|
||||
Image Settings:
|
||||
|
||||
- **resolution** (*Optional*, enum): The resolution the camera will capture images at. Higher
|
||||
resolutions require more memory, if there's not enough memory you will see an error during startup.
|
||||
|
||||
@ -90,15 +93,64 @@ Frame Settings:
|
||||
|
||||
- **jpeg_quality** (*Optional*, int): The JPEG quality that the camera should encode images with.
|
||||
From 10 (best) to 63 (worst). Defaults to ``10``.
|
||||
|
||||
- **vertical_flip** (*Optional*, boolean): Whether to flip the image vertically. Defaults to ``true``.
|
||||
- **horizontal_mirror** (*Optional*, boolean): Whether to mirror the image horizontally. Defaults to ``true``.
|
||||
- **contrast** (*Optional*, int): The contrast to apply to the picture, from -2 to 2. Defaults to ``0``.
|
||||
- **brightness** (*Optional*, int): The brightness to apply to the picture, from -2 to 2. Defaults to ``0``.
|
||||
- **saturation** (*Optional*, int): The saturation to apply to the picture, from -2 to 2. Defaults to ``0``.
|
||||
- **vertical_flip** (*Optional*, boolean): Whether to flip the image vertically. Defaults to ``true``.
|
||||
- **horizontal_mirror** (*Optional*, boolean): Whether to mirror the image horizontally. Defaults to ``true``.
|
||||
- **aec2** (*Optional*, boolean): Whether to enable Auto Exposure Control 2. Defaults to ``false``.
|
||||
- **ae_level** (*Optional*, int): The auto exposure level to apply to the picture, from -2 to 2. Defaults to ``0``.
|
||||
- **aec_value** (*Optional*, int): The Auto Exposure Control 2 value to apply to the picture, from 0 to 1200. Defaults to ``300``.
|
||||
- **special_effect** (*Optional*, enum): The effect to apply to the picture. Defaults to ``none`` (picture without effect).
|
||||
|
||||
- ``none``: Picture without effect
|
||||
- ``negative``: Colors of picture are inverted
|
||||
- ``grayscale``: Only luminance of picture is kept
|
||||
- ``red_tint``: Picture appear red-tinted
|
||||
- ``green_tint``: Picture appear green-tinted
|
||||
- ``blue_tint``: Picture appear blue-tinted
|
||||
- ``sepia``: Sepia effect is applied to picture
|
||||
|
||||
Exposure Settings:
|
||||
|
||||
- **aec_mode** (*Optional*, enum): The mode of exposure module. Defaults to ``auto`` (leave camera to automatically adjust exposure).
|
||||
|
||||
- ``manual``: Exposure can be manually set, with **aec_value** parameter. **ae_level** has no effect here
|
||||
- ``auto``: Camera manage exposure automatically. Compensation can be applied, thanks to **ae_level** parameter. **aec_value** has no effect here
|
||||
|
||||
- **aec2** (*Optional*, boolean): Whether to enable Auto Exposure Control 2. Seems to change computation method of automatic exposure. Defaults to ``false``.
|
||||
- **ae_level** (*Optional*, int): The auto exposure level to apply to the picture (when **aec_mode** is set to ``auto``), from -2 to 2. Defaults to ``0``.
|
||||
- **aec_value** (*Optional*, int): The Exposure value to apply to the picture (when **aec_mode** is set to ``manual``), from 0 to 1200. Defaults to ``300``.
|
||||
|
||||
Sensor Gain Settings:
|
||||
|
||||
- **agc_mode** (*Optional*, enum): The mode of gain control module. Defaults to ``auto`` (leave camera to automatically adjust sensor gain).
|
||||
|
||||
- ``manual``: Gain can be manually set, with **agc_value** parameter. **agc_gain_ceiling** has no effect here
|
||||
- ``auto``: Camera manage sensor gain automatically. Maximum gain can be defined, thanks to **agc_gain_ceiling** parameter. **agc_value** has no effect here
|
||||
|
||||
- **agc_value** (*Optional*, int): The gain value to apply to the picture (when **aec_mode** is set to ``manual``), from 0 to 30. Defaults to ``0``.
|
||||
- **agc_gain_ceiling** (*Optional*, enum): The maximum gain allowed, when **agc_mode** is set to ``auto``. This parameter seems act as "ISO" setting. Defaults to ``2x``.
|
||||
|
||||
- ``2x``: Camera is less sensitive, picture is clean (without visible noise)
|
||||
- ``4x``
|
||||
- ``8x``
|
||||
- ``16x``
|
||||
- ``32x``
|
||||
- ``64x``
|
||||
- ``128x``: Camera is more sensitive, but picture contain lot of noise
|
||||
|
||||
White Balance Setting:
|
||||
|
||||
- **wb_mode** (*Optional*, enum): The mode of white balace module. Defaults to ``auto``.
|
||||
|
||||
- ``auto``: Camera choose best white balance setting
|
||||
- ``sunny``: White balance sunny mode
|
||||
- ``cloudy``: White balance cloudy mode
|
||||
- ``office``: White balance office mode
|
||||
- ``home``: White balance home mode
|
||||
|
||||
Test Setting:
|
||||
|
||||
- **test_pattern** (*Optional*, boolean): For tests purposes, it's possible to replace picture get from sensor by a test color pattern. Defaults to ``false``.
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
|
@ -150,6 +150,7 @@ Configuration for Wireless Tag WT32-ETH01
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`network`
|
||||
- :apiref:`ethernet/ethernet_component.h`
|
||||
- `ESP32 Ethernet PHY connection info <https://pcbartists.com/design/embedded/esp32-ethernet-phy-schematic-design/>`__
|
||||
- :ghedit:`Edit`
|
||||
|
@ -5,7 +5,7 @@ H-bridge Fan
|
||||
:description: Instructions for setting up hbridge controlled fans (or motors).
|
||||
:image: fan.svg
|
||||
|
||||
The `'hbridge`' fan platform allows you to use a compatible `h-bridge` (L298N, DRV8871, MX1508, BTS7960, L9110S, DRV8833, TB6612, etc.) to control a fan (or motor/solenoid).
|
||||
The ``hbridge`` fan platform allows you to use a compatible `h-bridge` (L298N, DRV8871, MX1508, BTS7960, L9110S, DRV8833, TB6612, etc.) to control a fan (or motor/solenoid).
|
||||
|
||||
.. figure:: images/L298N_module.jpg
|
||||
:align: center
|
||||
|
@ -6,11 +6,9 @@ Fan Component
|
||||
:image: folder-open.svg
|
||||
|
||||
With the ``fan`` domain you can create components that appear as fans in
|
||||
the Home Assistant frontend. A fan can be switched ON or OFF, optionally
|
||||
has a speed level between 1 and the maximum supported speed level of the fan, and can have an
|
||||
oscillate and direction output.
|
||||
|
||||
This component restores its state on reboot/reset.
|
||||
the Home Assistant frontend. A fan can be switched on or off, optionally
|
||||
has a speed between 1 and the maximum supported speed of the fan, and can have an
|
||||
oscillation and direction output.
|
||||
|
||||
.. figure:: images/fan-ui.png
|
||||
:align: center
|
||||
@ -30,10 +28,20 @@ Configuration variables:
|
||||
|
||||
- **name** (**Required**, string): The name of the fan.
|
||||
- **icon** (*Optional*, icon): Manually set the icon to use for the fan in the frontend.
|
||||
- **restore_mode** (*Optional*): Control how the fan attempts to restore state on boot.
|
||||
|
||||
- ``NO_RESTORE`` - Don't restore any state.
|
||||
- ``RESTORE_DEFAULT_OFF`` - Attempt to restore state and default to OFF if not possible to restore (default).
|
||||
- ``RESTORE_DEFAULT_ON`` - Attempt to restore state and default to ON.
|
||||
- ``RESTORE_INVERTED_DEFAULT_OFF`` - Attempt to restore state inverted from the previous state and default to OFF.
|
||||
- ``RESTORE_INVERTED_DEFAULT_ON`` - Attempt to restore state inverted from the previous state and default to ON.
|
||||
- ``ALWAYS_OFF`` - Always initialize the fan as OFF on bootup.
|
||||
- ``ALWAYS_ON`` - Always initialize the fan as ON on bootup.
|
||||
|
||||
- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will
|
||||
not be exposed to the frontend (like Home Assistant). Only specifying an ``id`` without
|
||||
a ``name`` will implicitly set this to true.
|
||||
- **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend,
|
||||
- **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend
|
||||
(usually Home Assistant) without the user manually enabling it (via the Home Assistant UI).
|
||||
Requires Home Assistant 2021.9 or newer. Defaults to ``false``.
|
||||
- **entity_category** (*Optional*, string): The category of the entity.
|
||||
@ -116,7 +124,7 @@ Configuration options:
|
||||
- **speed** (*Optional*, int, :ref:`templatable <config-templatable>`):
|
||||
Set the speed level of the fan. Can be a number between 1 and the maximum speed level of the fan.
|
||||
- **direction** (*Optional*, string, :ref:`templatable <config-templatable>`):
|
||||
Set the diretion of the fan. Can be either ``forward`` or ``reverse``. Defaults to not changing the direction.
|
||||
Set the direction of the fan. Can be either ``forward`` or ``reverse``. Defaults to not changing the direction.
|
||||
|
||||
.. _fan-cycle_speed_action:
|
||||
|
||||
@ -138,7 +146,7 @@ Increments through speed levels of the fan with the given ID when executed. If t
|
||||
``fan.is_on`` / ``fan.is_off`` Condition
|
||||
----------------------------------------
|
||||
|
||||
This :ref:`condition <config-condition>` passes if the given fan is on/off.
|
||||
This :ref:`condition <config-condition>` passes if the given fan is on or off.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -228,7 +236,7 @@ advanced stuff (see the full API Reference for more info).
|
||||
.. code-block:: yaml
|
||||
|
||||
// Within lambda, get the fan direction and conditionally do something
|
||||
if (id(my_fan).direction == FanDirection::FAN_DIRECTION_FORWARD) {
|
||||
if (id(my_fan).direction == FanDirection::FORWARD) {
|
||||
// Fan direction is forward, do something here
|
||||
} else {
|
||||
// Fan direction is reverse, do something else here
|
||||
@ -248,7 +256,7 @@ advanced stuff (see the full API Reference for more info).
|
||||
auto call = id(my_fan).turn_on();
|
||||
call.set_speed(2);
|
||||
call.set_oscillating(true);
|
||||
call.set_direction(FanDirection::FAN_DIRECTION_REVERSE);
|
||||
call.set_direction(FanDirection::REVERSE);
|
||||
call.perform();
|
||||
|
||||
// Toggle the fan on/off
|
||||
|
@ -5,7 +5,7 @@ Grow Fingerprint Reader
|
||||
:description: Instructions for setting up Grow Fingerprint Reader integration in ESPHome.
|
||||
:image: fingerprint.svg
|
||||
|
||||
The ``fingerprint_grow`` component allows you to use your R307, R503, ZFM-20, ... fingerprint sensors with ESPHome.
|
||||
The ``fingerprint_grow`` component allows you to use your R307, R503, R503-RGB, ZFM-20, ... fingerprint sensors with ESPHome.
|
||||
|
||||
.. figure:: images/r307-full.jpg
|
||||
:align: center
|
||||
@ -25,7 +25,7 @@ Component/Hub
|
||||
|
||||
The reader can be powered by the 3.3V output of an NodeMCU. As the communication with the reader is done using UART (default baud rate is 57600), you need to have an :ref:`UART bus <uart>` in your configuration with the ``rx_pin`` connected to the reader's ``TX`` and the ``tx_pin`` connected to the reader's ``RX``.
|
||||
|
||||
If available on your reader model, it's recommended to connect 3.3VT (touch induction power supply) to 3.3V; WAKEUP (finger detection signal) to a free GPIO pin and define it with the ``sensing_pin`` option to allow the polling function to quickly return when there's no finger on the reader.
|
||||
If available on your reader model, it's recommended to connect 3.3VT (touch induction power supply) & 3.3V to 3.3V; WAKEUP (finger detection signal) to a free GPIO pin and define it with the ``sensing_pin`` option to allow the polling function to quickly return when there's no finger on the reader.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -308,7 +308,7 @@ Removes all enrolled fingerprints.
|
||||
``fingerprint_grow.led_control`` Action
|
||||
---------------------------------------
|
||||
|
||||
Turns on or off the LED on the reader. Only available on select models. If you have the R503 use :ref:`fingerprint_grow-aura_led_control` instead.
|
||||
Turns on or off the LED on the reader. Only available on select models. If you have the R503 or R503-RGB use :ref:`fingerprint_grow-aura_led_control` instead.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -328,7 +328,7 @@ Configuration options:
|
||||
``fingerprint_grow.aura_led_control`` Action
|
||||
--------------------------------------------
|
||||
|
||||
Controls the Aura LED on the reader. Only available on select models.
|
||||
Controls the Aura LED on the reader. Only available on select models. NOTE: The R503 has 2 variants with different LED colour options.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -389,7 +389,7 @@ Configuration options:
|
||||
|
||||
- **state** (**Required**, string, :ref:`templatable <config-templatable>`): The state to set the LED. One of ``BREATHING``, ``FLASHING``, ``ALWAYS_ON``, ``ALWAYS_OFF``, ``GRADUAL_ON`` and ``GRADUAL_OFF``.
|
||||
- **speed** (**Required**, int, :ref:`templatable <config-templatable>`): The duration each cycle lasts, a factor of 10ms. Only relevant for ``BREATHING``, ``FLASHING``, ``GRADUAL_ON`` and ``GRADUAL_OFF`` states. The total duration is defined by 10ms * speed * count. Range is 0 to 255.
|
||||
- **color** (**Required**, string, :ref:`templatable <config-templatable>`): The LED color to activate. One of ``RED``, ``BLUE`` and ``PURPLE``.
|
||||
- **color** (**Required**, string, :ref:`templatable <config-templatable>`): The LED color to activate. For R503, one of ``RED``, ``BLUE`` and ``PURPLE``. For R503-RGB, one of ``RED``, ``BLUE``, ``PURPLE``, ``GREEN``, ``YELLOW``, ``CYAN`` and ``WHITE``.
|
||||
- **count** (**Required**, int, :ref:`templatable <config-templatable>`): How many times to repeat the pattern. Only relevant for ``BREATHING`` and ``FLASHING`` states. 0 for infinite, or 1 to 255.
|
||||
|
||||
All actions
|
||||
|
@ -22,6 +22,8 @@ Configuration variables:
|
||||
- **useragent** (*Optional*, string): User-Agent header for requests. Defaults to ``ESPHome``.
|
||||
- **timeout** (*Optional*, :ref:`config-time`): Timeout for request. Defaults to ``5s``.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **follow_redirects** (*Optional*, boolean): Enable following HTTP redirects. Defaults to ``true``.
|
||||
- **redirect_limit** (*Optional*, integer): Maximum amount of redirects to follow when enabled. Defaults to ``3``.
|
||||
|
||||
ESP8266 Options:
|
||||
|
||||
|
@ -18,4 +18,6 @@ Components
|
||||
display/index
|
||||
text_sensor/index
|
||||
stepper/index
|
||||
touchscreen/index
|
||||
lock/index
|
||||
*
|
||||
|
@ -5,6 +5,21 @@ FastLED Light
|
||||
:description: Instructions for setting up FastLED addressable lights like NEOPIXEL.
|
||||
:image: color_lens.svg
|
||||
|
||||
.. warning::
|
||||
|
||||
FastLED does **not** work as expected with Arduino 3 or newer for ESP8266. For now, you can either downgrade the arduino version or use :doc:`neopixelbus`.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp8266:
|
||||
framework:
|
||||
version: 2.7.4
|
||||
|
||||
See these related issues:
|
||||
|
||||
- https://github.com/FastLED/FastLED/issues/1322
|
||||
- https://github.com/FastLED/FastLED/issues/1264
|
||||
|
||||
.. _fastled-clockless:
|
||||
|
||||
Clockless
|
||||
@ -124,7 +139,7 @@ Configuration variables:
|
||||
- **max_refresh_rate** (*Optional*, :ref:`config-time`):
|
||||
A time interval used to limit the number of commands a light can handle per second. For example
|
||||
16ms will limit the light to a refresh rate of about 60Hz. Defaults to the default value for the used chipset.
|
||||
- **data_rate** (*Optional*, frequency): The data rate to use for shifting data to the light. Can help if you
|
||||
- **data_rate** (*Optional*, frequency): The data rate to use for shifting data to the light. Can help if you
|
||||
have long cables or slow level-shifters.
|
||||
- **effects** (*Optional*, list): A list of :ref:`light effects <light-effects>` to use for this light.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
|
@ -405,10 +405,10 @@ with the behavior of the ``light.is_on`` and ``light.is_off`` condition above.
|
||||
``light.on_state`` Trigger
|
||||
**************************
|
||||
|
||||
This trigger is activated each time the set light state is changed. It is not triggered
|
||||
This trigger is activated each time the set light state is changed. It is not triggered
|
||||
based on current state, but rather, it triggers on the set state which can differ from
|
||||
the current state due to transitions. For example, the ``light.on_state`` trigger can
|
||||
be used for immediate action when the light is set to off; while ``light.on_turn_off``
|
||||
be used for immediate action when the light is set to off; while ``light.on_turn_off``
|
||||
does not trigger until the light actually achieves the off state.
|
||||
|
||||
.. code-block:: yaml
|
||||
@ -586,6 +586,10 @@ Lambda Effect
|
||||
|
||||
This effect allows you to write completely custom light effects yourself using :ref:`lambdas <config-lambda>`.
|
||||
|
||||
Available variable in the lambda:
|
||||
|
||||
- **initial_run** - A bool which is true on the first execution of the lambda. Useful to reset static variables when restarting an effect.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
light:
|
||||
@ -622,6 +626,7 @@ Configuration variables:
|
||||
- **lambda** (**Required**, :ref:`lambda <config-lambda>`): The code to execute. ``static`` variables are
|
||||
especially useful.
|
||||
|
||||
|
||||
Addressable Rainbow Effect
|
||||
**************************
|
||||
|
||||
|
BIN
components/lock/images/output-ui.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
166
components/lock/index.rst
Normal file
@ -0,0 +1,166 @@
|
||||
Lock Component
|
||||
================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up generic locks in ESPHome.
|
||||
:image: folder-open.svg
|
||||
|
||||
The ``lock`` domain includes all platforms that should function like a lock
|
||||
with lock/unlock actions.
|
||||
|
||||
.. note::
|
||||
|
||||
ESPHome lock components requires Home Assistant 2022.3 or newer
|
||||
|
||||
.. _config-lock:
|
||||
|
||||
Base Lock Configuration
|
||||
-------------------------
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
lock:
|
||||
- platform: ...
|
||||
name: "Lock Name"
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **name** (**Required**, string): The name of the lock.
|
||||
- **icon** (*Optional*, icon): Manually set the icon to use for the
|
||||
lock in the frontend.
|
||||
- **internal** (*Optional*, boolean): Mark this component as internal. Internal components will
|
||||
not be exposed to the frontend (like Home Assistant). Only specifying an ``id`` without
|
||||
a ``name`` will implicitly set this to true.
|
||||
- **on_lock** (*Optional*, :ref:`Action <config-action>`): An automation to perform
|
||||
when the lock is locked. See :ref:`lock-on_lock_unlock_trigger`.
|
||||
- **on_unlock** (*Optional*, :ref:`Action <config-action>`): An automation to perform
|
||||
when the lock is unlocked. See :ref:`lock-on_lock_unlock_trigger`..
|
||||
- **disabled_by_default** (*Optional*, boolean): If true, then this entity should not be added to any client's frontend,
|
||||
(usually Home Assistant) without the user manually enabling it (via the Home Assistant UI).
|
||||
Defaults to ``false``.
|
||||
- **entity_category** (*Optional*, string): The category of the entity.
|
||||
See https://developers.home-assistant.io/docs/core/entity/#generic-properties
|
||||
for a list of available options. Set to ``""`` to remove the default entity category.
|
||||
- If MQTT enabled, All other options from :ref:`MQTT Component <config-mqtt-component>`.
|
||||
|
||||
.. _lock-lock_action:
|
||||
|
||||
``lock.lock`` Action
|
||||
*************************
|
||||
|
||||
This action locks a lock with the given ID on when executed.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
on_...:
|
||||
then:
|
||||
- lock.lock: deadbolt_1
|
||||
|
||||
.. _lock-unlock_action:
|
||||
|
||||
``lock.unlock`` Action
|
||||
**************************
|
||||
|
||||
This action unlocks a lock with the given ID off when executed.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
on_...:
|
||||
then:
|
||||
- lock.unlock: deadbolt_1
|
||||
|
||||
.. _lock-open_action:
|
||||
|
||||
``lock.open`` Action
|
||||
************************
|
||||
|
||||
This action opens (e.g. unlatch) a lock with the given ID off when executed.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
on_...:
|
||||
then:
|
||||
- lock.open: doorlock_1
|
||||
|
||||
.. _lock-is_locked_condition:
|
||||
.. _lock-is_unlocked_condition:
|
||||
|
||||
``lock.is_locked`` / ``lock.is_unlocked`` Condition
|
||||
***************************************************
|
||||
|
||||
This :ref:`Condition <config-condition>` checks if the given lock is LOCKED (or UNLOCKED).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# In some trigger:
|
||||
on_...:
|
||||
if:
|
||||
condition:
|
||||
# Same syntax for is_unlocked
|
||||
lock.is_locked: my_lock
|
||||
|
||||
.. _lock-lambda_calls:
|
||||
|
||||
lambda calls
|
||||
************
|
||||
|
||||
From :ref:`lambdas <config-lambda>`, you can call several methods on all locks to do some
|
||||
advanced stuff (see the full API Reference for more info).
|
||||
|
||||
- ``publish_state()``: Manually cause the lock to publish a new state and store it internally.
|
||||
If it's different from the last internal state, it's additionally published to the frontend.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
// Within lambda, make the lock report a specific state
|
||||
id(my_lock).publish_state(LOCK_STATE_LOCKED);
|
||||
id(my_lock).publish_state(LOCK_STATE_UNLOCKED);
|
||||
|
||||
- ``state``: Retrieve the current state of the lock.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
// Within lambda, get the lock state and conditionally do something
|
||||
if (id(my_lock).state == LOCK_STATE_LOCKED) {
|
||||
// Lock is LOCKED, do something here
|
||||
}
|
||||
|
||||
- ``unlock()``/``lock()``/``open()``: Manually lock/unlock/open a lock from code.
|
||||
Similar to the ``lock.lock``, ``lock.unlock``, and ``lock.open`` actions,
|
||||
but can be used in complex lambda expressions.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
id(my_lock).unlock();
|
||||
id(my_lock).lock();
|
||||
id(my_lock).open();
|
||||
|
||||
.. _lock-on_lock_unlock_trigger:
|
||||
|
||||
``lock.on_lock`` / ``lock.on_unlock`` Trigger
|
||||
****************************************************************
|
||||
|
||||
This trigger is activated each time the lock is locked/unlocked. It becomes active
|
||||
right after the lock component has acknowledged the state (e.g. after it LOCKED/UNLOCKED itself).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
lock:
|
||||
- platform: template # or any other platform
|
||||
# ...
|
||||
on_lock:
|
||||
- logger.log: "Door Locked!"
|
||||
on_unlock:
|
||||
- logger.log: "Door Unlocked!"
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :apiref:`lock/lock.h`
|
||||
- :ghedit:`Edit`
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
*
|
39
components/lock/output.rst
Normal file
@ -0,0 +1,39 @@
|
||||
Generic Output Lock
|
||||
=====================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up generic output locks in ESPHome that control an output component.
|
||||
:image: upload.svg
|
||||
|
||||
The ``output`` lock platform allows you to use any output component as a lock.
|
||||
|
||||
.. figure:: images/output-ui.png
|
||||
:align: center
|
||||
:width: 80.0%
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
output:
|
||||
- platform: gpio
|
||||
pin: 25
|
||||
id: 'generic_out'
|
||||
lock:
|
||||
- platform: output
|
||||
name: "Generic Output"
|
||||
output: 'generic_out'
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **output** (**Required**, :ref:`config-id`): The ID of the output component to use.
|
||||
- **name** (**Required**, string): The name for the lock.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- All other options from :ref:`Lock <config-lock>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/components/output/index`
|
||||
- :apiref:`output/lock/output_lock.h`
|
||||
- :ghedit:`Edit`
|
115
components/lock/template.rst
Normal file
@ -0,0 +1,115 @@
|
||||
Template Lock
|
||||
===============
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up template locks that can execute arbitrary actions when locked, unlocked, or opened
|
||||
:image: description.svg
|
||||
|
||||
The ``template`` lock platform allows you to create simple locks out of just actions and
|
||||
an optional value lambda. Once defined, it will automatically appear in Home Assistant
|
||||
as a lock and can be controlled through the frontend.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
lock:
|
||||
- platform: template
|
||||
name: "Template Lock"
|
||||
lambda: |-
|
||||
if (id(some_binary_sensor).state) {
|
||||
return LOCK_STATE_LOCKED;
|
||||
} else {
|
||||
return LOCK_STATE_UNLOCKED;
|
||||
}
|
||||
lock_action:
|
||||
- switch.turn_on: switch1
|
||||
unlock_action:
|
||||
- switch.turn_off: switch1
|
||||
open_action:
|
||||
- button.press: button1
|
||||
|
||||
|
||||
Possible return values for the optional lambda:
|
||||
|
||||
- ``return LOCK_STATE_LOCKED;`` if the lock should be reported as LOCKED.
|
||||
- ``return LOCK_STATE_UNLOCKED;`` if the lock should be reported as UNLOCKED.
|
||||
- ``return LOCK_STATE_JAMMED;`` if the lock should be reported as JAMMED.
|
||||
- ``return LOCK_STATE_LOCKING;`` if the lock should be reported as LOCKING.
|
||||
- ``return LOCK_STATE_UNLOCKING;`` if the lock should be reported as UNLOCKING.
|
||||
- ``return {};`` if the last state should be repeated.
|
||||
|
||||
.. note::
|
||||
|
||||
Only ``LOCK_STATE_LOCKED`` and ``LOCK_STATE_UNLOCKED`` are supported by the MQTT component in Home Assistant
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name of the lock.
|
||||
- **lambda** (*Optional*, :ref:`lambda <config-lambda>`):
|
||||
Lambda to be evaluated repeatedly to get the current state of the lock.
|
||||
- **lock_action** (*Optional*, :ref:`Action <config-action>`): The action that should
|
||||
be performed when the remote (like Home Assistant's frontend) requests the lock to be locked.
|
||||
- **unlock_action** (*Optional*, :ref:`Action <config-action>`): The action that should
|
||||
be performed when the remote (like Home Assistant's frontend) requests the lock to be unlocked.
|
||||
- **restore_state** (*Optional*, boolean): Sets whether ESPHome should attempt to restore the
|
||||
state on boot-up and call the lock/unlock actions with the recovered values. Defaults to ``no``.
|
||||
- **optimistic** (*Optional*, boolean): Whether to operate in optimistic mode - when in this mode,
|
||||
any command sent to the template lock will immediately update the reported state.
|
||||
Defaults to ``false``.
|
||||
- **assumed_state** (*Optional*, boolean): Whether the true state of the lock is not known.
|
||||
This will make the Home Assistant frontend show buttons for both LOCK and UNLOCK actions, instead
|
||||
of hiding one of them when the lock is LOCKED/UNLOCKED. Defaults to ``false``.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- All other options from :ref:`Lock <config-lock>`.
|
||||
|
||||
.. _lock-template-publish_action:
|
||||
|
||||
``lock.template.publish`` Action
|
||||
----------------------------------
|
||||
|
||||
You can also publish a state to a template lock from elsewhere in your YAML file
|
||||
with the ``lock.template.publish`` action.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
lock:
|
||||
- platform: template
|
||||
name: "Template Lock"
|
||||
id: template_lock1
|
||||
|
||||
# in some trigger
|
||||
on_...:
|
||||
- lock.template.publish:
|
||||
id: template_lock1
|
||||
state: LOCK_STATE_LOCKED
|
||||
|
||||
# Templated
|
||||
- lock.template.publish:
|
||||
id: template_lock1
|
||||
state: !lambda 'return LOCK_STATE_LOCKED;'
|
||||
|
||||
Configuration options:
|
||||
|
||||
- **id** (**Required**, :ref:`config-id`): The ID of the template lock.
|
||||
- **state** (**Required**, boolean, :ref:`templatable <config-templatable>`):
|
||||
The state to publish.
|
||||
|
||||
.. note::
|
||||
|
||||
This action can also be written in lambdas, the parameter of the `publish_state` method denotes the state the
|
||||
lock should become:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
id(template_lock1).publish_state(lock::LOCK_STATE_LOCKED);
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/guides/automations`
|
||||
- :doc:`/components/lock/index`
|
||||
- :doc:`/components/binary_sensor/index`
|
||||
- :apiref:`template/lock/template_lock.h`
|
||||
- :ghedit:`Edit`
|
@ -47,6 +47,9 @@ Configuration variables:
|
||||
to use. Can be one of ``legacy`` or ``mac``. Defaults to ``legacy``, which
|
||||
generates unique_id in format ``ESP<component_type><default_object_id>``.
|
||||
``mac`` generator uses format ``<mac_address>-<component_type>-<fnv1_hash(friendly_name)>``.
|
||||
- **discovery_object_id_generator** (*Optional*, string): The object_id generator
|
||||
to use. Can be one of ``none`` or ``device_name``. Defaults to ``none`` which
|
||||
does not generate object_id. ``device_name`` generator uses format ``<device_name>_<friendly_name>``.
|
||||
- **use_abbreviations** (*Optional*, boolean): Whether to use
|
||||
`Abbreviations <https://www.home-assistant.io/docs/mqtt/discovery/>`__
|
||||
in discovery messages. Defaults to ``true``.
|
||||
@ -160,6 +163,17 @@ This will remove all retained messages with the topic
|
||||
``<DISCOVERY_PREFIX>/+/NODE_NAME/#``. If you want to purge on another
|
||||
topic, simply add ``--topic <your_topic>`` to the command.
|
||||
|
||||
Home Assistant generates entity names for all discovered devices based on entity type and
|
||||
entity name (e.g. ``sensor.uptime``). Numeric suffixes are appended to entity names when
|
||||
multiple devices use the same name for a sensor, making it harder to distinguish between
|
||||
similar sensors on different devices. Home Assistant 2021.12 allows MQTT devices to change
|
||||
this behaviour by specifying ``object_id`` discovery attribute which replaces the sensor
|
||||
name part of the generated entity name. Setting ``discovery_object_id_generator: device_name``
|
||||
in ESPHome MQTT integration configuration will cause Home Assistant to include device name
|
||||
in the generated entity names (e.g. ``sensor.uptime`` becomes ``sensor.<device name>_uptime``),
|
||||
making it easier to distinguish the entities in various entity lists.
|
||||
|
||||
|
||||
.. _mqtt-defaults:
|
||||
|
||||
Defaults
|
||||
@ -266,6 +280,7 @@ MQTT can have some overrides for specific options.
|
||||
payload_not_available: offline
|
||||
state_topic: livingroom/custom_state_topic
|
||||
command_topic: livingroom/custom_command_topic
|
||||
command_retain: false
|
||||
|
||||
Configuration variables:
|
||||
|
||||
@ -284,6 +299,8 @@ Configuration variables:
|
||||
- **command_topic** (*Optional*, string): The topic to subscribe to for
|
||||
commands from the remote. Defaults to
|
||||
``<TOPIC_PREFIX>/<COMPONENT_TYPE>/<COMPONENT_NAME>/command``.
|
||||
- **command_retain** (*Optional*, boolean): Whether MQTT command messages
|
||||
sent to the device should be retained or not. Default to ``false``.
|
||||
|
||||
.. warning::
|
||||
|
||||
|
22
components/network.rst
Normal file
@ -0,0 +1,22 @@
|
||||
Network component
|
||||
=================
|
||||
|
||||
.. seo::
|
||||
:description:
|
||||
:image: network-wifi.svg
|
||||
:keywords: Network, WiFi, WLAN, Ethernet, ESP32
|
||||
|
||||
The network component is a global configuration for all types of
|
||||
networks (WiFi, Ethernet).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration
|
||||
network:
|
||||
enable_ipv6: true
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **enable_ipv6** (*Optional*, boolean): Enables IPv6 support. Defaults to ``false``. Only available on ESP32 with ESP-IDF framework.
|
||||
|
@ -25,6 +25,7 @@ For more information on BLE services and characteristics, see
|
||||
ble_client_id: itag_black
|
||||
service_uuid: "10110000-5354-4F52-5A26-4249434B454C"
|
||||
characteristic_uuid: "10110013-5354-4f52-5a26-4249434b454c"
|
||||
require_response: false
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
@ -33,6 +34,8 @@ Configuration variables:
|
||||
- **service_uuid** (**Required**, UUID): UUID of the service on the device.
|
||||
- **characteristic_uuid** (**Required**, UUID): UUID of the service's characteristic to write to.
|
||||
- **id** (*Optional*, :ref:`config-id`): The ID to use for code generation, and for reference by dependent components.
|
||||
- **require_response** (*Optional*, boolean): Control whether to require a remote response from the device when writing.
|
||||
Whether or not this is required will vary by device. Defaults to ``false``
|
||||
- All other options from :ref:`Output <config-output>`.
|
||||
|
||||
See Also
|
||||
|
@ -37,7 +37,9 @@ Configuration variables:
|
||||
- **state_change_action** (*Optional*, :ref:`Automation <automation>`): An automation to perform when the load is switched. If a lambda is used the boolean ``state`` parameter holds the new status.
|
||||
- **turn_on_action** (*Optional*, :ref:`Automation <automation>`): An automation to perform when the load is turned on. Can be used to control for example a switch or output component.
|
||||
- **turn_off_action** (*Optional*, :ref:`Automation <automation>`): An automation to perform when the load is turned off. ``turn_on_action`` and ``turn_off_action`` must be configured together.
|
||||
|
||||
- **restart_cycle_on_state_change** (*Optional*, boolean): Restart a timer of a cycle
|
||||
when new state is set. Defaults to ``false``.
|
||||
|
||||
- All other options from :ref:`Output <config-output>`.
|
||||
|
||||
|
||||
|
143
components/select/modbus_controller.rst
Normal file
@ -0,0 +1,143 @@
|
||||
Modbus Controller Select
|
||||
========================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up Modbus Controller Select(s) with ESPHome.
|
||||
|
||||
The ``modbus_controller`` Select platform allows you to create a Select from modbus
|
||||
registers.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
select:
|
||||
- platform: modbus_controller
|
||||
name: "Modbus Select Register 1000"
|
||||
address: 1000
|
||||
value_type: U_WORD
|
||||
optionsmap:
|
||||
"Zero": 0
|
||||
"One": 1
|
||||
"Two": 2
|
||||
"Three": 3
|
||||
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name of the Select.
|
||||
- **address**: (**Required**, int): The start address of the first or only register
|
||||
of the Select.
|
||||
- **optionsmap**: (**Required**, Map[str, int]): Provide a mapping from options (str) of
|
||||
this Select to values (int) of the modbus register and vice versa. All options and
|
||||
all values have to be unique.
|
||||
- **value_type**: (*Optional*): The datatype of the modbus data. Defaults to ``U_WORD``.
|
||||
- ``U_WORD`` (unsigned 16 bit integer from 1 register = 16bit)
|
||||
- ``S_WORD`` (signed 16 bit integer from 1 register = 16bit)
|
||||
- ``U_DWORD`` (unsigned 32 bit integer from 2 registers = 32bit)
|
||||
- ``S_DWORD`` (signed 32 bit integer from 2 registers = 32bit)
|
||||
- ``U_DWORD_R`` (unsigned 32 bit integer from 2 registers low word first)
|
||||
- ``S_DWORD_R`` (signed 32 bit integer from 2 registers low word first)
|
||||
- ``U_QWORD`` (unsigned 64 bit integer from 4 registers = 64bit)
|
||||
- ``S_QWORD`` (unsigned 64 bit integer from 4 registers = 64bit)
|
||||
- ``U_QWORD_R`` (unsigned 64 bit integer from 4 registers low word first)
|
||||
- ``U_QWORD_R`` (signed 64 bit integer from 4 registers low word first)
|
||||
- **register_count**: (*Optional*): The number of registers which are used for this Select. Only
|
||||
required for uncommon response encodings or to
|
||||
:ref:`optimize modbus communications<modbus_register_count>`. Overrides the defaults determined
|
||||
by ``value_type``.
|
||||
- **skip_updates**: (*Optional*, int): By default all sensors of of a modbus_controller are
|
||||
updated together. For data points that don't change very frequently updates can be skipped. A
|
||||
value of 5 would only update this sensor range in every 5th update cycle. Defaults to ``0``.
|
||||
Note: The modbus_controller merges several registers into groups which are updated together. For
|
||||
each group the smallest update cycle is used.
|
||||
- **force_new_range**: (*Optional*, boolean): If possible sensors with sequential addresses are
|
||||
grouped together and requested in one range. Setting this to ``true`` enforces the start of a new
|
||||
range at that address.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **lambda** (*Optional*, :ref:`lambda <config-lambda>`): Lambda to be evaluated every update interval
|
||||
to get the current option of the select.
|
||||
- **write_lambda** (*Optional*, :ref:`lambda <config-lambda>`): Lambda to be evaluated on every update
|
||||
of the Sensor, before the new value is written to the modbus registers.
|
||||
- **use_write_multiple**: (*Optional*, boolean): By default the modbus command ``Preset Single Registers``
|
||||
(function code 6) is used for setting the holding register if only 1 register is set. If your device only supports *Preset Multiple Registers* (function code 16) set this option to ``true``. Defaults
|
||||
to ``false``.
|
||||
- All other options from :ref:`Select <config-select>`.
|
||||
|
||||
|
||||
Parameters passed into ``lambda``
|
||||
---------------------------------
|
||||
|
||||
- **x** (``int64_t``): The parsed integer value of the modbus data.
|
||||
- **data** (``const std::vector<uint8_t>&``): vector containing the complete raw modbus response bytes for this
|
||||
sensor. Note: because the response contains data for all registers in the same range you have to
|
||||
use ``data[item->offset]`` to get the first response byte for your sensor.
|
||||
- **item** (``ModbusSelect*const``): The sensor object itself.
|
||||
|
||||
Possible return values for the lambda:
|
||||
|
||||
- ``return <std::string>;`` The new option for this Select.
|
||||
- ``return {};`` Use default mapping (see ``optionsmap``).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# example
|
||||
lambda: |-
|
||||
ESP_LOGD("Reg1000", "Received value %lld", x);
|
||||
ESP_LOGD("Reg1000", "Parsed from bytes 0x%x;0x%x", data[item->offset], data[item->offset + 1]);
|
||||
if (x > 3) {
|
||||
return std::string("Three");
|
||||
}
|
||||
|
||||
|
||||
Parameters passed into ``write_lambda``
|
||||
---------------------------------------
|
||||
|
||||
- **x** (``const std::string&``): The option value to set for this Select.
|
||||
- **value** (``int64_t``): The mapping value of ``x`` using ``optionsmap``.
|
||||
- **payload** (``std::vector<uint16_t>& payload``): Empty vector for the payload. The lamdba can add
|
||||
16 bit raw modbus register words which are send to the modbus device.
|
||||
- **item** (``ModbusSelect*const``): The sensor object itself.
|
||||
|
||||
Possible return values for the lambda:
|
||||
|
||||
- ``return <int64_t>;`` the value which should be written to the configured modbus registers. If there were data written to ``payload`` this value is ignored.
|
||||
- ``return {};`` Skip updating the register.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# example
|
||||
write_lambda: |-
|
||||
ESP_LOGD("Reg1000", "Set option to %s (%lld)", x.c_str(), value);
|
||||
|
||||
// re-use default option value from optionsmap
|
||||
if (value == 0) {
|
||||
return value;
|
||||
}
|
||||
|
||||
// return own option value
|
||||
if (x == "One") {
|
||||
return 2;
|
||||
}
|
||||
|
||||
// write payload
|
||||
if (x == "Two") {
|
||||
payload.push_back(0x0001);
|
||||
return 0; // any value will do
|
||||
}
|
||||
|
||||
// ignore update
|
||||
return {};
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
- :doc:`/components/modbus_controller`
|
||||
- :doc:`/components/sensor/modbus_controller`
|
||||
- :doc:`/components/binary_sensor/modbus_controller`
|
||||
- :doc:`/components/switch/modbus_controller`
|
||||
- :doc:`/components/text_sensor/modbus_controller`
|
||||
- :doc:`/components/output/modbus_controller`
|
||||
- :ref:`automation`
|
||||
- https://www.modbustools.com/modbus.html
|
||||
- :ghedit:`Edit`
|
@ -14,7 +14,7 @@ and there are also some guides around like the one from `Adam Meyer <http://adam
|
||||
|
||||
Actually, the chip is bidirectional and could also be used as output, but this is not supported by the component yet.
|
||||
|
||||
First, you need to configure the component with the digital pins that control the multiplexer.
|
||||
First, you need to configure the component with the digital pins that control the multiplexer.
|
||||
Then you need to set up a voltage sensor source (e.g. :doc:`ADC sensor <adc>`) and pass it to the cd74hc4067 sensors with the ``sensor`` option.
|
||||
Each cd74hc4067 sensor is configured for one of the 16 input pins of the multiplexer.
|
||||
|
||||
@ -22,20 +22,21 @@ Each cd74hc4067 sensor is configured for one of the 16 input pins of the multipl
|
||||
|
||||
# Example configuration entry
|
||||
cd74hc4067:
|
||||
pin_s0: D0
|
||||
pin_s1: D1
|
||||
pin_s2: D2
|
||||
pin_s3: D3
|
||||
- id: cd74hc4067_1
|
||||
pin_s0: D0
|
||||
pin_s1: D1
|
||||
pin_s2: D2
|
||||
pin_s3: D3
|
||||
|
||||
sensor:
|
||||
- platform: adc
|
||||
- platform: adc
|
||||
id: adc_sensor
|
||||
pin: A0
|
||||
- platform: cd74hc4067
|
||||
- platform: cd74hc4067
|
||||
id: adc_0
|
||||
number: 0
|
||||
sensor: adc_sensor
|
||||
- platform: cd74hc4067
|
||||
- platform: cd74hc4067
|
||||
id: adc_1
|
||||
number: 1
|
||||
sensor: adc_sensor
|
||||
@ -56,13 +57,14 @@ Configuration Variables:
|
||||
************************
|
||||
|
||||
- **sensor** (**Required**, :ref:`config-id`): The source sensor to measure voltage values from, e.g. :doc:`ADC sensor <adc>`.
|
||||
- **cd74hc4067_id** (**Required**, :ref:`config-id`): The id of the cd74hc4067 component to use for this sensor.
|
||||
- **number** (*Required*, int): The number of the cd74hc4067 input pin (0-15)
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
Application Example
|
||||
-------------------
|
||||
|
||||
In this example, the component is used to measure the AC power output of two solar inverters to integrate them
|
||||
In this example, the component is used to measure the AC power output of two solar inverters to integrate them
|
||||
as energy sources in `Home Assistant <https://www.home-assistant.io/docs/energy/solar-panels/>`__.
|
||||
|
||||
For this purpose, :doc:`CT clamp sensors <ct_clamp>` are attached on each of the sensors.
|
||||
@ -72,42 +74,43 @@ The ``adc`` and ``cd74hc4067`` sensors updates are triggered by the ``ct_clamp``
|
||||
.. code-block:: yaml
|
||||
|
||||
cd74hc4067:
|
||||
pin_s0: D0
|
||||
pin_s1: D1
|
||||
pin_s2: D2
|
||||
pin_s3: D3
|
||||
- id: cd74hc4067_1
|
||||
pin_s0: D0
|
||||
pin_s1: D1
|
||||
pin_s2: D2
|
||||
pin_s3: D3
|
||||
|
||||
sensor:
|
||||
- platform: adc
|
||||
- platform: adc
|
||||
id: adc_sensor
|
||||
pin: A0
|
||||
update_interval: 3600s
|
||||
- platform: cd74hc4067
|
||||
- platform: cd74hc4067
|
||||
id: solar_1_raw
|
||||
number: 0
|
||||
sensor: adc_sensor
|
||||
update_interval: 3600s
|
||||
- platform: cd74hc4067
|
||||
- platform: cd74hc4067
|
||||
id: solar_2_raw
|
||||
number: 1
|
||||
sensor: adc_sensor
|
||||
update_interval: 3600s
|
||||
- platform: ct_clamp
|
||||
- platform: ct_clamp
|
||||
name: "SolarPower1"
|
||||
sensor: solar_1_raw
|
||||
update_interval: 5s
|
||||
unit_of_measurement: "W"
|
||||
device_class: "power"
|
||||
filters:
|
||||
- lambda: "return x > 0.001 ? x * 56221 : 0;"
|
||||
- platform: ct_clamp
|
||||
- lambda: "return x > 0.001 ? x * 56221 : 0;"
|
||||
- platform: ct_clamp
|
||||
name: "SolarPower2"
|
||||
sensor: solar_2_raw
|
||||
update_interval: 5s
|
||||
unit_of_measurement: "W"
|
||||
device_class: "power"
|
||||
filters:
|
||||
- lambda: "return x > 0.001 ? x * 57519 : 0;"
|
||||
- lambda: "return x > 0.001 ? x * 57519 : 0;"
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
BIN
components/sensor/images/max9611.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
components/sensor/images/mlx90393-full.jpg
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
components/sensor/images/radon_eye_rd200.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
components/sensor/images/xiaomi_mhoc303.jpg
Normal file
After Width: | Height: | Size: 34 KiB |
78
components/sensor/max9611.rst
Normal file
@ -0,0 +1,78 @@
|
||||
MAX9611/9612 High Side Current+Voltage+Temperature Sensor
|
||||
=========================================================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up MAX9611 MAX9612 High-Side Current-Sense Amplifier
|
||||
:image: max9611.jpg
|
||||
:keywords: MAX9611 MAX9612
|
||||
|
||||
The ``MAX9611`` sensor platform allows you to use your MAX9611/MAX9612
|
||||
(`datasheet <https://datasheets.maximintegrated.com/en/ds/MAX9611-MAX9612.pdf>`__)
|
||||
High-side current, voltage and temperature sensors with ESPHome.
|
||||
|
||||
This sensor supports up to +60V DC common mode voltage, has a 1.8V to 3.3V logic range,
|
||||
a 12-Bit integrated ADC with :ref:`I²C <i2c>`, and is meant to act as a high-side current sense amplifier.
|
||||
|
||||
The :ref:`I²C <i2c>` is
|
||||
required to be set up in your configuration for this sensor to work.
|
||||
|
||||
.. figure:: images/max9611.jpg
|
||||
:align: center
|
||||
:width: 50.0%
|
||||
|
||||
MAX9611 High-Side Current-Sense Amplifier
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: max9611
|
||||
shunt_resistance: 0.2 ohm
|
||||
gain: '1X'
|
||||
voltage:
|
||||
name: Max9611 Voltage
|
||||
current:
|
||||
name: Max9611 Current
|
||||
power:
|
||||
name: Max9611 Watts
|
||||
temperature:
|
||||
name: Max9611 Temperature
|
||||
address: 0x70
|
||||
update_interval: 60s
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **shunt_resistance** (*Required*): The value of the High Side Shunt Resistor.
|
||||
|
||||
- **Voltage** (*Optional*): The information for the voltage sensor
|
||||
|
||||
- **name** (**Required**, string): The name for the voltage sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **Current** (*Optional*): The information for the current sensor, scaled by the gain factor and multiplied by voltage
|
||||
|
||||
- **name** (**Required**, string): The name for the current sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **Power** (*Optional*): The information for the power sensor
|
||||
|
||||
- **name** (**Required**, string): The name for the power sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **temperature** (*Optional*): The information for the temperature sensor
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature sensor.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
|
||||
- **address** (*Optional*, int): Manually specify the I²C address of
|
||||
the sensor. Defaults to ``0x70``.
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the
|
||||
sensor. Defaults to ``60s``.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :ghedit:`Edit`
|
115
components/sensor/mlx90393.rst
Normal file
@ -0,0 +1,115 @@
|
||||
MLX90393 Triple-axis Magnetometer
|
||||
=================================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up MLX90393 Triple-Axis magnetometer sensor.
|
||||
:image: mlx90393.jpg
|
||||
:keywords: MLX90393
|
||||
|
||||
The ``mlx90393`` sensor platform allows you to use your MLX90393
|
||||
(`datasheet <https://media.melexis.com/-/media/files/documents/datasheets/mlx90393-datasheet-melexis.pdf>`__,
|
||||
`Adafruit`_) three axis magnetometer with ESPHome. The :ref:`I²C <i2c>` is required to be set up in
|
||||
your configuration for this sensor to work.
|
||||
|
||||
.. figure:: images/mlx90393-full.jpg
|
||||
:align: center
|
||||
:width: 50.0%
|
||||
|
||||
MLX90393 Triple-axis Magnetometer
|
||||
|
||||
.. _Adafruit: https://www.adafruit.com/product/4022
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: mlx90393
|
||||
id: mlx
|
||||
x_axis:
|
||||
name: "x"
|
||||
y_axis:
|
||||
name: "y"
|
||||
z_axis:
|
||||
name: "z"
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **x_axis** (*Optional*): The information for the x-axis.
|
||||
|
||||
- **name** (**Required**, string): The name for the x-axis sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- **resolution** (*Optional*, int): Set resolution. Defaults to ``19BIT``. Must be one of:
|
||||
|
||||
- ``16BIT``
|
||||
- ``17BIT``
|
||||
- ``18BIT``
|
||||
- ``19BIT``
|
||||
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **y_axis** (*Optional*): The information for the y-axis.
|
||||
|
||||
- **name** (**Required**, string): The name for the y-axis sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- **resolution** (*Optional*, int): Set resolution. Defaults to ``19BIT``. Must be one of:
|
||||
|
||||
- ``16BIT``
|
||||
- ``17BIT``
|
||||
- ``18BIT``
|
||||
- ``19BIT``
|
||||
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **z_axis** (*Optional*): The information for the z-axis.
|
||||
|
||||
- **name** (**Required**, string): The name for the z-axis sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- **resolution** (*Optional*, int): Set resolution. Defaults to ``16BIT``. Must be one of:
|
||||
|
||||
- ``16BIT``
|
||||
- ``17BIT``
|
||||
- ``18BIT``
|
||||
- ``19BIT``
|
||||
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **temperature** (*Optional*): Built-in temperature sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- **oversampling** (*Optional*, int): On-chip oversampling for the temperature sensor. Defaults to `0`. Must be between `0` and `3`.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **drdy_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): Data-ready pin. Often labelled ``INT``. Using this pin might lead to slightly quicker read times.
|
||||
|
||||
- **gain** (*Optional*, int): Specify the gain. Defaults to ``2_5X``. Must be one of
|
||||
|
||||
- ``1X``
|
||||
- ``1_33X``
|
||||
- ``1_67X``
|
||||
- ``2X``
|
||||
- ``2_5X``
|
||||
- ``3X``
|
||||
- ``4X``
|
||||
- ``5X``
|
||||
|
||||
- **oversampling** (*Optional*, int): On-chip oversampling. Defaults to ``2``. Must be between ``0`` and ``3``.
|
||||
|
||||
- **filter** (*Optional*, int): On-chip digital filter. Defaults to ``6``. Must be between ``0`` and ``7``.
|
||||
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the
|
||||
sensor. Defaults to ``60s``.
|
||||
|
||||
- **address** (*Optional*, int): Manually specify the I²C address of
|
||||
the sensor. Defaults to ``0x0C``.
|
||||
|
||||
- **i2c_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`I²C Component <i2c>` if you want
|
||||
to use multiple I²C buses.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- `arduino-MLX90393 <https://github.com/functionpointer/arduino-MLX90393>`__
|
||||
- :ghedit:`Edit`
|
102
components/sensor/radon_eye_ble.rst
Normal file
@ -0,0 +1,102 @@
|
||||
Radon Eye BLE Sensors
|
||||
=====================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up Radon Eye bluetooth-based sensors in ESPHome.
|
||||
:keywords: Radon, RadonEye, RD200, BLE, Bluetooth, Wave Plus, Wave Mini
|
||||
|
||||
The ``radon_eye_rd200`` sensor platforms lets you track the output of Radon Eye RD200 Bluetooth Low Energy device.
|
||||
|
||||
This component will track radon concentration.
|
||||
|
||||
Device Discovery
|
||||
-----------------
|
||||
|
||||
RadonEye devices can be found using the ``radon_eye_ble`` ble scanner.
|
||||
|
||||
To find out your device's MAC address, add the following to your ESPHome configuration:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
logger:
|
||||
level: DEBUG # Required for the tracker to show the device
|
||||
|
||||
esp32_ble_tracker:
|
||||
radon_eye_ble:
|
||||
|
||||
The device will then listen for nearby devices, and display a message like this one:
|
||||
|
||||
.. code-block:: text
|
||||
|
||||
[D][radon_eye_ble:017]:
|
||||
Found Radon Eye RD200 device Name: FR:R20:SN1234 (MAC: 01:02:03:04:05:06)
|
||||
|
||||
Once the device is found, remove the ``radon_eye_ble`` device tracker from your configuration and
|
||||
take note of the device MAC address, and use it when configuring a sensor below.
|
||||
|
||||
Supported Devices
|
||||
-----------------
|
||||
|
||||
Radon Eye RD200
|
||||
***************
|
||||
|
||||
Radon Eye RD200 tracks radon concentration over short periods (5 min interval) and longer periods
|
||||
(24h or month).
|
||||
|
||||
The ``radon_long_term`` sensor is populated with the longest available measurement. The RD200
|
||||
provides a 24hr measurement and a 1 month measurement.
|
||||
|
||||
If the 1 month isn't available, it will use
|
||||
the 24hr. If the 24hr isn't available either, it will not publish the value.
|
||||
|
||||
.. figure:: images/radon_eye_rd200.jpg
|
||||
:align: center
|
||||
:width: 60.0%
|
||||
|
||||
Configuration example:
|
||||
**********************
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
|
||||
ble_client:
|
||||
- mac_address: 01:02:03:04:05:06
|
||||
id: radon_eye_ble_id
|
||||
|
||||
sensor:
|
||||
- platform: radon_eye_rd200
|
||||
ble_client_id: radon_eye_ble_id
|
||||
update_interval: 5min # default
|
||||
radon:
|
||||
name: "Radon"
|
||||
radon_long_term:
|
||||
name: "Radon Long Term"
|
||||
|
||||
Here is an example to use pCi/L (to match the value on the device display):
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
|
||||
ble_client:
|
||||
- mac_address: 01:02:03:04:05:06
|
||||
id: radon_eye_ble_id
|
||||
|
||||
sensor:
|
||||
- platform: radon_eye_rd200
|
||||
ble_client_id: radon_eye_ble_id
|
||||
update_interval: 5min # default
|
||||
radon:
|
||||
name: "Radon"
|
||||
unit_of_measurement: "pCi/L"
|
||||
accuracy_decimals: 2
|
||||
filters:
|
||||
- lambda: return x / 37;
|
||||
radon_long_term:
|
||||
name: "Radon Long Term"
|
||||
unit_of_measurement: "pCi/L"
|
||||
accuracy_decimals: 2
|
||||
filters:
|
||||
- lambda: return x / 37;
|
||||
|
@ -49,18 +49,16 @@ required to be set up in your configuration for this sensor to work.
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **red_channel** (*Optional*): Get the percentage of how strongly the red color channel is activated.
|
||||
- **red_channel** (*Optional*): Value of the red color channel relative to the clear channel, as a percentage.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **green_channel** (*Optional*): Get the percentage of how strongly the green color channel is activated.
|
||||
- **green_channel** (*Optional*): Value of the green color channel relative to the clear channel, as a percentage.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **blue_channel** (*Optional*): Get the percentage of how strongly the blue color channel is activated.
|
||||
- **blue_channel** (*Optional*): Value of the blue color channel relative to the clear channel, as a percentage.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **clear_channel** (*Optional*): Get the percentage of how strongly the clear (without a color filter)
|
||||
channel is activated. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **clear_channel** (*Optional*): Value of the clear (without a color filter) channel, relative to the maximum value for
|
||||
the chosen integration time. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **illuminance** (*Optional*): Get the total illuminance of the sensor in lx.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **color_temperature** (*Optional*): Get the calculated color temperature of the light in Kelvin.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **gain** (*Optional*): Set the gain for the internal ADCs to work better in certain low-light conditions. Valid
|
||||
values are ``1x`` (default), ``4x``, ``16x``, ``60x`` (highest gain).
|
||||
- **integration_time** (*Optional*): The amount of time the light sensor is exposed. Valid values are
|
||||
@ -72,6 +70,7 @@ Configuration variables:
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the
|
||||
sensor. Defaults to ``60s``.
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -30,6 +30,9 @@ The TSL2591 device is available on breakout boards from a few vendors
|
||||
|
||||
The sensor claims a dynamic range of 600 million to 1 with an effective maximum of 88000 lux.
|
||||
It achieves that large range by having a configurable ``gain`` value.
|
||||
For many applications, you can use AUTO gain to have the ESP select a suitable gain setting based on
|
||||
the previous measurement. If light levels change dramatically this may cause the next reading to saturate,
|
||||
after which the gain will adjust down and subsequent readings will be in range.
|
||||
Use a higher gain value when measuring less intense light sources.
|
||||
On the other hand, if you get ADC readings of 65,535 for either physical sensor,
|
||||
you may be saturating that sensor and need to reduce the gain.
|
||||
@ -121,9 +124,10 @@ For the TSL2591 device:
|
||||
You cannot specify an arbitrary gain multiplier. It must be one of:
|
||||
|
||||
- ``low``, ``1x``
|
||||
- ``medium``, ``med``, ``25x`` *(default)*
|
||||
- ``medium``, ``med``, ``25x``
|
||||
- ``high``, ``400x``
|
||||
- ``maximum``, ``max``, ``9500x``
|
||||
- ``auto`` *(default)*
|
||||
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval for checking the sensors.
|
||||
Defaults to ``60s``.
|
||||
|
@ -237,6 +237,31 @@ Configuration example for PVVX MiThermometer firmware set to "Custom" advertisem
|
||||
battery_voltage:
|
||||
name: "PVVX Battery-Voltage"
|
||||
|
||||
MHO-C303
|
||||
********
|
||||
|
||||
Hygro thermometer clock with alarm, rectangular body, e-ink display, broadcasts temperature, humidity and battery status. Not encrypted.
|
||||
|
||||
.. figure:: images/xiaomi_mhoc303.jpg
|
||||
:align: center
|
||||
:width: 30.0%
|
||||
|
||||
Similar to the LYWSD02, with additional clock features (alarm, pomodoro timer). Runs on two AAA batteries.
|
||||
|
||||
Configuration example:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
sensor:
|
||||
- platform: xiaomi_mhoc303
|
||||
mac_address: "E7:50:59:32:A0:1C"
|
||||
temperature:
|
||||
name: "MHO-C303 Climate Temperature"
|
||||
humidity:
|
||||
name: "MHO-C303 Climate Humidity"
|
||||
battery_level:
|
||||
name: "MHO-C303 Climate Battery Level"
|
||||
|
||||
MHO-C401
|
||||
********
|
||||
|
||||
|
@ -42,6 +42,9 @@ Configuration variables:
|
||||
See https://developers.home-assistant.io/docs/core/entity/#generic-properties
|
||||
for a list of available options. Requires Home Assistant 2021.11 or newer.
|
||||
Set to ``""`` to remove the default entity category.
|
||||
- **device_class** (*Optional*, string): The device class for the switch.
|
||||
See https://developers.home-assistant.io/docs/core/entity/switch/#available-device-classes
|
||||
for a list of available options. Requires Home Assistant 2022.3 or newer.
|
||||
- If MQTT enabled, All other options from :ref:`MQTT Component <config-mqtt-component>`.
|
||||
|
||||
.. _switch-toggle_action:
|
||||
|
37
components/touchscreen/ektf2232.rst
Normal file
@ -0,0 +1,37 @@
|
||||
EKTF2232 Touchscreen Controller
|
||||
================================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up EKTF2232 touchscreen controller with ESPHome
|
||||
:image: ektf2232.svg
|
||||
:keywords: EKTF2232
|
||||
|
||||
The ``ektf2232`` component allows using the touchscreen controller
|
||||
found in the :doc:`Inkplate 6 Plus </components/display/inkplate6>` with ESPHome.
|
||||
The :ref:`I²C <i2c>` is required to be set up in your configuration for this sensor to work.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
touchscreen:
|
||||
- platform: ektf2232
|
||||
interrupt_pin: GPIO36
|
||||
rts_pin: GPIO16
|
||||
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually set the ID of this touchscreen.
|
||||
- **rts_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The reset pin of the controller.
|
||||
- **interupt_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The touch detection pin.
|
||||
|
||||
- All other options from :ref:`config-touchscreen`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`Touchscreen <index>`
|
||||
- :doc:`Inkplate 6 Plus </components/display/inkplate6>`
|
||||
- :apiref:`ektf2232/ektf2232.h`
|
||||
- :ghedit:`Edit`
|
90
components/touchscreen/index.rst
Normal file
@ -0,0 +1,90 @@
|
||||
Touchscreen Components
|
||||
======================
|
||||
|
||||
.. seo::
|
||||
:description: Instruction for using touchscreen components.
|
||||
:image: folder-open.svg
|
||||
|
||||
The ``touchscreen`` component holds the base code for most touchscreen components
|
||||
available in ESPHome and is responsible for passing the touch events to
|
||||
``binary_sensors`` with the ``touchscreen`` platform.
|
||||
|
||||
.. _config-touchscreen:
|
||||
|
||||
Base Touchscreen Configuration
|
||||
------------------------------
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example touchscreen
|
||||
touchscreen:
|
||||
- platform: ...
|
||||
on_touch:
|
||||
then:
|
||||
...
|
||||
|
||||
Configuration variables:
|
||||
************************
|
||||
|
||||
- **on_touch** (*Optional*, :ref:`Automation <automation>`): An automation to perform
|
||||
when the touchscreen is touched. See :ref:`touchscreen-on_touch`.
|
||||
- **display** (**Required**, :ref:`config-id`): The display to use. If only one display is
|
||||
available, this can be omitted.
|
||||
|
||||
.. _touchscreen-on_touch:
|
||||
|
||||
``on_touch`` Trigger
|
||||
--------------------
|
||||
|
||||
This automation will be triggered when the touchscreen detects a touch.
|
||||
|
||||
This trigger provides one arguments of type :apistruct:`touchscreen::TouchPoint` which has two integer members: ``x`` and ``y`` which
|
||||
represent the position of the touch in relation to the display width and height. It also has optional members that will be set
|
||||
depending on the touchscreen platform.
|
||||
|
||||
Binary Sensor
|
||||
-------------
|
||||
|
||||
The ``touchscreen`` binary sensor allows you to setup areas on the touch screen as virtual
|
||||
buttons.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
binary_sensor:
|
||||
- platform: touchscreen
|
||||
name: Top Left Touch Button
|
||||
x_min: 0
|
||||
x_max: 100
|
||||
y_min: 0
|
||||
y_max: 100
|
||||
|
||||
Configuration Variables:
|
||||
************************
|
||||
|
||||
- **name** (*Optional*, string): The name for the binary sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **touchscreen_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the touchscreen.
|
||||
- **x_min** (**Required**, int): Left coordinate of the screen area to be detected as the virtual button.
|
||||
- **x_max** (**Required**, int): Right coordinate of the screen area to be detected as the virtual button.
|
||||
- **y_min** (**Required**, int): Top coordinate of the screen area to be detected as the virtual button.
|
||||
- **y_max** (**Required**, int): Bottom coordinate of the screen area to be detected as the virtual button.
|
||||
|
||||
- All other options from :ref:`Binary Sensor <config-binary_sensor>`.
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`Binary Sensor Filters <binary_sensor-filters>`
|
||||
- :doc:`Inkplate 6 Plus </components/display/inkplate6>`
|
||||
- :doc:`EKTF2232 </components/touchscreen/ektf2232>`
|
||||
- :doc:`XPT2046 </components/binary_sensor/xpt2046>`
|
||||
- :apiref:`touchscreen/touchscreen.h`
|
||||
- :apiref:`touchscreen/binary_sensor/touchscreen_binary_sensor.h`
|
||||
- :ghedit:`Edit`
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
*
|
35
components/touchscreen/lilygo_t5_47.rst
Normal file
@ -0,0 +1,35 @@
|
||||
Lilygo T5 4.7" Touchscreen
|
||||
==========================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up the Lilygo T5 4.7" Touchscreen with ESPHome
|
||||
:image: lilygo_t5_47_touch.png
|
||||
:keywords: Lilygo T5 4.7" Touchscreen
|
||||
|
||||
The ``liygo_t5_47`` touchscreen platform allows using the touchscreen controller
|
||||
for the Lilygo T5 4.7" e-Paper Display with ESPHome.
|
||||
The :ref:`I²C <i2c>` is required to be set up in your configuration for this touchscreen to work.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
touchscreen:
|
||||
- platform: lilygo_t5_47
|
||||
interrupt_pin: GPIO13
|
||||
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually set the ID of this touchscreen.
|
||||
- **interupt_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The touch detection pin.
|
||||
Must be ``GPIO13``.
|
||||
|
||||
- All other options from :ref:`config-touchscreen`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`Touchscreen <index>`
|
||||
- :apiref:`lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.h`
|
||||
- :ghedit:`Edit`
|
@ -276,5 +276,6 @@ See Also
|
||||
--------
|
||||
|
||||
- :doc:`captive_portal`
|
||||
- :doc:`network`
|
||||
- :apiref:`wifi/wifi_component.h`
|
||||
- :ghedit:`Edit`
|
||||
|
4
conf.py
@ -67,9 +67,9 @@ author = "Otto Winter"
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = "2022.1"
|
||||
version = "2022.2"
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = "2022.1.4"
|
||||
release = "2022.2.0"
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -68,6 +68,7 @@ Contributors
|
||||
- `Andy Allsopp (@arallsopp) <https://github.com/arallsopp>`__
|
||||
- `arantius (@arantius) <https://github.com/arantius>`__
|
||||
- `arunderwood (@arunderwood) <https://github.com/arunderwood>`__
|
||||
- `Borys Pierov (@ashald) <https://github.com/ashald>`__
|
||||
- `Ash McKenzie (@ashmckenzie) <https://github.com/ashmckenzie>`__
|
||||
- `Ashton Kemerling (@AshtonKem) <https://github.com/AshtonKem>`__
|
||||
- `Pavel Pletenev (@ASMfreaK) <https://github.com/ASMfreaK>`__
|
||||
@ -88,6 +89,7 @@ Contributors
|
||||
- `bazuchan (@bazuchan) <https://github.com/bazuchan>`__
|
||||
- `Viktr (@BbIKTOP) <https://github.com/BbIKTOP>`__
|
||||
- `J. Nick Koston (@bdraco) <https://github.com/bdraco>`__
|
||||
- `Benno Pütz (@bennop) <https://github.com/bennop>`__
|
||||
- `Ben Suffolk (@bensuffolk) <https://github.com/bensuffolk>`__
|
||||
- `Arturo Casal (@berfenger) <https://github.com/berfenger>`__
|
||||
- `Ivan Bessarabov (@bessarabov) <https://github.com/bessarabov>`__
|
||||
@ -314,10 +316,10 @@ Contributors
|
||||
- `Arjan Filius (@iafilius) <https://github.com/iafilius>`__
|
||||
- `Adrián Panella (@ianchi) <https://github.com/ianchi>`__
|
||||
- `Ian Leeder (@ianleeder) <https://github.com/ianleeder>`__
|
||||
- `Jan Pobořil (@iBobik) <https://github.com/iBobik>`__
|
||||
- `igg (@igg) <https://github.com/igg>`__
|
||||
- `Petko Bordjukov (@ignisf) <https://github.com/ignisf>`__
|
||||
- `ikatkov (@ikatkov) <https://github.com/ikatkov>`__
|
||||
- `Michael (@imeekle) <https://github.com/imeekle>`__
|
||||
- `imgbot[bot] (@imgbot[bot]) <https://github.com/imgbot[bot]>`__
|
||||
- `Lorenzo Ortiz (@Infinitte) <https://github.com/Infinitte>`__
|
||||
- `irtimaled (@irtimaled) <https://github.com/irtimaled>`__
|
||||
@ -586,6 +588,7 @@ Contributors
|
||||
- `probonopd (@probonopd) <https://github.com/probonopd>`__
|
||||
- `Peter Stuifzand (@pstuifzand) <https://github.com/pstuifzand>`__
|
||||
- `Peter Tatrai (@ptatrai) <https://github.com/ptatrai>`__
|
||||
- `Patrick Toal (@ptoal) <https://github.com/ptoal>`__
|
||||
- `Leandro Puerari (@puerari) <https://github.com/puerari>`__
|
||||
- `puuu (@puuu) <https://github.com/puuu>`__
|
||||
- `Qc (@qc24) <https://github.com/qc24>`__
|
||||
@ -783,7 +786,6 @@ Contributors
|
||||
- `Pavel (@yekm) <https://github.com/yekm>`__
|
||||
- `Atsuko Ito (@yottatsa) <https://github.com/yottatsa>`__
|
||||
- `Nico B (@youknow0) <https://github.com/youknow0>`__
|
||||
- `YuanL.Lee (@yuanl) <https://github.com/yuanl>`__
|
||||
- `Yuval Aboulafia (@yuvalabou) <https://github.com/yuvalabou>`__
|
||||
- `zaluthar (@zaluthar) <https://github.com/zaluthar>`__
|
||||
- `david reid (@zathras777) <https://github.com/zathras777>`__
|
||||
@ -792,4 +794,4 @@ Contributors
|
||||
- `San (@zhujunsan) <https://github.com/zhujunsan>`__
|
||||
- `Christian Zufferey (@zuzu59) <https://github.com/zuzu59>`__
|
||||
|
||||
*This page was last updated February 9, 2022.*
|
||||
*This page was last updated February 16, 2022.*
|
||||
|
1
images/ektf2232.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="491.773" height="98.944" viewBox="0 0 130.115 26.179" xmlns="http://www.w3.org/2000/svg"><path style="fill:#000;fill-opacity:1;stroke-width:.133497;stroke-miterlimit:4;stroke-dasharray:none" d="M6.271 0h117.573a6.257 6.257 0 0 1 6.271 6.271v13.637a6.257 6.257 0 0 1-6.271 6.271H6.27A6.257 6.257 0 0 1 0 19.908V6.27A6.257 6.257 0 0 1 6.271 0Z"/><g aria-label="EKTF2232" style="font-size:10.5833px;line-height:1.25;letter-spacing:1.08479px;fill:#fffffc;stroke-width:.264583"><path d="M10.115 14.073v3.658h8.602v2.935H6.48V4.862h11.944v2.935h-8.309v3.431h7.338v2.845zM37.796 20.666H33.53l-5.057-6.209-2.123 2.213v3.996h-3.635V4.862h3.635v7.382l7-7.382h4.064l-6.548 7.044zM46.354 20.666h-3.657V7.842h-5.058v-2.98h13.773v2.98h-5.058zM66.405 4.862v2.935h-8.286v4.177h7.315v2.935h-7.315v5.757H54.46V4.862ZM74.082 17.686h6.796v2.98H68.934v-2.37l6.096-5.758q.971-.926 1.31-1.58.339-.678.339-1.333 0-.948-.655-1.445-.632-.519-1.874-.519-1.039 0-1.874.407-.836.383-1.4 1.174l-2.664-1.716q.926-1.378 2.551-2.145 1.626-.79 3.725-.79 1.762 0 3.071.587 1.332.564 2.055 1.625.745 1.039.745 2.461 0 1.287-.542 2.416t-2.1 2.574zM88.488 17.686h6.796v2.98H83.34v-2.37l6.096-5.758q.97-.926 1.31-1.58.338-.678.338-1.333 0-.948-.655-1.445-.632-.519-1.873-.519-1.04 0-1.874.407-.836.383-1.4 1.174l-2.664-1.716q.925-1.378 2.55-2.145 1.626-.79 3.726-.79 1.761 0 3.07.587 1.333.564 2.055 1.625.745 1.039.745 2.461 0 1.287-.541 2.416-.542 1.129-2.1 2.574zM105.264 11.296q2.077.339 3.184 1.558 1.106 1.197 1.106 2.98 0 1.378-.723 2.552-.722 1.151-2.212 1.851-1.468.7-3.613.7-1.67 0-3.296-.429-1.603-.452-2.732-1.264l1.422-2.8q.904.677 2.078 1.061 1.196.361 2.438.361 1.377 0 2.168-.519.79-.542.79-1.513 0-1.941-2.958-1.941h-1.67v-2.416l3.25-3.68h-6.728V4.862h11.063v2.37zM117.231 17.686h6.796v2.98h-11.943v-2.37l6.096-5.758q.97-.926 1.31-1.58.338-.678.338-1.333 0-.948-.655-1.445-.632-.519-1.874-.519-1.038 0-1.874.407-.835.383-1.4 1.174l-2.664-1.716q.926-1.378 2.551-2.145 1.626-.79 3.726-.79 1.76 0 3.07.587 1.333.564 2.055 1.625.745 1.039.745 2.461 0 1.287-.542 2.416t-2.1 2.574z" style="font-weight:700;font-size:22.5778px;font-family:Montserrat;-inkscape-font-specification:'Montserrat, Bold'"/></g></svg>
|
After Width: | Height: | Size: 2.1 KiB |
BIN
images/lilygo_t5_47_touch.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
images/max9611.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
images/mlx90393.jpg
Normal file
After Width: | Height: | Size: 35 KiB |
500
images/qr-code.svg
Normal file
@ -0,0 +1,500 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="464px" height="464px" viewBox="0 0 464 464" enable-background="new 0 0 464 464" xml:space="preserve">
|
||||
<rect x="0" y="0" width="464" height="464" fill="rgb(255,255,255)" /><g transform="translate(32,32)"><g transform="translate(128,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,0) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,16) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,16) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,16) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,16) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,16) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,32) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,32) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,32) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,32) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,32) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,48) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,48) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,64) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,64) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,64) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,64) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,80) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,80) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,80) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,80) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,80) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,96) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,96) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,96) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,96) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,96) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,112) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,112) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,112) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,112) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(64,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(96,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,128) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(16,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(32,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(64,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,144) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(16,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(96,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,160) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(64,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,176) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(96,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,192) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(32,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,208) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(32,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(96,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,224) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(32,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(64,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,240) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(16,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(48,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(64,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(96,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(112,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,256) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,272) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,288) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,288) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,288) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,288) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,304) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,320) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(256,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,336) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(224,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,352) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(176,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(272,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(304,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(336,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,368) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(128,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(144,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(192,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(208,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(288,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(352,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(368,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(384,384) scale(0.16,0.16)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,0) scale(1.12, 1.12)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<g>
|
||||
<rect x="15" y="15" style="fill:none;" width="70" height="70"/>
|
||||
<path d="M85,0H15H0v15v70v15h15h70h15V85V15V0H85z M85,85H15V15h70V85z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(288,0) scale(1.12, 1.12)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<g>
|
||||
<rect x="15" y="15" style="fill:none;" width="70" height="70"/>
|
||||
<path d="M85,0H15H0v15v70v15h15h70h15V85V15V0H85z M85,85H15V15h70V85z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(0,288) scale(1.12, 1.12)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<g>
|
||||
<rect x="15" y="15" style="fill:none;" width="70" height="70"/>
|
||||
<path d="M85,0H15H0v15v70v15h15h70h15V85V15V0H85z M85,85H15V15h70V85z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(32,32) scale(0.48, 0.48)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,32) scale(0.48, 0.48)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(32,320) scale(0.48, 0.48)"><g transform="" style="fill: rgb(0, 0, 0);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g></g></svg>
|
After Width: | Height: | Size: 33 KiB |
BIN
images/radon_eye_logo.png
Normal file
After Width: | Height: | Size: 16 KiB |
27
index.rst
@ -142,6 +142,7 @@ Core Components
|
||||
Core, components/esphome, cloud-circle.svg
|
||||
WiFi, components/wifi, network-wifi.svg
|
||||
MQTT, components/mqtt, mqtt.png
|
||||
Network, components/network, network-wifi.svg
|
||||
|
||||
I²C Bus, components/i2c, i2c.svg
|
||||
SPI Bus, components/spi, spi.svg
|
||||
@ -187,6 +188,7 @@ Air Quality
|
||||
PM1006 Sensor, components/sensor/pm1006, pm1006.jpg, Particulate
|
||||
PMSA003I, components/sensor/pmsa003i, pmsa003i.jpg, Particulate
|
||||
PMSX003, components/sensor/pmsx003, pmsx003.svg, Particulate
|
||||
RadonEye BLE, components/sensor/radon_eye_ble, radon_eye_logo.png, Radon
|
||||
SDS011 Sensor, components/sensor/sds011, sds011.jpg, Particulate
|
||||
SenseAir, components/sensor/senseair, senseair_s8.jpg, CO2
|
||||
SCD30, components/sensor/scd30, scd30.jpg, CO2 & Temperature & Humidity
|
||||
@ -261,6 +263,7 @@ Electricity
|
||||
INA226, components/sensor/ina226, ina226.jpg, DC Current & Power
|
||||
INA260, components/sensor/ina260, ina260.jpg, DC Current & Power
|
||||
INA3221, components/sensor/ina3221, ina3221.jpg, 3-Ch DC current
|
||||
MAX9611, components/sensor/max9611, max9611.jpg, +60VDC Voltage & Current & Power & Temperature
|
||||
PZEM AC, components/sensor/pzemac, pzem-ac.jpg, Voltage & Current & Power
|
||||
PZEM DC, components/sensor/pzemdc, pzem-dc.jpg, Voltage & Current & Power
|
||||
PZEM004T, components/sensor/pzem004t, pzem004t.svg, Voltage & Current & Power
|
||||
@ -295,6 +298,7 @@ Environmental
|
||||
MH-Z19, components/sensor/mhz19, mhz19.jpg, CO2 & Temperature
|
||||
MS5611, components/sensor/ms5611, ms5611.jpg, Pressure
|
||||
NTC Thermistor, components/sensor/ntc, ntc.jpg, Temperature
|
||||
RadonEye BLE, components/sensor/radon_eye_ble, radon_eye_logo.png, Radon
|
||||
RuuviTag, components/sensor/ruuvitag, ruuvitag.jpg, Temperature & Humidity & Accelerometer
|
||||
SCD30, components/sensor/scd30, scd30.jpg, CO2 & Temperature & Humidity
|
||||
SCD4X, components/sensor/scd4x, scd4x.jpg, CO2 & Temperature & Humidity
|
||||
@ -326,6 +330,7 @@ Magnetic
|
||||
|
||||
ESP32 Hall Sensor, components/sensor/esp32_hall, magnet.svg, ESP internal
|
||||
HMC5883L, components/sensor/hmc5883l, hmc5883l.jpg, 3-Axis magnetometer
|
||||
MLX90393, components/sensor/mlx90393, mlx90393.jpg, 3-Axis magnetometer
|
||||
QMC5883L, components/sensor/qmc5883l, qmc5883l.jpg, 3-Axis magnetometer
|
||||
|
||||
|
||||
@ -401,6 +406,7 @@ Binary Sensor Components
|
||||
Modbus Binary Sensor, components/binary_sensor/modbus_controller, modbus.png
|
||||
XPT2046, components/binary_sensor/xpt2046, xpt2046.jpg
|
||||
CAP1188 Capacitive Touch Sensor, components/binary_sensor/cap1188, cap1188.jpg
|
||||
Touchscreen, components/touchscreen/index, touch.svg
|
||||
Custom Binary Sensor, components/binary_sensor/custom, language-cpp.svg
|
||||
|
||||
Output Components
|
||||
@ -483,7 +489,9 @@ Button Components
|
||||
|
||||
Button Core, components/button/index, folder-open.svg
|
||||
Template Button, components/button/template, description.svg
|
||||
Generic Output Button, components/button/output, upload.svg
|
||||
Restart Button, components/button/restart, restart.svg
|
||||
Wake-on-LAN, components/button/wake_on_lan, power_settings.svg
|
||||
|
||||
Fan Components
|
||||
--------------
|
||||
@ -522,6 +530,15 @@ Display Components
|
||||
Inkplate, components/display/inkplate6, inkplate6.jpg
|
||||
PCD8544 (Nokia 5110/ 3310), components/display/pcd8544, pcd8544.jpg
|
||||
|
||||
Touchscreen Components
|
||||
----------------------
|
||||
|
||||
.. imgtable::
|
||||
|
||||
Touchscreen Core, components/touchscreen/index, folder-open.svg
|
||||
EKTF2232, components/touchscreen/ektf2232, ektf2232.svg, Inkplate 6 Plus
|
||||
Lilygo T5 4.7", components/touchscreen/lilygo_t5_47, lilygo_t5_47_touch.png
|
||||
|
||||
Cover Components
|
||||
----------------
|
||||
|
||||
@ -585,6 +602,16 @@ Select Components
|
||||
|
||||
Select Core, components/select/index, folder-open.svg
|
||||
Template Select, components/select/template, description.svg
|
||||
Modbus Select, components/select/modbus_controller, modbus.png
|
||||
|
||||
Lock Components
|
||||
-----------------
|
||||
|
||||
.. imgtable::
|
||||
|
||||
Lock Core, components/lock/index, folder-open.svg
|
||||
Generic Output Lock, components/lock/output, upload.svg
|
||||
Template Lock, components/lock/template, description.svg
|
||||
|
||||
Misc Components
|
||||
---------------
|
||||
|