mirror of
https://github.com/esphome/esphome-docs.git
synced 2025-03-01 03:51:36 +01:00
Documentation for WireGuard component and sensors (#2948)
Co-authored-by: H. Árkosi Róbert <robreg@zsurob.hu>
This commit is contained in:
parent
d0719caf68
commit
1d07f3f9d4
296
components/wireguard.rst
Normal file
296
components/wireguard.rst
Normal file
@ -0,0 +1,296 @@
|
||||
WireGuard Component
|
||||
===================
|
||||
|
||||
.. |wireguard| unicode:: WireGuard 0xAE
|
||||
.. _wireguard: https://www.wireguard.org/
|
||||
|
||||
.. seo::
|
||||
:description: Instructions to setup WireGuard for your ESP board.
|
||||
:keywords: WireGuard, VPN, ESP32
|
||||
|
||||
|wireguard|_ is an extremely simple yet fast and modern VPN that utilizes
|
||||
state-of-the-art cryptography. This component uses a **custom**
|
||||
implementation not developed by original authors and currently
|
||||
available for **ESP32 platform only**.
|
||||
|
||||
Please note that *"WireGuard" and the "WireGuard" logo are
|
||||
registered trademarks of Jason A. Donenfeld.* See
|
||||
`"WireGuard" Trademark Usage Policy <https://www.wireguard.com/trademark-policy/>`__
|
||||
for additional information.
|
||||
|
||||
.. warning::
|
||||
|
||||
To successfully use this component you must have |wireguard| also
|
||||
on your remote host (already installed and ready to accept connections).
|
||||
If you don't have it please read the section :ref:`wireguard-installation`.
|
||||
|
||||
.. warning::
|
||||
|
||||
This component requires the system clock to be synchronized.
|
||||
|
||||
See :doc:`time/index` to setup a time source
|
||||
and **do not use** ``homeassistant`` time-platform if
|
||||
Home Assistant is on the remote peer because the time
|
||||
synchronization is a prerequisite to establish the VPN link.
|
||||
|
||||
The :doc:`time/sntp` is a valid time-platform choice.
|
||||
|
||||
A VPN tunnel can be created to a **single** remote peer
|
||||
adding the following to your configuration:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
wireguard:
|
||||
address: x.y.z.w
|
||||
private_key: AaBbCcDd...=
|
||||
peer_endpoint: wg.server.example
|
||||
peer_public_key: EeFfGgHh...=
|
||||
|
||||
# Optional netmask (this is the default if omitted)
|
||||
netmask: 255.255.255.255
|
||||
|
||||
# Optional endpoint port (WireGuard default if omitted)
|
||||
peer_port: 51820
|
||||
|
||||
# Optional pre-shared key (omit if not in use)
|
||||
peer_preshared_key: XxYyZzWw...=
|
||||
|
||||
# Optional list of ip/mask (any host is allowed if omitted)
|
||||
peer_allowed_ips:
|
||||
- x.y.z.0/24
|
||||
- l.m.n.o/32 # the /32 can be omitted for single host
|
||||
- [...]
|
||||
|
||||
# Optional keepalive (disabled by default)
|
||||
peer_persistent_keepalive: 25s
|
||||
|
||||
It is recommended to use *secrets* at least for private and pre-shared keys:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
wireguard:
|
||||
private_key: !secret wg_privkey
|
||||
peer_preshared_key: !secret wg_shrdkey
|
||||
|
||||
Configuration variables
|
||||
------------------------
|
||||
|
||||
.. _wireguard-address:
|
||||
|
||||
- **address** (**Required**, IPv4 address): The local VPN address of the device.
|
||||
|
||||
If you intend to upload firmwares through the VPN link you probably need
|
||||
to copy this value to the ``use_address`` parameter of the :doc:`wifi`.
|
||||
|
||||
- **netmask** (*Optional*, IPv4 address): The netmask for the configured address.
|
||||
Default to ``255.255.255.255``.
|
||||
|
||||
See section :ref:`wireguard-static-routes` if outgoing connections are
|
||||
expected to transit through the VPN link (e.g. with :doc:`mqtt` to a
|
||||
remote MQTT broker).
|
||||
|
||||
- **private_key** (**Required**, string): The private key of the device.
|
||||
|
||||
- **peer_endpoint** (**Required**, string): The hostname of the remote peer.
|
||||
|
||||
- **peer_port** (*Optional*, UDP port): The port where remote peer is listening on.
|
||||
The |wireguard| default is ``51820``.
|
||||
|
||||
- **peer_public_key** (**Required**, string): The public key of the remote peer.
|
||||
|
||||
- **peer_preshared_key** (*Optional*, string): The chosen pre-shared key between
|
||||
local device and remote peer.
|
||||
|
||||
- **peer_persistent_keepalive** (*Optional*, :ref:`config-time`): The amount of
|
||||
time after which a *keepalive* packet is sent through the tunnel.
|
||||
By default this feature is disabled (``0s``).
|
||||
|
||||
If there are NATs or firewalls between the device and the remote peer set
|
||||
this value to something like ``25s``.
|
||||
|
||||
- **peer_allowed_ips** (*Optional*, list of IPv4 networks): A list of networks
|
||||
in CIDR notation (*IP/mask*) to be allowed through the tunnel. Any host
|
||||
(``0.0.0.0/0``) will be allowed if this parameter is omitted.
|
||||
|
||||
The device own ``address/32`` is always added by default to this list.
|
||||
|
||||
See section :ref:`wireguard-static-routes` if outgoing connections are
|
||||
expected to transit through the VPN link (e.g. with :doc:`mqtt` to a
|
||||
remote MQTT broker).
|
||||
|
||||
- **reboot_timeout** (*Optional*, :ref:`config-time`): The amount of time to wait
|
||||
before rebooting the device when the remote peer is unreachable. Can be disabled
|
||||
by setting this to ``0s``. Default to ``15min``.
|
||||
|
||||
- **require_connection_to_proceed** (*Optional*, boolean): Set to ``true`` to
|
||||
wait for the remote peer to be up before continuing to boot the device.
|
||||
Default to ``false``.
|
||||
|
||||
This can be used to delay the initialization of components that use the
|
||||
VPN tunnel as long as the VPN isn't ready. For example if you are using
|
||||
:doc:`mqtt` to reach a remote broker you may experience boot freeze just
|
||||
after the setup of MQTT because it waits for the broker to be reachable,
|
||||
but the connection cannot be established until the VPN link is
|
||||
active too. To bypass such deadlock set this parameter to ``true`` in
|
||||
order to not initialize MQTT until the remote peer is up.
|
||||
|
||||
- **update_interval** (*Optional*, :ref:`config-time`): How often to check
|
||||
the connection status and the latest handshake value. Default to ``10s``.
|
||||
|
||||
- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation.
|
||||
|
||||
.. _wireguard-static-routes:
|
||||
|
||||
Static routes and outgoing connections
|
||||
--------------------------------------
|
||||
|
||||
Currently there is no way on ESP32 devices to configure static routes for
|
||||
network interfaces, so the ``peer_allowed_ips`` list is used only to allow
|
||||
(or drop) packets that pass through the VPN tunnel, not to define static
|
||||
routes for remote hosts.
|
||||
|
||||
The routes are implicitly added by the configured ``netmask`` and
|
||||
**only** packets with destination *inside* the same network defined
|
||||
by ``address/netmask`` will be routed to the tunnel.
|
||||
|
||||
This means that the user has to tweak the ``netmask`` parameter
|
||||
to "cover" **all** the networks in the allowed IPs list in order
|
||||
to successfully establish *outgoing* connections to remote hosts.
|
||||
Incoming connections are not affected by ``netmask``.
|
||||
|
||||
Let's explain with some examples:
|
||||
|
||||
+--------------+---------------------+----------------------+------------------------------+
|
||||
| address | netmask | allowed ips | working outgoing connections |
|
||||
+==============+=====================+======================+==============================+
|
||||
| 172.16.0.100 | *omitted* or | *omitted* or | **none**, |
|
||||
| | 255.255.255.255 | any other value | no routes are created |
|
||||
+ +---------------------+----------------------+------------------------------+
|
||||
| | 255.255.255.0 | *omitted* | only to ``172.16.0.0/24`` |
|
||||
+ + +----------------------+ because ``192.168.0.0/24`` +
|
||||
| | | - 172.16.0.0/24 | and any other network will |
|
||||
| | | - 192.168.0.0/24 | be outside ``172.16.0.0/24`` |
|
||||
| | | - *any other* | |
|
||||
+ + +----------------------+------------------------------+
|
||||
| | | - 192.168.0.0/24 | **none** because |
|
||||
| | | | ``192.168.0.0/24`` is not |
|
||||
| | | | part of ``172.16.0.0/24`` |
|
||||
+--------------+---------------------+----------------------+------------------------------+
|
||||
| 10.44.0.100 | 255.0.0.0 | *omitted* | to ``10.0.0.0/8`` network |
|
||||
+ + +----------------------+------------------------------+
|
||||
| | | - 10.44.0.0/16 | only to the networks in |
|
||||
| | | - 10.10.0.0/16 | the allowed list because the |
|
||||
| | | | netmask will route the whole |
|
||||
| | | | ``10.0.0.0/8`` but wireguard |
|
||||
| | | | allows only those two |
|
||||
| | | | subnets |
|
||||
+--------------+---------------------+----------------------+------------------------------+
|
||||
| any | 0.0.0.0 | *omitted* | **any** |
|
||||
+ + +----------------------+------------------------------+
|
||||
| | | - 172.16.0.0/24 | to any network that is in |
|
||||
| | | - 10.44.0.0/16 | the list of allowed IPs |
|
||||
| | | - 10.10.0.0/16 | because the netmask will |
|
||||
| | | | route any traffic but |
|
||||
| | | | wireguard allows only its |
|
||||
| | | | own list |
|
||||
+--------------+---------------------+----------------------+------------------------------+
|
||||
|
||||
.. note::
|
||||
|
||||
Setting the ``netmask`` to ``0.0.0.0`` has the effect of routing
|
||||
through the VPN link any traffic. It is like having set the wireguard
|
||||
interface as the system default.
|
||||
|
||||
.. _wireguard-sensors:
|
||||
|
||||
Sensors
|
||||
-------
|
||||
|
||||
Here after the sensors available for this component.
|
||||
|
||||
Status Binary Sensor
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This binary sensor tracks the connection status (*online*/*offline*) of the remote peer.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
binary_sensor:
|
||||
- platform: wireguard
|
||||
status:
|
||||
name: 'WireGuard Status'
|
||||
|
||||
All options from :ref:`Binary Sensor <config-binary_sensor>` can be added to the
|
||||
above configuration.
|
||||
|
||||
Latest Handshake Sensor
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This sensor reports the *timestamp* of the latest completed handshake.
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
# Example configuration entry
|
||||
sensor:
|
||||
- platform: wireguard
|
||||
latest_handshake:
|
||||
name: 'WireGuard Latest Handshake'
|
||||
|
||||
All options from :ref:`Sensor <config-sensor>` can be added to the
|
||||
above configuration.
|
||||
|
||||
.. _wireguard-installation:
|
||||
|
||||
Remote peer setup
|
||||
-----------------
|
||||
|
||||
There are many different ways for installing and configuring
|
||||
|wireguard| on servers, home servers or general host. It depends
|
||||
on the platform and on the operating system in use.
|
||||
|
||||
You can start reading the `official documentation <https://www.wireguard.com/>`__
|
||||
to have an overview of what it is and on how to install it *system wide* for
|
||||
common operating systems. Read the thread at `Home Assistant Community Add-on: WireGuard
|
||||
<https://community.home-assistant.io/t/home-assistant-community-add-on-wireguard/134662>`__
|
||||
if you intend to install it through Home Assistant. Plase note that securely
|
||||
setting up a VPN requires some networking experience, you will need to open
|
||||
router ports and possibly use custom commands to redirect traffic.
|
||||
|
||||
Once everything is configured you should be able to add the device
|
||||
to Home Assistant. See next section.
|
||||
|
||||
Connecting to remote Home Assistant
|
||||
-----------------------------------
|
||||
|
||||
The ESP device should interact with remote Home Assistant, across the VPN link,
|
||||
as it is on the local network but probably the initial *auto discovery*
|
||||
will not work and you have to add the device **manually**.
|
||||
|
||||
These are the steps:
|
||||
|
||||
1. go to the Home Assistant "Integrations" page
|
||||
2. click on the "Add Integration" button (bottom right corner)
|
||||
3. select "ESPHome" from the list
|
||||
4. insert the configured IP :ref:`address <wireguard-address>`
|
||||
as the host name
|
||||
|
||||
The device should now be linked to your remote Home Assistant.
|
||||
|
||||
.. note::
|
||||
|
||||
If you have issues linking the ESP device try setting
|
||||
the ``use_address`` parameter of the :doc:`wifi` to the value
|
||||
of the :ref:`address <wireguard-address>` configured here.
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
- :doc:`time/index`
|
||||
- :doc:`time/sntp`
|
||||
- |wireguard|_ official website
|
||||
- `Home Assistant Community Add-on: WireGuard
|
||||
<https://community.home-assistant.io/t/home-assistant-community-add-on-wireguard/134662>`__
|
||||
(also on `GitHub <https://github.com/hassio-addons/addon-wireguard>`__)
|
||||
- :ghedit:`Edit`
|
87
images/wireguard_custom_logo.svg
Normal file
87
images/wireguard_custom_logo.svg
Normal file
@ -0,0 +1,87 @@
|
||||
<?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"
|
||||
width="282"
|
||||
height="188"
|
||||
version="1.1"
|
||||
id="svg8">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12" />
|
||||
<path
|
||||
d="m 21.2435,127.36317 h 239.512 c 10.31,0 18.667,8.358 18.667,18.667 v 20.667 c 0,10.309 -8.358,18.666 -18.667,18.666 H 21.2435 c -10.31,0 -18.666,-8.357 -18.666,-18.666 v -20.667 c 0,-10.31 8.357,-18.667 18.666,-18.667 z"
|
||||
id="path2" />
|
||||
<path
|
||||
d="m 21.2435,127.36317 h 239.512 c 10.31,0 18.667,8.358 18.667,18.667 v 20.667 c 0,10.309 -8.358,18.666 -18.667,18.666 H 21.2435 c -10.309,0 -18.666,-8.357 -18.666,-18.666 v -20.667 c 0,-10.31 8.357,-18.667 18.666,-18.667 z"
|
||||
fill="none"
|
||||
stroke="#000000"
|
||||
stroke-width="1.333"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-miterlimit="10"
|
||||
id="path4" />
|
||||
<g
|
||||
aria-label="WIREGUARD®"
|
||||
id="text18"
|
||||
style="font-size:42.6667px;line-height:125%;font-family:'Neuropol Nova';-inkscape-font-specification:'Neuropol Nova';text-align:center;letter-spacing:2px;word-spacing:0px;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
|
||||
<path
|
||||
d="m 20.982449,141.10321 h 4.250003 l 6.541672,26.29168 6.520838,-26.29168 h 4.72917 l 6.541671,26.29168 6.520839,-26.29168 h 4.270836 l -7.812506,31.10419 h -5.29167 l -6.562505,-27.00002 -6.625005,27.00002 h -5.291671 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
||||
id="path851" />
|
||||
<path
|
||||
d="m 66.611383,150.82331 h 2.893225 v 21.38409 h -2.893225 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path853" />
|
||||
<path
|
||||
d="m 87.403027,162.18137 q 0.930989,0.3151 1.804686,1.34635 0.88802,1.03125 1.776039,2.83593 l 2.936195,5.84375 h -3.108069 l -2.735674,-5.48567 q -1.059895,-2.14844 -2.062498,-2.85026 -0.98828,-0.70182 -2.707028,-0.70182 H 80.15564 v 9.03775 h -2.893226 v -21.38409 h 6.531243 q 3.666662,0 5.471347,1.53255 1.804686,1.53255 1.804686,4.62629 0,2.01953 -0.945312,3.35156 -0.930988,1.33203 -2.721351,1.84766 z m -7.247387,-8.98046 v 7.59114 h 3.638017 q 2.091143,0 3.151038,-0.95964 1.074217,-0.97396 1.074217,-2.85026 0,-1.8763 -1.074217,-2.82161 -1.059895,-0.95963 -3.151038,-0.95963 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path855" />
|
||||
<path
|
||||
d="m 99.658223,150.82331 h 13.520817 v 2.43489 h -10.62759 v 6.33072 h 10.18358 v 2.4349 h -10.18358 v 7.74868 h 10.8854 v 2.4349 H 99.658223 Z"
|
||||
style="font-size:29.3333px"
|
||||
id="path857" />
|
||||
<path
|
||||
d="m 142.73765,167.76989 v -8.35417 h -6.87501 v -3.45833 h 11.04168 v 13.35417 q -2.4375,1.72917 -5.375,2.625 -2.93751,0.875 -6.27084,0.875 -7.29167,0 -11.41668,-4.25 -4.10417,-4.27084 -4.10417,-11.87501 0,-7.625 4.10417,-11.87501 4.12501,-4.27083 11.41668,-4.27083 3.04167,0 5.77084,0.75 2.75,0.75 5.0625,2.20833 v 4.47917 q -2.33334,-1.97917 -4.95834,-2.97917 -2.625,-1 -5.52084,-1 -5.70833,0 -8.58334,3.18751 -2.85416,3.1875 -2.85416,9.5 0,6.29167 2.85416,9.47918 2.87501,3.1875 8.58334,3.1875 2.22917,0 3.97917,-0.375 1.75001,-0.39584 3.14584,-1.20834 z"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:sans-serif;-inkscape-font-specification:sans-serif;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-opacity:1"
|
||||
id="path859" />
|
||||
<path
|
||||
d="m 154.97463,150.82331 h 2.90755 v 12.99087 q 0,3.43749 1.24609,4.95572 1.2461,1.50391 4.03906,1.50391 2.77864,0 4.02474,-1.50391 1.24609,-1.51823 1.24609,-4.95572 v -12.99087 h 2.90755 v 13.34894 q 0,4.18229 -2.07682,6.3164 -2.0625,2.13411 -6.10156,2.13411 -4.05338,0 -6.1302,-2.13411 -2.0625,-2.13411 -2.0625,-6.3164 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path861" />
|
||||
<path
|
||||
d="m 185.93553,153.67356 -3.92447,10.64192 h 7.86327 z m -1.63281,-2.85025 h 3.27994 l 8.14973,21.38409 h -3.0078 l -1.94792,-5.48567 h -9.63931 l -1.94792,5.48567 h -3.05077 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path864" />
|
||||
<path
|
||||
d="m 210.98108,162.18137 q 0.93099,0.3151 1.80469,1.34635 0.88802,1.03125 1.77603,2.83593 l 2.9362,5.84375 h -3.10807 l -2.73567,-5.48567 q -1.0599,-2.14844 -2.0625,-2.85026 -0.98828,-0.70182 -2.70703,-0.70182 h -3.15104 v 9.03775 h -2.89322 v -21.38409 h 6.53124 q 3.66666,0 5.47135,1.53255 1.80468,1.53255 1.80468,4.62629 0,2.01953 -0.94531,3.35156 -0.93099,1.33203 -2.72135,1.84766 z m -7.24739,-8.98046 v 7.59114 h 3.63802 q 2.09114,0 3.15104,-0.95964 1.07421,-0.97396 1.07421,-2.85026 0,-1.8763 -1.07421,-2.82161 -1.0599,-0.95963 -3.15104,-0.95963 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path866" />
|
||||
<path
|
||||
d="m 226.12951,153.20091 v 16.62889 h 3.49478 q 4.42578,0 6.47395,-2.00521 2.0625,-2.00521 2.0625,-6.33072 0,-4.29687 -2.0625,-6.28776 -2.04817,-2.0052 -6.47395,-2.0052 z m -2.89323,-2.3776 h 5.944 q 6.21614,0 9.12369,2.59244 2.90755,2.57812 2.90755,8.07812 0,5.52864 -2.92187,8.12108 -2.92187,2.59245 -9.10937,2.59245 h -5.944 z"
|
||||
style="font-size:29.3333px"
|
||||
id="path868" />
|
||||
<path
|
||||
d="m 254.26362,142.54434 q -1.19401,0 -2.22396,0.42839 -1.02995,0.42838 -1.88673,1.28516 -0.85677,0.85677 -1.29427,1.90495 -0.4375,1.03906 -0.4375,2.22396 0,1.17578 0.4375,2.21485 0.4375,1.02995 1.29427,1.88672 0.85678,0.85677 1.88673,1.29427 1.02995,0.42839 2.22396,0.42839 1.20313,0 2.23307,-0.42839 1.03907,-0.4375 1.89584,-1.29427 0.84766,-0.84766 1.26693,-1.87761 0.42839,-1.02995 0.42839,-2.22396 0,-1.21224 -0.42839,-2.24219 -0.42839,-1.03907 -1.26693,-1.88672 -0.85677,-0.85678 -1.89584,-1.28516 -1.02994,-0.42839 -2.23307,-0.42839 z m 0,-0.9388 q 1.38542,0 2.57943,0.5013 1.20313,0.5013 2.19662,1.4948 0.99349,0.99349 1.48568,2.1875 0.49219,1.19401 0.49219,2.59766 0,1.38542 -0.49219,2.57943 -0.49219,1.1849 -1.48568,2.17839 -0.99349,0.99349 -2.19662,1.4948 -1.19401,0.5013 -2.57943,0.5013 -1.38542,0 -2.58855,-0.5013 -1.19401,-0.50131 -2.1875,-1.4948 -0.99349,-0.99349 -1.48568,-2.17839 -0.49219,-1.19401 -0.49219,-2.57943 0,-1.40365 0.49219,-2.59766 0.49219,-1.19401 1.48568,-2.1875 0.99349,-0.9935 2.1875,-1.4948 1.20313,-0.5013 2.58855,-0.5013 z m -0.2461,3.77344 h -1.12109 v 2.51563 h 1.12109 q 1.00261,0 1.39454,-0.28255 0.40104,-0.28255 0.40104,-0.96615 0,-0.69271 -0.40104,-0.97526 -0.40104,-0.29167 -1.39454,-0.29167 z m 0.0638,-0.9388 q 1.60417,0 2.39714,0.54687 0.79297,0.53777 0.79297,1.64063 0,0.78386 -0.48308,1.29428 -0.47396,0.51041 -1.34896,0.66536 0.21875,0.0729 0.51953,0.42839 0.3099,0.34635 0.72917,1.01172 l 1.2487,2.03255 h -1.56771 l -1.17578,-1.90495 q -0.53776,-0.875 -0.875,-1.10286 -0.32813,-0.23698 -0.82032,-0.23698 h -0.60156 v 3.24479 h -1.41276 v -7.6198 z"
|
||||
style="font-size:18.6667px;baseline-shift:super;stroke:none"
|
||||
id="path870" />
|
||||
</g>
|
||||
<path
|
||||
d="M 117.67886,1.97033 H 164.3211 L 140.99998,25.29145 117.67886,1.97033 m 11.66056,75.093997 c -2.33211,2.643067 -3.88685,6.529913 -3.88685,10.416768 a 15.547412,15.547412 0 0 0 15.54741,15.547415 15.547412,15.547412 0 0 0 15.54741,-15.547415 c 0,-4.27554 -1.71021,-8.162386 -4.58649,-10.960923 l 11.03867,-11.038667 c 5.59707,5.674809 9.09524,13.448519 9.09524,21.99959 A 31.094826,31.094826 0 0 1 140.99998,118.57592 31.094826,31.094826 0 0 1 109.90515,87.481095 c 0,-8.317865 3.26496,-15.858362 8.55108,-21.377691 l -0.0777,-0.07773 55.03784,-54.960104 v 0 c 5.59707,-5.59708 13.37078,-9.09524 21.99959,-9.09524 a 31.094826,31.094826 0 0 1 31.09483,31.094832 31.094826,31.094826 0 0 1 -31.09483,31.094824 c -8.55107,0 -16.32478,-3.49817 -21.99959,-9.095234 l 11.03867,-11.038667 c 2.79853,2.876271 6.68539,4.586489 10.96092,4.586489 A 15.547412,15.547412 0 0 0 210.96337,33.065162 15.547412,15.547412 0 0 0 195.41596,17.51774 c -4.27553,0 -8.16239,1.71021 -10.96092,4.58648 L 129.33946,77.064332 M 97.54496,22.10422 C 94.74643,19.22795 90.85957,17.51774 86.58403,17.51774 A 15.547412,15.547412 0 0 0 71.03662,33.065157 15.547412,15.547412 0 0 0 86.58403,48.612569 c 4.27554,0 8.1624,-1.710218 10.96093,-4.586489 l 11.03866,11.038658 c -5.67481,5.597073 -13.44851,9.095243 -21.99959,9.095243 A 31.094826,31.094826 0 0 1 55.48921,33.065157 31.094826,31.094826 0 0 1 86.58403,1.97033 c 8.62882,0 16.40252,3.49816 21.99959,9.09524 v 0 l 21.45543,21.455423 -11.03866,11.038667 z"
|
||||
id="path863"
|
||||
style="stroke-width:7.77371" />
|
||||
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
@ -385,6 +385,7 @@ Miscellaneous
|
||||
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
|
||||
WireGuard, components/wireguard, wireguard_custom_logo.svg
|
||||
|
||||
|
||||
Motion
|
||||
@ -490,6 +491,7 @@ Miscellaneous
|
||||
Remote Receiver, components/remote_receiver, remote.svg, dark-invert
|
||||
Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg
|
||||
Tuya Binary Sensor, components/binary_sensor/tuya, tuya.png
|
||||
WireGuard, components/wireguard, wireguard_custom_logo.svg
|
||||
|
||||
Output Components
|
||||
-----------------
|
||||
@ -852,6 +854,7 @@ Miscellaneous Components
|
||||
SML, components/sml, sml.svg
|
||||
Atlas Scientific Peristaltic Pump, components/ezo_pmp, ezo-pmp.jpg
|
||||
Resol VBus, components/vbus, resol_deltasol_bs_plus.jpg
|
||||
WireGuard, components/wireguard, wireguard_custom_logo.svg
|
||||
Demo, components/demo, description.svg, dark-invert
|
||||
Copy, components/copy, content-copy.svg, dark-invert
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user