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 = 2023.2.4
|
||||
PROJECT_NUMBER = 2023.3.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 = 2023.2.4
|
||||
ESPHOME_REF = 2023.3.0
|
||||
|
||||
.PHONY: html html-strict cleanhtml deploy help live-html Makefile netlify netlify-api api netlify-dependencies svg2png copy-svg2png minify
|
||||
|
||||
|
@ -8,3 +8,4 @@
|
||||
/devices/esp32.html /components/esp32.html
|
||||
|
||||
/changelog/2022.12.4.html /changelog/2022.12.0.html 301
|
||||
/components/display/ili9341.html /components/display/ili9xxx.html 301
|
||||
|
BIN
_static/changelog-2023.3.0.png
Normal file
After Width: | Height: | Size: 93 KiB |
@ -1 +1 @@
|
||||
2023.2.4
|
||||
2023.3.0
|
216
changelog/2023.3.0.rst
Normal file
@ -0,0 +1,216 @@
|
||||
ESPHome 2023.3.0 - 15th March 2023
|
||||
==================================
|
||||
|
||||
.. seo::
|
||||
:description: Changelog for ESPHome 2023.3.0.
|
||||
:image: /_static/changelog-2023.3.0.png
|
||||
:author: Jesse Hills
|
||||
:author_twitter: @jesserockz
|
||||
|
||||
.. imgtable::
|
||||
:columns: 4
|
||||
|
||||
Internal Temperature, components/sensor/internal_temperature, thermometer.svg
|
||||
Mopeka Standard Check LP, components/sensor/mopeka_std_check, mopeka_std_check.jpg
|
||||
Person Sensor (SEN21231), components/sensor/sen21231, sen21231.png
|
||||
Haier Climate, components/climate/haier, haier.svg
|
||||
FS3000, components/sensor/fs3000, fs3000.jpg
|
||||
Absolute Humidity, components/sensor/absolute_humidity, water-drop.svg
|
||||
AS7341, components/sensor/as7341, as7341.jpg, Spectral Color Sensor
|
||||
|
||||
|
||||
Sprinkler updates
|
||||
-----------------
|
||||
|
||||
The sprinkler component has had a big update thanks to :ghuser:`kbx81`.
|
||||
The method ``time_remaining()`` has been renamed to ``time_remaining_active_valve()`` for clarity.
|
||||
If you use this to display time remaining, simply update the name of the method in your code/lambda(s).
|
||||
|
||||
|
||||
Tuya lights
|
||||
-----------
|
||||
|
||||
Tuya Lights have had a configuration change and replaced ``rgb_datapoint`` and ``hsv_datapoint`` with a new
|
||||
combination of ``color_datapoint`` and ``color_type``. See the updated documentation (:doc:`/components/light/tuya`) for more information.
|
||||
|
||||
|
||||
SN74HC165
|
||||
---------
|
||||
|
||||
The pin/bit order has been reversed per shift register so that ``pin 0`` is now ``input A``.
|
||||
|
||||
Full list of changes
|
||||
--------------------
|
||||
|
||||
New Components
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
- Add internal_temperature component :esphomepr:`4330` by :ghuser:`Mat931` (new-integration)
|
||||
- Support Mopeka Standard LPG tank bluetooth sensor :esphomepr:`4351` by :ghuser:`Fabian-Schmidt` (new-integration)
|
||||
- add person sensor (SEN21231) from usefulsensors :esphomepr:`4454` by :ghuser:`shreyaskarnik` (new-integration)
|
||||
- add kuntze component :esphomepr:`4411` by :ghuser:`ssieb` (new-integration)
|
||||
- Add Haier climate component :esphomepr:`4001` by :ghuser:`Yarikx` (new-integration)
|
||||
- FS3000 sensor :esphomepr:`4502` by :ghuser:`kahrendt` (new-integration)
|
||||
- Add absolute humidity component :esphomepr:`4519` by :ghuser:`DAVe3283` (new-integration)
|
||||
- Add AS7341 spectral color sensor :esphomepr:`4331` by :ghuser:`mrgnr` (new-integration)
|
||||
- Renaming and extending the ili9341 to the ili9xxx component :esphomepr:`4275` by :ghuser:`nielsnl68` (new-integration) (breaking-change)
|
||||
|
||||
Breaking Changes
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
- Add configurable color datapoint :esphomepr:`4383` by :ghuser:`irtimaled` (breaking-change)
|
||||
- Sprinkler "v2" updates :esphomepr:`4159` by :ghuser:`kbx81` (breaking-change)
|
||||
- sn74hc165 fixes :esphomepr:`4457` by :ghuser:`jesserockz` (breaking-change)
|
||||
- Renaming and extending the ili9341 to the ili9xxx component :esphomepr:`4275` by :ghuser:`nielsnl68` (new-integration) (breaking-change)
|
||||
|
||||
Beta Changes
|
||||
^^^^^^^^^^^^
|
||||
|
||||
- Fix ethernet clk_mode for GPIO0_OUT :esphomepr:`4307` by :ghuser:`jorticus`
|
||||
- Add ESP32-S3 support in NeoPixelBus component :esphomepr:`4114` by :ghuser:`rcloran`
|
||||
- Renaming and extending the ili9341 to the ili9xxx component :esphomepr:`4275` by :ghuser:`nielsnl68` (new-integration) (breaking-change)
|
||||
- Drop unused, broken logging macros :esphomepr:`4534` by :ghuser:`oxan`
|
||||
- Revert storing Font glyphs in manually-allocated memory :esphomepr:`4516` by :ghuser:`oxan`
|
||||
- Correct BME680 gas calculation and heater_off :esphomepr:`4498` by :ghuser:`CarlosGS`
|
||||
- Add support for new mpu6050 clones responding with 0x70 address :esphomepr:`4546` by :ghuser:`jakehdk`
|
||||
- Add carbon dioxide device class to scd30 sensor schema. :esphomepr:`4547` by :ghuser:`murrayma`
|
||||
- Feat: add support for hex color in color component :esphomepr:`4493` by :ghuser:`dorianim`
|
||||
- Allow AUTO_LOAD to be a function :esphomepr:`4550` by :ghuser:`jesserockz`
|
||||
- On the ILI9xxx display's enable the psram on esp32 and allow big screen :esphomepr:`4551` by :ghuser:`nielsnl68`
|
||||
- Map gpio pins for touch on esp32-s2/s3 :esphomepr:`4552` by :ghuser:`jesserockz`
|
||||
- pipsolar component. Correct the sscanf format for QPIG command parsin… :esphomepr:`4165` by :ghuser:`eroldan`
|
||||
- Add state class back to uptime sensor :esphomepr:`4557` by :ghuser:`DAVe3283`
|
||||
- Added response for Tuya RSSI command :esphomepr:`4549` by :ghuser:`catalin2402`
|
||||
- Remove switch actions during config; bump setup priority :esphomepr:`4563` by :ghuser:`kbx81`
|
||||
- Mark esp32_touch supported only on standard esp32 variant :esphomepr:`4562` by :ghuser:`jesserockz`
|
||||
- fixing ``shrink`` and ``extend`` functions of the displaybuffer's Rect class :esphomepr:`4565` by :ghuser:`nielsnl68`
|
||||
|
||||
All changes
|
||||
^^^^^^^^^^^
|
||||
|
||||
- socket: Format IPv4-mapped IPv6 addresses as regular IPv4 address :esphomepr:`4382` by :ghuser:`oxan`
|
||||
- Bump frenck/action-yamllint from 1.3.1 to 1.4.0 :esphomepr:`4289` by :ghuser:`dependabot[bot]`
|
||||
- Bump pyupgrade from 3.3.0 to 3.3.1 :esphomepr:`4160` by :ghuser:`dependabot[bot]`
|
||||
- Bump black from 22.12.0 to 23.1.0 :esphomepr:`4375` by :ghuser:`dependabot[bot]`
|
||||
- Improve tuya network status command :esphomepr:`4415` by :ghuser:`Rjevski`
|
||||
- Gracefully reject vacuum map upload requests :esphomepr:`4414` by :ghuser:`Rjevski`
|
||||
- Fixed PlatformIO Build on DEV :esphomepr:`4422` by :ghuser:`Expaso`
|
||||
- Bump platformio from 6.1.5 to 6.1.6 :esphomepr:`4341` by :ghuser:`dependabot[bot]`
|
||||
- Bump pylint from 2.15.10 to 2.16.2 :esphomepr:`4426` by :ghuser:`dependabot[bot]`
|
||||
- Bump aioesphomeapi from 13.1.0 to 13.3.1 :esphomepr:`4427` by :ghuser:`dependabot[bot]`
|
||||
- Add concurrency limit to ci-docker :esphomepr:`4407` by :ghuser:`jesserockz`
|
||||
- Add final job so branch protection can require matrix ci steps :esphomepr:`4432` by :ghuser:`jesserockz`
|
||||
- Deep Sleep capable ports for ESP32S3 :esphomepr:`4230` by :ghuser:`LeDominik`
|
||||
- Initialize all fields in ESPTime in PCF85063 :esphomepr:`4439` by :ghuser:`oxan`
|
||||
- Bump zeroconf from 0.47.1 to 0.47.3 :esphomepr:`4437` by :ghuser:`dependabot[bot]`
|
||||
- Automate syncing device classes with HA :esphomepr:`4438` by :ghuser:`oxan`
|
||||
- NeoPixel - Add support for ESP32-S3 :esphomepr:`4435` by :ghuser:`ajacques`
|
||||
- add SUB_BINARY_SENSOR macro to binary sensor :esphomepr:`4447` by :ghuser:`regevbr`
|
||||
- add SUB_TEXT_SENSOR macro to text sensor :esphomepr:`4448` by :ghuser:`regevbr`
|
||||
- Simplify sensor schema generation :esphomepr:`4462` by :ghuser:`balloob`
|
||||
- add SUB_NUMBER macro and schema to number :esphomepr:`4449` by :ghuser:`regevbr`
|
||||
- add SUB_BUTTON macro and ability to button schema to define the class :esphomepr:`4450` by :ghuser:`regevbr`
|
||||
- Simplify number_schema function :esphomepr:`4467` by :ghuser:`jesserockz`
|
||||
- Simplify button_schema function :esphomepr:`4468` by :ghuser:`jesserockz`
|
||||
- Simplify binary_sensor_schema function :esphomepr:`4469` by :ghuser:`jesserockz`
|
||||
- Add configurable color datapoint :esphomepr:`4383` by :ghuser:`irtimaled` (breaking-change)
|
||||
- Add internal_temperature component :esphomepr:`4330` by :ghuser:`Mat931` (new-integration)
|
||||
- Move remaining SENSOR_SCHEMA to use sensor_schema() :esphomepr:`4471` by :ghuser:`jesserockz`
|
||||
- Allow specifying target and current visual steps for climate :esphomepr:`4440` by :ghuser:`jesserockz`
|
||||
- Bump aioesphomeapi from 13.3.1 to 13.4.0 :esphomepr:`4472` by :ghuser:`dependabot[bot]`
|
||||
- toshiba: add support for quiet fan mode :esphomepr:`4283` by :ghuser:`MichaelMure`
|
||||
- Bump esptool from 4.4 to 4.5 :esphomepr:`4428` by :ghuser:`dependabot[bot]`
|
||||
- Support Mopeka Standard LPG tank bluetooth sensor :esphomepr:`4351` by :ghuser:`Fabian-Schmidt` (new-integration)
|
||||
- fix library override logic :esphomepr:`4474` by :ghuser:`mzakharo`
|
||||
- Sprinkler "v2" updates :esphomepr:`4159` by :ghuser:`kbx81` (breaking-change)
|
||||
- add person sensor (SEN21231) from usefulsensors :esphomepr:`4454` by :ghuser:`shreyaskarnik` (new-integration)
|
||||
- Initial stab at importing idf components :esphomepr:`4000` by :ghuser:`jesserockz`
|
||||
- add kuntze component :esphomepr:`4411` by :ghuser:`ssieb` (new-integration)
|
||||
- Add Haier climate component :esphomepr:`4001` by :ghuser:`Yarikx` (new-integration)
|
||||
- Bump esp-idf to 4.4.3 via platformio/espressif32 @ 5.3.0 :esphomepr:`4254` by :ghuser:`bdraco`
|
||||
- Add energy to pzemdc :esphomepr:`3626` by :ghuser:`andreashergert1984`
|
||||
- Update esp32 esp-idf dev and latest version numbers :esphomepr:`4479` by :ghuser:`jesserockz`
|
||||
- [ExternalRAMAllocator] Use same `heap_caps_malloc` parameter as `ps_malloc`. :esphomepr:`4484` by :ghuser:`Fabian-Schmidt`
|
||||
- Lock scheduler items while modifying them :esphomepr:`4410` by :ghuser:`oxan`
|
||||
- Move Font glyphs to SPI RAM. :esphomepr:`4485` by :ghuser:`Fabian-Schmidt`
|
||||
- Run CI on merge group :esphomepr:`4489` by :ghuser:`jesserockz`
|
||||
- Fix parallel invocations of repeat action :esphomepr:`4480` by :ghuser:`oxan`
|
||||
- Make test3 use huge_app :esphomepr:`4488` by :ghuser:`jesserockz`
|
||||
- Change variable "skip_updates" and "skip_updates_counter" type from "uint8_t" to "uint16_t" :esphomepr:`4487` by :ghuser:`GitforZhangXL`
|
||||
- Fix copy-pasta mistake :esphomepr:`4492` by :ghuser:`jesserockz`
|
||||
- Add int16 to codegen :esphomepr:`4507` by :ghuser:`jesserockz`
|
||||
- Update __init__.py :esphomepr:`4514` by :ghuser:`dashkhaneh`
|
||||
- Remove idf components before checking if any in config :esphomepr:`4506` by :ghuser:`jesserockz`
|
||||
- substitutions: Don't warn when passwords look like a substitution :esphomepr:`4161` by :ghuser:`tljuniper`
|
||||
- Fix typo :esphomepr:`4515` by :ghuser:`oxan`
|
||||
- implement pairing for bluetooth proxy :esphomepr:`4475` by :ghuser:`jagheterfredrik`
|
||||
- Bump docker dependencies :esphomepr:`4526` by :ghuser:`jesserockz`
|
||||
- Bump aioesphomeapi from 13.4.0 to 13.5.0 :esphomepr:`4525` by :ghuser:`dependabot[bot]`
|
||||
- Ensure component is ready before update. :esphomepr:`4523` by :ghuser:`Fabian-Schmidt`
|
||||
- climate: add on_control callbacks :esphomepr:`4511` by :ghuser:`nwf`
|
||||
- FS3000 sensor :esphomepr:`4502` by :ghuser:`kahrendt` (new-integration)
|
||||
- Bump esptool from 4.5 to 4.5.1 :esphomepr:`4497` by :ghuser:`dependabot[bot]`
|
||||
- Add support for multiple devices in bme680_bsec :esphomepr:`3550` by :ghuser:`bisbastuner`
|
||||
- Bump pytest from 7.2.1 to 7.2.2 :esphomepr:`4505` by :ghuser:`dependabot[bot]`
|
||||
- Bump pylint from 2.16.2 to 2.16.4 :esphomepr:`4524` by :ghuser:`dependabot[bot]`
|
||||
- Add absolute humidity component :esphomepr:`4519` by :ghuser:`DAVe3283` (new-integration)
|
||||
- Add ability to await safe mode in codegen :esphomepr:`4529` by :ghuser:`oxan`
|
||||
- sn74hc165 fixes :esphomepr:`4457` by :ghuser:`jesserockz` (breaking-change)
|
||||
- Add AS7341 spectral color sensor :esphomepr:`4331` by :ghuser:`mrgnr` (new-integration)
|
||||
- Fix ethernet driver setting gpio 5 high when no power pin defined :esphomepr:`4531` by :ghuser:`jesserockz`
|
||||
- Use PSRam for BLE scan results. :esphomepr:`4486` by :ghuser:`Fabian-Schmidt`
|
||||
- Bump esp-idf to 4.4.4 :esphomepr:`4528` by :ghuser:`bdraco`
|
||||
- Added pzemdc reset energy action :esphomepr:`4481` by :ghuser:`KG3RK3N`
|
||||
- Fix ethernet clk_mode for GPIO0_OUT :esphomepr:`4307` by :ghuser:`jorticus`
|
||||
- Add ESP32-S3 support in NeoPixelBus component :esphomepr:`4114` by :ghuser:`rcloran`
|
||||
- Renaming and extending the ili9341 to the ili9xxx component :esphomepr:`4275` by :ghuser:`nielsnl68` (new-integration) (breaking-change)
|
||||
- Drop unused, broken logging macros :esphomepr:`4534` by :ghuser:`oxan`
|
||||
- Revert storing Font glyphs in manually-allocated memory :esphomepr:`4516` by :ghuser:`oxan`
|
||||
- Correct BME680 gas calculation and heater_off :esphomepr:`4498` by :ghuser:`CarlosGS`
|
||||
- Add support for new mpu6050 clones responding with 0x70 address :esphomepr:`4546` by :ghuser:`jakehdk`
|
||||
- Add carbon dioxide device class to scd30 sensor schema. :esphomepr:`4547` by :ghuser:`murrayma`
|
||||
- Feat: add support for hex color in color component :esphomepr:`4493` by :ghuser:`dorianim`
|
||||
- Allow AUTO_LOAD to be a function :esphomepr:`4550` by :ghuser:`jesserockz`
|
||||
- On the ILI9xxx display's enable the psram on esp32 and allow big screen :esphomepr:`4551` by :ghuser:`nielsnl68`
|
||||
- Map gpio pins for touch on esp32-s2/s3 :esphomepr:`4552` by :ghuser:`jesserockz`
|
||||
- pipsolar component. Correct the sscanf format for QPIG command parsin… :esphomepr:`4165` by :ghuser:`eroldan`
|
||||
- Add state class back to uptime sensor :esphomepr:`4557` by :ghuser:`DAVe3283`
|
||||
- Added response for Tuya RSSI command :esphomepr:`4549` by :ghuser:`catalin2402`
|
||||
- Remove switch actions during config; bump setup priority :esphomepr:`4563` by :ghuser:`kbx81`
|
||||
- Mark esp32_touch supported only on standard esp32 variant :esphomepr:`4562` by :ghuser:`jesserockz`
|
||||
- fixing ``shrink`` and ``extend`` functions of the displaybuffer's Rect class :esphomepr:`4565` by :ghuser:`nielsnl68`
|
||||
|
||||
Past Changelogs
|
||||
---------------
|
||||
|
||||
- :doc:`2023.2.0`
|
||||
- :doc:`2022.12.0`
|
||||
- :doc:`2022.11.0`
|
||||
- :doc:`2022.10.0`
|
||||
- :doc:`2022.9.0`
|
||||
- :doc:`2022.8.0`
|
||||
- :doc:`2022.6.0`
|
||||
- :doc:`2022.5.0`
|
||||
- :doc:`2022.4.0`
|
||||
- :doc:`2022.3.0`
|
||||
- :doc:`2022.2.0`
|
||||
- :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/2023.2.0.html
|
||||
:url: /changelog/2023.3.0.html
|
||||
|
||||
.. toctree::
|
||||
:glob:
|
||||
|
86
components/climate/haier.rst
Normal file
@ -0,0 +1,86 @@
|
||||
Haier Climate
|
||||
=============
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up a Haier climate devices.
|
||||
:image: air-conditioner.svg
|
||||
|
||||
The `haier` climate platform creates a Haier climate device.
|
||||
The component can be used as a replacement of a Haier proprietary WiFi modules such as KZW-W001 and KZW-W002.
|
||||
|
||||
This component requires a :ref:`uart` to be setup.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
logger:
|
||||
baud_rate: 0 #Disable UART logging for ESP8266
|
||||
|
||||
uart:
|
||||
rx_pin: GPIO3
|
||||
tx_pin: GPIO1
|
||||
baud_rate: 9600
|
||||
|
||||
climate:
|
||||
platform: haier
|
||||
name: Haier AC
|
||||
supported_swing_modes:
|
||||
- VERTICAL
|
||||
- HORIZONTAL
|
||||
- BOTH
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **name** (**Required**, string): The name of the climate device.
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): How often device will be polled for status. Defaults to `5s`.
|
||||
- **supported_swing_modes** (*Optional*, list): List of supported swing modes. Possible values are: ``VERTICAL``, ``HORIZONTAL``, ``BOTH``.
|
||||
- All other options from :ref:`Climate <config-climate>`.
|
||||
|
||||
Hardware setup
|
||||
--------------
|
||||
|
||||
Most units will have a dedicated USB-A port for Haier WiFi module.
|
||||
The physical USB port is in fact UART and does not "speak" USB protocol.
|
||||
It uses four USB pins as 5V, GND, RX, TX.
|
||||
You can use spare male USB cable to connect esphome device directly to the climate appliance.
|
||||
|
||||
Other units will not have USB ports, but will still probably have UART exposed somewhere on the main board.
|
||||
|
||||
.. list-table:: Haier UART pinout
|
||||
:header-rows: 1
|
||||
|
||||
* - Board
|
||||
- USB
|
||||
- Wire color
|
||||
- ESP8266
|
||||
* - 5V
|
||||
- VCC
|
||||
- red
|
||||
- 5V
|
||||
* - GND
|
||||
- GND
|
||||
- black
|
||||
- GND
|
||||
* - TX
|
||||
- DATA+
|
||||
- green
|
||||
- RX
|
||||
* - RX
|
||||
- DATA-
|
||||
- white
|
||||
- TX
|
||||
|
||||
.. figure:: images/usb_pinout.png
|
||||
:align: center
|
||||
:width: 70.0%
|
||||
|
||||
USB Pinout
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- `esphaier <https://github.com/MiguelAngelLV/esphaier>`__
|
||||
- :doc:`/components/climate/index`
|
||||
- :apiref:`haier/climate/haier.h`
|
||||
- :ghedit:`Edit`
|
BIN
components/climate/images/usb_pinout.png
Normal file
After Width: | Height: | Size: 13 KiB |
@ -43,7 +43,10 @@ Configuration variables:
|
||||
- **max_temperature** (*Optional*, float): The maximum temperature the climate device can reach.
|
||||
Used to set the range of the frontend gauge.
|
||||
- **temperature_step** (*Optional*, float): The granularity with which the target temperature
|
||||
can be controlled.
|
||||
can be controlled. Can be a single number, or split as below:
|
||||
|
||||
- **target_temperature** (**Required**, float)
|
||||
- **current_temperature** (**Required**, float)
|
||||
|
||||
Advanced options:
|
||||
|
||||
@ -58,6 +61,53 @@ Advanced options:
|
||||
for a list of available options. Requires Home Assistant 2021.11 or newer.
|
||||
Set to ``""`` to remove the default entity category.
|
||||
|
||||
MQTT options:
|
||||
|
||||
- **action_state_topic** (*Optional*, string): The topic to publish
|
||||
climate device action changes to.
|
||||
- **current_temperature_state_topic** (*Optional*, string): The topic to publish
|
||||
current temperature changes to.
|
||||
- **fan_mode_state_topic** (*Optional*, string): The topic to publish
|
||||
fan mode changes to.
|
||||
- **fan_mode_command_topic** (*Optional*, string): The topic to receive
|
||||
fan mode commands on.
|
||||
- **mode_state_topic** (*Optional*, string): The topic to publish
|
||||
climate device mode changes to.
|
||||
- **mode_command_topic** (*Optional*, string): The topic to receive
|
||||
climate device mode commands on.
|
||||
- **preset_state_topic** (*Optional*, string): The topic to publish
|
||||
preset changes to.
|
||||
- **preset_command_topic** (*Optional*, string): The topic to receive
|
||||
preset commands on.
|
||||
- **swing_mode_state_topic** (*Optional*, string): The topic to publish
|
||||
swing mode changes to.
|
||||
- **swing_mode_command_topic** (*Optional*, string): The topic to receive
|
||||
swing mode commands on.
|
||||
- **target_temperature_state_topic** (*Optional*, string): The topic to publish
|
||||
target temperature changes to.
|
||||
- **target_temperature_command_topic** (*Optional*, string): The topic to receive
|
||||
target temperature commands on.
|
||||
- **target_temperature_high_state_topic** (*Optional*, string): The topic to publish
|
||||
higher target temperature changes to.
|
||||
- **target_temperature_high_command_topic** (*Optional*, string): The topic to receive
|
||||
higher target temperature commands on.
|
||||
- **target_temperature_low_state_topic** (*Optional*, string): The topic to publish
|
||||
lower target temperature changes to.
|
||||
- **target_temperature_low_command_topic** (*Optional*, string): The topic to receive
|
||||
lower target temperature commands on.
|
||||
- All other options from :ref:`MQTT Component <config-mqtt-component>`.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
climate:
|
||||
- platform: ...
|
||||
visual:
|
||||
min_temperature: 18
|
||||
max_temperature: 25
|
||||
temperature_step:
|
||||
target_temperature: 0.5
|
||||
current_temperature: 0.1
|
||||
|
||||
Climate Automation
|
||||
------------------
|
||||
|
||||
@ -142,7 +192,7 @@ advanced stuff.
|
||||
id(my_climate).preset
|
||||
// Custom Preset, type: string
|
||||
id(my_climate).custom_preset
|
||||
|
||||
|
||||
|
||||
- ``.make_call``: Control the climate device
|
||||
|
||||
@ -158,7 +208,7 @@ advanced stuff.
|
||||
``climate.on_state`` Trigger
|
||||
****************************
|
||||
|
||||
This trigger is activated each time the state of the climate device is updated
|
||||
This trigger is activated each time the state of the climate device is updated
|
||||
(for example, if the current temperature measurement or the mode set by the users changes).
|
||||
|
||||
.. code-block:: yaml
|
||||
@ -169,42 +219,24 @@ This trigger is activated each time the state of the climate device is updated
|
||||
on_state:
|
||||
- logger.log: "State updated!"
|
||||
|
||||
MQTT options:
|
||||
.. _climate-on_control_trigger:
|
||||
|
||||
- **action_state_topic** (*Optional*, string): The topic to publish
|
||||
climate device action changes to.
|
||||
- **current_temperature_state_topic** (*Optional*, string): The topic to publish
|
||||
current temperature changes to.
|
||||
- **fan_mode_state_topic** (*Optional*, string): The topic to publish
|
||||
fan mode changes to.
|
||||
- **fan_mode_command_topic** (*Optional*, string): The topic to receive
|
||||
fan mode commands on.
|
||||
- **mode_state_topic** (*Optional*, string): The topic to publish
|
||||
climate device mode changes to.
|
||||
- **mode_command_topic** (*Optional*, string): The topic to receive
|
||||
climate device mode commands on.
|
||||
- **preset_state_topic** (*Optional*, string): The topic to publish
|
||||
preset changes to.
|
||||
- **preset_command_topic** (*Optional*, string): The topic to receive
|
||||
preset commands on.
|
||||
- **swing_mode_state_topic** (*Optional*, string): The topic to publish
|
||||
swing mode changes to.
|
||||
- **swing_mode_command_topic** (*Optional*, string): The topic to receive
|
||||
swing mode commands on.
|
||||
- **target_temperature_state_topic** (*Optional*, string): The topic to publish
|
||||
target temperature changes to.
|
||||
- **target_temperature_command_topic** (*Optional*, string): The topic to receive
|
||||
target temperature commands on.
|
||||
- **target_temperature_high_state_topic** (*Optional*, string): The topic to publish
|
||||
higher target temperature changes to.
|
||||
- **target_temperature_high_command_topic** (*Optional*, string): The topic to receive
|
||||
higher target temperature commands on.
|
||||
- **target_temperature_low_state_topic** (*Optional*, string): The topic to publish
|
||||
lower target temperature changes to.
|
||||
- **target_temperature_low_command_topic** (*Optional*, string): The topic to receive
|
||||
lower target temperature commands on.
|
||||
- All other options from :ref:`MQTT Component <config-mqtt-component>`.
|
||||
``climate.on_control`` Trigger
|
||||
******************************
|
||||
|
||||
This trigger is activated each time a *control* input of the climate device
|
||||
is updated via a ``ClimateCall`` (which includes changes coming in from Home
|
||||
Assistant). That is, this trigger is activated for, for example, changes to
|
||||
the mode, *but not* on temperature measurements. It will be invoked prior to
|
||||
the ``on_state`` trigger, if both are defined.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
climate:
|
||||
- platform: midea # or any other platform
|
||||
# ...
|
||||
on_control:
|
||||
- logger.log: "Control input received; configuration updated!"
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
@ -1,21 +1,25 @@
|
||||
ILI9341 TFT LCD
|
||||
===============
|
||||
|
||||
ILI9xxx TFT LCD Series
|
||||
======================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up ILI9341 TFT LCD display drivers.
|
||||
:description: Instructions for setting up ILI9xxx TFT LCD display drivers.
|
||||
:image: ili9341.jpg
|
||||
|
||||
.. _ili9341:
|
||||
.. _ili9xxx:
|
||||
|
||||
Usage
|
||||
-----
|
||||
This component is the successor of the ILI9341 component allowing to control more display drivers and use 16bit colors when enough free ram.
|
||||
|
||||
The ``ili9341`` display platform allows you to use
|
||||
The ``ILI9xxx`` display platform allows you to use
|
||||
ILI9341 (`datasheet <https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf>`__,
|
||||
`Aliexpress <https://www.aliexpress.com/af/Ili9341.html>`__)
|
||||
displays with ESPHome. As this is a somewhat higher resolution display and may require pins
|
||||
`Aliexpress <https://www.aliexpress.com/af/Ili9341.html>`__) and other
|
||||
displays from the same chip family with ESPHome. As this is a somewhat higher resolution display and may require pins
|
||||
beyond the typical SPI connections, it is better suited for use with the ESP32.
|
||||
|
||||
**Note:** To use 16bit instead of 8bit colors use a esp32 with enough PSRAM the display.
|
||||
|
||||
.. figure:: images/ili9341-full.jpg
|
||||
:align: center
|
||||
:width: 75.0%
|
||||
@ -27,15 +31,13 @@ beyond the typical SPI connections, it is better suited for use with the ESP32.
|
||||
|
||||
# Example minimal configuration entry
|
||||
display:
|
||||
- platform: ili9341
|
||||
model: TFT 2.4
|
||||
- platform: ili9xxx
|
||||
model: ili9341
|
||||
cs_pin: 14
|
||||
dc_pin: 27
|
||||
led_pin: 32 ### see note below ###
|
||||
reset_pin: 33
|
||||
|
||||
lambda: |-
|
||||
it.fill(Color::BLACK);
|
||||
it.fill(COLOR_BLACK);
|
||||
it.print(0, 0, id(my_font), id(my_red), TextAlign::TOP_LEFT, "Hello World!");
|
||||
|
||||
Configuration variables:
|
||||
@ -43,15 +45,12 @@ Configuration variables:
|
||||
|
||||
- **model** (**Required**): The model of the display. Options are:
|
||||
|
||||
- ``M5STACK``
|
||||
- ``TFT 2.4``
|
||||
- ``TFT 2.4R`` (ILI9342)
|
||||
- ``M5STACK``, ``TFT 2.4``, ``TFT 2.4R``
|
||||
- ``ILI9341``, ``ILI9342``, ``ILI9481``, ``ILI9486``, ``ILI9488``, ``ST7796``
|
||||
|
||||
- **cs_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The CS pin.
|
||||
- **dc_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): The DC pin.
|
||||
- **reset_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The RESET pin.
|
||||
- **led_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The display's backlight pin. **Note:** Connect to a
|
||||
PWM-capable pin to switch/dim the display's backlight **or** save a pin by connecting it through a 3.3K resistor to the +3V supply.
|
||||
- **rotation** (*Optional*): Set the rotation of the display. Everything drawn in the ``lambda:`` will be rotated
|
||||
per this option. One of ``0°`` (default), ``90°``, ``180°``, or ``270°``.
|
||||
- **lambda** (*Optional*, :ref:`lambda <config-lambda>`): The lambda to use for rendering the content on the display.
|
||||
@ -62,7 +61,7 @@ Configuration variables:
|
||||
- **pages** (*Optional*, list): Show pages instead of a single lambda. See :ref:`display-pages`.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- **color_palette** (*Optional*): The type of color pallet that will be used in the ESP's internal 8-bits-per-pixel buffer. This can be used to improve color depth quality of the image. For example if you know that the display will only be showing grayscale images, the clarity of the display can be improved by targeting the available colors to monochrome only. Options are:
|
||||
|
||||
|
||||
- ``NONE`` (default)
|
||||
- ``GRAYSCALE``
|
||||
- ``IMAGE_ADAPTIVE``
|
||||
@ -124,7 +123,7 @@ To configure a dimmable backlight:
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: gpio_32_backlight_pwm
|
||||
name: "ILI9341 Display Backlight"
|
||||
name: "Display Backlight"
|
||||
id: back_light
|
||||
restore_mode: ALWAYS_ON
|
||||
|
||||
@ -139,11 +138,10 @@ To configure an image adaptive color pallet to show greater than 8 bit color dep
|
||||
type: RGB24
|
||||
|
||||
display:
|
||||
- platform: ili9341
|
||||
model: TFT 2.4
|
||||
- platform: ili9xxx
|
||||
model: ili9341
|
||||
cs_pin: 5
|
||||
dc_pin: 4
|
||||
led_pin: 15
|
||||
reset_pin: 22
|
||||
rotation: 90
|
||||
id: tft_ha
|
||||
@ -158,5 +156,5 @@ See Also
|
||||
--------
|
||||
|
||||
- :doc:`index`
|
||||
- :apiref:`ili9341/ili9341_display.h`
|
||||
- :apiref:`ili9xxx/ili9xxx_display.h`
|
||||
- :ghedit:`Edit`
|
@ -465,13 +465,36 @@ A ``color`` component exists for just this purpose:
|
||||
blue: 25%
|
||||
white: 0%
|
||||
|
||||
Alternatively, you can use ``<color>_int`` to specify the color as an int value:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
color:
|
||||
- id: my_light_red
|
||||
red_int: 255
|
||||
green_int: 51
|
||||
blue_int: 64
|
||||
white_int: 0
|
||||
|
||||
Or, if you are more comforatble with hex values, you can use ``hex``:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
color:
|
||||
- id: my_light_red
|
||||
hex: FF3340
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **red** (*Optional*, percentage): The percentage of the red component. Defaults to ``100%``.
|
||||
- **red_int** (*Optional*, integer): The brightness of the red component on a scale of ``0`` to ``255``. Defaults to ``255``.
|
||||
- **green** (*Optional*, percentage): The percentage of the green component. Defaults to ``100%``.
|
||||
- **green_int** (*Optional*, integer): The brightness of the green component on a scale of ``0`` to ``255``. Defaults to ``255``.
|
||||
- **blue** (*Optional*, percentage): The percentage of the blue component. Defaults to ``100%``.
|
||||
- **blue_int** (*Optional*, integer): The brightness of the blue component on a scale of ``0`` to ``255``. Defaults to ``255``.
|
||||
- **white** (*Optional*, percentage): The percentage of the white component. Defaults to ``100%``.
|
||||
- **white_int** (*Optional*, integer): The brightness of the white component on a scale of ``0`` to ``255``. Defaults to ``255``.
|
||||
- **hex** (*Optional*, string): The color in hexadecimal representation. Defaults to ``FFFFFF``.
|
||||
|
||||
RGB displays use red, green, and blue, while grayscale displays may use white.
|
||||
|
||||
|
@ -127,7 +127,8 @@ settings vary by method:
|
||||
- **async** (*Optional*, boolean): Use an asynchronous transfer. Defaults to ``false``. If enabled,
|
||||
the logger must be disabled even if bus 1 is used.
|
||||
|
||||
- **esp32_i2s**: The recommended method for ESP32. Available on all output pins. Additional options:
|
||||
- **esp32_i2s**: The recommended method for ESP32, but not available on the ESP32-S3 or ESP32-C3.
|
||||
Available on all output pins. Additional options:
|
||||
|
||||
- **bus** (*Optional*): The I2S bus to use. The ESP32 has bus 0 or 1 available, but the ESP32-S2 only bus 0.
|
||||
One of ``0``, ``1``, ``dynamic``.
|
||||
@ -135,7 +136,7 @@ settings vary by method:
|
||||
- **esp32_rmt**: An alternative method for ESP32 that uses the RMT peripheral to send data.
|
||||
Available on all output pins. Additional options:
|
||||
|
||||
- **channel** (*Optional*): The RMT channel to use. The ESP32 has channels 0-7, ESP32-S2 0-3 and ESP32-C3 0-1.
|
||||
- **channel** (*Optional*): The RMT channel to use. The ESP32 has channels 0-7, ESP32-S2 0-3, ESP32-S3 0-3, and ESP32-C3 0-1.
|
||||
Defaults to 6 on ESP32, and 1 on other ESP32 variants.
|
||||
|
||||
The following method is available only for two-wire chips (specify ``data_pin`` and ``clock_pin``):
|
||||
|
@ -52,10 +52,17 @@ Configuration variables:
|
||||
change the brightness and would have to toggle the light using the physical buttons.
|
||||
- **color_temperature_datapoint** (*Optional*, int): The datapoint id number of the color
|
||||
temperature value.
|
||||
- **rgb_datapoint** (*Optional*, int): The datapoint id number of the RGB (red/green/blue) value.
|
||||
If this is set then ESPHome will set the color using a 6 digit hex RGB value.
|
||||
- **hsv_datapoint** (*Optional*, int): The datapoint id number of the HSV (hue/saturation/value) value.
|
||||
If this is set then ESPHome will set the color using a 12 digit hex HSV value.
|
||||
- **color_datapoint** (*Optional*, int): The datapoint id number of the color value.
|
||||
If this is set, along with **color_type**, then ESPHome will set the color value formatted
|
||||
based on the **color_type**.
|
||||
- **color_type** (*Optional*, enum): The color type to use when setting the **color_datapoint**.
|
||||
If this is set, along with **color_datapoint**, then ESPHome will use this value to format
|
||||
the color sent to **color_datapoint**.
|
||||
|
||||
- ``rgb``: Use a 6 digit hex RGB value
|
||||
- ``hsv``: Use a 12 digit hex HSV value
|
||||
- ``rgbhsv``: Use a 14 digit hex RGBHSV value
|
||||
|
||||
- **min_value** (*Optional*, int): The lowest dimmer value allowed. My dimmer had a
|
||||
minimum of 25 and wouldn't even accept anything lower, but this option is available if necessary.
|
||||
Defaults to 0.
|
||||
|
@ -1,3 +1,5 @@
|
||||
.. _logger:
|
||||
|
||||
Logger Component
|
||||
================
|
||||
|
||||
|
58
components/sensor/absolute_humidity.rst
Normal file
@ -0,0 +1,58 @@
|
||||
Absolute Humidity
|
||||
=================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up absolute humidity calculation
|
||||
:image: water-drop.svg
|
||||
|
||||
The ``absolute_humidity`` platform allows you to calculate absolute humidity from air temperature and relative humidity.
|
||||
|
||||
See the links at the bottom of the page for details on absolute humidity and the different saturated vapor pressure equations.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: absolute_humidity
|
||||
name: Absolute Humidity
|
||||
temperature: air_temperature
|
||||
humidity: relative_humidity
|
||||
|
||||
# Use any temperature and relative humidity source, e.g. a BME280:
|
||||
- platform: ...
|
||||
temperature:
|
||||
name: Temperature
|
||||
id: air_temperature
|
||||
humidity:
|
||||
name: Relative Humidity
|
||||
id: relative_humidity
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name for the absolute humidity sensor.
|
||||
- **temperature** (**Required**, :ref:`config-id`): The sensor that is used to measure the current temperature, in °C.
|
||||
- **humidity** (**Required**, :ref:`config-id`): The sensor that is used to measure the current relative humidity, in %.
|
||||
- **equation** (*Optional*): The saturated vapor pressure equation to use (see below).
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
Saturated vapor pressure equations
|
||||
----------------------------------
|
||||
|
||||
There are several different equations for calculating saturated vapor pressure.
|
||||
``Wobus`` is used by default, as it is notionally the most accurate, but any of the following can be used:
|
||||
|
||||
- ``Buck``: `Arden Buck equation <https://en.wikipedia.org/wiki/Arden_Buck_equation>`__
|
||||
- ``Tetens``: `Tetens equation <https://en.wikipedia.org/wiki/Tetens_equation>`__
|
||||
- ``Wobus``: `Wobus equation <https://wahiduddin.net/calc/density_altitude.htm>`__
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :apiref:`absolute_humidity/absolute_humidity.h`
|
||||
- `NOAA Discussion on Humidity <https://www.weather.gov/lmk/humidity>`__
|
||||
- `Absolute humidity on Wikipedia <https://en.wikipedia.org/wiki/Humidity#Absolute_humidity>`__
|
||||
- `How to calculate absolute humidity <https://www.environmentalbiophysics.org/chalk-talk-how-to-calculate-absolute-humidity/>`__
|
||||
- `How to convert relative humidity to absolute humidity <https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/>`__
|
||||
- :ghedit:`Edit`
|
@ -58,6 +58,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :apiref:`aht10/aht10.h`
|
||||
- `AHT10 Library <https://github.com/Thinary/AHT10>`__ by `Thinary Electronic <https://github.com/Thinary>`__
|
||||
- `Unofficial Translated AHT10 Datasheet (en) <https://wiki.liutyi.info/download/attachments/30507639/Aosong_AHT10_en_draft_0c.pdf>`__
|
||||
|
@ -57,6 +57,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
|
96
components/sensor/as7341.rst
Normal file
@ -0,0 +1,96 @@
|
||||
AS7341 Spectral Color Sensor
|
||||
============================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up AS7341 spectral color sensor.
|
||||
:image: as7341.jpg
|
||||
:keywords: AS7341
|
||||
|
||||
The ``as7341`` sensor platform allows you to use your AS7341 spectral color sensor
|
||||
(`datasheet <https://ams.com/documents/20143/36005/AS7341_DS000504_3-00.pdf/5eca1f59-46e2-6fc5-daf5-d71ad90c9b2b>`__,
|
||||
`Adafruit`_) with ESPHome. The :ref:`I²C Bus <i2c>` is required to be set up in
|
||||
your configuration for this sensor to work.
|
||||
|
||||
.. figure:: images/as7341-full.jpg
|
||||
:align: center
|
||||
:width: 50.0%
|
||||
|
||||
AS7341 Spectral Color Sensor
|
||||
|
||||
.. _Adafruit: https://www.adafruit.com/product/4698
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: as7341
|
||||
f1:
|
||||
name: "415nm"
|
||||
f2:
|
||||
name: "445nm"
|
||||
f3:
|
||||
name: "480nm"
|
||||
f4:
|
||||
name: "515nm"
|
||||
f5:
|
||||
name: "555nm"
|
||||
f6:
|
||||
name: "590nm"
|
||||
f7:
|
||||
name: "630nm"
|
||||
f8:
|
||||
name: "680nm"
|
||||
clear:
|
||||
name: "Clear"
|
||||
nir:
|
||||
name: "NIR"
|
||||
|
||||
|
||||
Configuration variables
|
||||
-----------------------
|
||||
|
||||
- **f1** (*Optional*): The reading for the 415nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f2** (*Optional*): The reading for the 445nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f3** (*Optional*): The reading for the 480nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f4** (*Optional*): The reading for the 515nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f5** (*Optional*): The reading for the 555nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f6** (*Optional*): The reading for the 590nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f7** (*Optional*): The reading for the 630nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **f8** (*Optional*): The reading for the 680nm channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **clear** (*Optional*): The reading for the clear channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **nir** (*Optional*): The reading for the NIR (near-infrared) channel. All options from :ref:`Sensor <config-sensor>`.
|
||||
- **gain** (*Optional*): The gain used by the device. A higher gain may be more suitable for lower-light environments. Must be one of:
|
||||
|
||||
- ``X0.5``
|
||||
- ``X1``
|
||||
- ``X2``
|
||||
- ``X4``
|
||||
- ``X8`` (*default*)
|
||||
- ``X16``
|
||||
- ``X32``
|
||||
- ``X64``
|
||||
- ``X128``
|
||||
- ``X256``
|
||||
- ``X512``
|
||||
|
||||
- **astep** (*Optional*): The number of integration steps. Default is ``599``. Must be between ``0`` and ``65534``.
|
||||
- **atime** (*Optional*): The integration time per step in increments of 2.78µs. Default is ``29``. Must be between ``0`` and ``255``.
|
||||
- All other options for I²C devices described at :ref:`I²C Bus <i2c>`.
|
||||
|
||||
Integration time
|
||||
----------------
|
||||
|
||||
The integration time determines how long a channel measurement takes and depends on ``ATIME`` and ``ASTEP``. The formula for the total integration time is:
|
||||
|
||||
.. math::
|
||||
|
||||
\text{t} = \text{(ATIME + 1)} \times \text{(ASTEP + 1)} \times \text{2.78µS}
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- `Adafruit_AS7341 <https://github.com/adafruit/Adafruit_AS7341>`__
|
||||
- `SparkFun_AS7341X_Arduino_Library <https://github.com/sparkfun/SparkFun_AS7341X_Arduino_Library>`__
|
||||
- :apiref:`as7341/as7341.h`
|
||||
- :ghedit:`Edit`
|
@ -66,4 +66,5 @@ See Also
|
||||
|
||||
- `b-parasite on GitHub <https://github.com/rbaron/b-parasite>`__
|
||||
- :doc:`/components/esp32_ble_tracker`
|
||||
- :doc:`absolute_humidity`
|
||||
- :ghedit:`Edit`
|
||||
|
@ -89,6 +89,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`bme680`
|
||||
- :doc:`bmp085`
|
||||
- :apiref:`bme280/bme280.h`
|
||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
@ -107,6 +107,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`bme280`
|
||||
- :doc:`bmp085`
|
||||
- :apiref:`bme680/bme680.h`
|
||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
@ -13,8 +13,8 @@ The ``bme680_bsec`` sensor platform allows you to use your BME680
|
||||
(`datasheet <https://cdn-shop.adafruit.com/product-files/3660/BME680.pdf>`__,
|
||||
`Adafruit`_) temperature, pressure and humidity and gas sensors with ESPHome via the Bosch Sensortec Environmental Cluster (BSEC)
|
||||
software library. The use of Bosch's proprietary algorithms provide an Index for Air Quality (IAQ) measurement derived from the
|
||||
gas resistance sensor's response to specific Volatile Organic Compounds (VOC). The BSEC software also provides estimated values
|
||||
for CO₂ and Breath Volatile Organic Compounds (b-VOC) using a correlation between VOC and CO₂ in a human's exhaled breath.
|
||||
gas resistance sensor's response to specific Volatile Organic Compounds (VOC). The BSEC software also provides estimated values
|
||||
for CO₂ and Breath Volatile Organic Compounds (b-VOC) using a correlation between VOC and CO₂ in a human's exhaled breath.
|
||||
|
||||
.. note::
|
||||
|
||||
@ -61,7 +61,7 @@ The :ref:`I²C <i2c>` is required to be set up in your configuration for this se
|
||||
- platform: bme680_bsec
|
||||
iaq_accuracy:
|
||||
name: "BME680 IAQ Accuracy"
|
||||
|
||||
|
||||
- platform: template
|
||||
name: "BME680 IAQ Classification"
|
||||
icon: "mdi:checkbox-marked-circle-outline"
|
||||
@ -93,7 +93,7 @@ The :ref:`I²C <i2c>` is required to be set up in your configuration for this se
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **address** (*Optional*, int): Manually specify the I^2C address of the sensor. Defaults to ``0x76``. Another address can be ``0x77``.
|
||||
- **address** (*Optional*, int): Manually specify the I²C address of the sensor. Defaults to ``0x76``. Another address can be ``0x77``.
|
||||
|
||||
- **temperature_offset** (*Optional*, float): Temperature offset if device is in enclosure and reads too high. This value is subtracted
|
||||
from the reading (e.g. if the sensor reads 5°C higher than expected, set this to ``5``) and also corrects the relative humidity readings. Defaults to ``0``.
|
||||
@ -109,11 +109,15 @@ Configuration variables:
|
||||
- **state_save_interval** (*Optional*, :ref:`config-time`): The minimum interval at which to save calibrated BSEC algorithm state to
|
||||
flash so that calibration doesn't have to start from zero on device restart. Defaults to ``6h``.
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. Use this ID in the sensor section to refer to the correct BME680 if you have more than one device. This will also be used to refer to the calibrated BSEC algorithm state saved to flash.
|
||||
|
||||
Sensor
|
||||
------
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **bme680_bsec_id** (*Optional*, :ref:`config-id`): Sets the ID of the bme680_bsec component to refer to. Useful when working with multiple devices.
|
||||
|
||||
- **temperature** (*Optional*): The information for the temperature sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature sensor.
|
||||
@ -172,6 +176,8 @@ Accuracy can be reported in text format.
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **bme680_bsec_id** (*Optional*, :ref:`config-id`): Sets the ID of the bme680_bsec component to refer to. Useful when working with multiple devices.
|
||||
|
||||
- **iaq_accuracy** (*Optional*): The information for the IAQ accuracy sensor. Shows: Stabilizing,
|
||||
Uncertain, Calibrating, Calibrated.
|
||||
|
||||
@ -194,6 +200,13 @@ For each sensor, all other options from :ref:`Sensor <config-sensor>` and :ref:`
|
||||
.. code-block:: yaml
|
||||
|
||||
bme680_bsec:
|
||||
# id
|
||||
# -----------
|
||||
# Identifier for this component, useful when working with multiple devices.
|
||||
# Must be unique, and can be used in the sensor sections to refer to the correct device.
|
||||
# Default: auto-computed
|
||||
id: bme680_internal
|
||||
|
||||
# i2c address
|
||||
# -----------
|
||||
# Common values are:
|
||||
@ -233,6 +246,10 @@ For each sensor, all other options from :ref:`Sensor <config-sensor>` and :ref:`
|
||||
|
||||
sensor:
|
||||
- platform: bme680_bsec
|
||||
# ID of the bme680_bsec component to use for the next sensors.
|
||||
# Useful when working with multiple devices
|
||||
bme680_bsec_id: bme680_internal
|
||||
|
||||
temperature:
|
||||
# Temperature in °C
|
||||
name: "BME680 Temperature"
|
||||
@ -282,11 +299,81 @@ For each sensor, all other options from :ref:`Sensor <config-sensor>` and :ref:`
|
||||
name: "BME680 IAQ Accuracy"
|
||||
|
||||
|
||||
Multiple sensors
|
||||
----------------------
|
||||
|
||||
The following configuration shows how to set up multiple BME680 devices. They can be configured to use the same I²C bus or to use different busses, but remember that the BME680 can only be set to operate on I²C address ``0x76`` or ``0x77``. There is no limit on the number of BME680 devices that can be connected.
|
||||
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# I2C bus for the BME680 devices
|
||||
i2c:
|
||||
- id: "i2cbus_bme"
|
||||
sda: GPIO18
|
||||
scl: GPIO19
|
||||
scan: true
|
||||
|
||||
# BME680 devices using BSEC library
|
||||
bme680_bsec:
|
||||
- id: bme680_internal
|
||||
i2c_id: "i2cbus_bme"
|
||||
address: 0x76
|
||||
- id: bme680_external
|
||||
i2c_id: "i2cbus_bme"
|
||||
address: 0x77
|
||||
|
||||
sensor:
|
||||
# Sensors for the internal BME680 device
|
||||
- platform: bme680_bsec
|
||||
bme680_bsec_id: bme680_internal
|
||||
temperature:
|
||||
name: "IN_Temp"
|
||||
pressure:
|
||||
name: "IN_Press"
|
||||
humidity:
|
||||
name: "IN_RH"
|
||||
iaq:
|
||||
name: "IN_IAQ"
|
||||
co2_equivalent:
|
||||
name: "IN_CO2eq"
|
||||
breath_voc_equivalent:
|
||||
name: "IN_VOCeq"
|
||||
|
||||
# Sensors for the external BME680 device
|
||||
- platform: bme680_bsec
|
||||
bme680_bsec_id: bme680_external
|
||||
temperature:
|
||||
name: "OUT_Temperatura"
|
||||
pressure:
|
||||
name: "OUT_Pressione"
|
||||
humidity:
|
||||
name: "OUT_RH"
|
||||
iaq:
|
||||
name: "OUT_IAQ"
|
||||
co2_equivalent:
|
||||
name: "OUT_CO2eq"
|
||||
breath_voc_equivalent:
|
||||
name: "OUT_VOCeq"
|
||||
|
||||
text_sensor:
|
||||
# Text sensor for the internal BME680 device
|
||||
- platform: bme680_bsec
|
||||
bme680_bsec_id: bme680_internal
|
||||
iaq_accuracy:
|
||||
name: "IN_IAQaccuracy"
|
||||
|
||||
# Text sensor for the external BME680 device
|
||||
- platform: bme680_bsec
|
||||
bme680_bsec_id: bme680_external
|
||||
iaq_accuracy:
|
||||
name: "OUT_IAQaccuracy"
|
||||
|
||||
Index for Air Quality (IAQ) Measurement
|
||||
---------------------------------------
|
||||
|
||||
The measurements are expressed with an index scale ranging from 0 to 500. The index itself is deduced
|
||||
from tests using ethanol gas, as well as important VOC in the exhaled breath of healthy humans.
|
||||
The measurements are expressed with an index scale ranging from 0 to 500. The index itself is deduced
|
||||
from tests using ethanol gas, as well as important VOC in the exhaled breath of healthy humans.
|
||||
The VOC values themselves are derived from several publications on breath analysis studies. The BSEC
|
||||
software library defines the levels as follows:
|
||||
|
||||
@ -307,7 +394,7 @@ software library defines the levels as follows:
|
||||
+-----------+---------------------+
|
||||
| > 351 | Extremely polluted |
|
||||
+-----------+---------------------+
|
||||
|
||||
|
||||
The selected b-VOC gasses are as follows:
|
||||
|
||||
+--------------------+----------------+
|
||||
@ -336,8 +423,8 @@ The selected b-VOC gasses are as follows:
|
||||
IAQ Accuracy and Calibration
|
||||
----------------------------
|
||||
|
||||
The BSEC software automatically calibrates automatically in the background to provide consistent IAQ performance. The
|
||||
calibration process considers the recent measurement history so that a value of 50 corresponds to a “typical good”
|
||||
The BSEC software automatically calibrates automatically in the background to provide consistent IAQ performance. The
|
||||
calibration process considers the recent measurement history so that a value of 50 corresponds to a “typical good”
|
||||
level and a value of 200 to a “typical polluted” level. The IAQ Accuracy sensor will give one of the following values:
|
||||
|
||||
- ``Stabilizing``: The device has just started, and the sensor is stabilizing (this typically lasts 5 minutes)
|
||||
@ -353,6 +440,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`bme680`
|
||||
- :apiref:`bme680_bsec/bme680_bsec.h`
|
||||
- `BME680 Datasheet <https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme680-ds001.pdf>`__
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 18 KiB |
@ -81,6 +81,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
- :doc:`htu21d`
|
||||
|
@ -55,6 +55,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`hdc1080`
|
||||
- :doc:`htu21d`
|
||||
|
@ -52,6 +52,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :apiref:`ENS210/ENS210.h`
|
||||
- `ENS210 Library <https://github.com/maarten-pennings/ENS210>`__ by `Maarten Pennings <https://github.com/maarten-pennings>`__
|
||||
- :ghedit:`Edit`
|
||||
|
47
components/sensor/fs3000.rst
Normal file
@ -0,0 +1,47 @@
|
||||
FS3000 Air Velocity Sensor
|
||||
==========================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up the FS3000 Air Velocity sensor.
|
||||
:image: fs3000.jpg
|
||||
:keywords: FS3000
|
||||
|
||||
The FS3000 Air Velocity sensor allows you to use your FS3000
|
||||
(`datasheet <https://www.renesas.com/kr/en/document/dst/fs3000-datasheet?r=1395551>`__,
|
||||
`sparkfun <https://www.sparkfun.com/products/18377>`__)
|
||||
sensors with ESPHome.
|
||||
|
||||
.. figure:: images/fs3000.jpg
|
||||
:align: center
|
||||
:width: 30.0%
|
||||
|
||||
FS3000 Air Velocity Sensor.
|
||||
(Credit: `Sparkfun <https://www.sparkfun.com/products/18377>`__, image compressed)
|
||||
|
||||
.. _Sparkfun: https://www.sparkfun.com/products/15805
|
||||
|
||||
The FS3000 is a solid state air velocity sensor that communicates over over I²C. It is based on a MEMS thermopile sensor. There are two subtypes available: the FS3000-1005 measures air velocities between 0 meters/second and 7.23 meters/second, and the FS3000-1015 measures air velocities between 0 meters/second and 15 meters/second.
|
||||
|
||||
To use the sensor, first set up an :ref:`I²C Bus <i2c>` and connect the sensor to the specified pins.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: fs3000
|
||||
name: "Air Velocity"
|
||||
model: 1005
|
||||
update_interval: 60s
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **model** (**Required**, string): Specify FS3000 model, can be ``1005`` or ``1015``.
|
||||
- **address** (*Optional*, int): Manually specifiy the I²C address of the sensor. Defaults to ``0x28``.
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the sensor. Defaults to ``60s``.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ghedit:`Edit`
|
@ -80,6 +80,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`htu21d`
|
||||
|
@ -52,6 +52,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`tee501`
|
||||
- :doc:`ee895`
|
||||
- :doc:`dht`
|
||||
|
@ -58,6 +58,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
|
BIN
components/sensor/images/as7341-full.jpg
Normal file
After Width: | Height: | Size: 134 KiB |
BIN
components/sensor/images/fs3000.jpg
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
components/sensor/images/internal_temperature-ui.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
components/sensor/images/mopeka_std_check.jpg
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
components/sensor/images/sen21231.png
Normal file
After Width: | Height: | Size: 334 KiB |
@ -115,6 +115,7 @@ See Also
|
||||
|
||||
- :doc:`/components/esp32_ble_tracker`
|
||||
- :doc:`/components/sensor/index`
|
||||
- :doc:`absolute_humidity`
|
||||
- :apiref:`inkbird_ibsth1_mini/inkbird_ibsth1_mini.h`
|
||||
- `OpenMQTTGateway <https://github.com/1technophile/OpenMQTTGateway>`__ by `@1technophile <https://github.com/1technophile>`__
|
||||
- :ghedit:`Edit`
|
||||
|
41
components/sensor/internal_temperature.rst
Normal file
@ -0,0 +1,41 @@
|
||||
Internal Temperature Sensor
|
||||
===========================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up the integrated temperature sensor of the ESP32 and RP2040.
|
||||
:image: thermometer.svg
|
||||
:keywords: esp32, rp2040, cpu, internal, temperature
|
||||
|
||||
The ``internal_temperature`` sensor platform allows you to use the integrated
|
||||
temperature sensor of the ESP32 and RP2040 chip.
|
||||
|
||||
.. note::
|
||||
|
||||
Some ESP32 variants return a large amount of invalid temperature
|
||||
values. Invalid measurements are ignored by this component.
|
||||
|
||||
.. figure:: images/internal_temperature-ui.png
|
||||
:align: center
|
||||
:width: 70.0%
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: internal_temperature
|
||||
name: "Internal Temperature"
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **name** (**Required**, string): The name of the temperature sensor.
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval
|
||||
to check the sensor. Defaults to ``60s``.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :ghedit:`Edit`
|
88
components/sensor/kuntze.rst
Normal file
@ -0,0 +1,88 @@
|
||||
Kuntze pool monitor
|
||||
===================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up Kuntze pool monitor in ESPHome.
|
||||
:image: kuntze.jpg
|
||||
|
||||
The ``kuntze`` component allows you to integrate the Kuntze water measurement
|
||||
instrument in ESPHome. It uses :ref:`UART <uart>` (ModBUS) for communication.
|
||||
|
||||
Once configured you can use sensors as described below for your projects.
|
||||
|
||||
|
||||
.. figure:: ../../images/kuntze.jpg
|
||||
:align: center
|
||||
|
||||
Kuntze Neon® Multi instrument
|
||||
|
||||
Overview
|
||||
--------
|
||||
|
||||
Kuntze devices have an RS485 (ModBUS RTU) communication port. Please see the
|
||||
Kuntze papers for the pinout of the RS485 connector on your unit. ModBUS line
|
||||
has to be terminated properly (with a ``120Ω`` resistor), and since this is likely
|
||||
your only unit connected to ESPHome, you should activate bus termination in the
|
||||
Network menu (this component doesn't support multiple Kuntze devices on the same
|
||||
bus). ModBUS address should remain at factory default value.
|
||||
|
||||
The device communicates at ``19200`` baud ``8E1``. To connect to ESPHome, an RS485
|
||||
transceiver is needed. Choose a type which does not need a trigger to send and
|
||||
receive data, for example:
|
||||
|
||||
.. figure:: ../../images/rs485.jpg
|
||||
|
||||
The controller connects to the UART of the MCU. For ESP32 GPIO `16` to `TXD` and `17`
|
||||
to RXD are the default ones but any other pins can be used as well. 3.3V to VCC and GND to GND.
|
||||
|
||||
.. warning::
|
||||
|
||||
If you are using the :ref:`logger` make sure you are not using the same pins for it or otherwise disable the UART
|
||||
logging with the ``baud_rate: 0`` option.
|
||||
|
||||
Component
|
||||
---------
|
||||
|
||||
A configured modbus component is optional. It will be automatically created.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
uart:
|
||||
- id: uart_bus
|
||||
tx_pin: GPIO16
|
||||
rx_pin: GPIO17
|
||||
baud_rate: 19200
|
||||
parity: EVEN
|
||||
|
||||
sensor:
|
||||
- platform: kuntze
|
||||
id: my_kuntze
|
||||
ph:
|
||||
id: ph
|
||||
temperature:
|
||||
id: temperature
|
||||
|
||||
|
||||
Configuration variables:
|
||||
|
||||
- **ph**: Measured pH value
|
||||
- **temperature**: Measured temperature value
|
||||
- **dis1**: Measured DIS 1 value
|
||||
- **dis2**: Measured DIS 2 value
|
||||
- **redox**: Measured Redox value
|
||||
- **ec**: Measured EC value
|
||||
- **oci**: Measured OCI value
|
||||
|
||||
|
||||
All sensors are *Optional* and support all other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :ref:`uart`
|
||||
- :ref:`logger`
|
||||
- :ref:`Sensor <config-sensor>`
|
||||
- `Kuntze manuals <https://www.kuntze.com/en/downloads-2/>`__
|
||||
- `Communication protocol <https://www.kuntze.com/wp-content/uploads/2021/05/2019_Manual_Modbus-RTU_ENG.pdf>`__
|
||||
- :ghedit:`Edit`
|
@ -19,6 +19,9 @@ sensor sends out a BLE broadcast.
|
||||
+ Mopeka Pro Check devices
|
||||
+ Mopeka Pro Plus devices
|
||||
+ Lippert Propane Tank Sensor, part number 2021130655
|
||||
|
||||
See :doc:`/components/sensor/mopeka_std_check` for original Mopeka Check sensors support.
|
||||
|
||||
|
||||
(images/mopeka_pro_check.jpg)
|
||||
(images/mopeka_pro_check_lippert.jpg)
|
||||
@ -119,11 +122,12 @@ and the ``mopeka_ble`` component like so:
|
||||
|
||||
After uploading, the ESP32 will immediately try to scan for BLE devices. For Mopeka Pro
|
||||
Check / Pro Plus / Lippert devices you must press and hold the green sync button for it to be identified.
|
||||
Or alternativly set the configuration flag ``show_sensors_without_sync: true`` to see all devices.
|
||||
For all sensors found the ``mopeka_ble`` component will print a message like this one:
|
||||
|
||||
.. code::
|
||||
|
||||
[20:43:26][I][mopeka_ble:040]: SENSOR FOUND: D3:75:F2:DC:16:91
|
||||
[20:43:26][I][mopeka_ble:074]: MOPEKA PRO (NRF52) SENSOR FOUND: D3:75:F2:DC:16:91
|
||||
|
||||
Then just copy the address (``D3:75:F2:DC:16:91``) into a new
|
||||
``sensor.mopeka_pro_check`` platform entry like in the configuration example at the top.
|
||||
|
150
components/sensor/mopeka_std_check.rst
Normal file
@ -0,0 +1,150 @@
|
||||
Mopeka Standard Check BLE Sensor
|
||||
================================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up Mopeka Standard Check bluetooth-based sensors in ESPHome.
|
||||
:image: mopeka_std_check.jpg
|
||||
:keywords: Mopeka, Mopeka Standard Check, Mopeka Std Check, BLE, Bluetooth
|
||||
|
||||
The ``mopeka_std_check`` sensor platform lets you track the output of Mopeka
|
||||
Standard Check LP Bluetooth Low Energy devices using the
|
||||
:doc:`/components/esp32_ble_tracker`. This component will track the tank level,
|
||||
distance, temperature, and battery percentage of a Mopeka Standard Check LP BLE
|
||||
device every time the sensor sends out a BLE broadcast.
|
||||
|
||||
.. warning::
|
||||
|
||||
This sensor component only supports the Mopeka Standard Check devices.
|
||||
See :doc:`/components/sensor/mopeka_pro_check` for Mopeka Pro Check sensors support.
|
||||
|
||||
.. figure:: images/mopeka_std_check.jpg
|
||||
:align: center
|
||||
|
||||
Mopeka Std Check LP over BLE.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
|
||||
sensor:
|
||||
# Example using 11kg 100% propane tank.
|
||||
- platform: mopeka_std_check
|
||||
mac_address: D3:75:F2:DC:16:91
|
||||
tank_type: Europe_11kg
|
||||
temperature:
|
||||
name: "Propane test temp"
|
||||
level:
|
||||
name: "Propane test level"
|
||||
distance:
|
||||
name: "Propane test distance"
|
||||
battery_level:
|
||||
name: "Propane test battery level"
|
||||
|
||||
# Custom example - user defined empty / full points and 80% butane and 20% propane.
|
||||
- platform: mopeka_std_check
|
||||
mac_address: D3:75:F2:DC:16:91
|
||||
tank_type: CUSTOM
|
||||
custom_distance_full: 40cm
|
||||
custom_distance_empty: 32mm
|
||||
propane_butane_mix: 20%
|
||||
temperature:
|
||||
name: "Propane c test temp"
|
||||
level:
|
||||
name: "Propane c test level"
|
||||
distance:
|
||||
name: "Propane c test distance"
|
||||
battery_level:
|
||||
name: "Propane c test battery level"
|
||||
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **mac_address** (**Required**, MAC Address): The MAC address of the Mopeka
|
||||
device.
|
||||
|
||||
- **tank_type** (**Required**): The tank type the sensor is measuring. See below.
|
||||
|
||||
- **custom_distance_full** (*Optional*): distance sensor will read when it should be
|
||||
considered full (100%). This is only used when tank_type = CUSTOM
|
||||
|
||||
- **custom_distance_empty** (*Optional*): distance sensor will read when it should be
|
||||
considered empty (0%). This is only used when tank_type = CUSTOM
|
||||
|
||||
- **propane_butane_mix** (*Optional*): Mixture of propane and butane.
|
||||
|
||||
- 100% - (*default*) 100% Propane
|
||||
|
||||
- 80% - 80% Propane and 20% Butane
|
||||
|
||||
- 20% - 20% Propane and 80% Butane
|
||||
|
||||
- 0% - 100% Butane
|
||||
|
||||
- **level** (*Optional*): The percentage of full for the tank sensor
|
||||
|
||||
- All options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **distance** (*Optional*): The raw distance/depth of the liquid for the sensor in mm.
|
||||
|
||||
- All options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **temperature** (*Optional*): The information for the temperature sensor.
|
||||
This temperature is on the sensor and is not calibrated to ambient temperature.
|
||||
|
||||
- All options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **battery_level** (*Optional*): The information for the battery percentage
|
||||
sensor. Sensor uses a standard CR2032 battery.
|
||||
|
||||
- All options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
Tank Types
|
||||
----------
|
||||
|
||||
Currently supported Tank types are:
|
||||
|
||||
- ``NORTH_AMERICA_20LB_VERTICAL`` - 20 LB vertical tank
|
||||
- ``NORTH_AMERICA_30LB_VERTICAL`` - 30 LB vertical tank
|
||||
- ``NORTH_AMERICA_40LB_VERTICAL`` - 40 LB vertical tank
|
||||
- ``EUROPE_6KG`` - 6kg vertical tank
|
||||
- ``EUROPE_11KG`` - 11kg vertical tank
|
||||
- ``EUROPE_14KG`` - 14kg vertical tank
|
||||
- ``CUSTOM`` - Allows you to define your own full and empty points
|
||||
|
||||
Setting Up Devices
|
||||
------------------
|
||||
|
||||
To set up Mopeka Standard Check devices you first need to find their MAC Address so that
|
||||
ESPHome can identify them. So first, create a simple configuration with the ``esp32_ble_tracker``
|
||||
and the ``mopeka_ble`` component like so:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
esp32_ble_tracker:
|
||||
|
||||
mopeka_ble:
|
||||
|
||||
After uploading, the ESP32 will immediately try to scan for BLE devices. For Mopeka Standard devices you must press and hold the green sync button for it to be identified.
|
||||
Or alternativly set the configuration flag ``show_sensors_without_sync: true`` to see all devices.
|
||||
For all sensors found the ``mopeka_ble`` component will print a message like this one:
|
||||
|
||||
.. code::
|
||||
|
||||
[20:43:26][I][mopeka_ble:056]: MOPEKA STD (CC2540) SENSOR FOUND: D3:75:F2:DC:16:91
|
||||
|
||||
Then just copy the address (``D3:75:F2:DC:16:91``) into a new
|
||||
``sensor.mopeka_std_check`` platform entry like in the configuration example at the top.
|
||||
|
||||
.. note::
|
||||
|
||||
The ESPHome Mopeka Standard Check BLE integration listens passively to packets the Mopeka device sends by itself.
|
||||
ESPHome therefore has no impact on the battery life of the device.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/components/esp32_ble_tracker`
|
||||
- :doc:`/components/sensor/index`
|
||||
- :apiref:`mopeka_std_check/mopeka_std_check.h`
|
||||
- :ghedit:`Edit`
|
@ -42,6 +42,8 @@ to some pins on your board and the baud rate set to 9600.
|
||||
name: "PZEM-003 Voltage"
|
||||
power:
|
||||
name: "PZEM-003 Power"
|
||||
energy:
|
||||
name: "PZEM-003 Energy"
|
||||
update_interval: 60s
|
||||
|
||||
Configuration variables:
|
||||
@ -53,11 +55,27 @@ Configuration variables:
|
||||
:ref:`Sensor <config-sensor>`.
|
||||
- **voltage** (*Optional*): Use the voltage value of the sensor in volts.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **energy** (*Optional*): Use the energy value of the sensor in kWh.
|
||||
All options from :ref:`Sensor <config-sensor>`.
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): The interval to check the
|
||||
sensor. Defaults to ``60s``.
|
||||
- **address** (*Optional*, int): The address of the sensor if multiple sensors are attached to
|
||||
the same UART bus. You will need to set the address of each device manually. Defaults to ``1``.
|
||||
|
||||
.. _pzemdc-reset_energy_action:
|
||||
|
||||
``pzemdc.reset_energy`` Action
|
||||
******************************
|
||||
|
||||
This action resets the total energy value of the pzemdc device with the given ID when executed.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
on_...:
|
||||
then:
|
||||
- pzemdc.reset_energy: pzemdc_1
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -184,6 +184,7 @@ See Also
|
||||
|
||||
- :doc:`/components/esp32_ble_tracker`
|
||||
- :doc:`/components/sensor/index`
|
||||
- :doc:`absolute_humidity`
|
||||
- :apiref:`ruuvitag/ruuvitag.h`
|
||||
- `Ruuvi <https://ruuvi.com>`__
|
||||
- :ghedit:`Edit`
|
||||
|
@ -108,6 +108,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
|
@ -186,6 +186,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`scd30`
|
||||
- :apiref:`scd4x/scd4x.h`
|
||||
- :ghedit:`Edit`
|
||||
|
36
components/sensor/sen21231.rst
Normal file
@ -0,0 +1,36 @@
|
||||
SEN21231 Person Sensor from Useful Sensors
|
||||
==========================================
|
||||
|
||||
.. seo::
|
||||
:description: Instructions for setting up a SEN21231 Person Sensor from Useful Sensors with ESPHome.
|
||||
:image: description.svg
|
||||
|
||||
`Person Sensor (SEN21231) from Useful Sensors <https://usefulsensors.com/person-sensor>`__ has built in facial recognition that can detect how many people are facing the sensor and relative positions of the faces.
|
||||
|
||||
.. figure:: images/sen21231.png
|
||||
:align: center
|
||||
:width: 70.0%
|
||||
|
||||
|
||||
Person Sensor
|
||||
|
||||
This sensor requires an :doc:`/components/i2c`. The I2C address is ``0x62``
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: sen21231
|
||||
id: person_sensor
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- All options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/components/sensor/index`
|
||||
- :apiref:`sen21231/sen21231.h`
|
||||
- :ghedit:`Edit`
|
@ -208,6 +208,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`sds011`
|
||||
- :doc:`pmsx003`
|
||||
- :doc:`ccs811`
|
||||
|
@ -53,6 +53,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
|
@ -67,5 +67,6 @@ See Also
|
||||
- :doc:`/components/sensor/sht3xd`
|
||||
- :doc:`/components/sensor/shtcx`
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :apiref:`sht4x/sht4x.h`
|
||||
- :ghedit:`Edit`
|
||||
|
@ -56,6 +56,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`dht`
|
||||
- :doc:`dht12`
|
||||
- :doc:`hdc1080`
|
||||
|
@ -76,6 +76,7 @@ See Also
|
||||
--------
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`absolute_humidity`
|
||||
- :doc:`mhz19`
|
||||
- `CO2mon-esp firmware <https://github.com/Anonym-tsk/co2mon-esp>`__ by `@anonym-tsk <https://github.com/Anonym-tsk>`__
|
||||
- `Some information about hacking MT8060 <https://habr.com/ru/company/dadget/blog/394333/>`__
|
||||
|
@ -51,8 +51,9 @@ It reaches even further, however, offering several more advanced features, as we
|
||||
:align: center
|
||||
:width: 60.0%
|
||||
|
||||
Example Sprinkler Controller UI -- Note that this example leverages :ref:`number <config-number>` components
|
||||
for setting run durations, repeat and multiplier values. More details below.
|
||||
Example Sprinkler Controller UI -- Note that this example leverages :doc:`number </components/number/index>`
|
||||
components for setting run durations, repeat and multiplier values.
|
||||
:ref:`More details below. <sprinkler-controller-sprinkler_controller_numbers>`
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -105,29 +106,32 @@ Configuration variables:
|
||||
the valves in reverse order (last-to-first as they appear in the controller's configuration). When
|
||||
this switch is turned off or not provided, the controller will iterate through the valves first-to-last.
|
||||
This switch will not appear in the front end if the controller is configured with only one valve.
|
||||
- **standby_switch** (*Optional*, *string*): The name for the sprinkler controller's standby switch
|
||||
as it will appear in the front end. When this switch is turned on, the controller *will not start any valves.*
|
||||
**This can result in confusing/unexpected behavior if there is no visual indication of this condition!**
|
||||
- **valve_open_delay** (*Optional*, :ref:`config-time`): The *minimum* delay in seconds that should be
|
||||
inserted between (distribution) valve switching -- in other words, the amount of time that must elapse
|
||||
between one valve switching off and the next one switching on. Useful for systems with valves which depend
|
||||
on sufficient water pressure to close. May not be used with *valve_overlap*.
|
||||
on sufficient water pressure to close. May not be used with ``valve_overlap``.
|
||||
- **valve_overlap** (*Optional*, :ref:`config-time`): The amount of time in seconds that the current valve
|
||||
and the next valve should run simultaneously as the next valve/zone starts up. This may help prevent pipes
|
||||
from banging as valves close. May not be used with *valve_open_delay*.
|
||||
from banging as valves close. May not be used with ``valve_open_delay``.
|
||||
- **pump_switch_off_during_valve_open_delay** (*Optional*, boolean): If set to ``true``, the pump will be
|
||||
switched off during the ``valve_open_delay`` interval; otherwise, it remains on. This may only be
|
||||
specified when ``valve_open_delay`` is configured (see above). Defaults to ``false``.
|
||||
- **pump_start_pump_delay** (*Optional*, :ref:`config-time`): The delay in seconds from when a distribution
|
||||
valve is opened to when the associated pump is activated. Useful to ensure pressure does not build
|
||||
up from running the pump when no distribution valves are open. May not be used with *pump_start_valve_delay*.
|
||||
up from running the pump when no distribution valves are open. May not be used with ``pump_start_valve_delay``.
|
||||
- **pump_start_valve_delay** (*Optional*, :ref:`config-time`): The delay in seconds from when a pump
|
||||
is started to when the associated distribution valve is opened. Useful for systems where distribution
|
||||
valves require sufficient pressure to fully/quickly close. May not be used with *pump_start_pump_delay*.
|
||||
valves require sufficient pressure to fully/quickly close. May not be used with ``pump_start_pump_delay``.
|
||||
- **pump_stop_pump_delay** (*Optional*, :ref:`config-time`): The delay in seconds from when a distribution
|
||||
valve is closed to when the respective pump is deactivated. Useful for systems where distribution valves
|
||||
require sufficient pressure to fully/quickly close. May not be used with *pump_stop_valve_delay*.
|
||||
require sufficient pressure to fully/quickly close. May not be used with ``pump_stop_valve_delay``.
|
||||
- **pump_stop_valve_delay** (*Optional*, :ref:`config-time`): The delay in seconds from when a pump is
|
||||
deactivated to when the respective distribution valve is closed. Useful to ensure pressure does not build
|
||||
up from running the pump when no distribution valves are open or to allow the main line out to distribution
|
||||
valves to drain. May not be used with *pump_stop_pump_delay*.
|
||||
valves to drain. May not be used with ``pump_stop_pump_delay``.
|
||||
- **pump_pulse_duration** (*Optional*, :ref:`config-time`): The *minimum* length of the pulse generated to
|
||||
operate a pump in milliseconds. *Required* when one or more latching pumps is configured. Note that the *exact*
|
||||
length of the pulse is determined by the frequency of the main application loop (as are other ``delay`` timers
|
||||
@ -140,7 +144,18 @@ Configuration variables:
|
||||
used in ESPHome). Typically this is expected to provide a resolution of approximately 16 milliseconds, however
|
||||
this may vary somewhat depending on your exact configuration. Regardless, it should provide more-than-sufficient
|
||||
precision to operate any such valve.
|
||||
- **repeat** (*Optional*, int): The number of times a full cycle should be repeated. Defaults to 0.
|
||||
- **multiplier_number** (*Optional*, *string*): The name of the :doc:`number </components/number/index>` component that
|
||||
should be presented to the front end (Home Assistant) to enable control of the sprinkler controller's ``multiplier``
|
||||
value. See :ref:`sprinkler-controller-sprinkler_controller_numbers` below for more detail.
|
||||
- **repeat_number** (*Optional*, *string*): The name of the :doc:`number </components/number/index>` component that
|
||||
should be presented to the front end (Home Assistant) to enable control of the sprinkler controller's ``repeat``
|
||||
value. May not be used with ``repeat``. See :ref:`sprinkler-controller-sprinkler_controller_numbers` below for more
|
||||
detail.
|
||||
- **repeat** (*Optional*, int): The number of times a full cycle should be repeated. Defaults to 0. May not be used
|
||||
with ``repeat_number``.
|
||||
- **next_prev_ignore_disabled** (*Optional*, boolean): Set to ``true`` to cause
|
||||
:ref:`sprinkler-controller-action_next_valve` and :ref:`sprinkler-controller-action_previous_valve` to skip
|
||||
over valves that are not enabled. Defaults to ``false``.
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. While optional,
|
||||
this is necessary to identify the controller instance (particularly in cases where more than one is
|
||||
defined) when calling controller actions (see below) such as ``start_full_cycle`` or ``shutdown``.
|
||||
@ -173,10 +188,16 @@ Configuration variables:
|
||||
would *switch on* the respective pump/valve. *It is not recommended to expose this switch to the front end; please
|
||||
see* :ref:`sprinkler-controller-an_important_note_about_gpio_switches_and_control` *below for more detail.*
|
||||
May not be specified with *pump_switch_id*.
|
||||
- **run_duration** (**Required**, :ref:`config-time`): The duration in seconds this valve should
|
||||
remain on/open after it is activated. When a given valve is activated, the controller's multiplier value
|
||||
is multiplied by this value to determine the actual run duration for the valve, thus allowing the run
|
||||
duration for all valves/zones to be proportionally increased or decreased as desired.
|
||||
- **run_duration_number** (*Optional*, *string*): The name of the :doc:`number </components/number/index>` component
|
||||
that should be presented to the front end (Home Assistant) to enable control of the valve's ``run_duration`` value.
|
||||
May not be used with ``run_duration``. See :ref:`sprinkler-controller-sprinkler_controller_numbers` below for more
|
||||
detail. **Pro tip:** Want times in minutes? Add ``unit_of_measurement: min`` to the number configuration. See
|
||||
:ref:`sprinkler-controller-sprinkler_controller_numbers` for more detail.
|
||||
- **run_duration** (*Optional*, :ref:`config-time`): Required when ``run_duration_number`` is not provided. The
|
||||
duration in seconds this valve should remain on/open after it is activated. When a given valve is activated, the
|
||||
controller's multiplier value is multiplied by this value to determine the actual run duration for the valve, thus
|
||||
allowing the run duration for all valves/zones to be proportionally increased or decreased as desired. May not be
|
||||
used with ``run_duration_number``.
|
||||
- **valve_switch_id** (**Required**, :ref:`Switch <config-switch>`): This is the :ref:`switch <config-switch>`
|
||||
component to be used to control the valve that operates the given section or zone of the sprinkler
|
||||
system. Typically this would be a :doc:`GPIO switch <switch/gpio>` wired to control a relay
|
||||
@ -213,7 +234,7 @@ off, **not** the :doc:`GPIO switch <switch/gpio>` the zone is configured with.
|
||||
Keep in mind that a :doc:`GPIO switch <switch/gpio>` directly controls the state of the GPIO pin it is associated
|
||||
with. While it's technically feasible to "override" this behavior, it might not always be desirable. For example,
|
||||
if you *wanted* to control the state of the switch/pin manually during testing of your system/configuration, this
|
||||
would make that impossible (or at least more difficult than necessary), presenting other complications. Ultimately,
|
||||
would make doing so impossible (or at least more difficult than necessary), presenting other complications. Ultimately,
|
||||
flexibility is key, as we've learned from any number of conversations on the ESPHome Discord server.
|
||||
|
||||
As mentioned in the introduction, the sprinkler controller automates control of the :doc:`GPIO switches <switch/gpio>`
|
||||
@ -295,11 +316,11 @@ See :ref:`sprinkler-controller-sprinkler_controller_queue` section below for mor
|
||||
``sprinkler.start_single_valve`` action
|
||||
***************************************
|
||||
|
||||
Starts a single valve. This disables the controller's "auto-advance" and queue features so that
|
||||
only this valve/zone will run. The valve will remain on for its configured ``run_duration``
|
||||
multiplied by the controller's multiplier value. *Note that this action ignores whether the valve
|
||||
is enabled; that is, when called, the specified valve will always run.* Valves are numbered in the
|
||||
order they appear in the sprinkler controller's configuration starting at zero (0).
|
||||
Starts a single valve. This disables the controller's "auto-advance" and queue features so that only this valve/zone
|
||||
will run. The valve will remain on for the specified duration or (if ``run_duration`` is not specified or is zero) for
|
||||
its configured ``run_duration`` multiplied by the controller's multiplier value. *Note that this action ignores whether
|
||||
the valve is enabled; that is, when called, the specified valve will always run.* Valves are numbered in the order they
|
||||
appear in the sprinkler controller's configuration starting at zero (0).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -308,14 +329,14 @@ order they appear in the sprinkler controller's configuration starting at zero (
|
||||
- sprinkler.start_single_valve:
|
||||
id: sprinkler_ctrlr
|
||||
valve_number: 0
|
||||
run_duration: 600s # optional
|
||||
|
||||
.. _sprinkler-controller-action_shutdown:
|
||||
|
||||
``sprinkler.shutdown`` action
|
||||
*****************************
|
||||
|
||||
Immediately (begins to) turns off all valves, effectively shutting down the system, respecting any
|
||||
configured pump or valve stop delays.
|
||||
Initiates a shutdown of all valves/the system, respecting any configured pump or valve stop delays.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -330,7 +351,8 @@ configured pump or valve stop delays.
|
||||
|
||||
Advances to the next valve (numerically). If ``manual_selection_delay`` is configured, the controller
|
||||
will wait before activating the selected valve. If no valve is active, the first valve (as they appear
|
||||
in the controller's configuration) will be started.
|
||||
in the controller's configuration) will be started. Setting ``next_prev_ignore_disabled`` to ``true``
|
||||
will cause this action to skip valves that are not enabled via their valve enable switch (see above).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -345,7 +367,8 @@ in the controller's configuration) will be started.
|
||||
|
||||
Advances to the previous valve (numerically). If ``manual_selection_delay`` is configured, the controller
|
||||
will wait before activating the selected valve. If no valve is active, the last valve (as they appear in
|
||||
the controller's configuration) will be started.
|
||||
the controller's configuration) will be started. Setting ``next_prev_ignore_disabled`` to ``true`` will
|
||||
cause this action to skip valves that are not enabled via their valve enable switch (see above).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -438,8 +461,10 @@ section below for more detail and examples.
|
||||
***********************************
|
||||
|
||||
Sets the multiplier value used to proportionally increase or decrease the run duration for all valves/zones.
|
||||
When a given valve is activated, this value is multiplied by the valve's run duration (see below) to
|
||||
determine the valve's actual run duration.
|
||||
When a given valve is activated, this value is multiplied by the valve's run duration (see below) to determine the
|
||||
valve's actual run duration. *Note that a multiplier value of zero is allowed; if the multiplier value is zero, the
|
||||
sprinkler controller will not start any valves.* **This can result in confusing/unexpected behavior if a visual
|
||||
indication of this condition is not available!**
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -466,6 +491,30 @@ of 1, the initial cycle will run, then the repeat cycle will run, resulting in a
|
||||
id: sprinkler_ctrlr
|
||||
repeat: 2 # would run three cycles
|
||||
|
||||
.. _sprinkler-controller-action_set_divider:
|
||||
|
||||
``sprinkler.set_divider`` action
|
||||
********************************
|
||||
|
||||
The divider value sets both the multiplier and repeat values as follows:
|
||||
|
||||
- The multiplier value is set to the value of 1 / ``divider``
|
||||
- The repeat value is set to ``divider`` - 1
|
||||
|
||||
As an example, given a divider value of 4, the multiplier would be set to 0.25 and the repeat value
|
||||
would be set to 3.
|
||||
|
||||
This can be useful for dividing the run duration for each valve into multiple shorter cycles, therefore
|
||||
avoiding run-off by allowing the ground more time to absorb the water.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
on_...:
|
||||
then:
|
||||
- sprinkler.set_divider:
|
||||
id: sprinkler_ctrlr
|
||||
divider: 2
|
||||
|
||||
.. _sprinkler-controller-action_set_valve_run_duration:
|
||||
|
||||
``sprinkler.set_valve_run_duration`` action
|
||||
@ -485,8 +534,7 @@ by the multiplier value (see above) to determine the valve's actual run duration
|
||||
|
||||
.. note::
|
||||
|
||||
- The ``next_valve``, ``previous_valve`` and ``start_single_valve`` actions ignore whether a valve
|
||||
is enabled via its enable switch.
|
||||
- The ``start_single_valve`` action ignores whether a valve is enabled via its enable switch.
|
||||
- The ``next_valve`` and ``previous_valve`` actions may not appear to respond immediately if either
|
||||
``manual_selection_delay`` or any of the various delay mechanisms described in the
|
||||
:ref:`sprinkler-controller-pump_and_distribution_valve_coordination` section below are configured.
|
||||
@ -636,19 +684,21 @@ This example illustrates a complete, simple three-valve system with no pump/upst
|
||||
main_switch: "Lawn Sprinklers"
|
||||
auto_advance_switch: "Lawn Sprinklers Auto Advance"
|
||||
reverse_switch: "Lawn Sprinklers Reverse"
|
||||
multiplier_number: "Lawn Sprinkler Multiplier"
|
||||
repeat_number: "Lawn Sprinkler Repeat"
|
||||
valve_overlap: 5s
|
||||
valves:
|
||||
- valve_switch: "Front Lawn"
|
||||
enable_switch: "Enable Front Lawn"
|
||||
run_duration: 900s
|
||||
run_duration_number: "Front Yard Run Duration"
|
||||
valve_switch_id: lawn_sprinkler_valve_sw0
|
||||
- valve_switch: "Side Lawn"
|
||||
enable_switch: "Enable Side Lawn"
|
||||
run_duration: 900s
|
||||
run_duration_number: "Front Yard Run Duration"
|
||||
valve_switch_id: lawn_sprinkler_valve_sw1
|
||||
- valve_switch: "Back Lawn"
|
||||
enable_switch: "Enable Back Lawn"
|
||||
run_duration: 900s
|
||||
run_duration_number: "Front Yard Run Duration"
|
||||
valve_switch_id: lawn_sprinkler_valve_sw2
|
||||
|
||||
switch:
|
||||
@ -853,12 +903,20 @@ valves, each of which are shared between the two controllers:
|
||||
- valve_switch: "Front Garden"
|
||||
enable_switch: "Enable Front Garden"
|
||||
pump_switch_id: sprinkler_pump_sw0
|
||||
run_duration: 900s
|
||||
run_duration_number:
|
||||
id: garden_sprinkler_ctrlr_front_run_duration
|
||||
name: "Front Garden Run Duration"
|
||||
initial_value: 10
|
||||
unit_of_measurement: min
|
||||
valve_switch_id: garden_sprinkler_valve_sw0
|
||||
- valve_switch: "Back Garden"
|
||||
enable_switch: "Enable Back Garden"
|
||||
pump_switch_id: sprinkler_pump_sw1
|
||||
run_duration: 900s
|
||||
run_duration_number:
|
||||
id: garden_sprinkler_ctrlr_back_run_duration
|
||||
name: "Back Garden Run Duration"
|
||||
initial_value: 10
|
||||
unit_of_measurement: min
|
||||
valve_switch_id: garden_sprinkler_valve_sw1
|
||||
|
||||
switch:
|
||||
@ -891,6 +949,59 @@ valves, each of which are shared between the two controllers:
|
||||
communicate to ensure any given pump is activated and deactivated only as necessary, even when
|
||||
the controllers are operating simultaneously.
|
||||
|
||||
.. _sprinkler-controller-sprinkler_controller_numbers:
|
||||
|
||||
Using the Sprinkler Controller's Numbers
|
||||
****************************************
|
||||
|
||||
The sprinkler controller can leverage ESPHome's/Home Assistant's :doc:`number </components/number/index>` component to
|
||||
make valve run durations easily adjustable from the front end (Home Assistant).
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
sprinkler:
|
||||
- id: lawn_sprinkler_ctrlr
|
||||
multiplier_number: "Lawn Sprinkler Multiplier"
|
||||
repeat_number: "Lawn Sprinkler Repeat"
|
||||
...
|
||||
|
||||
An added benefit of using :doc:`number </components/number/index>` components is that modified valve run durations,
|
||||
multiplier and repeat values can persist across resets/reboots of the ESP device. If this is your desired behavior, you
|
||||
should configure the :doc:`number </components/number/index>` components within your sprinkler controller configuration.
|
||||
|
||||
The sprinkler controller's implementation of the :doc:`number </components/number/index>` component is based on
|
||||
ESPHome's :doc:`/components/number/index`, supporting all of its :ref:`configuration variables <config-number>` in
|
||||
addition to a subset of the :doc:`Template Number Component's </components/number/template>` configuration variables,
|
||||
including:
|
||||
|
||||
- ``initial_value`` (Defaults to 900 for valves, 1 for multiplier, 0 for repeat)
|
||||
- ``max_value`` (Defaults to 86400 for valves, 10 for multiplier and repeat)
|
||||
- ``min_value`` (Defaults to 1 for valves, 0 for multiplier and repeat)
|
||||
- ``step`` (Defaults to 1 for valves and repeat, 0.1 for multiplier)
|
||||
- ``restore_value`` (Defaults to ``true``; set to ``false`` to always restore ``initial_value`` at boot)
|
||||
- ``set_action``
|
||||
- ``unit_of_measurement`` (For run durations only; defaults to ``s`` for seconds or specify ``min`` for minutes)
|
||||
|
||||
Here's a brief example:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
sprinkler:
|
||||
- id: lawn_sprinkler_ctrlr
|
||||
main_switch: "Lawn Sprinklers"
|
||||
...
|
||||
multiplier_number:
|
||||
id: controller_multiplier_number
|
||||
name: "Lawn Sprinkler Multiplier"
|
||||
initial_value: 1.5
|
||||
min_value: 0.1
|
||||
max_value: 5
|
||||
set_action:
|
||||
- lambda: "some_function();"
|
||||
...
|
||||
|
||||
.. _sprinkler-controller-sprinkler_controller_extending_switches:
|
||||
|
||||
Extending the Sprinkler Controller's Switches
|
||||
*********************************************
|
||||
|
||||
@ -970,30 +1081,6 @@ queue entry will be picked up *before* the next valve that would run as a part o
|
||||
behavior cannot be changed. It should also be noted that the queue has a hard-coded limit of 100 entries to limit
|
||||
memory use.
|
||||
|
||||
Additional Tricks
|
||||
*****************
|
||||
|
||||
Beyond what is shown in the configuration examples above, other ESPHome elements may be called into
|
||||
play to help build out an extensive interface for the controller in the front end (Home Assistant).
|
||||
For example, the :ref:`number <config-number>` component may be used to set valve run durations or
|
||||
the controller's multiplier value:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration to set multiplier via number
|
||||
number:
|
||||
- platform: template
|
||||
id: sprinkler_ctrlr_multiplier
|
||||
name: "Sprinkler Controller Multiplier"
|
||||
min_value: 0.1
|
||||
max_value: 10.0
|
||||
step: 0.1
|
||||
lambda: "return id(lawn_sprinkler_ctrlr).multiplier();"
|
||||
set_action:
|
||||
- sprinkler.set_multiplier:
|
||||
id: lawn_sprinkler_ctrlr
|
||||
multiplier: !lambda 'return x;'
|
||||
|
||||
Expose Sprinkler Controller Actions via user-API
|
||||
************************************************
|
||||
|
||||
@ -1032,6 +1119,168 @@ and/or trigger sprinkler controller actions using automations.
|
||||
then:
|
||||
- sprinkler.shutdown: lawn_sprinkler_ctrlr
|
||||
|
||||
.. _sprinkler-controller-sprinkler_controller_understanding_state:
|
||||
|
||||
Understanding the Sprinkler Controller's State
|
||||
----------------------------------------------
|
||||
|
||||
A number of people have asked about how to determine the sprinkler controller's state. This section aims to outline how
|
||||
to use the sprinkler controller's :apiref:`API <sprinkler/sprinkler.h>` to determine what it is doing, generally with
|
||||
the goal of indicating this on some form of :doc:`display </components/display/index>` hardware. Note that this
|
||||
discussion largely revolves around C++ code (as is used in ESPHome lambdas).
|
||||
|
||||
Many of the methods used to determine the sprinkler controller's state return a type of value known as an ``optional``.
|
||||
If you are curious, a general reference for the ``optional`` type may be found
|
||||
`here <https://en.cppreference.com/w/cpp/utility/optional>`__, but what is important for now is:
|
||||
|
||||
- The ``optional`` type *may* or *may not* contain a value
|
||||
|
||||
- The method ``has_value()`` is used to determine if a value is present. For example:
|
||||
``id(lawn_sprinkler_ctrlr).active_valve().has_value()``
|
||||
- The method ``value()`` is used to determine the value, *if* it is determined that a value is present. For example:
|
||||
``auto running_valve = id(lawn_sprinkler_ctrlr).active_valve().value()``
|
||||
|
||||
- The ``optional`` type can contain a value of any C++ type (``bool``, ``int``, ``float``, etc.) (In C++ terms, it is a
|
||||
template.)
|
||||
|
||||
The examples that follow illustrate use of the the sprinkler controller's methods within a
|
||||
:doc:`display </components/display/index>` lambda. The examples are intended to illustrate a pattern and (for sake of
|
||||
brevity) *are not complete*; at very least you'll need to fill out the :doc:`display </components/display/index>`
|
||||
component's specific configuration details before you can use them.
|
||||
|
||||
With these points in mind, let's discuss some of the methods which indicate the state of the sprinkler controller.
|
||||
We'll approach this from the angle of *"how do I..."*
|
||||
|
||||
.. _sprinkler-controller-sprinkler_controller_understanding_state_how_do_i:
|
||||
|
||||
How Do I...
|
||||
***********
|
||||
|
||||
- **...determine if the sprinkler controller is running?**
|
||||
|
||||
Use the method ``optional<size_t> active_valve()`` to check if there is an active valve. If the ``optional`` returned
|
||||
``has_value()``, the sprinkler controller is running and you may use the ``value()`` method to check which specific
|
||||
valve is active.
|
||||
|
||||
*Example:*
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
display:
|
||||
- platform: ...
|
||||
# ...display configuration...
|
||||
lambda: |-
|
||||
if (id(lawn_sprinkler_ctrlr).active_valve().has_value()) {
|
||||
// the controller is running, get the active valve into running_valve and print it
|
||||
auto running_valve = id(lawn_sprinkler_ctrlr).active_valve().value();
|
||||
it.printf(0, 0, "Valve %u active", running_valve);
|
||||
} else {
|
||||
// the controller is NOT running
|
||||
it.print(0, 0, "Idle");
|
||||
}
|
||||
|
||||
- **...determine if the sprinkler controller is paused and, if so, which valve is paused?**
|
||||
|
||||
Use the method ``optional<size_t> paused_valve()`` to check if there is a paused valve. If the ``optional`` returned
|
||||
``has_value()``, the sprinkler controller is paused and you may use the ``value()`` method to check which specific
|
||||
valve is paused. In general, this follows the same pattern as the
|
||||
:ref:`active_valve() example above <sprinkler-controller-sprinkler_controller_understanding_state_how_do_i>`.
|
||||
|
||||
- **...determine the sprinkler controller's current mode?**
|
||||
|
||||
If by this you mean, "is auto-advance/the queue/reverse/standby enabled?", you are in the right spot. Methods exist
|
||||
for just this purpose:
|
||||
|
||||
- ``bool auto_advance()``
|
||||
- ``bool queue_enabled()``
|
||||
- ``bool reverse()``
|
||||
- ``bool standby()``
|
||||
|
||||
Each will return ``true`` if the respective "mode" is enabled.
|
||||
|
||||
*Examples:*
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
display:
|
||||
- platform: ...
|
||||
# ...display configuration...
|
||||
lambda: |-
|
||||
if (id(lawn_sprinkler_ctrlr).auto_advance()) {
|
||||
// auto-advance is enabled
|
||||
it.print(0, 0, "Auto-advance enabled");
|
||||
} else {
|
||||
// auto-advance is NOT enabled
|
||||
it.print(0, 0, "Auto-advance disabled");
|
||||
}
|
||||
if (id(lawn_sprinkler_ctrlr).queue_enabled()) {
|
||||
// queue is enabled
|
||||
it.print(0, 10, "Queue enabled");
|
||||
} else {
|
||||
// queue is NOT enabled
|
||||
it.print(0, 10, "Queue disabled");
|
||||
}
|
||||
|
||||
- **...determine the sprinkler controller's multiplier/repeat values?**
|
||||
|
||||
Methods of interest in this case are:
|
||||
|
||||
- ``float multiplier()``
|
||||
- ``optional<uint32_t> repeat()``
|
||||
- ``optional<uint32_t> repeat_count()``
|
||||
|
||||
Note again that each of the ``repeat`` methods returns an ``optional`` type; if the ``optional`` returned
|
||||
``has_value()``, repeating is enabled and you can get the repeat target (``repeat()``) or current repeat
|
||||
count (``repeat_count()``) with ``optional``'s ``value()`` method.
|
||||
|
||||
The ``multiplier()`` method returns a ``float`` type and, as such, it always has a value.
|
||||
|
||||
*Examples:*
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
display:
|
||||
- platform: ...
|
||||
# ...display configuration...
|
||||
lambda: |-
|
||||
it.printf(0, 0, "Multiplier: %f", id(lawn_sprinkler_ctrlr).multiplier());
|
||||
|
||||
if (id(lawn_sprinkler_ctrlr).repeat().has_value()) {
|
||||
// the controller is repeating, print the repeat target value
|
||||
it.printf(0, 10, "Repeat %u times", id(lawn_sprinkler_ctrlr).repeat().value());
|
||||
}
|
||||
|
||||
- **...determine how much time is left/required?**
|
||||
|
||||
Several methods are available for this purpose:
|
||||
|
||||
- ``uint32_t total_cycle_time_all_valves()``
|
||||
- ``uint32_t total_cycle_time_enabled_valves()``
|
||||
- ``uint32_t total_cycle_time_enabled_incomplete_valves()``
|
||||
- ``uint32_t total_queue_time()``
|
||||
- ``optional<uint32_t> time_remaining_active_valve()``
|
||||
- ``optional<uint32_t> time_remaining_current_operation()``
|
||||
|
||||
Note that, as with several of the earlier examples, the ``time_remaining_...`` methods each return an ``optional``
|
||||
type. If the ``optional`` returned ``has_value()``, a valve is active/running; if it does not ``has_value()``, no
|
||||
valve is active, meaning the controller is idle.
|
||||
|
||||
*Example:*
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
display:
|
||||
- platform: ...
|
||||
# ...display configuration...
|
||||
lambda: |-
|
||||
if (id(lawn_sprinkler_ctrlr).time_remaining_active_valve().has_value()) {
|
||||
// the controller is running, print the number of seconds remaining
|
||||
it.printf(0, 0, "Time left: %u sec.", id(lawn_sprinkler_ctrlr).time_remaining_active_valve().value());
|
||||
} else {
|
||||
// the controller is NOT running
|
||||
it.print(0, 0, "Idle");
|
||||
}
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
4
conf.py
@ -67,9 +67,9 @@ author = "ESPHome"
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = "2023.2"
|
||||
version = "2023.3"
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = "2023.2.4"
|
||||
release = "2023.3.0"
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -42,18 +42,10 @@ After validating the sensor is working, we can proceed and add some formulas.
|
||||
update_interval: 15s
|
||||
icon: 'mdi:signal'
|
||||
unit_of_measurement: 'm'
|
||||
- platform: template
|
||||
- platform: absolute_humidity
|
||||
name: "Absolute Humidity"
|
||||
lambda: |-
|
||||
const float mw = 18.01534; // molar mass of water g/mol
|
||||
const float r = 8.31447215; // Universal gas constant J/mol/K
|
||||
return (6.112 * powf(2.718281828, (17.67 * id(bme280_temperature).state) /
|
||||
(id(bme280_temperature).state + 243.5)) * id(bme280_humidity).state * mw) /
|
||||
((273.15 + id(bme280_temperature).state) * r); // in grams/m^3
|
||||
accuracy_decimals: 2
|
||||
update_interval: 15s
|
||||
icon: 'mdi:water'
|
||||
unit_of_measurement: 'g/m³'
|
||||
temperature: bme280_temperature
|
||||
humidity: bme280_humidity
|
||||
- platform: template
|
||||
name: "Dew Point"
|
||||
lambda: |-
|
||||
@ -73,7 +65,7 @@ The variable ``STANDARD_SEA_LEVEL_PRESSURE`` (in hPa), should be filled in for y
|
||||
The formula derived from `here <https://github.com/finitespace/BME280/blob/master/src/EnvironmentCalculations.cpp>`__,
|
||||
converts the currently measured pressure to the altitudes in meters including temperature compensation.
|
||||
|
||||
The lambda in the second :doc:`/components/sensor/template` defines two physical constants and
|
||||
The second block uses the :doc:`/components/sensor/absolute_humidity` component which
|
||||
converts the currently measured temperature and relative humidity to absolute humidity (grams/m^3).
|
||||
|
||||
.. note::
|
||||
@ -120,13 +112,13 @@ Calculating the sea level pressure with a statically mounted sensor can be used
|
||||
Formula explanation
|
||||
-------------------
|
||||
|
||||
- `Relative humidity calculations <https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/>`__
|
||||
- `Altitude calculation <https://en.wikipedia.org/wiki/Atmospheric_pressure#Altitude_variation>`__
|
||||
- `Dew Point calculation <https://carnotcycle.wordpress.com/2017/08/01/compute-dewpoint-temperature-from-rh-t/>`__
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`/components/sensor/absolute_humidity`
|
||||
- :doc:`/components/sensor/template`
|
||||
- :doc:`/components/sensor/bme280`
|
||||
- :ghedit:`Edit`
|
||||
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.9 KiB |
@ -379,7 +379,8 @@ All Actions
|
||||
:ref:`sprinkler.pause <sprinkler-controller-action_pause>` / :ref:`sprinkler.resume <sprinkler-controller-action_resume>` /
|
||||
:ref:`sprinkler.resume_or_start_full_cycle <sprinkler-controller-action_resume_or_start_full_cycle>` / :ref:`sprinkler.queue_valve <sprinkler-controller-action_queue_valve>` /
|
||||
:ref:`sprinkler.clear_queued_valves <sprinkler-controller-action_clear_queued_valves>` / :ref:`sprinkler.set_multiplier <sprinkler-controller-action_set_multiplier>` /
|
||||
:ref:`sprinkler.set_repeat <sprinkler-controller-action_set_repeat>` / :ref:`sprinkler.set_valve_run_duration <sprinkler-controller-action_set_valve_run_duration>`
|
||||
:ref:`sprinkler.set_repeat <sprinkler-controller-action_set_repeat>` / :ref:`sprinkler.set_divider <sprinkler-controller-action_set_divider>` /
|
||||
:ref:`sprinkler.set_valve_run_duration <sprinkler-controller-action_set_valve_run_duration>`
|
||||
- :ref:`globals.set <globals-set_action>`
|
||||
- :ref:`remote_transmitter.transmit_* <remote_transmitter-transmit_action>`
|
||||
- :ref:`climate.control <climate-control_action>`
|
||||
|
@ -52,6 +52,7 @@ Contributors
|
||||
- `Alex (@alex-richards) <https://github.com/alex-richards>`__
|
||||
- `Alexander Leisentritt (@Alex9779) <https://github.com/Alex9779>`__
|
||||
- `Alex Barcelo (@alexbarcelo) <https://github.com/alexbarcelo>`__
|
||||
- `AlexCPU (@AlexCPU) <https://github.com/AlexCPU>`__
|
||||
- `Alexandre Danault (@AlexDanault) <https://github.com/AlexDanault>`__
|
||||
- `Alex Iribarren (@alexiri) <https://github.com/alexiri>`__
|
||||
- `Alex Mekkering (@AlexMekkering) <https://github.com/AlexMekkering>`__
|
||||
@ -74,6 +75,7 @@ Contributors
|
||||
- `Vegetto (@angelnu) <https://github.com/angelnu>`__
|
||||
- `Sergey Anisimov (@anisimovsergey) <https://github.com/anisimovsergey>`__
|
||||
- `Nikolay Vasilchuk (@Anonym-tsk) <https://github.com/Anonym-tsk>`__
|
||||
- `Anthony Keane (@anthonykeane) <https://github.com/anthonykeane>`__
|
||||
- `Antonio Fiol (@antonio-fiol) <https://github.com/antonio-fiol>`__
|
||||
- `Adriaan Peeters (@apeeters) <https://github.com/apeeters>`__
|
||||
- `apendley (@apendley) <https://github.com/apendley>`__
|
||||
@ -90,6 +92,7 @@ Contributors
|
||||
- `Pavel Pletenev (@ASMfreaK) <https://github.com/ASMfreaK>`__
|
||||
- `Andreas Soehlke (@asoehlke) <https://github.com/asoehlke>`__
|
||||
- `Mike Dunston (@atanisoft) <https://github.com/atanisoft>`__
|
||||
- `Alexander Turlov (@aturlov) <https://github.com/aturlov>`__
|
||||
- `AustinMorris (@AustinMorris) <https://github.com/AustinMorris>`__
|
||||
- `Avirsaam (@Avirsaam) <https://github.com/Avirsaam>`__
|
||||
- `Arsène von Wyss (@avonwyss) <https://github.com/avonwyss>`__
|
||||
@ -199,6 +202,7 @@ Contributors
|
||||
- `Daniel Schramm (@danielschramm) <https://github.com/danielschramm>`__
|
||||
- `Chris (@darthsebulba04) <https://github.com/darthsebulba04>`__
|
||||
- `Dan Gentry (@dashdrum) <https://github.com/dashdrum>`__
|
||||
- `Aliasghar Dashkhaneh (@dashkhaneh) <https://github.com/dashkhaneh>`__
|
||||
- `Anthony Uk (@dataway) <https://github.com/dataway>`__
|
||||
- `Dav-id (@dav-id-org) <https://github.com/dav-id-org>`__
|
||||
- `DAVe3283 (@DAVe3283) <https://github.com/DAVe3283>`__
|
||||
@ -225,7 +229,6 @@ Contributors
|
||||
- `Davide Depau (@depau) <https://github.com/depau>`__
|
||||
- `dependabot[bot] (@dependabot[bot]) <https://github.com/dependabot[bot]>`__
|
||||
- `Joeri Colman (@depuits) <https://github.com/depuits>`__
|
||||
- `Stephan Martin (@designer2k2) <https://github.com/designer2k2>`__
|
||||
- `Destix (@Destix) <https://github.com/Destix>`__
|
||||
- `Deun Lee (@deunlee) <https://github.com/deunlee>`__
|
||||
- `Develo (@devyte) <https://github.com/devyte>`__
|
||||
@ -244,6 +247,7 @@ Contributors
|
||||
- `DrZoid (@docteurzoidberg) <https://github.com/docteurzoidberg>`__
|
||||
- `Dominik (@DomiStyle) <https://github.com/DomiStyle>`__
|
||||
- `Derek M. (@doolbneerg) <https://github.com/doolbneerg>`__
|
||||
- `Dorian Zedler (@dorianim) <https://github.com/dorianim>`__
|
||||
- `Mark Dietzer (@Doridian) <https://github.com/Doridian>`__
|
||||
- `Jiang Sheng (@doskoi) <https://github.com/doskoi>`__
|
||||
- `Robert Schütz (@dotlambda) <https://github.com/dotlambda>`__
|
||||
@ -289,6 +293,7 @@ Contributors
|
||||
- `Eric Hiller (@erichiller) <https://github.com/erichiller>`__
|
||||
- `Matt Hamilton (@Eriner) <https://github.com/Eriner>`__
|
||||
- `Ernst Klamer (@Ernst79) <https://github.com/Ernst79>`__
|
||||
- `Eduardo Roldan (@eroldan) <https://github.com/eroldan>`__
|
||||
- `escoand (@escoand) <https://github.com/escoand>`__
|
||||
- `Eric Severance (@esev) <https://github.com/esev>`__
|
||||
- `esphomebot (@esphomebot) <https://github.com/esphomebot>`__
|
||||
@ -326,7 +331,6 @@ Contributors
|
||||
- `Franck Nijhof (@frenck) <https://github.com/frenck>`__
|
||||
- `frippe75 (@frippe75) <https://github.com/frippe75>`__
|
||||
- `Fritz Mueller (@fritzm) <https://github.com/fritzm>`__
|
||||
- `Marc Egli (@frog32) <https://github.com/frog32>`__
|
||||
- `Florian Trück (@ftrueck) <https://github.com/ftrueck>`__
|
||||
- `functionpointer (@functionpointer) <https://github.com/functionpointer>`__
|
||||
- `mr G1K (@G1K) <https://github.com/G1K>`__
|
||||
@ -342,6 +346,7 @@ Contributors
|
||||
- `Gerard (@gerard33) <https://github.com/gerard33>`__
|
||||
- `Giampiero Baggiani (@giampiero7) <https://github.com/giampiero7>`__
|
||||
- `Giovanni (@Gio-dot) <https://github.com/Gio-dot>`__
|
||||
- `GitforZhangXL (@GitforZhangXL) <https://github.com/GitforZhangXL>`__
|
||||
- `github-actions[bot] (@github-actions[bot]) <https://github.com/github-actions[bot]>`__
|
||||
- `gitolicious (@gitolicious) <https://github.com/gitolicious>`__
|
||||
- `The Gitter Badger (@gitter-badger) <https://github.com/gitter-badger>`__
|
||||
@ -358,7 +363,6 @@ Contributors
|
||||
- `Antoine GRÉA (@grea09) <https://github.com/grea09>`__
|
||||
- `Gil Peeters (@grillp) <https://github.com/grillp>`__
|
||||
- `George (@grob6000) <https://github.com/grob6000>`__
|
||||
- `Stefan Grufman (@GruffyPuffy) <https://github.com/GruffyPuffy>`__
|
||||
- `gsexton (@gsexton) <https://github.com/gsexton>`__
|
||||
- `Gabriel Sieben (@gsieben) <https://github.com/gsieben>`__
|
||||
- `Jadson Santos (@gtjadsonsantos) <https://github.com/gtjadsonsantos>`__
|
||||
@ -411,6 +415,7 @@ Contributors
|
||||
- `Ivan Shvedunov (@ivan4th) <https://github.com/ivan4th>`__
|
||||
- `Ivan Kravets (@ivankravets) <https://github.com/ivankravets>`__
|
||||
- `Ivo-tje (@Ivo-tje) <https://github.com/Ivo-tje>`__
|
||||
- `Fredrik Gustafsson (@jagheterfredrik) <https://github.com/jagheterfredrik>`__
|
||||
- `Jan Harkes (@jaharkes) <https://github.com/jaharkes>`__
|
||||
- `Jakob Reiter (@jakommo) <https://github.com/jakommo>`__
|
||||
- `James Braid (@jamesbraid) <https://github.com/jamesbraid>`__
|
||||
@ -471,6 +476,7 @@ Contributors
|
||||
- `JonnyaiR (@jonnyair) <https://github.com/jonnyair>`__
|
||||
- `Jonathan V (@jonofmac) <https://github.com/jonofmac>`__
|
||||
- `Joppy (@JoppyFurr) <https://github.com/JoppyFurr>`__
|
||||
- `Jared Sanson (@jorticus) <https://github.com/jorticus>`__
|
||||
- `Joshua Spence (@joshuaspence) <https://github.com/joshuaspence>`__
|
||||
- `Joscha Wagner (@jowgn) <https://github.com/jowgn>`__
|
||||
- `Javier Peletier (@jpeletier) <https://github.com/jpeletier>`__
|
||||
@ -489,6 +495,7 @@ Contributors
|
||||
- `Harald Nagel (@k7hpn) <https://github.com/k7hpn>`__
|
||||
- `kaegi (@kaegi) <https://github.com/kaegi>`__
|
||||
- `kahrendt (@kahrendt) <https://github.com/kahrendt>`__
|
||||
- `Kamahat (@kamahat) <https://github.com/kamahat>`__
|
||||
- `Karol Zlot (@karolzlot) <https://github.com/karolzlot>`__
|
||||
- `Kattni (@kattni) <https://github.com/kattni>`__
|
||||
- `Krasimir Nedelchev (@kaykayehnn) <https://github.com/kaykayehnn>`__
|
||||
@ -498,6 +505,7 @@ Contributors
|
||||
- `Ken Piper (@Kealper) <https://github.com/Kealper>`__
|
||||
- `Robert Kiss (@kepten) <https://github.com/kepten>`__
|
||||
- `Kevin O'Rourke (@kevinior) <https://github.com/kevinior>`__
|
||||
- `Kai Gerken (@KG3RK3N) <https://github.com/KG3RK3N>`__
|
||||
- `Khoi Hoang (@khoih-prog) <https://github.com/khoih-prog>`__
|
||||
- `Ed (@kixtarter) <https://github.com/kixtarter>`__
|
||||
- `Kurt Kellner (@kkellner) <https://github.com/kkellner>`__
|
||||
@ -542,7 +550,6 @@ Contributors
|
||||
- `Lode Vermeiren (@lodev) <https://github.com/lodev>`__
|
||||
- `Barry Loong (@loongyh) <https://github.com/loongyh>`__
|
||||
- `LuBeDa (@lubeda) <https://github.com/lubeda>`__
|
||||
- `Lukáš Maňas (@LucasCZE) <https://github.com/LucasCZE>`__
|
||||
- `Joakim Sørensen (@ludeeus) <https://github.com/ludeeus>`__
|
||||
- `ludrao (@ludrao) <https://github.com/ludrao>`__
|
||||
- `Lukas Klass (@LukasK13) <https://github.com/LukasK13>`__
|
||||
@ -556,9 +563,7 @@ Contributors
|
||||
- `Marc-Antoine Courteau (@macourteau) <https://github.com/macourteau>`__
|
||||
- `Massimiliano Ravelli (@madron) <https://github.com/madron>`__
|
||||
- `Alexandre-Jacques St-Jacques (@Maelstrom96) <https://github.com/Maelstrom96>`__
|
||||
- `magnus (@magnusja) <https://github.com/magnusja>`__
|
||||
- `Magnus Nordlander (@magnusnordlander) <https://github.com/magnusnordlander>`__
|
||||
- `Magnus Øverli (@magnusoverli) <https://github.com/magnusoverli>`__
|
||||
- `majbthrd (@majbthrd) <https://github.com/majbthrd>`__
|
||||
- `Major Péter (@majorpeter) <https://github.com/majorpeter>`__
|
||||
- `raymonder jin (@mamil) <https://github.com/mamil>`__
|
||||
@ -566,7 +571,6 @@ Contributors
|
||||
- `Marcel van der Veldt (@marcelveldt) <https://github.com/marcelveldt>`__
|
||||
- `Marc (@MarcHagen) <https://github.com/MarcHagen>`__
|
||||
- `Marcio Granzotto Rodrigues (@marciogranzotto) <https://github.com/marciogranzotto>`__
|
||||
- `Marc Teale (@marcteale) <https://github.com/marcteale>`__
|
||||
- `marecabo (@marecabo) <https://github.com/marecabo>`__
|
||||
- `Ben Marengo (@marengaz) <https://github.com/marengaz>`__
|
||||
- `Marvin Gaube (@margau) <https://github.com/margau>`__
|
||||
@ -608,7 +612,6 @@ Contributors
|
||||
- `André Klitzing (@misery) <https://github.com/misery>`__
|
||||
- `Tomasz (@Misiu) <https://github.com/Misiu>`__
|
||||
- `Matthew Garrett (@mjg59) <https://github.com/mjg59>`__
|
||||
- `Maarten (@mjkl-gh) <https://github.com/mjkl-gh>`__
|
||||
- `Morton Jonuschat (@mjonuschat) <https://github.com/mjonuschat>`__
|
||||
- `mjoshd (@mjoshd) <https://github.com/mjoshd>`__
|
||||
- `mknjc (@mknjc) <https://github.com/mknjc>`__
|
||||
@ -620,10 +623,12 @@ Contributors
|
||||
- `Moritz Glöckl (@moritzgloeckl) <https://github.com/moritzgloeckl>`__
|
||||
- `Chris Laplante (@mostthingsweb) <https://github.com/mostthingsweb>`__
|
||||
- `Sam Hughes (@MrEditor97) <https://github.com/MrEditor97>`__
|
||||
- `Morgan Robertson (@mrgnr) <https://github.com/mrgnr>`__
|
||||
- `Mariusz Kryński (@mrk-its) <https://github.com/mrk-its>`__
|
||||
- `Michael Davidson (@MrMDavidson) <https://github.com/MrMDavidson>`__
|
||||
- `mtl010957 (@mtl010957) <https://github.com/mtl010957>`__
|
||||
- `mulcmu (@mulcmu) <https://github.com/mulcmu>`__
|
||||
- `Martin Murray (@murrayma) <https://github.com/murrayma>`__
|
||||
- `Michel van de Wetering (@mvdwetering) <https://github.com/mvdwetering>`__
|
||||
- `Michiel van Turnhout (@mvturnho) <https://github.com/mvturnho>`__
|
||||
- `Martin Weinelt (@mweinelt) <https://github.com/mweinelt>`__
|
||||
@ -665,6 +670,7 @@ Contributors
|
||||
- `Nuno Sousa (@nunofgs) <https://github.com/nunofgs>`__
|
||||
- `Maksym Lunin (@nut-code-monkey) <https://github.com/nut-code-monkey>`__
|
||||
- `Chris Nussbaum (@nuttytree) <https://github.com/nuttytree>`__
|
||||
- `Nathaniel Wesley Filardo (@nwf) <https://github.com/nwf>`__
|
||||
- `obrain17 (@obrain17) <https://github.com/obrain17>`__
|
||||
- `Ockert Marais (@OckertM) <https://github.com/OckertM>`__
|
||||
- `Dave Walker (@oddsockmachine) <https://github.com/oddsockmachine>`__
|
||||
@ -727,6 +733,7 @@ Contributors
|
||||
- `randomllama (@randomllama) <https://github.com/randomllama>`__
|
||||
- `rbaron (@rbaron) <https://github.com/rbaron>`__
|
||||
- `Robert Cambridge (@rcambrj) <https://github.com/rcambrj>`__
|
||||
- `Russell Cloran (@rcloran) <https://github.com/rcloran>`__
|
||||
- `Rebbe Pod (@RebbePod) <https://github.com/RebbePod>`__
|
||||
- `Alex (@redwngsrul) <https://github.com/redwngsrul>`__
|
||||
- `Regev Brody (@regevbr) <https://github.com/regevbr>`__
|
||||
@ -799,15 +806,11 @@ Contributors
|
||||
- `spacemanspiff2007 (@spacemanspiff2007) <https://github.com/spacemanspiff2007>`__
|
||||
- `Sean Brogan (@spbrogan) <https://github.com/spbrogan>`__
|
||||
- `Spegs21 (@Spegs21) <https://github.com/Spegs21>`__
|
||||
- `Stephan Peijnik-Steinwender (@speijnik) <https://github.com/speijnik>`__
|
||||
- `Eric Lind (@sperly) <https://github.com/sperly>`__
|
||||
- `Samuel Sieb (@ssieb) <https://github.com/ssieb>`__
|
||||
- `Stefan Staub (@sstaub) <https://github.com/sstaub>`__
|
||||
- `St4n (@St4n) <https://github.com/St4n>`__
|
||||
- `Stanislav Habich (@standahabich) <https://github.com/standahabich>`__
|
||||
- `Stas (@stas-sl) <https://github.com/stas-sl>`__
|
||||
- `stegm (@stegm) <https://github.com/stegm>`__
|
||||
- `Steve Baxter (@stevebaxter) <https://github.com/stevebaxter>`__
|
||||
- `Stewart (@stewiem2000) <https://github.com/stewiem2000>`__
|
||||
- `sticilface (@sticilface) <https://github.com/sticilface>`__
|
||||
- `Stijn Tintel (@stintel) <https://github.com/stintel>`__
|
||||
@ -842,7 +845,6 @@ Contributors
|
||||
- `Tijs-B (@Tijs-B) <https://github.com/Tijs-B>`__
|
||||
- `Aidan Timson (@timmo001) <https://github.com/timmo001>`__
|
||||
- `Tim Savage (@timsavage) <https://github.com/timsavage>`__
|
||||
- `Snōwball (@tobias-) <https://github.com/tobias->`__
|
||||
- `Philipp Tölke (@toelke) <https://github.com/toelke>`__
|
||||
- `tomaszduda23 (@tomaszduda23) <https://github.com/tomaszduda23>`__
|
||||
- `Tom Brien (@TomBrien) <https://github.com/TomBrien>`__
|
||||
@ -909,4 +911,4 @@ Contributors
|
||||
- `Zack Barett (@zsarnett) <https://github.com/zsarnett>`__
|
||||
- `Christian Zufferey (@zuzu59) <https://github.com/zuzu59>`__
|
||||
|
||||
*This page was last updated February 23, 2023.*
|
||||
*This page was last updated March 16, 2023.*
|
||||
|
BIN
images/as7341.jpg
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
images/fs3000.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
25
images/haier.svg
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!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="824px" height="256px" viewBox="0 0 824 256" enable-background="new 0 0 824 256" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#005BAA" d="M712.652,171.532c0.348-3.178,0.552-6.388,0.552-9.638c0-49.205-40.776-89.07-91.083-89.07
|
||||
c-50.293,0-91.063,39.865-91.063,89.07c0,49.189,40.771,89.039,91.063,89.039c38.259,0,70.963-23.021,84.481-55.729l-39.257-6.878
|
||||
c-8.696,15.914-25.151,26.634-43.96,26.634c-24.967,0-45.642-18.778-49.801-43.429H712.652z M623.386,109.79
|
||||
c21.319,0,39.528,13.729,46.96,33.163h-93.977C583.781,123.52,602.03,109.79,623.386,109.79z"/>
|
||||
<rect x="460.066" y="76.555" fill="#005BAA" width="46.512" height="171.18"/>
|
||||
<path fill="#005BAA" d="M483.339,6.758c-14.358,0-25.95,11.655-25.95,25.953c0,14.276,11.592,25.9,25.95,25.9
|
||||
c14.3,0,25.917-11.624,25.917-25.9C509.256,18.413,497.639,6.758,483.339,6.758"/>
|
||||
<polygon fill="#005BAA" points="175.389,21.671 175.389,113.822 75.133,113.822 75.133,21.671 24.291,21.671 24.291,247.582
|
||||
75.133,247.582 75.133,155.427 175.389,155.427 175.389,247.582 226.273,247.582 226.273,21.671 "/>
|
||||
<path fill="#005BAA" d="M385.318,76.634v9.185c-13.519-8.191-29.361-12.896-46.336-12.896c-49.308,0-89.3,39.84-89.3,89.006
|
||||
c0,49.156,39.992,89.006,89.3,89.006c16.534,0,31.981-4.491,45.262-12.27v8.918h45.384V76.634H385.318z M341.25,213.408
|
||||
c-28.777,0-52.04-23.027-52.04-51.459c0-28.456,23.262-51.5,52.04-51.5c28.77,0,52.071,23.044,52.071,51.5
|
||||
C393.32,190.381,370.019,213.408,341.25,213.408z"/>
|
||||
<path fill="#005BAA" d="M809.376,60.657c-42.832,7.472-75.396,44.736-75.896,89.679v97.398h44.535l0.023-99.229
|
||||
c0-22.716,17.053-41.463,39.032-44.153L809.376,60.657z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
BIN
images/kuntze.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
images/mopeka_std_check.jpg
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
images/sen21231.png
Normal file
After Width: | Height: | Size: 25 KiB |
1
images/thermometer.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path fill="currentColor" d="M15 13V5A3 3 0 0 0 9 5V13A5 5 0 1 0 15 13M12 4A1 1 0 0 1 13 5V8H11V5A1 1 0 0 1 12 4Z"/></svg>
|
After Width: | Height: | Size: 186 B |
1
images/water-drop.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg height="26" width="26" xmlns="http://www.w3.org/2000/svg"><path d="M12.953,0c0,0-9,10.906-9,16.906c0,4.971,4.029,9,9,9s9-4.029,9-9C21.953,10.906,12.953,0,12.953,0z M9.026,17.496c0,1.426,0.668,4.25,1.134,5.426c-3.042-1.494-3.846-4.425-3.846-6.463c0-3.173,3.684-7.824,5.777-12.149 C11.861,6.581,9.026,13.177,9.026,17.496z"/></svg>
|
After Width: | Height: | Size: 333 B |
10
index.rst
@ -214,6 +214,7 @@ Bluetooth Low Energy (BLE)
|
||||
BLE RSSI, components/sensor/ble_rssi, bluetooth.svg
|
||||
Inkbird IBS-TH1 Mini, components/sensor/inkbird_ibsth1_mini, inkbird_isbth1_mini.jpg, Temperature & Humidity
|
||||
Mopeka Pro Check LP, components/sensor/mopeka_pro_check, mopeka_pro_check.jpg, tank level
|
||||
Mopeka Standard Check LP, components/sensor/mopeka_std_check, mopeka_std_check.jpg, tank level
|
||||
RuuviTag, components/sensor/ruuvitag, ruuvitag.jpg, Temperature & Humidity & Accelerometer
|
||||
Xiaomi BLE, components/sensor/xiaomi_ble, xiaomi_mijia_logo.jpg, Various
|
||||
|
||||
@ -273,6 +274,7 @@ Environmental
|
||||
|
||||
.. imgtable::
|
||||
|
||||
Absolute Humidity, components/sensor/absolute_humidity, water-drop.svg
|
||||
AHT10 / AHT20 / AHT21 / DHT20, components/sensor/aht10, aht10.jpg, Temperature & Humidity
|
||||
AirThings BLE, components/sensor/airthings_ble, airthings_logo.png, Temperature & Humidity & Pressure
|
||||
AM2320, components/sensor/am2320, am2320.jpg, Temperature & Humidity
|
||||
@ -294,6 +296,7 @@ Environmental
|
||||
HTU21D / Si7021 / SHT21, components/sensor/htu21d, htu21d.jpg, Temperature & Humidity
|
||||
Hydreon Rain Sensor, components/sensor/hydreon_rgxx, hydreon_rg9.jpg, Rain
|
||||
Inkbird IBS-TH1 Mini, components/sensor/inkbird_ibsth1_mini, inkbird_isbth1_mini.jpg, Temperature & Humidity
|
||||
Internal Temperature, components/sensor/internal_temperature, thermometer.svg, Temperature
|
||||
MCP9808, components/sensor/mcp9808, mcp9808.jpg, Temperature
|
||||
MH-Z19, components/sensor/mhz19, mhz19.jpg, CO2 & Temperature
|
||||
MPL3115A2, components/sensor/mpl3115a2, mpl3115a2.jpg, Temperature & Pressure
|
||||
@ -321,6 +324,7 @@ Light
|
||||
|
||||
AM43, components/sensor/am43, am43.jpg, Lux
|
||||
APDS9960, components/sensor/apds9960, apds9960.jpg, Colour & Gesture
|
||||
AS7341, components/sensor/as7341, as7341.jpg, Spectral Color Sensor
|
||||
BH1750, components/sensor/bh1750, bh1750.jpg, Lux
|
||||
LTR390, components/sensor/ltr390, ltr390.jpg, Lux & UV
|
||||
MAX44009, components/sensor/max44009, max44009.svg, Lux
|
||||
@ -347,6 +351,7 @@ Miscellaneous
|
||||
Binary Sensor Map, components/sensor/binary_sensor_map, binary_sensor_map.jpg, Map binary to value
|
||||
b-parasite, components/sensor/b_parasite, b_parasite.jpg, Moisture & Temperature & Humidity & Light
|
||||
EZO sensor circuits, components/sensor/ezo, ezo-ph-circuit.png, (pH)
|
||||
FS3000, components/sensor/fs3000, fs3000.jpg, Air velocity
|
||||
Havells Solar, components/sensor/havells_solar, havellsgti5000d_s.jpg, Solar rooftop
|
||||
Growatt Solar, components/sensor/growatt_solar, growatt.jpg, Solar rooftop
|
||||
Kalman Combinator, components/sensor/kalman_combinator, function.svg
|
||||
@ -359,6 +364,8 @@ Miscellaneous
|
||||
uFire EC sensor, components/sensor/ufire_ec, ufire_ec.png, EC & Temperature
|
||||
uFire ISE sensor, components/sensor/ufire_ise, ufire_ise.png, pH & Temperature
|
||||
Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg
|
||||
Person Sensor (SEN21231), components/sensor/sen21231, sen21231.png
|
||||
Kuntze pool sensor, components/sensor/kuntze, kuntze.jpg
|
||||
|
||||
|
||||
Motion
|
||||
@ -558,7 +565,7 @@ Display Components
|
||||
ST7735, components/display/st7735, st7735.jpg
|
||||
ST7789V, components/display/st7789v, st7789v.jpg
|
||||
ST7920, components/display/st7920, st7920.jpg
|
||||
ILI9341, components/display/ili9341, ili9341.jpg
|
||||
ILI9xxx, components/display/ili9xxx, ili9341.jpg
|
||||
Waveshare E-Paper, components/display/waveshare_epaper, waveshare_epaper.jpg
|
||||
Inkplate, components/display/inkplate6, inkplate6.jpg
|
||||
PCD8544 (Nokia 5110/ 3310), components/display/pcd8544, pcd8544.jpg
|
||||
@ -621,6 +628,7 @@ Climate Components
|
||||
Midea, components/climate/midea, midea.svg
|
||||
Anova Cooker, components/climate/anova, anova.png
|
||||
BedJet Climate System, components/climate/bedjet, bedjet.png
|
||||
Haier Climate, components/climate/haier, haier.svg
|
||||
|
||||
Number Components
|
||||
-----------------
|
||||
|