|
|
@ -2,15 +2,14 @@ |
|
|
|
|
|
|
|
# Configuration guide |
|
|
|
|
|
|
|
I think, the best starting point for creating your own yaml configuration, |
|
|
|
is to look at the [example.yaml](example.yaml) file from the project |
|
|
|
documentation. This configuration was written with the functionality of the |
|
|
|
original firmware in mind and it makes use of all available options. This |
|
|
|
configuration guide can be used to fill in the blanks. |
|
|
|
I think, the best starting point for creating your own yaml configuration, is to look at the |
|
|
|
[example.yaml](example.yaml) file from the project documentation. This configuration was written |
|
|
|
with the functionality of the original firmware in mind and it makes use of all available options. |
|
|
|
This configuration guide can be used to fill in the blanks. |
|
|
|
|
|
|
|
The `xiaomi_bslamp2` platform provides various components that expose the |
|
|
|
core functionalities of the lamp. In the following table, you can find what |
|
|
|
components are used for exposing what physical components of the lamp. |
|
|
|
The `xiaomi_bslamp2` platform provides various components that expose the core functionalities of |
|
|
|
the lamp. In the following table, you can find what components are used for exposing what physical |
|
|
|
components of the lamp. |
|
|
|
|
|
|
|
| Part | Component(s) | |
|
|
|
| -------------------------- |------------------------------------------------------------------| |
|
|
@ -25,17 +24,16 @@ components are used for exposing what physical components of the lamp. |
|
|
|
|
|
|
|
## Platform: xiaomi_bslamp2 |
|
|
|
|
|
|
|
At the core of the hardware support is the `xiaomi_bslamp2` platform, which |
|
|
|
provides two hub-style hardware abstraction layer (HAL) components that are |
|
|
|
used by the other components: one for driving the GPIO's for the RGBWW leds |
|
|
|
and one for the I2C communication between the ESP32 and the front panel. |
|
|
|
At the core of the hardware support is the `xiaomi_bslamp2` platform, which provides two hub-style |
|
|
|
hardware abstraction layer (HAL) components that are used by the other components: one for driving |
|
|
|
the GPIO's for the RGBWW leds and one for the I2C communication between the ESP32 and the front |
|
|
|
panel. |
|
|
|
|
|
|
|
I do mention the platform configuration here for completeness sake, but |
|
|
|
generally you will not have to add the following configuration option to |
|
|
|
your yaml file. It is loaded automatically by the components that need it, |
|
|
|
and the GPIO + I2C configurations are fully prepared to work for the Bedside |
|
|
|
Lamp 2 wiring out of the box. Therefore, you will not find this piece of |
|
|
|
configuration in the [example.yaml](example.yaml). |
|
|
|
I do mention the platform configuration here for completeness sake, but **generally you will not have |
|
|
|
to add the following configuration option to your yaml file**. It is loaded automatically by the |
|
|
|
components that need it, and the GPIO + I2C configurations are fully prepared to work for the |
|
|
|
Bedside Lamp 2 wiring out of the box. Therefore, you will not find this piece of configuration in |
|
|
|
the [example.yaml](example.yaml). |
|
|
|
|
|
|
|
Having said that, here are the configuration options: |
|
|
|
|
|
|
@ -56,14 +54,14 @@ xiaomi_bslamp2: |
|
|
|
trigger_pin: "GPIO16" |
|
|
|
``` |
|
|
|
|
|
|
|
The only reason that I can think of for adding this platform configuration |
|
|
|
to your yaml file, would be if you blew one or more or the ESP32 pins, and |
|
|
|
need to rewire functionality. In other casis, simply omit the section. |
|
|
|
The only reason that I can think of for adding this platform configuration to your yaml file, would |
|
|
|
be if you blew one or more or the ESP32 pins, and need to rewire functionality. In other casis, |
|
|
|
simply omit the section. |
|
|
|
|
|
|
|
## Component: light |
|
|
|
|
|
|
|
The light component creates an RGBWW light. This means that it can do |
|
|
|
colored light and cold/warm white light based on a color temperature. |
|
|
|
The light component creates an RGBWW light. This means that it can do colored light and cold/warm |
|
|
|
white light based on a color temperature. |
|
|
|
|
|
|
|
```yaml |
|
|
|
light: |
|
|
@ -97,24 +95,22 @@ light: |
|
|
|
### Configuration variables: |
|
|
|
|
|
|
|
* **name** (**Required**, string): The name of the light. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. |
|
|
|
By providing an id, you can reference the light from automation rules |
|
|
|
(e.g. to turn on the light when the power button is tapped) |
|
|
|
* **default_transition_length** (*Optional*, Time): The transition length to |
|
|
|
use when no transition length is set in a light call. Defaults to 1s. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. By providing an id, |
|
|
|
you can reference the light from automation rules (e.g. to turn on the light when the power button |
|
|
|
is tapped) |
|
|
|
* **default_transition_length** (*Optional*, Time): The transition length to use when no transition |
|
|
|
length is set in a light call. Defaults to 1s. |
|
|
|
* **effects** (*Optional*, list): A list of |
|
|
|
[light effects](https://esphome.io/components/light/index.html#light-effects) |
|
|
|
to use for this light. |
|
|
|
* **presets** (*Optional*, dict): Used to define presets, that can be used |
|
|
|
from automations. See [below](#light-presets) for detailed information. |
|
|
|
* **on_brightness** (*Optional*, Action): An automation to perform when the |
|
|
|
brightness of the light is modified. |
|
|
|
* All other options from [the base Light |
|
|
|
implementation](https://esphome.io/components/light/index.html#config-light), |
|
|
|
except for options that handle color correction options like |
|
|
|
`gamma_correct` and `color_correct`. These options are superceded by the |
|
|
|
fact that the light component has a fully customized light model, that |
|
|
|
closely follows the light model of the original lamp's firmware. |
|
|
|
[light effects](https://esphome.io/components/light/index.html#light-effects) to use for this light. |
|
|
|
* **presets** (*Optional*, dict): Used to define presets, that can be used from automations. See |
|
|
|
[below](#light-presets) for detailed information. |
|
|
|
* **on_brightness** (*Optional*, Action): An automation to perform when the brightness of the light |
|
|
|
is modified. |
|
|
|
* All other options from |
|
|
|
[the base Light implementation](https://esphome.io/components/light/index.html#config-light), |
|
|
|
except for options that handle color correction options like `gamma_correct` and `color_correct`. |
|
|
|
These options are superceded by the fact that the light component has a fully customized light |
|
|
|
model, that closely follows the light model of the original lamp's firmware. |
|
|
|
|
|
|
|
### Light modes |
|
|
|
|
|
|
@ -124,22 +120,19 @@ The lamp supports multiple light modes. These are: |
|
|
|
* **White light** (input: Color Temperature + brightness > 1%) |
|
|
|
* **Night light** (input: RGB or White light + brightness at 1%) |
|
|
|
|
|
|
|
In the original firmware + Yeelight Home Assistant integration, the night |
|
|
|
light feature is implemented through a switch component. The switch can be |
|
|
|
turned on to activate the night light mode. In this ESPHome firmware, |
|
|
|
setting the brightness to its lowest value triggers the night light mode. |
|
|
|
This makes things a lot easier to control. |
|
|
|
In the original firmware + Yeelight Home Assistant integration, the night light feature is |
|
|
|
implemented through a switch component. The switch can be turned on to activate the night light |
|
|
|
mode. In this ESPHome firmware, setting the brightness to its lowest value triggers the night light |
|
|
|
mode. This makes things a lot easier to control. |
|
|
|
|
|
|
|
It is possible to control the night light mode separately. An example of |
|
|
|
this can be found in the [example.yaml](example.yaml), in which holding the |
|
|
|
power button is bound to activating the night light. |
|
|
|
It is possible to control the night light mode separately. An example of this can be found in the |
|
|
|
[example.yaml](example.yaml), in which holding the power button is bound to activating the night |
|
|
|
light. |
|
|
|
|
|
|
|
### light.disco_on Action |
|
|
|
|
|
|
|
This action sets the state of the light immediately |
|
|
|
(i.e. without waiting for the next main loop iteration), |
|
|
|
without saving the state to memory and without publishing |
|
|
|
the state change. |
|
|
|
This action sets the state of the light immediately (i.e. without waiting for the next main loop |
|
|
|
iteration), without saving the state to memory and without publishing the state change. |
|
|
|
|
|
|
|
```yaml |
|
|
|
on_...: |
|
|
@ -152,13 +145,13 @@ on_...: |
|
|
|
blue: 100% |
|
|
|
``` |
|
|
|
|
|
|
|
The possible configuration options for this Action are the same |
|
|
|
as those for the standard `light.turn_on` Action. |
|
|
|
The possible configuration options for this Action are the same as those for the standard |
|
|
|
`light.turn_on` Action. |
|
|
|
|
|
|
|
### light.disco_off Action |
|
|
|
|
|
|
|
This action turns off the disco mode by restoring the state |
|
|
|
of the lamp to the last known state that was saved to memory. |
|
|
|
This action turns off the disco mode by restoring the state of the lamp to the last known state from |
|
|
|
before using the disco mode. |
|
|
|
|
|
|
|
```yaml |
|
|
|
on_...: |
|
|
@ -169,29 +162,25 @@ on_...: |
|
|
|
|
|
|
|
### Light presets |
|
|
|
|
|
|
|
The presets functionality was written with the original lamp firemware |
|
|
|
functionality in mind: the user has two groups of presets available: one for |
|
|
|
RGB light presets and one for white light presets (based on color |
|
|
|
temperature). The color button (the top one on the front panel) can be |
|
|
|
tapped to switch to the next preset within the active preset group. The same |
|
|
|
button can be held for a little while, to switch to the other preset group. |
|
|
|
The presets functionality was written with the original lamp firemware functionality in mind: the |
|
|
|
user has two groups of presets available: one for RGB light presets and one for white light presets |
|
|
|
(based on color temperature). The color button (the top one on the front panel) can be tapped to |
|
|
|
switch to the next preset within the active preset group. The same button can be held for a little |
|
|
|
while, to switch to the other preset group. |
|
|
|
|
|
|
|
In your light configuration, you can mimic this behavior (in fact: it is |
|
|
|
done so in the [example.yaml](example.yaml)) by means of the presets system. |
|
|
|
This system consists of two parts: |
|
|
|
In your light configuration, you can mimic this behavior (in fact: it is done so in the |
|
|
|
[example.yaml](example.yaml)) by means of the presets system. This system consists of two parts: |
|
|
|
|
|
|
|
* Defining presets |
|
|
|
* Activating presets from automations |
|
|
|
|
|
|
|
**Defining presets** |
|
|
|
|
|
|
|
Presets can be configured in the `presets` option of the `light` |
|
|
|
configuration. |
|
|
|
Presets can be configured in the `presets` option of the `light` configuration. |
|
|
|
|
|
|
|
Presets are arranged in groups. You can define as little or as many groups |
|
|
|
as you like. The example configuration uses two groups, but that is only to |
|
|
|
mimic the original behavior. If you only need one group, then create one |
|
|
|
group. If you need ten, go ahead and knock yourself out. |
|
|
|
Presets are arranged in groups. You can define as little or as many groups as you like. The example |
|
|
|
configuration uses two groups, but that is only to mimic the original behavior. If you only need one |
|
|
|
group, then create one group. If you need ten, go ahead and knock yourself out. |
|
|
|
|
|
|
|
The general structure of the presets configuration is: |
|
|
|
|
|
|
@ -209,9 +198,9 @@ light: |
|
|
|
.. |
|
|
|
``` |
|
|
|
|
|
|
|
*Note: duplicate template names are ok, as long as they are within their own |
|
|
|
group. If you use duplicate preset names within a single group, then the |
|
|
|
last preset will override the earlier one(s).* |
|
|
|
*Note: duplicate template names are ok, as long as they are within their own group. If you use |
|
|
|
duplicate preset names within a single group, then the last preset will override the earlier |
|
|
|
one(s).* |
|
|
|
|
|
|
|
A preset can define one of the following: |
|
|
|
|
|
|
@ -232,9 +221,8 @@ A preset can define one of the following: |
|
|
|
|
|
|
|
**Activating presets from automations** |
|
|
|
|
|
|
|
Once presets have been configured, they can be activated using the |
|
|
|
`preset.activate` action. The following options are available for this |
|
|
|
action: |
|
|
|
Once presets have been configured, they can be activated using the `preset.activate` action. The |
|
|
|
following options are available for this action: |
|
|
|
|
|
|
|
* Switch to next preset group (and after the last, switch to the first): |
|
|
|
```yaml |
|
|
@ -273,25 +261,22 @@ preset.activate: white.warm |
|
|
|
|
|
|
|
**Handling of invalid input** |
|
|
|
|
|
|
|
When a group or template is specified that does not exist, or if next |
|
|
|
group/preset is used while no presets have been defined at all, then the |
|
|
|
action will be ignored and an error will be logged. |
|
|
|
When a group or template is specified that does not exist, or if next group/preset is used while no |
|
|
|
presets have been defined at all, then the action will be ignored and an error will be logged. |
|
|
|
|
|
|
|
*Note: This is validation at run time. It would be a lot better to |
|
|
|
validate the names at compile time more strictly, so the firmware will not |
|
|
|
even compile when invalid names are in use. |
|
|
|
[Issue #15](https://github.com/mmakaay/esphome-xiaomi_bslamp2/issues/15) |
|
|
|
was created for implementing this. However, a new feature in ESPHome is |
|
|
|
required to be able to do this implementation. Good news is that this |
|
|
|
is already well on its way.* |
|
|
|
*Note: This is validation at run time. It would be a lot better to validate the names at compile |
|
|
|
time more strictly, so the firmware will not even compile when invalid names are in use. |
|
|
|
[Issue #15](https://github.com/mmakaay/esphome-xiaomi_bslamp2/issues/15) was created for |
|
|
|
implementing this. However, a new feature in ESPHome is required to be able to do this |
|
|
|
implementation. Good news is that this is already well on its way.* |
|
|
|
|
|
|
|
|
|
|
|
## Component: binary_sensor |
|
|
|
|
|
|
|
Binary sensors can be added to the configuration for handling touch/release |
|
|
|
events for the front panel. On touch, a binary_sensor will publish `True`, |
|
|
|
on release it will publish `False`. The configuration of a binary_sensor |
|
|
|
determines what part of the front panel is involved in the touch events. |
|
|
|
Binary sensors can be added to the configuration for handling touch/release events for the front |
|
|
|
panel. On touch, a binary_sensor will publish `True`, on release it will publish `False`. The |
|
|
|
configuration of a binary_sensor determines what part of the front panel is involved in the touch |
|
|
|
events. |
|
|
|
|
|
|
|
```yaml |
|
|
|
binary_sensor: |
|
|
@ -303,38 +288,35 @@ binary_sensor: |
|
|
|
- light.toggle: my_bedside_lamp |
|
|
|
``` |
|
|
|
|
|
|
|
For referencing the parts of the front panel, the following part identifiers |
|
|
|
are available: |
|
|
|
For referencing the parts of the front panel, the following part identifiers are available: |
|
|
|
|
|
|
|
* POWER_BUTTON (or its alias: POWER) |
|
|
|
* COLOR_BUTTON (or its alias: COLOR) |
|
|
|
* SLIDER |
|
|
|
|
|
|
|
If personal taste dictates so, you can use lower case characters and spaces |
|
|
|
instead of underscores. This means that for example "Power Button" and |
|
|
|
"power" would be valid identifiers for the power button. |
|
|
|
If personal taste dictates so, you can use lower case characters and spaces instead of underscores. |
|
|
|
This means that for example "Power Button" and "power" would be valid identifiers for the power |
|
|
|
button. |
|
|
|
|
|
|
|
### Configuration variables: |
|
|
|
|
|
|
|
* **name** (*Optional*, string): The name of the binary sensor. Setting a |
|
|
|
name will expose the binary sensor as an entity in Home Assistant. If you |
|
|
|
do not need this, you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. |
|
|
|
By providing an id, you can reference the binary_sensor from automation |
|
|
|
rules (to retrieve the current state of the binary_sensor). |
|
|
|
* **for** (*Mandatory*, part identifier): This specifies to for part of the |
|
|
|
front panel the binary sensor must report touch events. |
|
|
|
* **name** (*Optional*, string): The name of the binary sensor. Setting a name will expose the |
|
|
|
binary sensor as an entity in Home Assistant. If you do not need this, you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. By providing an id, |
|
|
|
you can reference the binary_sensor from automation rules (to retrieve the current state of the |
|
|
|
binary_sensor). |
|
|
|
* **for** (*Mandatory*, part identifier): This specifies to for part of the front panel the binary |
|
|
|
sensor must report touch events. |
|
|
|
* All other options from |
|
|
|
[Binary Sensor](https://esphome.io/components/binary_sensor/index.html#config-binary-sensor). |
|
|
|
|
|
|
|
## Component: sensor |
|
|
|
|
|
|
|
The sensor component publishes touch events for the front panel slider. The |
|
|
|
published value represents the level at which the slider was touched. |
|
|
|
The sensor component publishes touch events for the front panel slider. The published value |
|
|
|
represents the level at which the slider was touched. |
|
|
|
|
|
|
|
*Note: This sensor only reports the touched slider level. It cannot be used |
|
|
|
for detecting release events. If you want to handle touch/release events for |
|
|
|
the slider, then you can make use of the |
|
|
|
*Note: This sensor only reports the touched slider level. It cannot be used for detecting release |
|
|
|
events. If you want to handle touch/release events for the slider, then you can make use of the |
|
|
|
[binary_sensor](#component-binary_sensor) instead.* |
|
|
|
|
|
|
|
```yaml |
|
|
@ -352,27 +334,22 @@ sensor: |
|
|
|
|
|
|
|
### Configuration variables: |
|
|
|
|
|
|
|
* **name** (*Optional*, string): The name of the sensor. Setting a name will |
|
|
|
expose the sensor as an entity in Home Assistant. If you do not need this, |
|
|
|
you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. |
|
|
|
By providing an id, you can reference the sensor from automation rules |
|
|
|
(e.g. to retrieve the current state of the binary_sensor). |
|
|
|
* **range_from** (*Optional*, float): By default, published values vary from |
|
|
|
the range 0.01 to 1.00, in 20 steps. This option modifies the lower bound |
|
|
|
of the range. |
|
|
|
* **range_to** (*Optional*, float): This option modifies the upper bound of |
|
|
|
the range. |
|
|
|
* **name** (*Optional*, string): The name of the sensor. Setting a name will expose the sensor as an |
|
|
|
entity in Home Assistant. If you do not need this, you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. By providing an id, |
|
|
|
you can reference the sensor from automation rules (e.g. to retrieve the current state of the |
|
|
|
binary_sensor). |
|
|
|
* **range_from** (*Optional*, float): By default, published values vary from the range 0.01 to 1.00, |
|
|
|
in 20 steps. This option modifies the lower bound of the range. |
|
|
|
* **range_to** (*Optional*, float): This option modifies the upper bound of the range. |
|
|
|
* All other options from |
|
|
|
[Sensor](https://esphome.io/components/sensor/index.html#config-sensor). |
|
|
|
|
|
|
|
## Component: output |
|
|
|
|
|
|
|
The (float) output component is linked to the front panel illumination + |
|
|
|
level indicator. Setting this output to value 0.0 will turn off the |
|
|
|
frontpanel illumination. Other values, up to 1.0, will turn on the |
|
|
|
illumination and will set the level indicator to the requested level (in 10 |
|
|
|
steps). |
|
|
|
The (float) output component is linked to the front panel illumination + level indicator. Setting |
|
|
|
this output to value 0.0 will turn off the frontpanel illumination. Other values, up to 1.0, will |
|
|
|
turn on the illumination and will set the level indicator to the requested level (in 10 steps). |
|
|
|
|
|
|
|
```yaml |
|
|
|
output: |
|
|
@ -387,18 +364,16 @@ output: |
|
|
|
|
|
|
|
## Component: text_sensor |
|
|
|
|
|
|
|
The text sensor component publishes changes in the active |
|
|
|
[light mode](#light-modes). Possible output values for this sensor are: "off", |
|
|
|
"rgb", "white" and "night". |
|
|
|
The text sensor component publishes changes in the active [light mode](#light-modes). Possible |
|
|
|
output values for this sensor are: "off", "rgb", "white" and "night". |
|
|
|
|
|
|
|
### Configuration variables: |
|
|
|
|
|
|
|
* **name** (*Optional*, string): The name of the text sensor. Setting a name |
|
|
|
will expose the text sensor as an entity in Home Assistant. If you do not |
|
|
|
need this, you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. |
|
|
|
By providing an id, you can reference the text sensor from automation |
|
|
|
rules (to retrieve the current state of the text_sensor). |
|
|
|
* **name** (*Optional*, string): The name of the text sensor. Setting a name will expose the text |
|
|
|
sensor as an entity in Home Assistant. If you do not need this, you can omit the name. |
|
|
|
* **id** (*Optional*, ID): Manually specify the ID used for code generation. By providing an id, |
|
|
|
you can reference the text sensor from automation rules (to retrieve the current state of the |
|
|
|
text_sensor). |
|
|
|
* All other options from |
|
|
|
[Text Sensor](https://esphome.io/components/text_sensor/index.html) |
|
|
|
|
|
|
|