Update next from current 20201221 (#894)
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.7 KiB |
@ -573,6 +573,56 @@ Release 1.15.1 - September 14
|
||||
- docs: Adds Tuya Climate temperature multiplier :docspr:`756` by :ghuser:`jesserockz`
|
||||
- esphome: Adds support for Tuya Climate temperature multiplier :esphomepr:`1276` by :ghuser:`jesserockz`
|
||||
|
||||
Release 1.15.2 - September 20
|
||||
-----------------------------
|
||||
|
||||
- docs: Light triggers referenced in the "automation" guide. :docspr:`746` by :ghuser:`demikl`
|
||||
- docs: specific MacOS Docker command to launch dashboard :docspr:`553` by :ghuser:`oncleben31`
|
||||
- docs: Update index.rst :docspr:`757` by :ghuser:`3ative`
|
||||
- esphome: Adds new homeassistant.tag_scanned action :esphomepr:`1281` by :ghuser:`jesserockz`
|
||||
- docs: add custom uart id usage :docspr:`765` by :ghuser:`glmnet`
|
||||
- esphome: Readds the battery level for xiaomi_hhccjcy01 :esphomepr:`1288` by :ghuser:`jesserockz`
|
||||
- esphome: fix(remote_receiver): Add missing pin setup for ESP32 :esphomepr:`1252` by :ghuser:`lwfitzgerald`
|
||||
- docs: Add docs for homeassistant.tag_scanned action :docspr:`763` by :ghuser:`jesserockz`
|
||||
|
||||
Release 1.15.3 - October 22
|
||||
---------------------------
|
||||
|
||||
- docs: Mention CODEOWNERS magic symbol :docspr:`767` by :ghuser:`glmnet`
|
||||
- docs: using docker image to build esphome-docs locally :docspr:`747` by :ghuser:`demikl`
|
||||
- docs: Add missing doc for rc_switch event :docspr:`740` by :ghuser:`micw`
|
||||
- docs: Remove unneeded parameters :docspr:`752` by :ghuser:`KTibow`
|
||||
- docs: Enable color_interlock for the Teckin SB50 example :docspr:`743` by :ghuser:`CarlosGS`
|
||||
- docs: clarify esp8266_restore_from_flash with restore_value :docspr:`754` by :ghuser:`pille`
|
||||
- docs: Update mirabella-genio-bulb.rst :docspr:`732` by :ghuser:`DotNetDann`
|
||||
- docs: Fix APDS9960 datasheet link :docspr:`772` by :ghuser:`JonathanTreffler`
|
||||
- docs: Update uart.rst :docspr:`771` by :ghuser:`sublime93`
|
||||
- docs: Update index.rst :docspr:`773` by :ghuser:`damanti-me`
|
||||
- docs: HM3301 - Change type to calculation_type :docspr:`769` by :ghuser:`rdehuyss`
|
||||
- docs: Update diy.rst :docspr:`781` by :ghuser:`Dilbert66`
|
||||
- docs: Update docker architectures in getting started :docspr:`780` by :ghuser:`jesserockz`
|
||||
- docs: Remove bh7150 API reference :docspr:`784` by :ghuser:`JeffResc`
|
||||
- docs: Add 2.13in-ttgo-b73 to list of waveshare models :docspr:`786` by :ghuser:`davewongillies`
|
||||
- docs: Typo: connedted -> connected :docspr:`787` by :ghuser:`johanvanderkuijl`
|
||||
- docs: Update edit URL on Sonoff Basic page :docspr:`785` by :ghuser:`JeffResc`
|
||||
- docs: Update Sonoff Mini :docspr:`783` by :ghuser:`debsahu`
|
||||
- docs: Set correct link to ESPColor struct :docspr:`788` by :ghuser:`cdrfun`
|
||||
- docs: Add battery_level note for xiaomi_hhccjcy01 :docspr:`761` by :ghuser:`axilleas`
|
||||
- docs: Corrected the example pin mapping to GPIO mapping. :docspr:`789` by :ghuser:`shaeed`
|
||||
- esphome: fix chip_rotation: 180 :esphomepr:`1321` by :ghuser:`ssieb`
|
||||
- docs: Fix links, moved to gists :docspr:`802` by :ghuser:`glmnet`
|
||||
- docs: Update wifi.rst :docspr:`795` by :ghuser:`Frankster-NL`
|
||||
- docs: BME680 default address is 0x76 :docspr:`792` by :ghuser:`trvrnrth`
|
||||
- docs: Individual BMXXXXX sensor configs are optional :docspr:`791` by :ghuser:`trvrnrth`
|
||||
- esphome: Fix Light Trigger :esphomepr:`1308` by :ghuser:`MartinWelsch`
|
||||
- esphome: Fix Xiaomi merged packet parsing :esphomepr:`1293` by :ghuser:`Alex9779`
|
||||
- docs: Correct pull-up value :docspr:`811` by :ghuser:`tomlut`
|
||||
- esphome: Fix color_interlock behavior :esphomepr:`1325` by :ghuser:`margau`
|
||||
- esphome: Fix scheduler with too many cancelled timers :esphomepr:`1309` by :ghuser:`glmnet`
|
||||
- esphome: fix config check in OnlyWith configuration helper :esphomepr:`1304` by :ghuser:`akomelj`
|
||||
- esphome: fix: Incorrect time delay conversion breaks remote_transmitter_esp8266.cpp :esphomepr:`1322` by :ghuser:`thejonesyboy`
|
||||
- esphome: fix hm3301 AQICalculator is off by 1 :esphomepr:`1331` by :ghuser:`ikatkov`
|
||||
|
||||
Past Changelogs
|
||||
---------------
|
||||
|
||||
|
@ -75,6 +75,39 @@ Configuration options:
|
||||
- **variables** (*Optional*, mapping): Optional variables that can be used in the ``data_template``.
|
||||
Values are :ref:`lambdas <config-lambda>` and will be evaluated before sending the request.
|
||||
|
||||
Data structures are not possible, but you can create an script in Home Assistant and call with all
|
||||
the parameters in plain format.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Home Assistant Configuration
|
||||
script:
|
||||
...
|
||||
set_light_rgb:
|
||||
alias: 'ESPHome RGB light set'
|
||||
sequence:
|
||||
- service: light.turn_on
|
||||
data_template:
|
||||
entity_id: '{{ light_name }}'
|
||||
rgb_color:
|
||||
- '{{ red }}'
|
||||
- '{{ green }}'
|
||||
- '{{ blue }}'
|
||||
|
||||
Then in ESPHome
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# In some trigger
|
||||
on_...:
|
||||
- homeassistant.service:
|
||||
service: script.set_light_rgb
|
||||
data:
|
||||
light_name: 'my_light'
|
||||
red: '255'
|
||||
green: '199'
|
||||
blue: '71'
|
||||
|
||||
.. _api-services:
|
||||
|
||||
User-defined Services
|
||||
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 215 KiB |
Before Width: | Height: | Size: 295 KiB After Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 188 KiB |
@ -98,6 +98,24 @@ using :ref:`api-homeassistant_tag_scanned_action`.
|
||||
then:
|
||||
- homeassistant.tag_scanned: !lambda 'return x;'
|
||||
|
||||
Alternatively you could also send the value directly to Home Assistant via a
|
||||
:doc:`template sensor </components/sensor/template>`.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
pn532:
|
||||
# ...
|
||||
on_tag:
|
||||
then:
|
||||
- text_sensor.template.publish:
|
||||
id: rfid_tag
|
||||
state: !lambda 'return x;'
|
||||
|
||||
text_sensor:
|
||||
- platform: template
|
||||
name: "RFID Tag"
|
||||
id: rfid_tag
|
||||
|
||||
.. _pn532-tag:
|
||||
|
||||
NFC/RFID Tag
|
||||
|
@ -31,11 +31,13 @@ There are three types of bang bang controllers this platform can represent:
|
||||
|
||||
- As soon as the temperature goes below the lower target temperature, ``heat_action`` will be called.
|
||||
- When the temperature goes above the higher temperature, ``idle_action`` will be called.
|
||||
- If you change operating mode (manual mode). And it is between high and low temperature. It does not wait to get to low temperature, it starts working until it gets to high temperature.
|
||||
|
||||
- **Coolers**: For devices where the observed temperature can only be decreased.
|
||||
|
||||
- As soon as the temperature goes above the higher target temperature, ``cool_action`` will be called.
|
||||
- When the temperature goes below the lower temperature, ``idle_action`` will be called.
|
||||
- If you change operating mode (manual mode). And it is between high and low temperature. It does not wait to get to high temperature, it starts working until it gets to low temperature.
|
||||
|
||||
- **Heater+Cooler**: For devices where the temperature can both actively be increased and decreased.
|
||||
|
||||
|
@ -111,7 +111,9 @@ Useful for
|
||||
it will no longer enter deep sleep mode and you can upload your OTA update.
|
||||
|
||||
Remember to turn "OTA mode" off again after the OTA update by sending a MQTT message with the payload
|
||||
``OFF``. Note that the device won't enter deep sleep again until the next reboot.
|
||||
``OFF``. To enter the the deep sleep again after the OTA update send a message on the topic ``livingroom/sleep_mode``
|
||||
with payload ``ON``. Deep sleep will start immediately. Don't forget to delete the payload before the node
|
||||
wakes up again.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
@ -121,10 +123,14 @@ Useful for
|
||||
mqtt:
|
||||
# ...
|
||||
on_message:
|
||||
topic: livingroom/ota_mode
|
||||
payload: 'ON'
|
||||
then:
|
||||
- deep_sleep.prevent: deep_sleep_1
|
||||
- topic: livingroom/ota_mode
|
||||
payload: 'ON'
|
||||
then:
|
||||
- deep_sleep.prevent: deep_sleep_1
|
||||
- topic: livingroom/sleep_mode
|
||||
payload: 'ON'
|
||||
then:
|
||||
- deep_sleep.enter: deep_sleep_1
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 183 KiB |
Before Width: | Height: | Size: 248 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 392 KiB After Width: | Height: | Size: 376 KiB |
Before Width: | Height: | Size: 217 KiB After Width: | Height: | Size: 208 KiB |
@ -1,76 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="300"
|
||||
height="300"
|
||||
version="1"
|
||||
id="svg14"
|
||||
sodipodi:docname="seg09.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)">
|
||||
<metadata
|
||||
id="metadata20">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs18" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1581"
|
||||
inkscape:window-height="480"
|
||||
id="namedview16"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.5733333"
|
||||
inkscape:cx="142.17599"
|
||||
inkscape:cy="160.323"
|
||||
inkscape:window-x="718"
|
||||
inkscape:window-y="580"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg14" />
|
||||
<g
|
||||
id="g12"
|
||||
stroke="#000">
|
||||
<path
|
||||
d="m 190.797,154.49152 -15.212,15.5 h -59 l -15.517,-15.5 15.517,-15.5 h 59 z m 0,81.5 -15.212,15.5 h -59 l -15.517,-15.5 15.517,-15.5 h 59 z"
|
||||
id="path2"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ff0000;fill-rule:evenodd" />
|
||||
<path
|
||||
d="M98 75.385l15.5 15.212v45L98 151.115l-15.5-15.518v-45L98 75.385zM194 75.385l15.5 15.212v45L194 151.115l-15.5-15.518v-45L194 75.385z"
|
||||
id="path4"
|
||||
fill="none" />
|
||||
<path
|
||||
d="M 190.797,72.5 175.585,88 h -59 L 101.068,72.5 116.585,57 h 59 z"
|
||||
id="path6"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="M98 157.443l15.5 15.212v45L98 233.172l-15.5-15.517v-45L98 157.443zM194 157.443l15.5 15.212v45L194 233.172l-15.5-15.517v-45l15.5-15.212z"
|
||||
id="path8"
|
||||
fill="none" />
|
||||
<path
|
||||
d="M237.5 239.25a12.25 12.25 0 1 1-24.5 0 12.25 12.25 0 1 1 24.5 0z"
|
||||
id="path10"
|
||||
stroke-linecap="round"
|
||||
fill="none" />
|
||||
</g>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="svg14" width="300" height="300" version="1"><metadata id="metadata20"/><g id="g12" stroke="#000"><path id="path2" d="m 190.797,154.49152 -15.212,15.5 h -59 l -15.517,-15.5 15.517,-15.5 h 59 z m 0,81.5 -15.212,15.5 h -59 l -15.517,-15.5 15.517,-15.5 h 59 z" style="fill:red;fill-rule:evenodd"/><path id="path4" fill="none" d="M98 75.385l15.5 15.212v45L98 151.115l-15.5-15.518v-45L98 75.385zM194 75.385l15.5 15.212v45L194 151.115l-15.5-15.518v-45L194 75.385z"/><path id="path6" d="M 190.797,72.5 175.585,88 h -59 L 101.068,72.5 116.585,57 h 59 z" style="fill:#fff;fill-opacity:1;fill-rule:evenodd"/><path id="path8" fill="none" d="M98 157.443l15.5 15.212v45L98 233.172l-15.5-15.517v-45L98 157.443zM194 157.443l15.5 15.212v45L194 233.172l-15.5-15.517v-45l15.5-15.212z"/><path id="path10" fill="none" stroke-linecap="round" d="M237.5 239.25a12.25 12.25 0 1 1-24.5 0 12.25 12.25 0 1 1 24.5 0z"/></g></svg>
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 983 B |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300" version="1"><g stroke="#000"><path d="M190.797 72.5L175.585 88h-59l-15.517-15.5L116.585 57h59l15.212 15.5zM190.797 154l-15.212 15.5h-59L101.068 154l15.517-15.5h59l15.212 15.5zM98 75.385l15.5 15.212v45L98 151.115l-15.5-15.518v-45L98 75.385zM194 75.385l15.5 15.212v45L194 151.115l-15.5-15.518v-45L194 75.385z" fill="red" fill-rule="evenodd"/><path d="M190.797 236.057l-15.212 15.5h-59l-15.517-15.5 15.517-15.5h59l15.212 15.5zM98 157.443l15.5 15.212v45L98 233.172l-15.5-15.517v-45L98 157.443zM194 157.443l15.5 15.212v45L194 233.172l-15.5-15.517v-45l15.5-15.212z" fill="none"/><path d="M237.5 239.25a12.25 12.25 0 1 1-24.5 0 12.25 12.25 0 1 1 24.5 0z" fill="none" stroke-linecap="round"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300" version="1"><g stroke="#000"><path fill="red" fill-rule="evenodd" d="M190.797 72.5L175.585 88h-59l-15.517-15.5L116.585 57h59l15.212 15.5zM190.797 154l-15.212 15.5h-59L101.068 154l15.517-15.5h59l15.212 15.5zM98 75.385l15.5 15.212v45L98 151.115l-15.5-15.518v-45L98 75.385zM194 75.385l15.5 15.212v45L194 151.115l-15.5-15.518v-45L194 75.385z"/><path fill="none" d="M190.797 236.057l-15.212 15.5h-59l-15.517-15.5 15.517-15.5h59l15.212 15.5zM98 157.443l15.5 15.212v45L98 233.172l-15.5-15.517v-45L98 157.443zM194 157.443l15.5 15.212v45L194 233.172l-15.5-15.517v-45l15.5-15.212z"/><path fill="none" stroke-linecap="round" d="M237.5 239.25a12.25 12.25 0 1 1-24.5 0 12.25 12.25 0 1 1 24.5 0z"/></g></svg>
|
Before Width: | Height: | Size: 760 B After Width: | Height: | Size: 759 B |
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 172 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 201 KiB After Width: | Height: | Size: 186 KiB |
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 223 KiB |
Before Width: | Height: | Size: 359 KiB After Width: | Height: | Size: 344 KiB |
@ -118,7 +118,7 @@ Additionally, you have access to two helper methods which will fetch the width a
|
||||
# ...
|
||||
lambda: |-
|
||||
// Draw a circle in the middle of the display
|
||||
it.filled_circle(it.get_width() / 2, it.get_height() / 2);
|
||||
it.filled_circle(it.get_width() / 2, it.get_height() / 2, 20);
|
||||
|
||||
|
||||
You can view the full API documentation for the rendering engine in the "API Reference" in the See Also section.
|
||||
|
@ -201,6 +201,7 @@ appropriate lines of C code in the lambada to hide or show the image or text as
|
||||
pin:
|
||||
number: GPIO0
|
||||
inverted: true
|
||||
mode: INPUT_PULLUP
|
||||
name: "T-Display Button Input 0"
|
||||
id: tdisplay_button_input_0
|
||||
- platform: gpio
|
||||
|
@ -8,6 +8,7 @@ Waveshare E-Paper Display
|
||||
The ``waveshare_epaper`` display platform allows you to use
|
||||
some E-Paper displays sold by `Waveshare <https://www.waveshare.com/product/displays/e-paper.htm>`__
|
||||
with ESPHome. The 2.13" `TTGO module <https://github.com/lewisxhe/TTGO-EPaper-Series>`__ with an ESP32 on the board is supported as well.
|
||||
Depending on your specific revision of the board you might need to try out the `-b73` version (see below).
|
||||
Similar modules sold by other vendors might also work but not have been tested yet. Currently only
|
||||
single-color E-Ink displays are implemented and of those only a few modules.
|
||||
|
||||
@ -73,13 +74,14 @@ Configuration variables:
|
||||
- ``1.54in``
|
||||
- ``2.13in`` (not tested)
|
||||
- ``2.13in-ttgo`` (T5_V2.3 tested)
|
||||
- ``2.70in``
|
||||
- ``2.13in-ttgo-b73`` (T5_V2.3 with B73 display tested)
|
||||
- ``2.70in`` (currently not working with the HAT Rev 2.1 version)
|
||||
- ``2.90in``
|
||||
- ``2.90in-b`` (B/W rendering only)
|
||||
- ``4.20in``
|
||||
- ``5.83in``
|
||||
- ``7.50in``
|
||||
- ``7.50inV2``
|
||||
- ``7.50inV2`` (Can't use with an ESP8266 as it runs out of RAM)
|
||||
|
||||
- **busy_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The BUSY pin. Defaults to not connected.
|
||||
- **reset_pin** (*Optional*, :ref:`Pin Schema <config-pin_schema>`): The RESET pin. Defaults to not connected.
|
||||
|
@ -43,8 +43,6 @@ Advanced options:
|
||||
but you can customize this behavior using this option.
|
||||
- **platformio_options** (*Optional*, mapping): Additional options to pass over to PlatformIO in the
|
||||
platformio.ini file. See :ref:`esphome-platformio_options`.
|
||||
- **use_custom_code** (*Optional*, boolean): Whether to configure the project for writing custom components.
|
||||
This sets up some flags so that custom code should compile correctly
|
||||
- **includes** (*Optional*, list of files): A list of C[++] files to include in the main (auto-generated) sketch file
|
||||
for custom components. The paths in this list are relative to the directory where the YAML configuration file
|
||||
is in. Should have file extension ``.h`` - See :ref:`esphome-includes` for more info.
|
||||
|
@ -91,7 +91,19 @@ Configuration for Olimex ESP32-POE
|
||||
clk_mode: GPIO17_OUT
|
||||
phy_addr: 0
|
||||
power_pin: GPIO12
|
||||
|
||||
|
||||
Configuration for LILYGO TTGO T-Internet-POE ESP32-WROOM LAN8270A Chip
|
||||
----------------------------------------------------------------------
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ethernet:
|
||||
type: LAN8720
|
||||
mdc_pin: GPIO23
|
||||
mdio_pin: GPIO18
|
||||
clk_mode: GPIO17_OUT
|
||||
phy_addr: 0
|
||||
|
||||
Configuration for OpenHacks LAN8720
|
||||
-----------------------------------
|
||||
|
||||
@ -106,6 +118,18 @@ Configuration for OpenHacks LAN8720
|
||||
Note: This board has an issue that might cause the ESP32 to boot in program mode. When testing, make sure you are monitoring the
|
||||
serial output and reboot the device several times to see if it boots into the program properly.
|
||||
|
||||
Configuration for Wireless Tag WT32-ETH01
|
||||
-----------------------------------------
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
ethernet:
|
||||
type: LAN8720
|
||||
mdc_pin: GPIO23
|
||||
mdio_pin: GPIO18
|
||||
clk_mode: GPIO0_IN
|
||||
phy_addr: 1
|
||||
power_pin: GPIO16
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 28 KiB |
@ -8,10 +8,13 @@ I²C Bus
|
||||
:image: i2c.png
|
||||
:keywords: i2c, iic, bus
|
||||
|
||||
This component sets up the I²C bus for your ESP32 or ESP8266. In order for those components
|
||||
This component sets up the I²C bus for your ESP32 or ESP8266. In order for these components
|
||||
to work correctly, you need to define the I²C bus in your configuration. Please note the ESP
|
||||
will enable its internal 10kΩ pullup resistors for these pins, so you usually don't need to
|
||||
put on external ones.
|
||||
put on external ones. You can use multiple devices on one I²C bus as each device is given a
|
||||
unique address for communicating between between it and the ESP. You can do this by hopping
|
||||
wires from the two lines (SDA and SCL) from each device board to the next device board or by
|
||||
connecting the wires from each device back to the two I²C pins on the ESP.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 530 KiB After Width: | Height: | Size: 496 KiB |
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 178 KiB |
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 232 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 122 KiB |
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 148 KiB |
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 132 KiB |
@ -718,7 +718,7 @@ This effect allows you to access each LED individually in a custom light effect.
|
||||
Available variables in the lambda:
|
||||
|
||||
- **it** - :apiclass:`AddressableLight <light::AddressableLight>` instance (see API reference for more info).
|
||||
- **current_color** - :apiclass:`ESPColor ` <light::ESPColor>` instance (see API reference for more info).
|
||||
- **current_color** - :apistruct:`ESPColor <light::ESPColor>` instance (see API reference for more info).
|
||||
- **initial_run** - A bool which is true on the first execution of the lambda. Useful to reset static variables when restarting a effect.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
@ -12,6 +12,10 @@ segments can be individually controlled.
|
||||
|
||||
Similarly, a single light strip can be partitioned into multiple partitions with this integration.
|
||||
|
||||
If you want to do this, you may run into strange behavior like that the original light entity (e.g., ``fastled_clockless``)
|
||||
may be conflicting with the partition. For better control over which segments of the strip will overlap each other,
|
||||
mark the original ``light`` as ``internal: true``.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
@ -31,6 +35,8 @@ Similarly, a single light strip can be partitioned into multiple partitions with
|
||||
# Example for light segment source
|
||||
- platform: fastled_clockless
|
||||
id: light2
|
||||
# You may want (but don't need) this
|
||||
internal: true
|
||||
# Other settings
|
||||
|
||||
Configuration variables:
|
||||
|
@ -36,8 +36,7 @@ The MCP23008 component (`datasheet <http://ww1.microchip.com/downloads/en/device
|
||||
mcp23008: mcp23008_hub
|
||||
# Use pin number 0
|
||||
number: 0
|
||||
# One of INPUT, INPUT_PULLUP or OUTPUT
|
||||
mode: INPUT_PULLUP
|
||||
mode: OUTPUT
|
||||
inverted: False
|
||||
|
||||
# Individual inputs
|
||||
|
@ -334,9 +334,15 @@ Configuration variables:
|
||||
|
||||
This action can also be used in :ref:`lambdas <config-lambda>`:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
mqtt:
|
||||
# Give the mqtt component an ID
|
||||
id: mqtt_client
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
App.get_mqtt_client()->subscribe("the/topic", [=](const std::string &payload) {
|
||||
id(mqtt_client).subscribe("the/topic", [=](const std::string &payload) {
|
||||
// do something with payload
|
||||
});
|
||||
|
||||
@ -362,7 +368,7 @@ Please note that it's a good idea to check if the key exists in the Json Object
|
||||
# ...
|
||||
on_json_message:
|
||||
topic: the/topic
|
||||
then:
|
||||
then:
|
||||
- light.turn_on:
|
||||
id: living_room_lights
|
||||
|
||||
@ -397,9 +403,15 @@ Configuration variables:
|
||||
|
||||
This action can also be used in :ref:`lambdas <config-lambda>`:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
mqtt:
|
||||
# Give the mqtt component an ID
|
||||
id: mqtt_client
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
App.get_mqtt_client()->subscribe_json("the/topic", [=](JsonObject &root) {
|
||||
id(mqtt_client).subscribe_json("the/topic", [=](JsonObject &root) {
|
||||
// do something with JSON-decoded value root
|
||||
});
|
||||
|
||||
@ -522,6 +534,22 @@ the MQTT broker.
|
||||
then:
|
||||
- logger.log: MQTT is connected!
|
||||
|
||||
.. note::
|
||||
|
||||
This action can also be written in :ref:`lambdas <config-lambda>`:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
mqtt:
|
||||
# Give the mqtt component an ID
|
||||
id: mqtt_client
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
if (id(mqtt_client)->is_connected()) {
|
||||
// do something if MQTT is connected
|
||||
}
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
|
@ -33,12 +33,12 @@ for example the `RobotDyn dimmer
|
||||
# Example configuration entry
|
||||
output:
|
||||
- platform: ac_dimmer
|
||||
id: dimmer1
|
||||
gate_pin: D7
|
||||
zero_cross_pin:
|
||||
number: D6
|
||||
mode: INPUT
|
||||
inverted: yes
|
||||
id: dimmer1
|
||||
gate_pin: D7
|
||||
zero_cross_pin:
|
||||
number: D6
|
||||
mode: INPUT
|
||||
inverted: yes
|
||||
|
||||
light:
|
||||
- platform: monochromatic
|
||||
|
@ -12,7 +12,7 @@ no need for additional filtering.
|
||||
|
||||
The DAC spans across two pins, each on its own channel: GPIO25 (Channel 1) and GPIO26 (Channel 2).
|
||||
|
||||
The output level is a percentage of the board supply voltage (VDD_A) - generally this will be 3.3V.
|
||||
The output level is a percentage of the board supply voltage (VDD_A) - generally this will be 3.3 V.
|
||||
|
||||
|
||||
.. code-block:: yaml
|
||||
@ -29,6 +29,13 @@ The output level is a percentage of the board supply voltage (VDD_A) - generally
|
||||
- output.set_level:
|
||||
id: dac_output
|
||||
level: 50%
|
||||
|
||||
# Use the DAC output as a light
|
||||
light:
|
||||
- platform: monochromatic
|
||||
output: dac_output
|
||||
gamma_correct: 1.4
|
||||
id: dac_output
|
||||
|
||||
|
||||
Configuration variables:
|
||||
@ -48,6 +55,7 @@ Use Cases
|
||||
- Driving a bar graph or large amount of LEDs using an analog-controlled LED driver like the LM3914
|
||||
(`datasheet <https://www.ti.com/lit/ds/symlink/lm3914.pdf>`__); this can allow you to make tank
|
||||
level indicators, temperature gauges, and so on from a single output pin
|
||||
- Generating 0-10 V for a dimmable light (operational amplifier required)
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 163 KiB |
@ -74,6 +74,9 @@ Automations:
|
||||
- **on_rc5** (*Optional*, :ref:`Automation <automation>`): An automation to perform when a
|
||||
RC5 remote code has been decoded. A variable ``x`` of type :apiclass:`remote_base::RC5Data`
|
||||
is passed to the automation for use in lambdas.
|
||||
- **on_rc_switch** (*Optional*, :ref:`Automation <automation>`): An automation to perform when a
|
||||
RCSwitch RF code has been decoded. A variable ``x`` of type :apiclass:`remote_base::RCSwitchData`
|
||||
is passed to the automation for use in lambdas.
|
||||
- **on_samsung** (*Optional*, :ref:`Automation <automation>`): An automation to perform when a
|
||||
Samsung remote code has been decoded. A variable ``x`` of type :apiclass:`remote_base::SamsungData`
|
||||
is passed to the automation for use in lambdas.
|
||||
@ -208,6 +211,20 @@ Remote code selection (exactly one of these has to be included):
|
||||
remote_transmitter:
|
||||
pin: 5
|
||||
carrier_duty_percent: 100%
|
||||
|
||||
.. note::
|
||||
|
||||
To caputure the codes more effectively with directly connected receiver like tsop38238 you can try to use `INPUT_PULLUP`:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
remote_receiver:
|
||||
pin:
|
||||
number: D4
|
||||
inverted: True
|
||||
mode: INPUT_PULLUP
|
||||
dump: all
|
||||
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
@ -72,11 +72,15 @@ To measure voltages higher than 1.1V, set ``attenuation`` to one of the `followi
|
||||
ESP8266 Measuring VCC
|
||||
---------------------
|
||||
|
||||
On the ESP8266 you can even measure the voltage the chip is getting. This can be useful in situations
|
||||
On the ESP8266 you can even measure the voltage the *chip is getting*. This can be useful in situations
|
||||
where you want to shut down the chip if the voltage is low when using a battery.
|
||||
|
||||
To measure the VCC voltage, set ``pin:`` to ``VCC`` and make sure nothing is connected to the ``A0`` pin.
|
||||
|
||||
.. note::
|
||||
|
||||
To avoid confusion: It measures the voltage at the chip, and not at the VCC pin of the board. It should usually be around 3.3V.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
sensor:
|
||||
|
@ -6,7 +6,7 @@ APDS9960 Sensor
|
||||
:image: apds9960.jpg
|
||||
|
||||
The ``apds9960`` sensor platform allows you to use your APDS9960 RGB and gesture sensors
|
||||
(`datasheet <https://cdn-shop.adafruit.com/datasheets/BST-BME280_DS001-10.pdf>`__,
|
||||
(`datasheet <https://cdn.sparkfun.com/datasheets/Sensors/Proximity/apds9960.pdf>`__,
|
||||
`SparkFun`_) with ESPHome.
|
||||
The :ref:`I²C <i2c>` is
|
||||
required to be set up in your configuration for this sensor to work.
|
||||
|
@ -59,6 +59,6 @@ See Also
|
||||
|
||||
- :ref:`sensor-filters`
|
||||
- :doc:`tsl2561`
|
||||
- :apiref:`bh7150/bh7150.h`
|
||||
- :apiref:`bh1750/bh1750.h`
|
||||
- `BH1750 Library <https://github.com/claws/BH1750>`__ by `@claws <https://github.com/claws>`__
|
||||
- :ghedit:`Edit`
|
||||
|
@ -37,7 +37,7 @@ required to be set up in your configuration for this sensor to work.
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **temperature** (**Required**): The information for the temperature.
|
||||
- **temperature** (*Optional*): The information for the temperature.
|
||||
sensor
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature
|
||||
@ -47,7 +47,7 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **pressure** (**Required**): The information for the pressure sensor.
|
||||
- **pressure** (*Optional*): The information for the pressure sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the pressure sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
@ -55,7 +55,7 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **humidity** (**Required**): The information for the pressure sensor.
|
||||
- **humidity** (*Optional*): The information for the pressure sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the humidity sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
@ -39,7 +39,7 @@ your configuration for this sensor to work.
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **temperature** (**Required**): The information for the temperature sensor.
|
||||
- **temperature** (*Optional*): The information for the temperature sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
@ -47,7 +47,7 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **pressure** (**Required**): The information for the pressure sensor.
|
||||
- **pressure** (*Optional*): The information for the pressure sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the pressure sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
@ -55,7 +55,7 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **humidity** (**Required**): The information for the humidity sensor.
|
||||
- **humidity** (*Optional*): The information for the humidity sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the humidity sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
@ -63,14 +63,14 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **gas_resistance** (**Required**): The information for the gas sensor.
|
||||
- **gas_resistance** (*Optional*): The information for the gas sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the gas resistance sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **address** (*Optional*, int): Manually specify the I²C address of
|
||||
the sensor. Defaults to ``0x77``. Another address can be ``0x76``.
|
||||
the sensor. Defaults to ``0x76``. Another address can be ``0x77``.
|
||||
- **iir_filter** (*Optional*): Set up an Infinite Impulse Response filter to increase accuracy. One of
|
||||
``OFF``, ``1x``, ``3x``, ``7x``, ``15x``, ``31x``, ``63x`` and ``127x``. Defaults to ``OFF``.
|
||||
- **heater** (*Optional*): The settings for the internal heater for the gas sensor. Set this
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.1 KiB |
@ -38,14 +38,14 @@ your configuration for this sensor to work.
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **temperature** (**Required**): The information for the temperature sensor.
|
||||
- **temperature** (*Optional*): The information for the temperature sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature
|
||||
sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **pressure** (**Required**): The information for the pressure sensor.
|
||||
- **pressure** (*Optional*): The information for the pressure sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the pressure sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
@ -35,7 +35,7 @@ required to be set up in your configuration for this sensor to work.
|
||||
Configuration variables:
|
||||
------------------------
|
||||
|
||||
- **temperature** (**Required**): The information for the temperature.
|
||||
- **temperature** (*Optional*): The information for the temperature.
|
||||
sensor
|
||||
|
||||
- **name** (**Required**, string): The name for the temperature
|
||||
@ -45,7 +45,7 @@ Configuration variables:
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
|
||||
- **pressure** (**Required**): The information for the pressure sensor.
|
||||
- **pressure** (*Optional*): The information for the pressure sensor.
|
||||
|
||||
- **name** (**Required**, string): The name for the pressure sensor.
|
||||
- **oversampling** (*Optional*): The oversampling parameter for the temperature sensor.
|
||||
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
@ -76,7 +76,7 @@ Let's now also take a closer look at this line, which you might not be too used
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
class MyCustomSensor : public Component, public Sensor {
|
||||
class MyCustomSensor : public Component, public Sensor {
|
||||
|
||||
What this line is essentially saying is that we're defining our own class that's called ``MyCustomSensor``
|
||||
which is also a subclass of :apiclass:`Component` and :apiclass:`Sensor <sensor::Sensor>`.
|
||||
@ -132,6 +132,57 @@ Every time ``update`` is called we will now **publish** a new value to the front
|
||||
The rest of ESPHome will then take care of processing this value and ultimately publishing it
|
||||
to the outside world (for example using MQTT).
|
||||
|
||||
One last thing. Some sensors, such as the BMP180 were are going to explain later, require some other component before they can be used. Remember how we talked about the ``setup()`` method? Well just like when writing in the Arduino IDE, components need to be set up in the right order. For that ESPHome introduces another method in the :apiclass:`Component` class.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
float get_setup_priority() const override { return esphome::setup_priority::HARDWARE; }
|
||||
|
||||
Where HARDWARE can be any of:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
/// For communication buses like i2c/spi
|
||||
extern const float BUS;
|
||||
/// For components that represent GPIO pins like PCF8573
|
||||
extern const float IO;
|
||||
/// For components that deal with hardware and are very important like GPIO switch
|
||||
extern const float HARDWARE;
|
||||
/// For components that import data from directly connected sensors like DHT.
|
||||
extern const float DATA;
|
||||
/// Alias for DATA (here for compatability reasons)
|
||||
extern const float HARDWARE_LATE;
|
||||
/// For components that use data from sensors like displays
|
||||
extern const float PROCESSOR;
|
||||
extern const float WIFI;
|
||||
/// For components that should be initialized after WiFi is connected.
|
||||
extern const float AFTER_WIFI;
|
||||
/// For components that should be initialized after a data connection (API/MQTT) is connected.
|
||||
extern const float AFTER_CONNECTION;
|
||||
/// For components that should be initialized at the very end of the setup process.
|
||||
extern const float LATE;
|
||||
|
||||
Now don't let the wording confuse you. The ``get_setup_priority()`` method is an override. Instead of fetching the setup priority setup for us, it instead fetches the setup priority for esphome, while being defined by us. The BMP180 would for instance need to be setup with a priority of IO or lower. A serial streaming (TCP) server would require a working WIFI setup and therefore get AFTER_WIFI.
|
||||
|
||||
This finalizes our example as:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
class MyCustomSensor : public PollingComponent, public Sensor {
|
||||
public:
|
||||
// constructor
|
||||
MyCustomSensor() : PollingComponent(15000) {}
|
||||
|
||||
float get_setup_priority() const override { return esphome::setup_priority::XXXX; }
|
||||
|
||||
void setup() override {
|
||||
// This will be called by App.setup()
|
||||
}
|
||||
void update() override {
|
||||
// This will be called every "update_interval" milliseconds.
|
||||
}
|
||||
};
|
||||
|
||||
Step 2: Registering the custom sensor
|
||||
-------------------------------------
|
||||
|
||||
|
@ -20,7 +20,7 @@ and similar 1-Wire temperature sensors.
|
||||
To use your :ref:`dallas sensor <dallas-sensor>`, first define a dallas “hub” with a pin and
|
||||
id, which you will later use to create the sensors. The 1-Wire bus the
|
||||
sensors are connected to should have an external pullup resistor of
|
||||
about 4.7KΩ. For this, connect a resistor of *about* 4.7KΩ (values around that like 1Ω will, if you don't have
|
||||
about 4.7KΩ. For this, connect a resistor of *about* 4.7KΩ (values around that like 1KΩ will, if you don't have
|
||||
massively long wires, work fine in most cases) between ``3.3V`` and the data pin.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
@ -26,7 +26,7 @@ The sensor communicate with board by :ref:`I²C <i2c>` protocol, and requires 3.
|
||||
name: "PM10.0"
|
||||
aqi:
|
||||
name: "AQI"
|
||||
type: "CAQI"
|
||||
calculation_type: "CAQI"
|
||||
|
||||
Configuration variables:
|
||||
------------------------
|
||||
@ -51,7 +51,7 @@ Configuration variables:
|
||||
|
||||
- **aqi** (*Optional*): AQI sensor. Requires the ``pm_2_5`` and ``pm_10_0`` sensors defined. See below.
|
||||
|
||||
- **type** (**Required**): One of: ``AQI`` or ``CAQI``.
|
||||
- **calculation_type** (**Required**): One of: ``AQI`` or ``CAQI``.
|
||||
- **name** (**Required**, string): The name for the temperature sensor.
|
||||
- **id** (*Optional*, :ref:`config-id`): Set the ID of this sensor for use in lambdas.
|
||||
- All other options from :ref:`Sensor <config-sensor>`.
|
||||
@ -75,7 +75,7 @@ There are two implementations:
|
||||
name: "PM10.0"
|
||||
aqi:
|
||||
name: "AQI"
|
||||
type: "CAQI"
|
||||
calculation_type: "CAQI"
|
||||
|
||||
|
||||
See Also
|
||||
|
@ -20,6 +20,10 @@ states from your Home Assistant instance using the :doc:`native API </components
|
||||
|
||||
This component is only for numeral states. If you want to import arbitrary text states
|
||||
from Home Assistant, use the :doc:`Home Assistant Text Sensor </components/text_sensor/homeassistant>`.
|
||||
|
||||
Albeit you might not plan to __export__ states from the node and you do not need an entity of the node
|
||||
in Home Assistant, this component still requires you to register the node under Home Assistant. See:
|
||||
:doc:`Getting started with Hassio </guides/getting_started_hassio>`
|
||||
|
||||
Importing attributes is currently not supported, but you can create template sensors in Home Assistant
|
||||
that return the attribute of a sensor and then import the template sensor here.
|
||||
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 190 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 343 KiB After Width: | Height: | Size: 321 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 132 KiB |
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 248 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 298 KiB After Width: | Height: | Size: 281 KiB |
Before Width: | Height: | Size: 464 KiB After Width: | Height: | Size: 447 KiB |
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 161 KiB |
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 198 KiB |
Before Width: | Height: | Size: 281 KiB After Width: | Height: | Size: 267 KiB |
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 190 KiB |
Before Width: | Height: | Size: 205 KiB After Width: | Height: | Size: 195 KiB |
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 300 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.6 KiB |