From b7449a26c6c97e8baa93e05ecf453f9c87e65eb7 Mon Sep 17 00:00:00 2001 From: tkdrob Date: Wed, 28 Apr 2021 15:28:09 -0400 Subject: [PATCH 01/79] Add documentation for goalzero switch platform (#17231) --- source/_integrations/goalzero.markdown | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/source/_integrations/goalzero.markdown b/source/_integrations/goalzero.markdown index d336dadc1a0..db3fcbbacbb 100644 --- a/source/_integrations/goalzero.markdown +++ b/source/_integrations/goalzero.markdown @@ -7,10 +7,11 @@ ha_iot_class: Local Polling ha_release: 0.116 ha_config_flow: true ha_domain: goalzero -ha_codeowners: - - '@tkdrob' ha_platforms: - binary_sensor + - switch +ha_codeowners: + - '@tkdrob' --- This `goalzero` integration pulls data from a Wifi enabled Goal Zero Yeti. @@ -19,6 +20,15 @@ This `goalzero` integration pulls data from a Wifi enabled Goal Zero Yeti. ## Integration Entities -Each added configuration entry will create the following sensors: +Each added configuration entry will create the following binary sensors: -`v12PortStatus`, `usbPortStatus`, `acPortStatus`, `backlight`, `app_online`, `isCharging` +- **Backlight**: Indicates if the backlight is currently on. +- **App Online**: Indicates if the mobile app is actively being used. +- **Charging**: Shows when the battery is currently charging. +- **Input Detected**: Shows when the device detects power input. + +The following switches will also be created: + +- **12V Port Status**: Indicates if the 12V power port is currently on. +- **USB Port Status**: Indicates if the USB power port is currently on. +- **AC Port Status**: Indicates if the AC power port is currently on. From 5adbd5b91a5c582cd1ab30af13162dda5465d2e1 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Wed, 28 Apr 2021 16:43:49 -0400 Subject: [PATCH 02/79] Update API limit in ClimaCell docs (#17635) --- source/_integrations/climacell.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/climacell.markdown b/source/_integrations/climacell.markdown index 9dffd9474f8..4ce37ba52d5 100644 --- a/source/_integrations/climacell.markdown +++ b/source/_integrations/climacell.markdown @@ -23,7 +23,7 @@ The ClimaCell integration allows you to obtain weather, air quality, pollen, and You can obtain a free API key by signing up with [ClimaCell](https://developer.climacell.co/sign-up?_ga=2.137889264.1908484805.1591592950-510691096.1591288729). -The integration will automatically set the refresh interval based on the number of ClimaCell integrations that are using the same API key for a given Home Assistant instance. The integration currently assumes you are using a free account so the max requests per day is 1000. If you want to use a paid account to increase the number of max requests and increase the update frequency, please open a Home Assistant issue for the integration. +The integration will automatically set the refresh interval based on the number of ClimaCell integrations that are using the same API key for a given Home Assistant instance. The integration currently assumes you are using a free account so the max requests per day is 500 (the refresh interval is calculated such that you should only use up around 90% of the quota). If you want to use a paid account to increase the number of max requests and increase the update frequency, please open a Home Assistant issue for the integration. ## Supported Forecast Types From 9617f0a2b5bcdf433b53f8737596aa158fad033e Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Wed, 28 Apr 2021 23:23:07 -0400 Subject: [PATCH 03/79] Document zwave_js_value_updated event (#17615) * Document zwave_js_value_updated event * add statement about assumed_state * use table and add entity domain impacted * add example automation * lint --- source/_integrations/zwave_js.markdown | 46 +++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/source/_integrations/zwave_js.markdown b/source/_integrations/zwave_js.markdown index 4fee7b9dd10..c58e14dd223 100644 --- a/source/_integrations/zwave_js.markdown +++ b/source/_integrations/zwave_js.markdown @@ -287,7 +287,7 @@ These are notification events fired by devices using the Entry Control command c } ``` -## Scene events (Value Notification) +### Scene events (Value Notification) Value Notifications are used for stateless values, like `Central Scenes` and `Scene Activation`. These events fire with the `zwave_js_value_notification` event type. @@ -312,6 +312,50 @@ Value Notification example: } ``` +### Value updated events + +Due to some devices not following the Z-Wave spec, there are scenarios where a device will send a value update but a state change won't be detected in Home Assistant. To address the gap, the `zwave_js_value_updated` event can be listened to to capture any value updates that are received by an affected entity. This event is **enabled on a per device and per entity domain basis**, and the entities will have `assumed_state` set to `true`. This change will affect how the UI for these entities look; if you'd like the UI to match other entities of the same type where `assumed_state` is not set to `true`, you can override the setting via [entity customization](/docs/configuration/customizing-devices/#assumed_state). + +The following devices currently support this event: + +| Make | Model | Entity Domain | +|----------------- |---------------------------------- |--------------- | +| Vision Security | ZL7432 In Wall Dual Relay Switch | `switch` | + +Value Updated example: + +```json +{ + "node_id": 4, + "home_id": "974823419", + "device_id": "ad8098fe80980974", + "entity_id": "switch.in_wall_dual_relay_switch", + "command_class": 37, + "command_class_name": "Switch Binary", + "endpoint": 0, + "property": "currentValue", + "property_name": "currentValue", + "property_key": null, + "property_key_name": null, + "value": 0, + "value_raw": 0 +} +``` + +This event can be used to trigger a refresh of values when the new state needs to be retrieved. Here's an example automation: + +```yaml +trigger: + platform: event + event_type: zwave_js_value_updated + event_data: + entity_id: switch.in_wall_dual_relay_switch +action: + - service: zwave_js.refresh_value + target: + entity_id: switch.in_wall_dual_relay_switch_2, switch.in_wall_dual_relay_switch_3 +``` + ## Current Limitations As this integration is still in the early stages there are some important limitations to be aware of. From d558ebfc21aa2008b6f80fb17c70f9a462239bd3 Mon Sep 17 00:00:00 2001 From: djtimca <60706061+djtimca@users.noreply.github.com> Date: Thu, 29 Apr 2021 10:57:33 -0400 Subject: [PATCH 04/79] Updated omnilogic documentation for switch platform. (#15330) --- source/_integrations/omnilogic.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_integrations/omnilogic.markdown b/source/_integrations/omnilogic.markdown index fc8e4aec6d0..e77e46a5b47 100644 --- a/source/_integrations/omnilogic.markdown +++ b/source/_integrations/omnilogic.markdown @@ -3,6 +3,7 @@ title: Hayward Omnilogic description: Instructions on how to configure Hayward OmniLogic integration. ha_category: - Sensor + - Switch ha_release: 0.116 ha_iot_class: Cloud Polling ha_config_flow: true @@ -19,13 +20,14 @@ ha_platforms: There is currently support for the following device types within Home Assistant: -- Sensor +- ***Sensor*** - Air Temperature, Water Temperature, Variable Pump Speed, Chlorinator Setting, Salt Level, pH, and ORP +- ***Switch*** - All relays, pumps (single, dual, variable speed), and relay-based lights. {% include integrations/config_flow.md %} ## Known limitations -- The platform only supports sensors at the initial release. Future releases will include light/switch/water heater for control of lights, pumps, relays and heaters. +- The platform only supports sensors and switches at the current release. Future releases will include light/water heater for control of Colorlogic lights and pool heaters. ## Debugging integration From 832617b277ac54a377f0fecf1b2ab97ebf05010f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 29 Apr 2021 09:25:48 -0700 Subject: [PATCH 05/79] Document auto_off (#17573) Co-authored-by: Franck Nijhof --- source/_integrations/template.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/template.markdown b/source/_integrations/template.markdown index 5c3240c1ef2..6e8139255e8 100644 --- a/source/_integrations/template.markdown +++ b/source/_integrations/template.markdown @@ -129,6 +129,10 @@ binary_sensor: description: The amount of time the template state must be ***not met*** before this sensor will switch to `off`. This can also be a template. required: false type: time + auto_off: + description: "**Requires a trigger.** After how much time the entity should turn off after it rendered 'on'." + required: false + type: time "[both sensor and binary_sensor entities]": description: Fields that can be used above for both sensors and binary sensors. required: false From 4c35b377df06b689ece742d46e3baa3b7dee6352 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Thu, 29 Apr 2021 19:03:15 -0600 Subject: [PATCH 06/79] Remove SimpliSafe websocket documentation (#17643) --- source/_integrations/simplisafe.markdown | 83 +----------------------- 1 file changed, 2 insertions(+), 81 deletions(-) diff --git a/source/_integrations/simplisafe.markdown b/source/_integrations/simplisafe.markdown index 690d7171465..b22e33db76c 100644 --- a/source/_integrations/simplisafe.markdown +++ b/source/_integrations/simplisafe.markdown @@ -27,7 +27,7 @@ There is currently support for the following device types within Home Assistant: - **Freeze Sensor**: reports on the freeze sensor temperature*. - **Glass Break Sensor**: reports on the glass breakage sensor status*. - **Lock**: reports on `Door Locks` and can be used to lock and unlock a lock. -- **Motion Sensor**: triggers [events](#events) if the alarm is armed or if secret alerts are enabled in SimpliSafe. +- **Motion Sensor**: reports on motion detected. - **Siren**: reports on the siren status*. - **Smoke Detector**: reports on the smoke sensor status*. - **Water Sensor**: reports on water sensor status*. @@ -45,8 +45,7 @@ entity. ### `simplisafe.clear_notifications` Clear any existing notifications within the SimpliSafe cloud; this will mark existing -notifications as "read" in the SimpliSafe web and mobile apps, as well as prevent them -from triggering future `SIMPLISAFE_NOTIFICATION` events. +notifications as "read" in the SimpliSafe web and mobile apps. ### `simplisafe.remove_pin` @@ -89,81 +88,3 @@ For any property denoting a volume, the following values should be used: | `exit_delay_home` | yes | The number of seconds to delay triggering when exiting with a "home" state | | `light` | yes | Whether the light on the base station should display when armed | | `voice_prompt_volume` | yes | The volume of the base station's voice prompts | - -## Events - -### `SIMPLISAFE_EVENT` - -`SIMPLISAFE_EVENT` events represent events that appear on the timeline of the SimpliSafe -web and mobile apps. When received, they come with event data that contains the -following keys: - -* `changed_by`: the PIN that triggered the event (if appropriate) -* `event_type`: the type of event -* `info`: a human-friendly string describing the event in more detail -* `sensor_name`: the sensor that triggered the event (if appropriate) -* `sensor_serial`: the serial number of the sensor that triggered the event (if appropriate) -* `sensor_type`: the type of sensor that triggered the event (if appropriate) -* `system_id`: the system ID to which the event belongs -* `timestamp`: the UTC datetime at which the event was received - -For example, when someone rings the doorbell, a -`SIMPLISAFE_EVENT` event will fire with the following event data: - -```python -{ - "event_type": "SIMPLISAFE_EVENT", - "data": { - "last_event_changed_by": "", - "last_event_type": "doorbell_detected", - "last_event_info": "Someone is at your \"Front Door\"", - "last_event_sensor_name": "Front Door", - "last_event_sensor_serial": "", - "last_event_sensor_type": "doorbell", - "system_id": [systemid], - "last_event_timestamp": "2021-01-28T22:01:32+00:00" - }, - "origin": "LOCAL", - "time_fired": "2021-01-28T22:01:37.478539+00:00", - "context": { - "id": "[id]", - "parent_id": null, - "user_id": null - } -} -``` - -`last_event_type` can have the following values: - -* `camera_motion_detected` -* `doorbell_detected` -* `entry_detected` -* `motion_detected` - -To build an automation using one of these, use `SIMPLISAFE_EVENT` -as an event trigger, with `last_event_type` as the `event_data`. -For example, the following will trigger when the doorbell rings: - -```yaml -trigger: - - platform: event - event_type: SIMPLISAFE_EVENT - event_data: - last_event_type: doorbell_detected -``` - -### `SIMPLISAFE_NOTIFICATION` - -`SIMPLISAFE_NOTIFICATION` events represent system notifications that would appear in the -messages section of the SimpliSafe web and mobile apps. When received, they come with -event data that contains the following keys: - -* `category`: The notification category (e.g., `error`) -* `code`: The SimpliSafe code for the notification -* `message`: The actual text of the notification -* `timestamp`: The UTC timestamp of the notification - -Note that when Home Assistant restarts, `SIMPLISAFE_NOTIFICATION` events will fire once -again for any notifications still active in the SimpliSafe web and mobile apps. To -prevent this, either (a) clear them in the web/mobile app or (b) utilize the -`simplisafe.clear_notifications` service described above. From ece9a568b88823d5ee139faeb586df265b64baca Mon Sep 17 00:00:00 2001 From: karliemeads <68717336+karliemeads@users.noreply.github.com> Date: Fri, 30 Apr 2021 18:40:43 -0400 Subject: [PATCH 07/79] Update default profile behaviour in light.turn_on (#17513) --- source/_integrations/light.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/_integrations/light.markdown b/source/_integrations/light.markdown index 3c0f46ed6e9..dcdd99c8ebc 100644 --- a/source/_integrations/light.markdown +++ b/source/_integrations/light.markdown @@ -24,6 +24,12 @@ The field transition is optional and can be omitted. The `.default` suffix should be added to the entity identifier of each light to define a default value, e.g., for `light.ceiling_2` the `profile` field is `light.ceiling_2.default`. To define a default for all lights, the identifier `group.all_lights.default` can be used. Individual settings always supercede the `all_lights` default setting. +
+ +If a light entity is in the `on` state, the default profile brightness and will only be applied if it is called in the service call data attribute `profile`, like any other named profile. The transition attribute will be applied for all `light.turn_on`, `light.toggle` and `light.turn_off` service calls, unless specified otherwise in the service call data. + +
+ ### Service `light.turn_on` Turns one light on or multiple lights on using [groups](/integrations/group/). @@ -87,6 +93,11 @@ automation: brightness: 130 rgb_color: [255,0,0] ``` +
+ +If no data is sent, and a default profile exists, the default profile will be applied. + +
### Service `light.turn_off` From 5fd41600802b8ceeea5aca395b5f2df4188d9827 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Mon, 3 May 2021 18:42:50 +0200 Subject: [PATCH 08/79] Add Identify service to Elgato integration (#17669) --- source/_integrations/elgato.markdown | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/source/_integrations/elgato.markdown b/source/_integrations/elgato.markdown index 86924c6deba..f1dc03db7c1 100644 --- a/source/_integrations/elgato.markdown +++ b/source/_integrations/elgato.markdown @@ -29,3 +29,35 @@ and content creators, many of whom operate on platforms like YouTube and Twitch. This integration adds the Key Light device as a light in Home Assistant, and allows you to control the color temperature, brightness, and its on/off state. + +## Services + +### Service `elgato.identify` + +The identify service shortly blinks the Elgato light. Originally meant as +a way to identify which light you are talking to, it can also be used as +a service to create a visual notification with. + +This service also works when the light is turned off and will turn off the +light after the identification sequence has been completed. + +{% my developer_call_service badge service="elgato.identify" %} + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------- | +| `entity_id` | Yes | String or list of Elgato light entity IDs. + +Example automation, in YAML format, that triggers a visual notification when +a binary sensor (a doorbell) is triggered: + +```yaml +- alias: Visual doorbell notification example + trigger: + - platform: state + entity_id: binary_sensor.doorbell + to: "on" + action: + - service: elgato.identify + target: + entity_id: light.elgato_key_light +``` From e3ff6c0ee764aa70df9fc231042d07b6facd5086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Tue, 4 May 2021 08:32:06 +0200 Subject: [PATCH 09/79] Add documentation for binary sensors in Syncthru integration (#17517) adds binary sensors also remove outdated warning about english configuration --- source/_integrations/syncthru.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/_integrations/syncthru.markdown b/source/_integrations/syncthru.markdown index dc3a60fb021..6377c7c0797 100644 --- a/source/_integrations/syncthru.markdown +++ b/source/_integrations/syncthru.markdown @@ -12,6 +12,7 @@ ha_domain: syncthru ha_ssdp: true ha_platforms: - sensor + - binary_sensor --- The Samsung SyncThru Printer platform allows you to read current data from your local Samsung printer. @@ -20,13 +21,11 @@ It usually provides information about the device's state, the left amount of ink The following information is displayed in separate sensors, if it is available: + - Whether the printer is online + - Whether the printer is in an error state - Black, cyan, magenta and yellow toner fill level - Black, cyan, magenta and yellow drum state - First to fifth paper input tray state - First to sixth paper output tray state {% include integrations/config_flow.md %} - -
-Note that this component or parts thereof may not work if the language of your printer is not configured to be English. -
From c58ce45323d0d064b0758c35fd02bb57d70dcc7f Mon Sep 17 00:00:00 2001 From: Dermot Duffy Date: Tue, 4 May 2021 00:09:40 -0700 Subject: [PATCH 10/79] Small clarification in motionEye documentation (#17682) --- source/_integrations/motioneye.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/motioneye.markdown b/source/_integrations/motioneye.markdown index cc3bc193049..067ed4b9289 100644 --- a/source/_integrations/motioneye.markdown +++ b/source/_integrations/motioneye.markdown @@ -20,6 +20,8 @@ and visualization of multiple types of cameras. {% include integrations/config_flow.md %} +Note that the URL required is the URL for the motionEye server itself -- **not** the URL for the camera stream(s) that it makes available. + ## MotionEye Cameras As cameras are added or removed to motionEye, they are automatically added or removed From 9736614db8e05f180fd15bb9014e7619d69f4b44 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Tue, 4 May 2021 09:19:22 +0200 Subject: [PATCH 11/79] New modbus switch. (#17516) --- source/_integrations/modbus.markdown | 71 ++++++++++++++++------------ 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 552e44b397f..05ebbd5ceee 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -647,22 +647,27 @@ To use your Modbus switches in your installation, add the following to your `con ```yaml # Example configuration.yaml entry modbus: - - name: hub1 - type: tcp + - type: tcp host: IP_ADDRESS port: 502 switches: - name: Switch1 address: 13 - input_type: coil + write_type: coil - name: Switch2 slave: 2 address: 14 - input_type: coil + write_type: coil + verify: - name: Register1 address: 11 command_on: 1 command_off: 0 + verify: + input_type: holding + address: 127 + state_on: 25 + state_off: 1 ``` {% configuration %} @@ -677,14 +682,16 @@ switches: type: integer command_on: description: Value to write to turn on the switch. - required: true + required: false + default: 0x01 type: integer command_off: description: Value to write to turn off the switch. - required: true + required: false + default: 0x00 type: integer - input_type: - description: type of adddress (holding/input/coil) + write_type: + description: type of adddress (holding/coil) required: false default: holding type: string @@ -699,33 +706,39 @@ switches: default: 15 slave: description: The number of the slave (can be omitted for tcp and udp Modbus). - required: true + required: false type: integer - state_on: - description: Register value when switch is on. + default: 0 + verify: + description: read from modbus device to verify switch. required: false - default: same as command_on - type: integer - state_off: - description: Register value when switch is off. - required: false - default: same as command_off - type: integer - verify_register: - description: Register to readback. - required: false - default: same as register - type: string - verify_state: - description: Define if is possible to readback the status of the switch. - required: false - default: true - type: boolean + type: map + keys: + address: + description: address to read from. + required: false + default: write address + type: integer + input_type: + description: type of adddress (holding/coil/discrete/input) + required: false + default: write_type + type: integer + state_on: + description: value when switch is on. + required: false + default: same as command_on + type: integer + state_off: + description: value when switch is off. + required: false + default: same as command_off + type: integer {% endconfiguration %} #### Full example -Example switches, for which the state is polled from Modbus every 15 seconds (default). +Example switches, for which the state is not polled. ```yaml modbus: From 4b45ce5e7e89d1f2d6c43c1b09f66f959dc58a2e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 6 May 2021 07:24:09 +0200 Subject: [PATCH 12/79] Add support for Elgato Light Strip (#17668) * Add support for Elgato Light Strip * Update source/_integrations/elgato.markdown Co-authored-by: Martin Hjelmare Co-authored-by: Martin Hjelmare --- source/_integrations/elgato.markdown | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/source/_integrations/elgato.markdown b/source/_integrations/elgato.markdown index f1dc03db7c1..b893a7d0d9a 100644 --- a/source/_integrations/elgato.markdown +++ b/source/_integrations/elgato.markdown @@ -1,11 +1,10 @@ --- -title: Elgato Key Light -description: Instructions on how to integrate an Elgato Key Light with Home Assistant. +title: Elgato Light +description: Instructions on how to integrate an Elgato Light with Home Assistant. ha_category: - Light ha_release: 0.104 ha_iot_class: Local Polling -ha_qa_scale: platinum ha_config_flow: true ha_codeowners: - '@frenck' @@ -16,13 +15,18 @@ ha_platforms: - light --- -The [Elgato Key Light](https://www.elgato.com/en/gaming/key-light) sets the -bar for high-end studio lightning. With 80 LEDs, that put out a massive -2500 lumens, and can change the color temperature as well. - -The LED light panel is created specifically, and designed for streamers +The [Elgato](https://www.elgato.com/) Lights sets the bar for high-end studio +lightning. The LED lights are created and designed specifically for streamers and content creators, many of whom operate on platforms like YouTube and Twitch. +The following light productions from Elgato have been tested with this +integration: + +- [Elgato Key Light](https://www.elgato.com/en/key-light) +- [Elgato Key Light Air](https://www.elgato.com/en/key-light-air) +- [Elgato Ring Light](https://www.elgato.com/en/ring-light) +- [Elgato Light Strip](https://www.elgato.com/en/light-strip) + {% include integrations/config_flow.md %} ## Lights @@ -30,13 +34,16 @@ and content creators, many of whom operate on platforms like YouTube and Twitch. This integration adds the Key Light device as a light in Home Assistant, and allows you to control the color temperature, brightness, and its on/off state. +When using the Elgato Light Strip, color support is automatically detected +and enabled in Home Assistant. + ## Services ### Service `elgato.identify` The identify service shortly blinks the Elgato light. Originally meant as -a way to identify which light you are talking to, it can also be used as -a service to create a visual notification with. +a way to identify which light you are talking to; it can also be used as +a service to create a visual notification. This service also works when the light is turned off and will turn off the light after the identification sequence has been completed. From 8bc9d706a3c78e434d8c6037e44168488ad281e0 Mon Sep 17 00:00:00 2001 From: Aidan Timson Date: Thu, 6 May 2021 08:56:01 +0100 Subject: [PATCH 13/79] System Bridge Integration (#17077) Co-authored-by: Franck Nijhof Co-authored-by: Martin Hjelmare --- source/_integrations/system_bridge.markdown | 93 +++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 source/_integrations/system_bridge.markdown diff --git a/source/_integrations/system_bridge.markdown b/source/_integrations/system_bridge.markdown new file mode 100644 index 00000000000..dbac2350402 --- /dev/null +++ b/source/_integrations/system_bridge.markdown @@ -0,0 +1,93 @@ +--- +title: System Bridge +description: How to integrate the System Bridge integration into Home Assistant. +ha_category: + - Sensor + - System Monitor +ha_release: 2021.6 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@timmo001' +ha_domain: system_bridge +ha_quality_scale: silver +ha_platforms: + - binary_sensor + - sensor +--- + +[System Bridge](https://system-bridge.timmo.dev) is an application that runs on your local machine to share system information via its API as well as allowing commands to be sent to the device. + +## Prerequisites + +You will need your API key. This can be found and configured in the application's settings. + +{% include integrations/config_flow.md %} + +## Sensors + +This integration provides the following sensors: + +| Name | Description | +| ---------------- | --------------------------------------------------- | +| Battery | Battery level of the device | +| CPU Speed | The current CPU speed | +| CPU Temperature | The current temperature of the device | +| Filesystem(s) | Space used for each drive letter / filesystem mount | +| Operating System | Version information of the Operating System | +| Load | System load percentage | + +## Services + +### Service `system_bridge.send_command` + +Sends a command to the server to run. + +{% my developer_call_service service="system_bridge.send_command" title="Open your Home Assistant instance and show your service developer tools with a specific service selected." %} + +#### Examples + +```yaml +service: system_bridge.send_command +data: + bridge: device + command: code + arguments: /home/user/file.txt +``` + +```yaml +service: system_bridge.send_command +data: + bridge: device + command: python + arguments: '-V' +``` + +### Service `system_bridge.open` + +Open a URL or file on the server using the default application. + +{% my developer_call_service service="system_bridge.open" title="Open your Home Assistant instance and show your service developer tools with a specific service selected." %} + +#### Examples + +```yaml +service: system_bridge.open +data: + bridge: "device" + path: "C:\image.jpg" +``` + +```yaml +service: system_bridge.open +data: + bridge: "device" + path: "https://home-assistant.io" +``` + +```yaml +service: system_bridge.open +data: + bridge: "device" + path: "steam://rungameid/814380" +``` From 692e58498eddd0f45f89d3cdcaae8bdd7994d87d Mon Sep 17 00:00:00 2001 From: jan iversen Date: Sat, 8 May 2021 13:39:21 +0200 Subject: [PATCH 14/79] Describe "delay" for modbus (#17703) * Describe "delay" for modbus. * Update source/_integrations/modbus.markdown Co-authored-by: Martin Hjelmare Co-authored-by: Martin Hjelmare --- source/_integrations/modbus.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 69ffcf33ed8..4324599425c 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -49,7 +49,7 @@ modbus: {% configuration %} delay: - description: Time to sleep in seconds after connecting and before sending messages. Some modbus-tcp servers need a short delay typically 1-2 seconds in order to prepare the communication. If a server accepts connecting, but there is no response to the requests send, this parameter might help. + description: Time to delay messages in seconds after connecting. Some modbus devices need a delay typically 1-2 seconds after connection is established in order to prepare the communication. If a device accepts connecting with no response to the requests sent or the device disconnects, this parameter might help. required: false default: 0 type: integer From 4ec4d7c78a30332aa30e40e9dedf5ff98f1a96a1 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Sun, 9 May 2021 00:46:01 +0200 Subject: [PATCH 15/79] Add info about configuration variables (#17308) Co-authored-by: jjlawren Co-authored-by: Franck Nijhof --- source/_integrations/shelly.markdown | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/source/_integrations/shelly.markdown b/source/_integrations/shelly.markdown index e50e6e914b6..a6557623683 100644 --- a/source/_integrations/shelly.markdown +++ b/source/_integrations/shelly.markdown @@ -53,10 +53,10 @@ Examples: | Device Name | Channel Name | Entity Name | | ----------- | -------------- | --------------------------------| -| `Not set` | `Not Set` | shellyswitch25-ABC123 Channel 1 | -| `Not set` | Kids Room Bulb | Kids Room Bulb | -| Kitchen | `Not Set` | Kitchen Channel 1 | -| Bedroom | Round Bulb | Round Bulb | +| `Not set` | `Not Set` | shellyswitch25-ABC123 Channel 1 | +| `Not set` | Kids Room Bulb | Kids Room Bulb | +| Kitchen | `Not Set` | Kitchen Channel 1 | +| Bedroom | Round Bulb | Round Bulb | Names are set from the device web page: @@ -107,11 +107,11 @@ If the **BUTTON TYPE** of the switch connected to the device is set to `momentar | Shelly input event | Click Type | | ------------------ | --------------| | `S` | `single` | -| `SS` | `double` | +| `SS` | `double` | | `SSS` | `triple` | -| `L` | `long` | -| `SL` | `single_long` | -| `LS` | `long_single` | +| `L` | `long` | +| `SL` | `single_long` | +| `LS` | `long_single` |
@@ -119,6 +119,18 @@ Not all devices support all input events. You can check on [Shelly API Reference
+## CoAP port + +In some cases, it may be needed to customize the CoAP port (default: `5683`) your Home Assistant instance is listening to. + +In order to change it, add the following key to your configuration.yaml: + +```yaml +# Example configuration.yaml entry +shelly: + coap_port: 12345 +``` + ## Known issues and limitations - Only supports firmware 1.8 and later From 6badbcc5d9ace4353bc3ce8ab7af7e53d19aa289 Mon Sep 17 00:00:00 2001 From: Maciej Bieniek Date: Sun, 9 May 2021 02:04:47 +0200 Subject: [PATCH 16/79] Add Nettigo Air Monitor integration documentation (#17419) --- source/_integrations/nam.markdown | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 source/_integrations/nam.markdown diff --git a/source/_integrations/nam.markdown b/source/_integrations/nam.markdown new file mode 100644 index 00000000000..6eb73d1e401 --- /dev/null +++ b/source/_integrations/nam.markdown @@ -0,0 +1,30 @@ +--- +title: Nettigo Air Monitor +description: Instructions on how to integrate Nettigo Air Monitor within Home Assistant. +ha_category: + - DIY +ha_release: 2021.6 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@bieniu' +ha_domain: nam +ha_platforms: + - air_quality + - sensor +ha_quality_scale: platinum +--- + +The Nettigo Air Monitor integration allows you to read temperature, humidity, pressure and air quality data from Nettigo Air Monitor devices. [Nettigo Air Monitor](https://air.nettigo.pl/?setlang=en) is a DIY air quality monitoring system with open source firmware, based on an open hardware project. + +The integration currently has support for the following sensors: + +- BME280 +- BMP280 +- DHT22 +- HECA +- SDS011 +- SHT3X +- SPS30 + +{% include integrations/config_flow.md %} From b44ee4b743e39be33c09b26f8371e077ea57dc08 Mon Sep 17 00:00:00 2001 From: Gleb Sinyavskiy Date: Sun, 9 May 2021 10:09:20 +0200 Subject: [PATCH 17/79] Remove docs for the N26 integration (#17750) --- source/_integrations/n26.markdown | 51 ------------------------------- source/_redirects | 3 +- 2 files changed, 2 insertions(+), 52 deletions(-) delete mode 100644 source/_integrations/n26.markdown diff --git a/source/_integrations/n26.markdown b/source/_integrations/n26.markdown deleted file mode 100644 index 3be22fd4c9b..00000000000 --- a/source/_integrations/n26.markdown +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: N26 -description: Instructions on how to integrate N26 integration within Home Assistant. -ha_category: - - Finance - - Sensor - - Switch -ha_release: 0.92 -ha_iot_class: Cloud Polling -ha_domain: n26 -ha_platforms: - - sensor - - switch ---- - -The [N26](https://n26.com) integration for Home Assistant allows you to track your N26 account. - -N26 is a bank from germany that launched as a start up. It is an "online only" bank in that it has no local "stores" to retrieve or deposit money and account management is done only through their web interface and mobile apps. The sensor allows to show account info including balance, spaces (sub-accounts within an account) and bank card status. The switch allows to change the "Blocked/Unblocked" status of an N26 bank card. - -## Configuration - -Add the following entry to the `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -n26: - username: YOUR_EMAIL - password: YOUR_PASSWORD -``` - -It is possible to add more than one account: - -```yaml -# Example configuration.yaml entry -n26: - - username: YOUR_EMAIL1 - password: YOUR_PASSWORD1 - - username: YOUR_EMAIL2 - password: YOUR_PASSWORD2 -``` - -{% configuration %} -username: - description: The account username. - required: true - type: string -password: - description: The account password. - required: true - type: string -{% endconfiguration %} diff --git a/source/_redirects b/source/_redirects index 2214f5d45ed..e2f748ef508 100644 --- a/source/_redirects +++ b/source/_redirects @@ -1584,7 +1584,6 @@ /components/mysensors /integrations/mysensors /components/mystrom /integrations/mystrom /components/mythicbeastsdns /integrations/mythicbeastsdns -/components/n26 /integrations/n26 /components/nad /integrations/nad /components/namecheapdns /integrations/namecheapdns /components/nanoleaf /integrations/nanoleaf @@ -2303,3 +2302,5 @@ /components/sensor.socialblade /more-info/removed-integration 301 /components/socialblade /more-info/removed-integration 301 /integrations/socialblade /more-info/removed-integration 301 +/components/n26 /more-info/removed-integration 301 +/integrations/n26 /more-info/removed-integration 301 From 85ae3068b534a0dbd33395f7bbe580670e1ffdad Mon Sep 17 00:00:00 2001 From: Aidan Timson Date: Sun, 9 May 2021 10:07:13 +0100 Subject: [PATCH 18/79] Add additional System Bridge sensors (#17747) --- source/_integrations/system_bridge.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/system_bridge.markdown b/source/_integrations/system_bridge.markdown index dbac2350402..bc39a8e8a2a 100644 --- a/source/_integrations/system_bridge.markdown +++ b/source/_integrations/system_bridge.markdown @@ -30,10 +30,14 @@ This integration provides the following sensors: | Name | Description | | ---------------- | --------------------------------------------------- | +| BIOS Version | Version of your system's BIOS | | Battery | Battery level of the device | | CPU Speed | The current CPU speed | | CPU Temperature | The current temperature of the device | | Filesystem(s) | Space used for each drive letter / filesystem mount | +| Memory Free | Memory (RAM) free in GB | +| Memory Used | Memory (RAM) used in GB | +| Memory Used % | Memory (RAM) % used | | Operating System | Version information of the Operating System | | Load | System load percentage | From 7f9f25d7497d125b91ac3b539808704c913e0ab6 Mon Sep 17 00:00:00 2001 From: Gleb Sinyavskiy Date: Sun, 9 May 2021 20:55:23 +0200 Subject: [PATCH 19/79] Add docs for the syncthing integration (#14160) Co-authored-by: Franck Nijhof --- CODEOWNERS | 1 + source/_integrations/syncthing.markdown | 35 ++++++++++++++++++ .../images/integrations/syncthing/sensor.png | Bin 0 -> 52881 bytes .../images/integrations/syncthing/sensors.png | Bin 0 -> 13558 bytes 4 files changed, 36 insertions(+) create mode 100644 source/_integrations/syncthing.markdown create mode 100644 source/images/integrations/syncthing/sensor.png create mode 100644 source/images/integrations/syncthing/sensors.png diff --git a/CODEOWNERS b/CODEOWNERS index 0c7252fbd1e..de2517f57b7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -460,6 +460,7 @@ source/_integrations/switchbot.markdown @danielhiversen source/_integrations/switcher_kis.markdown @tomerfi source/_integrations/switchmate.markdown @danielhiversen source/_integrations/syncthru.markdown @nielstron +source/_integrations/syncthing.markdown @zhulik source/_integrations/synology_dsm.markdown @hacf-fr @Quentame @mib1185 source/_integrations/synology_srm.markdown @aerialls source/_integrations/syslog.markdown @fabaff diff --git a/source/_integrations/syncthing.markdown b/source/_integrations/syncthing.markdown new file mode 100644 index 00000000000..4bd1dacd373 --- /dev/null +++ b/source/_integrations/syncthing.markdown @@ -0,0 +1,35 @@ +--- +title: Syncthing +description: Instructions on how to integrate Syncthing within Home Assistant. +ha_category: + - Downloading + - Sensor +ha_release: 2021.06 +ha_iot_class: Local Polling +ha_quality_scale: silver +ha_config_flow: true +ha_codeowners: + - '@zhulik' +ha_domain: syncthing +--- + +[Syncthing](https://syncthing.net/) is a continuous file synchronization program. It synchronizes files between two or more computers +in real-time, safely protected from prying eyes. + +The Syncthing integration allows you to monitor states of your synced folders from within Home Assistant and set up automations based on the information. + +## Prerequisites + +To set up the monitoring you need to get an **API key**. Open the Syncthing web +interface(e.g., `http://127.0.0.1:8384`) in the browser and go to **Actions** -> **Settings**. You will find +the key on the right of the settings dialog. + +{% include integrations/config_flow.md %} + +## Integration Entities + +The Syncthing integration adds one sensor per syncing folder: + +![Syncthing Sensors](/images/integrations/syncthing/sensors.png) + +![Syncthing Sensors](/images/integrations/syncthing/sensor.png) diff --git a/source/images/integrations/syncthing/sensor.png b/source/images/integrations/syncthing/sensor.png new file mode 100644 index 0000000000000000000000000000000000000000..073bdd820d31ccba721074f4c154637c5d613273 GIT binary patch literal 52881 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 F{{Vdft}Xxo literal 0 HcmV?d00001 diff --git a/source/images/integrations/syncthing/sensors.png b/source/images/integrations/syncthing/sensors.png new file mode 100644 index 0000000000000000000000000000000000000000..ea773d1890cbf12fb602928501514a200d3a40c0 GIT binary patch literal 13558 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 vt#}lP{=A?ifANN#o0NywrZIGWd61z5PD`v{Z1> literal 0 HcmV?d00001 From 63ea2f6237a00634ceab70476f9daae6381a2ce5 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Sun, 9 May 2021 21:08:07 +0200 Subject: [PATCH 20/79] Add description of verify for modbus switch. (#17709) Co-authored-by: Franck Nijhof Co-authored-by: Martin Hjelmare --- source/_integrations/modbus.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 4324599425c..a883889e243 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -710,7 +710,7 @@ switches: type: integer default: 0 verify: - description: read from modbus device to verify switch. + description: Read from modbus device to verify switch. If used without attributes it uses the toggle register configuration. If omitted no verification is done, but the state of the switch is set with each toggle. required: false type: map keys: From 033630e4b468673804f21bd322b508bdbf1c97ad Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 9 May 2021 22:25:02 +0200 Subject: [PATCH 21/79] Remove defunct Spot Crime integration (#17761) --- source/_integrations/spotcrime.markdown | 78 ------------------------- source/_redirects | 5 +- 2 files changed, 3 insertions(+), 80 deletions(-) delete mode 100644 source/_integrations/spotcrime.markdown diff --git a/source/_integrations/spotcrime.markdown b/source/_integrations/spotcrime.markdown deleted file mode 100644 index 2cfceb9f7a7..00000000000 --- a/source/_integrations/spotcrime.markdown +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Spot Crime -description: Instructions on how to integrate spotcrime.com into Home Assistant. -ha_release: 0.65 -ha_category: - - Sensor -ha_iot_class: Cloud Polling -ha_domain: spotcrime -ha_platforms: - - sensor ---- - -
-SpotCrime is no longer handing out API keys to integrate their services. -
- -The `spotcrime` sensor allows one to track reported incidents occurring in a given area. Incidents include anything reported to [Spot Crime](https://www.spotcrime.info). Your regional emergency services may or may not report data. The sensor defaults to counting incidents within one day, but can be customized via `configuration.yaml`. - -## Configuration - -To enable this sensor, add the following lines to your `configuration.yaml`. Your `radius` should be of sufficient size to capture incidents in your area. 0.01 = 1 mile. - -```yaml -sensor: - - platform: spotcrime - name: NAME - radius: SEARCH_RADIUS - api_key: YOUR_API_KEY -``` - -{% configuration %} -name: - description: Name the sensor what you'd like. - required: true - type: string -radius: - description: Radius you'd like to search within. 0.01 = 1 mile. - required: true - type: float -api_key: - description: The API key to access the service. - required: true - type: string -days: - description: Number of days you'd like see to crime statistics for. - required: false - type: integer -include: - description: Event types you want statistics for. - required: false - type: list -exclude: - description: Event types to ignore statistics for. - required: false - type: list -{% endconfiguration %} - -## Notes - -### Incident Types - -You can explicitly include or exclude incident types. Specifying `include`s restricts the incidents to those types. Specifying `exclude`s will return all incident types except those specified. - -These incident types are available: - -- Arrest -- Arson -- Assault -- Burglary -- Robbery -- Shooting -- Theft -- Vandalism -- Other - -### Events - -The `crimealerts` sensor fires a `crimealerts_incident` event when a new incident is detected, including the type, time, and location of the incident. diff --git a/source/_redirects b/source/_redirects index e2f748ef508..37ad966cdf9 100644 --- a/source/_redirects +++ b/source/_redirects @@ -853,7 +853,6 @@ /components/sensor.sonarr /integrations/sonarr /components/sensor.speedtest /integrations/speedtestdotnet /components/sensor.speedtestdotnet /integrations/speedtestdotnet -/components/sensor.spotcrime /integrations/spotcrime /components/sensor.sql /integrations/sql /components/sensor.srp_energy /integrations/srp_energy /components/sensor.starlingbank /integrations/starlingbank @@ -1810,7 +1809,6 @@ /components/speedtestdotnet /integrations/speedtestdotnet /components/spider /integrations/spider /components/splunk /integrations/splunk -/components/spotcrime /integrations/spotcrime /components/spotify /integrations/spotify /components/sql /integrations/sql /components/squeezebox /integrations/squeezebox @@ -2304,3 +2302,6 @@ /integrations/socialblade /more-info/removed-integration 301 /components/n26 /more-info/removed-integration 301 /integrations/n26 /more-info/removed-integration 301 +/components/sensor.spotcrime /more-info/removed-integration 301 +/components/spotcrime /more-info/removed-integration 301 +/integrations/spotcrime /more-info/removed-integration 301 From bfbe885f176fc25d8577ec5a30d078c13f82d8df Mon Sep 17 00:00:00 2001 From: Pawel Date: Mon, 10 May 2021 17:15:52 +0200 Subject: [PATCH 22/79] New configuration steps for EPSON (#16274) Co-authored-by: Martin Hjelmare --- source/_integrations/epson.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_integrations/epson.markdown b/source/_integrations/epson.markdown index e7eba445f48..f72220b7552 100644 --- a/source/_integrations/epson.markdown +++ b/source/_integrations/epson.markdown @@ -14,6 +14,8 @@ ha_platforms: --- The `epson` platform allows you to control a Epson projector from Home Assistant. +**Device has to be turned on during initial configuration.** +When you want to add a device for the first time, turn it on before following the integration steps. {% include integrations/config_flow.md %} From e39e02fe0d9a01a382152b6f0667a2d5a41fab45 Mon Sep 17 00:00:00 2001 From: Rob Bierbooms Date: Wed, 12 May 2021 00:54:03 +0200 Subject: [PATCH 23/79] Update buienradar.markdown for config flow (#14000) Co-authored-by: Franck Nijhof --- source/_integrations/buienradar.markdown | 156 +++++------- .../_integrations/sensor.buienradar.markdown | 237 ------------------ 2 files changed, 64 insertions(+), 329 deletions(-) delete mode 100644 source/_integrations/sensor.buienradar.markdown diff --git a/source/_integrations/buienradar.markdown b/source/_integrations/buienradar.markdown index ae18bd1769e..a16d885cace 100644 --- a/source/_integrations/buienradar.markdown +++ b/source/_integrations/buienradar.markdown @@ -6,9 +6,11 @@ ha_category: - Weather ha_release: 0.47 ha_iot_class: Cloud Polling +ha_config_flow: true ha_codeowners: - '@mjj4791' - '@ties' + - '@Robbie1221' ha_domain: buienradar ha_platforms: - camera @@ -16,115 +18,85 @@ ha_platforms: - weather --- -The `buienradar` platform uses [buienradar.nl](https://buienradar.nl/) as a source for current meteorological data for your location. The weather forecast is delivered by Buienradar, who provides a web service that provides detailed weather information for users in The Netherlands. +The Buienradar integration uses [buienradar.nl](https://buienradar.nl/) as a source for current meteorological data for your location. The weather forecast is delivered by Buienradar, who provides a web service that provides detailed weather information for users in The Netherlands. The relevant weather station used will be automatically selected based on the location specified in the Home Assistant configuration (or in the Buienradar weather/sensor component). A map of all available weather stations can be found [here](https://www.google.com/maps/d/embed?mid=1NivHkTGQUOs0dwQTnTMZi8Uatj0). Besides the weather platform, there is currently support for the following additional device types: - [Camera](#camera): Radar map -- [Sensor](/integrations/sensor.buienradar/): More customizable +- [Sensor](#sensor): Extended weather data -## Configuration - -To add the Buienradar weather to your installation, add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -weather: - - platform: buienradar -``` - -{% configuration %} -name: - description: "You can specify a name of the component, but do not have to. If you specify a name, the weather integration will get an entity name of `weather.[name]`; if no name is specified, it will try to set its name to `weather.BR_[stationname]`. However at the moment in time, the entity is created, no data has been retrieved yet, so the entity will get named `weather.BR_unknown_station`. Later the station name will be known and get updated, but the entity name remains." - required: false - type: string -latitude: - description: Latitude to use for selection of data source location. Longitude and latitude will be taken from Home Assistant configuration but can be overridden/changed in this integration to select a different location for Buienradar. - required: false - type: float -longitude: - description: Longitude to use for selection of data source location. Longitude and latitude will be taken from Home Assistant configuration but can be overridden/changed in this integration to select a different location for Buienradar. - required: false - type: float -forecast: - description: "`true` to add a temperature forecast, `false` to suppress it." - required: false - type: boolean - default: true -{% endconfiguration %} - -### Full configuration - -A full configuration example: - -```yaml -# Example configuration.yaml entry -weather: - - platform: buienradar - name: "volkel" - # Force 'Meetstation Volkel' to be used: - latitude: 51.65 - longitude: 5.70 - forecast: true -``` - - -
- -This platform is an alternative to the [`buienradar`](/integrations/sensor.buienradar/) sensor. -The weather platform is easier to configure but less customizable. - -
+{% include integrations/config_flow.md %} ## Camera -The `buienradar` camera platform uses [buienradar.nl](https://buienradar.nl/) as a source for the last rain radar map. The overview image of the whole of the Netherlands is loaded and shown as a camera in Home Assistant. +The `buienradar` camera platform uses [buienradar.nl](https://buienradar.nl/) as a source for the last rain radar map. The overview image of the whole of the Netherlands is loaded and shown as a camera in Home Assistant. The Netherlands is the default country and can be changed to Belgium (see [Setting options](#setting-options)). Internally this component uses the radar map image as [documented](https://www.buienradar.nl/overbuienradar/gratis-weerdata) on buienradar.nl. The downloaded image is cached to prevent Home Assistant from making a new request to buienradar.nl multiple times a minute when Home Assistant checks for new stills from the camera. -To add `buienradar` camera to Home Assistant, add the following section to your -`configuration.yaml` file: -```yaml -# Example configuration.yaml entry -camera: - - platform: buienradar -``` +The camera entity is added disabled by default and should first be enabled before it starts reading the camera images. -{% configuration %} -name: - description: You can (optionally) specify the name of the camera. The name - will be shown in the user interface below the radar image. - required: false - type: string -dimension: - description: Size of the image to be loaded from buienradar.nl - (120 to 700 pixels) - required: false - default: 512 - type: integer -delta: - description: Time interval in seconds between image updates - required: false - default: 600 - type: integer +## Sensor + +The Buienradar integration will set up separate sensor entities with more detailed weather data. The selected weather station will provide all-weather data, with the exception of the forecasted precipitation. The forecasted precipitation data will be retrieved from Buienradar using your actual GPS location (and not the location of the nearest weather station). The sensor entities are disabled by default and should be enabled before they will be updated with data. + +The following entities will be created: + +- **Station name**: The name of the selected meteo-station. +- **Barometer forecast**: A numeric barametric forecast (1 to 7) +- **Barometer forecast name**: "A textual representation of the barometer forecast (eg: Thunderstorms, Stable, etc.)." +- **Condition code**: "A symbol and a unique code identifying the current weather condition ([a..z])." +- **Condition**: A symbol and the current weather condition (`clear`, `cloudy`, `fog`, `rainy`, `snowy` or `lightning`). +- **Condition detailed**: A symbol and detailed current weather condition (`clear`, `partlycloudy`, `cloudy`, `partlycloudy-fog`, `partlycloudy-light-rain`, `partlycloudy-rain`, `light-rain`, `rainy`, `snowy-rainy`, `partlycloudy-light-snow`, `partlycloudy-snow`, `light-snow`, `snowy`, `partlycloudy-lightning` or `lightning`). +- **Condition exact**: A symbol with the full current weather condition (in English). +- **Symbol**: A symbol for the current weather with the full current condition (in Dutch). +- **Feel temperature**: "The current feel temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." +- **Humidity**: The relative humidity (%). +- **Temperature**: "The current temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." +- **Ground temperature**: "The current ground temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." +- **Wind speed**: "The wind speed in [km/h](https://en.wikipedia.org/wiki/Kilometres_per_hour)." +- **Wind force**: "The wind speed/force in [Bft](https://en.wikipedia.org/wiki/Beaufort_scale)." +- **Wind direction**: "Where the wind is coming from: N (North), Z (south), NO (North-East), etc." +- **Wind azimuth**: Where the wind is coming from in degrees, with true north at 0° and progressing clockwise. +- **Pressure**: "The sea-level air pressure in [hPa](https://en.wikipedia.org/wiki/Hectopascal)." +- **Visibility**: "Visibility in meters ([m](https://en.wikipedia.org/wiki/Metre))." +- **Wind gust**: "The wind speed of wind gusts ([m/s](https://en.wikipedia.org/wiki/M/s))." +- **Precipation**: The amount of precipitation/rain in mm/h. +- **Precipation forecast average**: The average expected precipitation/rain in mm/h within the given time-frame. +- **Precipation forecast total**: The total expected precipitation/rain in mm within the given time-frame. The total expected rain in the configured time-frame will be equal to _precipitation_forecast_total_/_timeframe_ mm/min. So, with time-frame configured to 30 minutes and a value of 5, the expected rain is 5 mm in 30 minutes, which is the same as 10 mm/h. If time-frame is set to 90 minutes and a value of 5, the expected rain is 5 mm in 90 minutes, which is equal to 3.3 mm/h. +- **Irradiance**: "Sun intensity in Watt per square meter ([W/m2](https://en.wikipedia.org/wiki/W/m2))." +- **Rain last 24h**: The rail over the last 24 hours (in mm). +- **Rain last hour: The rail over the last hour (in mm). +- **Temperature n days ahead**: "The forecasted temperature n days ahead (in [C](https://en.wikipedia.org/wiki/Celsius))." +- **Minimum temperature n days ahead**: "The forecasted minimum temperature n days ahead (in [C](https://en.wikipedia.org/wiki/Celsius))." +- **Rain chance n days ahead**: The forecasted chance for rain n days ahead (%). +- **Sun chance n days ahead**: The forecasted chance for sun n days ahead (%). +- **Rain n days ahead**: "The forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimeter) n days ahead; the average of minrain_1d and maxrain_1d." +- **Minimum rain n days ahead**: "The minimum forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimeter) n days ahead." +- **Maximum rain n days ahead**: "The maximum forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimeter) n days ahead." +- **Wind azimuth n days ahead**: Where the wind is coming from in degrees, with true north at 0° and progressing clockwise for n days ahead. (derived from winddirection_1d) +- **Wind direction n days ahead**: "Where the wind will be coming from n days ahead: N (North), Z (south), NO (North-East), etc." +- **Wind force n days ahead**: "The expected windforce in [Bft](https://en.wikipedia.org/wiki/Beaufort_scale) n days ahead." +- **Wind speed n days ahead**: "The expected windspeed in [m/s](https://en.wikipedia.org/wiki/M/s) n days ahead (derived from windforce_1d)." +- **Condition code n days ahead**: Symbol and condition code of the expected condition n days ahead. +- **Condition n days ahead**: Symbol and expected condition n days ahead. +- **Detailed condition n days ahead**: Symbol and detailed expected condition n days ahead. +- **Full condition (english) n days ahead**: Symbol and full expected condition n days ahead (in English). +- **Full condition (dutch) n days ahead**: Symbol and full expected condition n days ahead (in Dutch). + +{% include integrations/option_flow.md %} + +{% configuration_basic %} country_code: - description: You can (optionally) specify the country code (NL or BE) of the + description: You can specify the country code (NL or BE) of the country to display on the camera. - required: false - default: NL - type: string -{% endconfiguration %} - -### The `name` Variable - -If you specify a name, the camera will get this name as its label. A slugified -version of the name will be used as the name of the entity. - -With the default of "Buienradar loop" the entity name becomes -`camera.buienradar_loop`. +delta: + description: Time interval in seconds between camera image updates +timeframe: + description: Minutes to look ahead for precipitation forecast sensors (minimum 5, maximum 120). +{% endconfiguration_basic %} _[Usage statement:](https://www.buienradar.nl/overbuienradar/gratis-weerdata) Buienradar makes free weather data available for use by individuals and businesses (website/intranet). The use of the weather data is allowed for **non-commercial purposes**. Please refer to the full usage statement linked above to confirm your use or to request permission._ diff --git a/source/_integrations/sensor.buienradar.markdown b/source/_integrations/sensor.buienradar.markdown deleted file mode 100644 index c155cdfa0db..00000000000 --- a/source/_integrations/sensor.buienradar.markdown +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: "Buienradar Sensor" -description: "Instructions on how to integrate buienradar.nl sensor within Home Assistant." -logo: buienradar.png -ha_category: - - Weather -ha_release: 0.47 -ha_iot_class: Cloud Polling -ha_domain: buienradar ---- - -The `buienradar` platform uses [buienradar.nl](https://buienradar.nl/) as a source for current meteorological data for your location. The weather forecast is delivered by Buienradar, who provides a webservice that provides detailed weather information for users in The Netherlands. The relevant weather station used will be automatically selected based on the location specified in the Home Assistant configuration (or in the buienradar weather/sensor component). A map of all available weather stations can be found [here](https://www.google.com/maps/d/embed?mid=1NivHkTGQUOs0dwQTnTMZi8Uatj0). - -The selected weather station will provide all weather data, with the exception of the forecasted precipitation. The forecasted precipitation data will be retrieved from buienradar using your actual gps-location (and not the location of the nearest weather station). - -To integrate `buienradar` with Home Assistant, add the following section to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: buienradar - monitored_conditions: - - symbol - - humidity - - temperature - - windspeed - - pressure -``` - -{% configuration %} -name: - description: You can specify a name of the component, but do not have to. See more info below. - required: false - type: string -latitude: - description: Latitude to use for selection of data source location. Longitude and latitude will be taken from Home Assistant configuration, but can be overridden/changed in this integration to select a different location for buienradar.nl. - required: false - type: float -longitude: - description: Longitude to use for selection of data source location. Longitude and latitude will be taken from Home Assistant configuration, but can be overridden/changed in this integration to select a different location for buienradar.nl. - required: false - type: float -timeframe: - description: Minutes to look ahead for precipitation forecast (minimum 5, maximum 120). - required: false - default: 60 - type: integer -monitored_conditions: - description: One or more conditions to display in the frontend. See [the Buienradar.nl website](https://www.buienradar.nl/overbuienradar/legenda) for a detailed explanation of each one. - required: true - type: list - keys: - stationname: - description: The name of the selected meteo-station. - barometerfc: - description: A numeric barametric forecast (1 to 7) - barometerfcname: - description: "A textual representation of the barometer forecast (eg: Thunderstorms, Stable, etc.)." - conditioncode: - description: "A symbol and a unique code identifying the current weather condition ([a..z])." - condition: - description: A symbol and the current weather condition (`clear`, `cloudy`, `fog`, `rainy`, `snowy` or `lightning`). - conditiondetailed: - description: A symbol and detailed current weather condition (`clear`, `partlycloudy`, `cloudy`, `partlycloudy-fog`, `partlycloudy-light-rain`, `partlycloudy-rain`, `light-rain`, `rainy`, `snowy-rainy`, `partlycloudy-light-snow`, `partlycloudy-snow`, `light-snow`, `snowy`, `partlycloudy-lightning` or `lightning`). - conditionexact: - description: A symbol with the full current weather condition (in English). - symbol: - description: A symbol for the current weather with the full current condition (in Dutch). - feeltemperature: - description: "The current feel temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." - humidity: - description: The relative humidity (%). - temperature: - description: "The current temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." - groundtemperature: - description: "The current ground temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." - windspeed: - description: "The wind speed in [km/h](https://en.wikipedia.org/wiki/Kilometres_per_hour)." - windforce: - description: "The wind speed/force in [Bft](https://en.wikipedia.org/wiki/Beaufort_scale)." - winddirection: - description: "Where the wind is coming from: N (North), Z (south), NO (North-East), etc." - windazimuth: - description: Where the wind is coming from in degrees, with true north at 0° and progressing clockwise. - pressure: - description: "The sea-level air pressure in [hPa](https://en.wikipedia.org/wiki/Hectopascal)." - visibility: - description: "Visibility in meters ([m](https://en.wikipedia.org/wiki/Metre))." - windgust: - description: "The wind speed of wind gusts ([m/s](https://en.wikipedia.org/wiki/M/s))." - precipitation: - description: The amount of precipitation/rain in mm/h. - precipitation_forecast_average: - description: The average expected precipitation/rain in mm/h within the given time-frame. - precipitation_forecast_total: - description: The total expected precipitation/rain in mm within the given time-frame. The total expected rain in the configured time-frame will be equal to _precipitation_forecast_total_/_timeframe_ mm/min. So, with time-frame configured to 30 minutes and a value of 5, the expected rain is 5 mm in 30 minutes, which is the same as 10 mm/h. If time-frame is set to 90 minutes and a value of 5, the expected rain is 5 mm in 90 minutes, which is equal to 3.3 mm/h. - irradiance: - description: "Sun intensity in Watt per square meter ([W/m2](https://en.wikipedia.org/wiki/W/m2))." - rainlast24hour: - description: The rain over the last 24 hours (in mm). - rainlasthour: - description: The rain over the last hour (in mm). - temperature_1d: - description: "The forecasted temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." - mintemp_1d: - description: "The forecasted minimum temperature (in [C](https://en.wikipedia.org/wiki/Celsius))." - rainchance_1d: - description: The forecasted chance for rain (%). - sunchance_1d: - description: The forecasted chance for sun (%). - rain_1d: - description: "The forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimetre); the average of minrain_1d and maxrain_1d." - minrain_1d: - description: "The minimum forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimetre)." - maxrain_1d: - description: "The maximum forecasted amount of rain in [mm](https://en.wikipedia.org/wiki/Millimetre)." - windazimuth_1d: - description: Where the wind is coming from in degrees, with true north at 0° and progressing clockwise. (derived from winddirection_1d) - winddirection_1d: - description: "Where the wind will be coming from: N (North), Z (south), NO (North-East), etc." - windforce_1d: - description: "The expected windforce in [Bft](https://en.wikipedia.org/wiki/Beaufort_scale)." - windspeed_1d: - description: "The expected windspeed in [m/s](https://en.wikipedia.org/wiki/M/s) (derived from windforce_1d)." - conditioncode_1d: - description: Symbol and condition code of the expected condition. - condition_1d: - description: Symbol and expected condition. - conditiondetailed_1d: - description: Symbol and detailed expected condition. - conditionexact_1d: - description: Symbol and full expected condition (in English). - symbol_1d: - description: Symbol and full expected condition (in Dutch). -{% endconfiguration %} - -## The `Name` Variable - -If you specify a name, the sensors will get an entity name of `sensor.[name]_[default sensor display name]`, for example: - -- `sensor.lopik_temperature`, since the name of the sensor is set to `lopik` and the default display name for monitored condition `temperature` is `Temperature`. -- `sensor.lopik_wind_force`, since the name of the sensor is set to `lopik` and the default display name for monitored condition `windforce` is `Wind force`. - -If no name is specified the sensors will be called `sensor.br_[default sensor display name]`, for example: - -- `sensor.br_wind_speed`, since no name has been set for the sensor and the default display name for monitored condition `windspeed` is `Wind speed`. -- `sensor.br_ground_temperature`, since no name has been set for the sensor and the default display name for monitored condition `groundtemperature` is `Ground Temperature`. - -## Daily forecasts - -Conditions above marked with `1d` are daily forecasts. To get forecast for different day, replace the number -in `_1d` part of the sensor name. Valid values are from `1` to `5`. - -## Configuration examples - -Full configuration example (excluding forecasted conditions) where location is manually specified: - -```yaml -# Example configuration.yaml entry -- platform: buienradar - name: "volkel" - # Force 'Meetstation Volkel' to be used: - latitude: 51.65 - longitude: 5.70 - monitored_conditions: - - stationname - - barometerfc - - barometerfcname - - conditioncode - - condition - - conditiondetailed - - conditionexact - - symbol - - feeltemperature - - humidity - - temperature - - groundtemperature - - windspeed - - windforce - - winddirection - - windazimuth - - pressure - - visibility - - windgust - - precipitation - - irradiance - - precipitation_forecast_average - - precipitation_forecast_total - - rainlast24hour - - rainlasthour -``` - -Configuration example with current condition and (some) forecasted values: - -```yaml -# Weather prediction -sensor: - - platform: buienradar - monitored_conditions: - # current condition: - - condition - - conditioncode - - conditiondetailed - - conditionexact - - symbol - # conditions for forecasted data: - - symbol_1d - - symbol_2d - - symbol_3d - - symbol_4d - - symbol_5d - - temperature_1d - - temperature_2d - - temperature_3d - - temperature_4d - - temperature_5d - - mintemp_1d - - rainchance_1d - - rainchance_2d - - sunchance_1d - - sunchance_2d - - rain_1d - - rain_2d - - minrain_1d - - maxrain_1d - - windforce_1d - - windforce_2d - - windspeed_1d - - windspeed_2d - - winddirection_1d - - winddirection_2d - - windazimuth_1d - - windazimuth_2d -``` - -[Usage statement:](https://www.buienradar.nl/overbuienradar/gratis-weerdata) -> Buienradar makes free weather-data available for use by individuals and businesses (website/intranet). The use of the weather-data is allowed for **non-commercial purposes**. Please refer to the full usage statement linked above to confirm your usage or to request permission. From fc72f6b834df70474da791d59c0489f24dcc4072 Mon Sep 17 00:00:00 2001 From: Artem Draft Date: Wed, 12 May 2021 01:54:20 +0300 Subject: [PATCH 24/79] Docs about new overrides in universal (#17548) Co-authored-by: Franck Nijhof --- source/_integrations/universal.markdown | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/_integrations/universal.markdown b/source/_integrations/universal.markdown index 7c4d37eb85e..2a46a6f807b 100644 --- a/source/_integrations/universal.markdown +++ b/source/_integrations/universal.markdown @@ -41,6 +41,18 @@ media_player: volume_mute: service: SERVICE data: SERVICE_DATA + media_play: + service: SERVICE + data: SERVICE_DATA + media_pause: + service: SERVICE + data: SERVICE_DATA + media_previous_track: + service: SERVICE + data: SERVICE_DATA + media_next_track: + service: SERVICE + data: SERVICE_DATA attributes: is_volume_muted: ENTITY_ID|ATTRIBUTE state: ENTITY_ID|ATTRIBUTE @@ -61,7 +73,7 @@ state_template: required: false type: template commands: - description: "Commands to be overwritten. Most, if not all, media player service commands can be overwritten. Example entries are `turn_on`, `turn_off`, `select_source`, `volume_set`, `volume_up`, `volume_down`, and `volume_mute` (refer to the [`media_player` documentation](/integrations/media_player/) to see the full list)." + description: "Commands to be overwritten. Almost all media player service commands can be overwritten. Example entries are `turn_on`, `turn_off`, `select_source`, `volume_set`, `volume_up`, `volume_down`, `volume_mute`, `media_play`, `media_pause`, `media_stop`, `media_previous_track`, `media_next_track` and `play_media` (refer to the [`media_player` documentation](/integrations/media_player/) to see the full list)." required: false type: string attributes: From 560c98cea078daa379a42057ba4ac8dcfc63ce34 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Wed, 12 May 2021 10:29:54 +0200 Subject: [PATCH 25/79] Add services and platforms to Fritz (#17802) Co-authored-by: Franck Nijhof --- source/_integrations/fritz.markdown | 46 ++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index cf2cad37b27..d4dec0ff6c7 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -3,6 +3,8 @@ title: AVM FRITZ!Box Tools description: Instructions on how to integrate AVM FRITZ!Box based routers into Home Assistant. ha_category: - Presence Detection + - Binary Sensor + - Sensor ha_release: '0.10' ha_domain: fritz ha_config_flow: true @@ -13,10 +15,18 @@ ha_codeowners: ha_iot_class: Local Polling ha_platforms: - device_tracker + - binary_sensor + - sensor ha_ssdp: true --- -The `fritz` platform offers presence detection by looking at connected devices to a [AVM FRITZ!Box](https://avm.de/produkte/fritzbox/) based router. +The AVM FRITZ!Box Tools integration allows you to control your [AVM FRITZ!Box](https://avm.de/produkte/fritzbox/) based router. + +There is support for the following platform types within Home Assistant: + +- **Device tracker** - presence detection by looking at connected devices. +- **Binary sensor** - connectivity status. +- **Sensor** - external IP address and uptime. {% include integrations/config_flow.md %} @@ -24,4 +34,38 @@ The `fritz` platform offers presence detection by looking at connected devices t TR-064 needs to be enabled in the FRITZ!Box network settings for Home Assistant to login and read device info. +## Username + +The configuration in the UI asks for a username. Starting from FRITZ!OS 7.24 the FRITZ!Box creates a random username for the admin user if you didn't set one yourself. This can be found after logging into the FRITZ!Box and visiting System -> FRITZ!Box Users -> Users. The username starts with `fritz` followed by four random numbers. Under properties on the right it says `created automatically`. Prior to FRITZ!OS 7.24 the default username was `admin`. + +## Services + +Currently supported services are Platform specific: + +- `fritz.reconnect` +- `fritz.reboot` + +### Platform Services + +#### Service `fritz.reboot` + +Reboot the router. + + + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | +| `entity_id` | no | Only act on a specific router | + +#### Service `fritz.reconnect` + +Disconnect and reconnect the router to the Internet. +If you have a dynamic IP address, most likely it will change. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | +| `entity_id` | no | Only act on a specific router | + +## Additional info + See the [device tracker integration page](/integrations/device_tracker/) for instructions how to configure the people to be tracked. From 17747d012d6be29676073fb46f765a251cccaf79 Mon Sep 17 00:00:00 2001 From: Kevin Anthony Date: Thu, 13 May 2021 07:09:35 -0300 Subject: [PATCH 26/79] Add Core200S Support to vesync Documentation (#17735) Add the Core200S support to the vesync documentation as well as indicating which attributes for the fans work with which device type. --- source/_integrations/vesync.markdown | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index b44b1ad43a0..4c7c23091cc 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -50,6 +50,7 @@ This integration supports devices controllable by the VeSync App. The following ### Fans - LEVOIT Smart Wifi Air Purifier (LV-PUR131S) +- LEVOIT Core 200S Smart True HEPA Air Purifier (Core200S) ## Prerequisite @@ -80,17 +81,19 @@ VeSync outlets will expose the following details for only the smart outlets. Ene ## Fan Exposed Attributes -VeSync air purifiers will expose the following details. +VeSync air purifiers will expose the following details depending on the features supported by the model: -| Attribute | Description | Example | -| ----------------------- | ----------------------------------------------------------------------- | --------------- | -| `mode` | The current mode the device is in. | manual | -| `speed` | The current speed setting of the device. | high | -| `speed_list` | The available list of speeds supported by the device. | high | -| `active_time` | The number of seconds since the device has been in a non-off mode. | 1598 | -| `filter_life` | Remaining percentage of the filter. | 142 | -| `air_quality` | The current air quality reading. | excellent | -| `screen_status` | The current status of the screen. | on | +| Attribute | Description | Example | +| ----------------------- | --------------------------------------------------------------------------------- | --------------- | +| `mode` | The current mode the device is in. (LV-PUR131S, Core200S) | manual | +| `speed` | The current speed setting of the device. (LV-PUR131S, Core200S) | high | +| `speed_list` | The available list of speeds supported by the device. (LV-PUR131S) | high | +| `active_time` | The number of seconds since the device has been in a non-off mode. (LV-PUR131S) | 1598 | +| `filter_life` | Remaining percentage of the filter. (LV-PUR131S, Core200S) | 142 | +| `air_quality` | The current air quality reading. (LV-PUR131S) | excellent | +| `screen_status` | The current status of the screen. (LV-PUR131S) | on | +| `night_light` | The current status of the night light (Core200S) | off | +| `child_lock` | The current status of the child lock (Core200S) | off | ## Extracting Attribute data From a583f5d8129ff6e814557098feb493c946dc6475 Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler Date: Fri, 14 May 2021 01:21:49 -0700 Subject: [PATCH 27/79] Add documentation about lock platform for Mazda integration (#17815) --- source/_integrations/mazda.markdown | 32 ++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/source/_integrations/mazda.markdown b/source/_integrations/mazda.markdown index 9f3f85f99d9..3c247e70286 100644 --- a/source/_integrations/mazda.markdown +++ b/source/_integrations/mazda.markdown @@ -4,6 +4,7 @@ description: Instructions on how to integrate your Connected Services capable Ma ha_release: '2021.3' ha_category: - Car + - Lock - Presence Detection - Sensor ha_iot_class: Cloud Polling @@ -26,13 +27,34 @@ This integration requires an active Mazda Connected Services subscription and a - CX-9: 2021+ - CX-5: 2021+ -This integration provides the following platforms: - -- Sensor: Fuel remaining, fuel distance remaining, odometer, and tire pressure. Tire pressure is not available for CX-5 and CX-9 models. -- Device tracker: Tracks the current location of the vehicle. This updates when the vehicle is switched off. - {% include integrations/config_flow.md %}
The MyMazda API only allows one active session at a time. Therefore, if you use the same account with both Home Assistant and the MyMazda mobile app, you may experience issues ("Multiple devices detected" notifications, session expired warnings, etc.) To fix this, you can create a secondary MyMazda account, and share your vehicle with the secondary account. Log in to the mobile app using the primary account and select Menu > MyMazda > My Vehicle > Drivers > Manage Drivers > Invite Driver. When finished, log into the secondary account with Home Assistant.
+ +## Platforms + +### Sensor + +The following sensor entities are available: +- Fuel remaining +- Fuel distance remaining +- Odometer +- Tire pressure (not available for CX-5 and CX-9 models) + +### Device tracker + +Tracks the current location of the vehicle. This will generally update when the vehicle is switched off. + +### Lock + +Displays the current door lock status of the vehicle, and locks/unlocks the doors of the vehicle. + +
+ The "Automatic Re-Lock" feature will automatically re-lock the doors if they are not opened shortly after being unlocked. This applies regardless of whether you are using the key, or unlocking the doors remotely using Home Assistant or the MyMazda app. +
+ +## Disclaimer + +This integration is not affiliated with or endorsed by Mazda. \ No newline at end of file From 9d786747e3aeed15b7ed3a0424fb58e690a570e5 Mon Sep 17 00:00:00 2001 From: indykoning <15870933+indykoning@users.noreply.github.com> Date: Fri, 14 May 2021 10:22:34 +0200 Subject: [PATCH 28/79] Growatt server - Change documentation to reflect support for config flow (#14998) --- source/_integrations/growatt_server.markdown | 50 +------------------- 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/source/_integrations/growatt_server.markdown b/source/_integrations/growatt_server.markdown index c12b5da2821..6e78d19cad2 100644 --- a/source/_integrations/growatt_server.markdown +++ b/source/_integrations/growatt_server.markdown @@ -18,52 +18,4 @@ This is a sensor to collect information from your Growatt inverters using [Growa This will log into your Growatt account and grab the first "Plant", after which it collects the inverters on this plant and creates sensors for these inverters as well as total sensors. -## Configuration - -Add the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry -sensor: - - platform: growatt_server - username: GROWATT_SERVER_USERNAME - password: GROWATT_SERVER_PASSWORD -``` - -{% configuration %} -username: - description: The username used to log into Growatt server. - required: true - type: string -password: - description: The password used to log into Growatt server. - required: true - type: string -plant_id: - description: The plant id to use in case you have multiple plants on your account. - required: false - type: integer - default: 0 -name: - description: Name of the sensor to use in the frontend. - required: false - default: Growatt - type: string -{% endconfiguration %} - -## Example with multiple plants - -```yaml -# Example configuration.yaml entry -sensor: - - platform: growatt_server - name: "growatt home" - plant_id: 12345678 - username: username - password: password - - platform: growatt_server - name: "growatt work" - plant_id: 87654321 - username: username - password: password -``` +{% include integrations/config_flow.md %} From 2d4be0dce7bc908a24af0c702fb57c8ec083c435 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Fri, 14 May 2021 11:02:46 +0200 Subject: [PATCH 29/79] Add description of ""close_comm_on_error". (#17826) Co-authored-by: Martin Hjelmare Co-authored-by: Franck Nijhof --- source/_integrations/modbus.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index a883889e243..e0d47b44a10 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -48,6 +48,11 @@ modbus: ``` {% configuration %} +close_comm_on_error: + description: Determines if the modbus communication is closed when an error occurs, default is true. Some serial-rs485 adapters send garble to HA when opened, this leads to a disconnect and a new connect, which can continue. If in a running communication the debug log contains a message from pymodbus, with the text "cleaning....", then try this parameter. + required: false + default: true + type: boolean delay: description: Time to delay messages in seconds after connecting. Some modbus devices need a delay typically 1-2 seconds after connection is established in order to prepare the communication. If a device accepts connecting with no response to the requests sent or the device disconnects, this parameter might help. required: false From 607a8aee3be2dc4e404fc209fcd43f530aadf0f6 Mon Sep 17 00:00:00 2001 From: Kevin Eifinger Date: Fri, 14 May 2021 17:34:23 +0200 Subject: [PATCH 30/79] add integration kraken (#11891) Co-authored-by: Klaas Schoute Co-authored-by: Franck Nijhof --- source/_integrations/kraken.markdown | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 source/_integrations/kraken.markdown diff --git a/source/_integrations/kraken.markdown b/source/_integrations/kraken.markdown new file mode 100644 index 00000000000..78dc7be995a --- /dev/null +++ b/source/_integrations/kraken.markdown @@ -0,0 +1,30 @@ +--- +title: Kraken +description: Instructions on how to integrate Kraken.com sensors into Home Assistant. +ha_category: + - Finance + - Sensor +ha_iot_class: Cloud Polling +ha_release: 2021.7 +ha_config_flow: true +ha_quality_scale: gold +ha_codeowners: + - '@eifinger' +ha_domain: kraken +ha_platforms: + - sensor +--- + +The Kraken integration allows you to monitor exchange rates on [kraken.com](https://www.kraken.com/). +For a list of tradable asset pairs check this [this kraken support article](https://support.kraken.com/hc/en-us/articles/201893658-Currency-pairs-available-for-trading-on-Kraken). + +{% include integrations/config_flow.md %} + +{% include integrations/option_flow.md %} + +{% configuration_basic %} +Update interval: + description: "Seconds between updates" +Tracked Asset Pairs: + description: "Select the assets you want to track. This list is automatically updated with a list of tradable assets on kraken.com" +{% endconfiguration_basic %} From 91e517168f2677dc9f1215bc8f4044c9af0da90d Mon Sep 17 00:00:00 2001 From: Thomas Schamm Date: Fri, 14 May 2021 22:06:19 +0200 Subject: [PATCH 31/79] Added documentation for new boschshc integration (#12842) Co-authored-by: Franck Nijhof --- source/_integrations/bosch_shc.markdown | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 source/_integrations/bosch_shc.markdown diff --git a/source/_integrations/bosch_shc.markdown b/source/_integrations/bosch_shc.markdown new file mode 100644 index 00000000000..24ecb5851f1 --- /dev/null +++ b/source/_integrations/bosch_shc.markdown @@ -0,0 +1,29 @@ +--- +title: Bosch SHC +description: Integrate Bosch SHC. +ha_category: + - Binary Sensor +ha_release: 2021.6 +ha_iot_class: Local Polling +ha_config_flow: true +ha_codeowners: + - '@tschamm' +ha_domain: bosch_shc +ha_config_flow: true +--- + +The Bosch SHC integration allows you to integrate your [Bosch SHC](https://www.bosch-smarthome.com) into Home Assistant. + +There is currently support for the following device types within Home Assistant: + +- [Binary Sensor](#binary-sensor) + +{% include integrations/config_flow.md %} + +### Binary Sensor + +The binary sensor platform allows you to monitor the states of your Shutter Contacts and Smoke Detectors. Binary sensors are added for each Door/Window Contact and Smoke Detector. + +## Client registration + +Before accessing the Bosch Smart Home Controller, a client must be registered on the controller. For this, a valid SSL cert/key pair must be registered on the controller. To start the client registration, press and hold the button on the controller until the LED starts flashing. For more information, follow the [client registration](https://github.com/BoschSmartHome/bosch-shc-api-docs/tree/master/postman#register-a-new-client-to-the-bosch-smart-home-controller) steps described in the Bosch SHC API documentation. From 3cbe00b1b03259a8d5bd4a66b39e54585aa02e2c Mon Sep 17 00:00:00 2001 From: tkdrob Date: Fri, 14 May 2021 16:07:42 -0400 Subject: [PATCH 32/79] Add DHCP support to goalzero (#17784) --- source/_integrations/goalzero.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/goalzero.markdown b/source/_integrations/goalzero.markdown index 928abe9e8d1..892c74fe5a7 100644 --- a/source/_integrations/goalzero.markdown +++ b/source/_integrations/goalzero.markdown @@ -6,6 +6,7 @@ ha_category: ha_iot_class: Local Polling ha_release: 0.116 ha_config_flow: true +ha_dhcp: true ha_domain: goalzero ha_platforms: - binary_sensor From b6c629a1466b9ab5d2c2b00eb1b13468d1e7d8ba Mon Sep 17 00:00:00 2001 From: Matt Emerick-Law Date: Fri, 14 May 2021 21:08:15 +0100 Subject: [PATCH 33/79] Update scene editor page with new screenshot and top-right menu (#17809) --- source/_docs/scene/editor.markdown | 3 ++- source/images/docs/scenes/editor.png | Bin 83008 -> 43201 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_docs/scene/editor.markdown b/source/_docs/scene/editor.markdown index c03d9478f69..531aba90f88 100644 --- a/source/_docs/scene/editor.markdown +++ b/source/_docs/scene/editor.markdown @@ -5,7 +5,7 @@ description: "Instructions on how to use the scenes editor." In Home Assistant 0.102 we introduced the first version of our scene editor. If you just created a new configuration with Home Assistant, then you're all set! Go to the UI and enjoy. -From the UI choose **Configuration** which is located in the sidebar, then click on **Scenes** to go to the scene editor. Press the **+** sign in the lower right corner to get started. +From the UI choose **Configuration** which is located in the sidebar, then click on **Scenes** to go to the scene editor. Press the **Add Scene** button in the lower right corner to get started. Choose a meaningful name for your scene. @@ -18,6 +18,7 @@ The state of your devices will be saved, so it can be restored when you are fini Set the state of the devices to how you want them to be in your scene, this can be done by clicking on it and edit the state from the popup, or any other method that changes the state. On the moment you save the scene, all the states of your devices are stored in the scene. When you leave the editor the states of the devices are restored to the state from before you started editing. +The menu on the top-right has options to **Duplicate scene** and **Delete scene**. ## Updating your configuration to use the editor diff --git a/source/images/docs/scenes/editor.png b/source/images/docs/scenes/editor.png index 258a0eeac228e308bc0095dc90d12571b1708519..053c6dfb795058c45d90a9bf89224dcfc1c0446d 100644 GIT binary patch literal 43201 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 X+w3ZV`lLD0JCuK*EQ9>Z;LZO4ijqnu literal 83008 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

>&o=^H0sa*~^kwBP6u5Mvbdv4*y1nx7c|Y8$8B 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 From ccbf73d71b7b221f279e626c13c1348858a2e376 Mon Sep 17 00:00:00 2001 From: Raphael Date: Fri, 14 May 2021 16:08:58 -0400 Subject: [PATCH 34/79] Add Etekcity VeSync Bulbs LED documentation (#17745) --- source/_integrations/vesync.markdown | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/source/_integrations/vesync.markdown b/source/_integrations/vesync.markdown index 4c7c23091cc..e0220507fa2 100644 --- a/source/_integrations/vesync.markdown +++ b/source/_integrations/vesync.markdown @@ -2,9 +2,9 @@ title: VeSync description: Instructions on how to set up VeSync switches, outlets, and fans within Home Assistant. ha_category: + - Light - Switch - Fan - - Light ha_release: 0.66 ha_iot_class: Cloud Polling ha_config_flow: true @@ -14,9 +14,9 @@ ha_codeowners: - '@thegardenmonkey' ha_domain: vesync ha_platforms: - - fan - light - switch + - fan --- The `vesync` integration enables you to control smart switches and outlets connected to the VeSync App. @@ -25,15 +25,25 @@ The devices must be added to the VeSync App before this integration can discover The following platforms are supported: +- **light** - **switch** - **fan** -- **light** ## Supported Devices This integration supports devices controllable by the VeSync App. The following devices are supported by this integration: -### Plugs +### Bulbs +- Etekcity WiFi Dimmable LED Bulb (ESL100) +- Etekcity WiFi Dimmable and Tunable White LED Bulb (ESL100CW) + +### Wall Switches + +- Etekcity In Wall Smart Switch (EWSL01-USA) +- Etekcity Wifi Dimmer Switch (ESD16) +- Etekcity Wifi Dimmer Switch (ESWD16) + +### Outlet Plugs - Etekcity 7 Amp US outlet - ESW01-USA (Round) - Etekcity 10 Amp US outlet - ESW10-USA (Round) @@ -41,12 +51,6 @@ This integration supports devices controllable by the VeSync App. The following - Etekcity 15 Amp US outlet - ESW15-USA (Rectangular) - Etekcity 2 Plug Outdoor Outlet - ESO15-TB -### Switches - -- Etekcity In Wall Smart Switch (EWSL01-USA) -- Etekcity Wifi Dimmer Switch (ESD16) -- Etekcity Wifi Dimmer Switch (ESWD16) - ### Fans - LEVOIT Smart Wifi Air Purifier (LV-PUR131S) From 51104df210af06741914271e854f3448a8851c18 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 15 May 2021 10:24:45 -0400 Subject: [PATCH 35/79] Add support for American Standard thermostats to nexia (#17804) --- source/_integrations/nexia.markdown | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/_integrations/nexia.markdown b/source/_integrations/nexia.markdown index 817510a5205..20f3d2ffe10 100644 --- a/source/_integrations/nexia.markdown +++ b/source/_integrations/nexia.markdown @@ -1,6 +1,6 @@ --- -title: Nexia -description: Instructions on how to integrate Nexia Thermostats (Trane/American Standard) into Home Assistant. +title: Nexia/American Standard +description: Instructions on how to integrate Trane and American Standard thermostats into Home Assistant. ha_category: - Binary Sensor - Sensor @@ -20,7 +20,7 @@ ha_platforms: - sensor --- -The `nexia` integration allows you to integrate your [Nexia](https://mynexia.com/) thermostats into Home Assistant. +The `nexia` integration allows you to integrate your [Nexia](https://mynexia.com/) (Trane) thermostats or [American Standard](https://asairhome.com/) thermostats into Home Assistant. There is currently support for the following device types within Home Assistant: @@ -58,9 +58,11 @@ The following binary sensors are added for each thermostat zone: The `nexia` climate platform lets you control a thermostat. -The following thermostats are supported: `XL1050`, `XL850`, `XL824` +The following Trane thermostats are supported: `XL1050`, `XL850`, `XL824` -The following thermostats are not supported: `XL624` +The following American Standard thermostats have been reported to work: `AZONE1050`, `AZONE850`, `ACONT824` + +The following thermostats are not supported: `XL624`, `XL950`, `AZONE950`, `AZEMT500`, `AZEMT400B` Other thermostats may work, but they have not been tested. From 0921aefa9210ff96710656817174ee2cb3e5dc13 Mon Sep 17 00:00:00 2001 From: Sascha Sander Date: Sat, 15 May 2021 18:58:22 +0200 Subject: [PATCH 36/79] Update Kostal Plenticore documentation to include PV3/DC3 sensors (#17833) --- source/_integrations/kostal_plenticore.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_integrations/kostal_plenticore.markdown b/source/_integrations/kostal_plenticore.markdown index 238fbd990f8..a7392c7357d 100644 --- a/source/_integrations/kostal_plenticore.markdown +++ b/source/_integrations/kostal_plenticore.markdown @@ -42,6 +42,7 @@ The following sensors are available in the library: | AC Power | W | Output power of the inverter. | | DC1 Power | W | Power of string 1. | | DC2 Power | W | Power of string 2. | +| DC3 Power | W | Power of string 3. | | PV to Battery Power | W | Power used to charge the battery. | | Energy Manager State | | State of the energy manager. | | Battery Cycles | | Number of full charge/discharge cylces. | @@ -79,6 +80,10 @@ The following sensors are available in the library: | Energy PV2 Month | kWh | Energy of PV string 2 of the current month. | | Energy PV2 Year | kWh | Energy of PV string 2 of the current year. | | Energy PV2 Total | kWh | Energy of PV string 2 total. | +| Energy PV3 Day | kWh | Energy of PV string 3 of the current day. | +| Energy PV3 Month | kWh | Energy of PV string 3 of the current month. | +| Energy PV3 Year | kWh | Energy of PV string 3 of the current year. | +| Energy PV3 Total | kWh | Energy of PV string 3 total. | | Energy Yield Day | kWh | Energy yield of the current day. | | Energy Yield Month | kWh | Energy yield of the current month. | | Energy Yield Year | kWh | Energy yield of the current year. | From 4248047e1ddc5ba437888d047060da438a4d72c0 Mon Sep 17 00:00:00 2001 From: Filipe Pina <636320+fopina@users.noreply.github.com> Date: Sat, 15 May 2021 19:29:42 +0100 Subject: [PATCH 37/79] add ssl support to tcp integration (#17045) --- source/_integrations/tcp.markdown | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/source/_integrations/tcp.markdown b/source/_integrations/tcp.markdown index b6e4cf66d1e..d7c9b63814a 100644 --- a/source/_integrations/tcp.markdown +++ b/source/_integrations/tcp.markdown @@ -67,6 +67,16 @@ buffer_size: required: false default: "`1024`" type: integer +ssl: + description: If `true`, use SSL/TLS. + required: false + default: false + type: boolean +verify_ssl: + description: Set this to `false` if the server is using a self-signed certificate. + required: false + default: true + type: boolean {% endconfiguration %} ### Examples @@ -193,4 +203,14 @@ timeout: required: false type: integer default: 10 +ssl: + description: If `true`, use SSL/TLS. + required: false + default: false + type: boolean +verify_ssl: + description: Set this to `false` if the server is using a self-signed certificate. + required: false + default: true + type: boolean {% endconfiguration %} From e4487074a6f844be3505c49a876b70d85deecf04 Mon Sep 17 00:00:00 2001 From: Klaas Schoute Date: Sat, 15 May 2021 21:10:30 +0200 Subject: [PATCH 38/79] Add Garages Amsterdam Integration (#15629) Co-authored-by: Franck Nijhof --- .../_integrations/garages_amsterdam.markdown | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 source/_integrations/garages_amsterdam.markdown diff --git a/source/_integrations/garages_amsterdam.markdown b/source/_integrations/garages_amsterdam.markdown new file mode 100644 index 00000000000..61526227254 --- /dev/null +++ b/source/_integrations/garages_amsterdam.markdown @@ -0,0 +1,36 @@ +--- +title: Garages Amsterdam +description: Instructions on how to integrate Garages Amsterdam within Home Assistant. +ha_category: + - Sensor + - Binary Sensor +ha_release: 2021.6 +ha_codeowners: + - '@klaasnicolaas' +ha_config_flow: true +ha_iot_class: Cloud Polling +ha_domain: garages_amsterdam +--- + +The Garages Amsterdam integration uses an API provided by the municipality of Amsterdam, to measure the occupancy of Amsterdam parking garages in the Netherlands. You can track multiple garages by adding the integration multiple times. + +{% include integrations/config_flow.md %} + +### Sensor + +When you add a parking garage, 4 sensors are created in your configuration by default: + +- **Free space long** - Number of free parking spaces for cardholders or reserved spaces +- **Free space short** - Number of free parking spaces for regular paid parking +- **Long capacity** - Total of parking spaces for cardholders or reserved spaces +- **Short capacity** - Total of parking spaces for regular paid parking + +

+ + Some parking garages don't have long-term parking spaces, in which case the 2 specific **Long** sensors will not be created. + +
+ +### Binary Sensor + +Each parking garage also has a binary sensor, which indicates whether there are problems in the data provision from the API. When it indicates `ok` everything is fine. If the state changes to `problem`, the upstream data might not be up to date or reliable and will remain in this state until new data is coming in. From 02f72335101f245ee0799cfff254e6c919020acc Mon Sep 17 00:00:00 2001 From: mountainsandcode Date: Mon, 17 May 2021 11:12:14 +0200 Subject: [PATCH 39/79] Add control of hardware buttons to Sonos (#17665) --- source/_integrations/sonos.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index 6cdeb50c6f0..6091743aa31 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -120,6 +120,7 @@ Night Sound and Speech Enhancement modes are only supported when playing from th | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | | `entity_id` | yes | String or list of `entity_id`s that will have their options set. +| `buttons_enabled` | yes | Boolean to control the functioning of hardware buttons on the device. | `night_sound` | yes | Boolean to control Night Sound mode. | `speech_enhance` | yes | Boolean to control Speech Enhancement mode. | `status_light` | yes | Boolean to control the Status (LED) Light. From 306844d704a34a56fbc6e286a58944b0e77cb512 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Mon, 17 May 2021 16:15:38 +0200 Subject: [PATCH 40/79] Update KNX for xknx 0.18.2 (#17798) --- source/_integrations/knx.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index c94a98afd14..1780fc16e1f 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -614,10 +614,10 @@ setpoint_shift_state_address: required: false type: [string, list] setpoint_shift_mode: - description: Defines the internal device DPT used. Either 'DPT6010' or 'DPT9002'. + description: Defines the internal device DPT used. Either 'DPT6010', 'DPT9002' or None. When `None` or omitted the DPT is auto-assigned from the first incoming telegram. required: false type: string - default: DPT6010 + default: None setpoint_shift_min: description: Minimum value of setpoint shift. required: false @@ -894,7 +894,7 @@ rgbw_state_address: required: false type: [string, list] individual_colors: - description: Used when the actuator only supports individual group addresses for colors. When `address` is specified for all 3 (or 4) individual colors the root `address` key can be omitted. + description: Used when the actuator only supports individual group addresses for colors. When `individual_colors` is used the root `address` key may be omitted. required: false type: map keys: From 25180d5f50b186e16d07154e23eab3e5cc0b5b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Le=20Baillif?= Date: Mon, 17 May 2021 17:03:21 +0200 Subject: [PATCH 41/79] Watson TTS: default voice as of core #48722 (#17832) When core#48722 will be merged, default voice will be "en-US_AllisonV3Voice" --- source/_integrations/watson_tts.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/watson_tts.markdown b/source/_integrations/watson_tts.markdown index cf54ba9db4d..bc9999b9a68 100644 --- a/source/_integrations/watson_tts.markdown +++ b/source/_integrations/watson_tts.markdown @@ -52,7 +52,7 @@ voice: description: Voice name to be used. required: false type: string - default: en-US_AllisonVoice + default: en-US_AllisonV3Voice output_format: description: "Override the default output format. Supported formats: `audio/flac`, `audio/mp3`, `audio/mpeg`, `audio/ogg`, `audio/ogg;codecs=opus`, `audio/ogg;codecs=vorbis`, `audio/wav`" required: false From 3fc73b27d02bbcbc2b7eb738c612ea05dd35c328 Mon Sep 17 00:00:00 2001 From: Michael Klamminger <6277211+m1ch@users.noreply.github.com> Date: Wed, 19 May 2021 15:09:09 +0200 Subject: [PATCH 42/79] Add entity_id to mqtt sensor templates (#17872) --- source/_integrations/sensor.mqtt.markdown | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown index b2eaeda5e75..c1de8e28308 100644 --- a/source/_integrations/sensor.mqtt.markdown +++ b/source/_integrations/sensor.mqtt.markdown @@ -147,7 +147,7 @@ unit_of_measurement: required: false type: string value_template: - description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the value." + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the value. Available variables: `entity_id`. The `entity_id` can be used to reference the entity's attributes." required: false type: template {% endconfiguration %} @@ -206,6 +206,26 @@ sensor: The state and the attributes of the sensor by design do not update in a synchronous manner if they share the same MQTT topic. Temporal mismatches between the state and the attribute data may occur if both the state and the attributes are changed simultaneously by the same MQTT message. An automation that triggers on any state change of the sensor will also trigger both on the change of the state or a change of the attributes. Such automations will be triggered twice if both the state and the attributes change. Please use a [MQTT trigger](/docs/automation/trigger/#mqtt-trigger) and process the JSON in the automation directly via the {% raw %}`{{ trigger.payload_json }}`{% endraw %} [trigger data](/docs/automation/templating/#mqtt) for automations that must synchronously handle multiple JSON values within the same MQTT message. +### Usage of `entity_id` in the template + +The example below shows how a simple filter, that calculates the value by adding 90% of the new value and 10% of the previous value, can be implemented in a template. + +{% raw %} +```yaml +# Example configuration.yaml entry +sensor: + - platform: mqtt + name: "Temp 1" + state_topic: "sensor/temperature" + value_template: |- + {% if states(entity_id) == None %} + {{ value | round(2) }} + {% else %} + {{ value | round(2) * 0.9 + states(entity_id) * 0.1 }} + {% endif %} +``` +{% endraw %} + ### Owntracks battery level sensor If you are using the [OwnTracks](/integrations/owntracks) and enable the reporting of the battery level then you can use an MQTT sensor to keep track of your battery. A regular MQTT message from OwnTracks looks like this: From af1a3741f73303274f690e82e9abc6ece8257dd2 Mon Sep 17 00:00:00 2001 From: shbatm Date: Wed, 19 May 2021 19:26:07 -0500 Subject: [PATCH 43/79] Add Z-Wave Parameter and Node Rename Services to ISY994 (#17891) * Add new service descriptions to ISY994 * Fix markdown lint gone haywire * Fix incorrect optional parameters --- source/_integrations/isy994.markdown | 36 +++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/source/_integrations/isy994.markdown b/source/_integrations/isy994.markdown index 57466244ea5..a8dc28894f3 100644 --- a/source/_integrations/isy994.markdown +++ b/source/_integrations/isy994.markdown @@ -47,6 +47,7 @@ There is currently support for the following device types within Home Assistant: Home Assistant is capable of communicating with any binary sensor, cover, fan, light, lock, sensor and switch that is configured on the controller. Using the programs on the controller, custom binary sensors, cover, fan, lock, and switches can also be created. {% include integrations/config_flow.md %} + ## Manual configuration You may also configure the integration manually by adding the following section to your `configuration.yaml` file: @@ -165,7 +166,7 @@ Send a command to an ISY Device using its Home Assistant entity ID. Valid comman | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | -| `entity_id` | yes | Name(s) of entities to send the command, e.g., `light.front_porch`. | +| `entity_id` | no | Name(s) of entities to send the command, e.g., `light.front_porch`. | | `command` | no | The command to be sent to the device, e.g., `"fast_on"` | #### Service `isy994.send_raw_node_command` @@ -174,19 +175,48 @@ Send a "raw" (e.g., `DON`, `DOF`) ISY REST Device Command to a Node using its Ho | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | -| `entity_id` | yes | Name(s) of entities to send the command, e.g., `light.front_porch`. | +| `entity_id` | no | Name(s) of entities to send the command, e.g., `light.front_porch`. | | `command` | no | The ISY REST Command to be sent to the device, e.g., `"DON"` | | `value` | yes | The integer value to be sent with the command, if required by the command, e.g., `255` | | `parameters` | yes | A `dict` of parameters to be sent in the query string for controlling colored bulbs or advanced parameters, e.g., `{ GV2: 0, GV3: 0, GV4: 255 }` | | `unit_of_measurement` | yes | The ISY Unit of Measurement (UOM) to send with the command, if required, e.g., `67` | +#### Service `isy994.get_zwave_parameter` + +Request a Z-Wave Device parameter via the ISY. The parameter value will be returned as a entity extra state attribute with the name "ZW#" where "#" is the parameter number. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | +| `entity_id` | no | Name of entity to send the command, e.g., `light.front_porch`. This must be an ISY Z-Wave Node. | +| `parameter` | no | The parameter number to retrieve from the end device. | + +#### Service `isy994.set_zwave_parameter` + +Update a Z-Wave Device parameter via the ISY. The parameter value will also be returned as a entity extra state attribute with the name "ZW#" where "#" is the parameter number. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | ----------------------------------------------------------------------------------------------- | +| `entity_id` | no | Name of entity to send the command, e.g., `light.front_porch`. This must be an ISY Z-Wave Node. | +| `parameter` | no | The parameter number to set on the end device. | +| `value` | no | The value to set for the parameter. May be an integer or byte string (e.g. "0xFFFF"). | +| `size` | no | The size of the parameter, either 1, 2, or 4 bytes. | + +#### Service `isy994.rename_node` + +Rename a node or group (scene) on the ISY994. Note: this will not automatically change the Home Assistant Entity Name or Entity ID to match. The entity name and ID will only be updated after calling `isy994.reload` or restarting Home Assistant, and ONLY IF you have not already customized the name within Home Assistant. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------------------------------- | +| `entity_id` | no | Name of entity to send the command, e.g., `light.front_porch`. | +| `name` | no | The new name to use within the ISY994. | + #### Service `isy994.set_on_level` Send an ISY set_on_level command to a `light` Node to set the devices' local On Level. | Service data attribute | Optional | Description | | ---------------------- | -------- | ----------- | -| `entity_id` | yes | Name(s) of entities to send the command, e.g., `light.front_porch`. | +| `entity_id` | no | Name(s) of entities to send the command, e.g., `light.front_porch`. | | `value` | no | The integer value to set the On Level to in a range of 0-255, e.g., `255` | #### Service `isy994.set_ramp_rate` From 53fb699dfd538c5b6e245eb3ffad4b65ae7da079 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Thu, 20 May 2021 11:43:51 +0200 Subject: [PATCH 44/79] Mqtt fan docs update for new state reset attributes (#17820) * Mqtt fan docs upate for new state reset attributes * Better description of new payload_reset_attributes --- source/_docs/mqtt/discovery.markdown | 2 ++ source/_integrations/fan.mqtt.markdown | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/source/_docs/mqtt/discovery.markdown b/source/_docs/mqtt/discovery.markdown index 471ec71cd74..3833fbd041e 100644 --- a/source/_docs/mqtt/discovery.markdown +++ b/source/_docs/mqtt/discovery.markdown @@ -189,6 +189,8 @@ Supported abbreviations: 'pl_strt': 'payload_start', 'pl_stpa': 'payload_start_pause', 'pl_ret': 'payload_return_to_base', + 'pl_rst_pct': 'payload_reset_percentage', + 'pl_rst_pr_mode': 'payload_reset_preset_mode', 'pl_toff': 'payload_turn_off', 'pl_ton': 'payload_turn_on', 'pl_unlk': 'payload_unlock', diff --git a/source/_integrations/fan.mqtt.markdown b/source/_integrations/fan.mqtt.markdown index 18f17e056f7..167ce449a6d 100644 --- a/source/_integrations/fan.mqtt.markdown +++ b/source/_integrations/fan.mqtt.markdown @@ -169,6 +169,16 @@ payload_oscillation_on: required: false type: string default: oscillate_on +payload_reset_percentage: + description: A special payload that resets the `percentage` state attribute to `None` when received at the `percentage_state_topic`. + required: false + type: string + default: 'None' +payload_reset_preset_mode: + description: A special payload that resets the `preset_mode` state attribute to `None` when received at the `preset_mode_state_topic`. + required: false + type: string + default: 'None' percentage_command_template: description: Defines a [template](/docs/configuration/templating/#processing-incoming-data) to generate the payload to send to `percentage_command_topic`. required: false From 625912d694070e4f4ff9216311a7e420d8af9052 Mon Sep 17 00:00:00 2001 From: Artem Draft Date: Thu, 20 May 2021 15:20:38 +0300 Subject: [PATCH 45/79] New documentation about play_media service in LG Netcast (#17543) --- source/_integrations/lg_netcast.markdown | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/source/_integrations/lg_netcast.markdown b/source/_integrations/lg_netcast.markdown index 7d57d93555b..f23d0855f52 100644 --- a/source/_integrations/lg_netcast.markdown +++ b/source/_integrations/lg_netcast.markdown @@ -66,3 +66,17 @@ media_player: mac: AA-BB-CC-DD-EE-FF broadcast_address: 11.22.33.44 ``` + +## Change channel through play_media service + +The `play_media` service can be used in a script to switch to the specified TV channel. It selects the major channel number according to the `media_content_id` parameter: + +```yaml +# Example action entry in script to switch to channel number 15 +service: media_player.play_media +target: + entity_id: media_player.lg_tv +data: + media_content_id: 15 + media_content_type: channel +``` From ed4d77f6f3b52c29a2b4608247606a8b17750243 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Thu, 20 May 2021 15:45:53 +0200 Subject: [PATCH 46/79] Add EDS0066 to supported onewire devices (#17711) --- source/_integrations/onewire.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index 679c01f573e..abb7fde310f 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -75,7 +75,7 @@ Notes: -
Bridge devices have no sensors. The `aux` and `main` branches are searched for additional 1-wire devices during discovery. -- Multisensors manufactures by Embedded Data Systems. Currently only EDS0068 (temperature/humidity/barometric pressure/light) is supported. +- Multisensors manufactured by Embedded Data Systems. Currently only EDS0066 (temperature/barometric pressure) and EDS0068 (temperature/humidity/barometric pressure/light) are supported. ## Interfacing with the 1-wire bus From a99cf5ab981548e2e7da0852def230e34d8db5e5 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Thu, 20 May 2021 17:05:43 +0200 Subject: [PATCH 47/79] Add DS2405 to supported onewire devices (#17710) --- source/_integrations/onewire.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/onewire.markdown b/source/_integrations/onewire.markdown index abb7fde310f..63f21dd7000 100644 --- a/source/_integrations/onewire.markdown +++ b/source/_integrations/onewire.markdown @@ -52,6 +52,7 @@ Each 1-wire component data sheet describes the different properties the componen | Family | Device | Physical Quantity | | -------|:-----|:-----| +| 05 | [DS2405](https://datasheets.maximintegrated.com/en/ds/DS2405.pdf) | 1 PIO [4](#note_4) | | 12 | [DS2406](https://datasheets.maximintegrated.com/en/ds/DS2406.pdf) | 2 latches (latch.A/B) and 2 PIOs (PIO.A/B) [4](#note_4) | | 29 | [DS2408](https://datasheets.maximintegrated.com/en/ds/DS2408.pdf) | 8 latches (latch.0-7) and 8 PIOs (PIO.0/7) [4](#note_4) | From 53e8ba38047c2bec623dfd54d5abd7f72d113c6c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 20 May 2021 17:38:04 +0200 Subject: [PATCH 48/79] Add note about TensorFlow only available on Core (#17907) --- source/_integrations/tensorflow.markdown | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/_integrations/tensorflow.markdown b/source/_integrations/tensorflow.markdown index 9837b7686aa..6e4e9b5a780 100644 --- a/source/_integrations/tensorflow.markdown +++ b/source/_integrations/tensorflow.markdown @@ -8,11 +8,16 @@ ha_release: 0.82 ha_domain: tensorflow --- -The `tensorflow` image processing platform allows you to detect and recognize objects in a camera image using [TensorFlow](https://www.tensorflow.org/). The state of the entity is the number of objects detected, and recognized objects are listed in the `summary` attribute along with quantity. The `matches` attribute provides the confidence `score` for recognition and the bounding `box` of the object for each detection category. +The TensorFlow image processing platform allows you to detect and recognize objects in a camera image using [TensorFlow](https://www.tensorflow.org/). The state of the entity is the number of objects detected, and recognized objects are listed in the `summary` attribute along with quantity. The `matches` attribute provides the confidence `score` for recognition and the bounding `box` of the object for each detection category. -{% details "Notes for Home Assistant Core Installations" %} +
+This integration is only available on Home Assistant Core installation types. Unfortunately, it cannot be used with Home Assistant OS, Supervised or Container. +
+ +## Prerequisites The following packages must be installed on Debian before following the setup for the integration to work: + `sudo apt-get install libatlas-base-dev libopenjp2-7 libtiff5` It is possible that Home Assistant is unable to install the Python TensorFlow bindings. If that is the case, @@ -24,8 +29,6 @@ See [the official install guide](https://www.tensorflow.org/install/) for other Furthermore, the official Python TensorFlow wheels by Google, require your CPU to support the `avx` extension. If your CPU lacks those capabilities, Home Assistant will crash when using TensorFlow, without any message. -{% enddetails %} - ## Preparation This integration requires files to be downloaded, compiled on your computer, and added to the Home Assistant configuration directory. These steps can be performed by cloning [this repository](https://github.com/hunterjm/hass-tensorflow) into your configuration directory. Alternatively, if you wish to perform the process manually, the process is as follows: From 9b4b5c7da1d2342afbd2d0479da4dc5d264f1780 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Fri, 21 May 2021 18:35:45 +0300 Subject: [PATCH 49/79] Add min/max/step to MQTT number (#17894) --- source/_integrations/number.mqtt.markdown | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/_integrations/number.mqtt.markdown b/source/_integrations/number.mqtt.markdown index bf36dd2a23f..9264a5720ef 100644 --- a/source/_integrations/number.mqtt.markdown +++ b/source/_integrations/number.mqtt.markdown @@ -99,6 +99,16 @@ json_attributes_topic: description: The MQTT topic subscribed to receive a JSON dictionary payload and then set as number attributes. Implies `force_update` of the current number state when a message is received on this topic. required: false type: string +min: + description: Minimum value. + required: false + type: float + default: 1 +max: + description: Maximum value. + required: false + type: float + default: 100 name: description: The name of the Number. required: false @@ -122,6 +132,11 @@ state_topic: description: The MQTT topic subscribed to receive number values. required: false type: string +step: + description: Step value. Smallest value `0.001`. + required: false + type: float + default: 1 unique_id: description: An ID that uniquely identifies this Number. If two Numbers have the same unique ID Home Assistant will raise an exception. required: false From d0bbb8cbd4e9a72e05760bbbe35f39f5c75664d3 Mon Sep 17 00:00:00 2001 From: PeteBa Date: Sat, 22 May 2021 16:34:32 +0100 Subject: [PATCH 50/79] Recorder "purge entities" service (#17867) --- source/_integrations/recorder.markdown | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/_integrations/recorder.markdown b/source/_integrations/recorder.markdown index 97ce6591b59..ac34167d0b1 100644 --- a/source/_integrations/recorder.markdown +++ b/source/_integrations/recorder.markdown @@ -207,6 +207,16 @@ Note that purging will not immediately decrease disk space usage but it will sig | `repack` | yes | When using SQLite or PostgreSQL this will rewrite the entire database. When using MySQL or MariaDB it will optimize or recreate the events and states tables. This is a heavy operation that can cause slowdowns and increased disk space usage while it runs. Only supported by SQLite, PostgreSQL, MySQL and MariaDB. | | `apply_filter` | yes | Apply entity_id and event_type filter in addition to time based purge. Useful in combination with `include` / `exclude` filter to remove falsely added states and events. Combine with `repack: true` to reduce database size. | +### Service `purge_entities` + +Call the service `recorder.purge_entities` to start a task that purges events and states from the recorder database that match any of the specified `entity_id`, `domains` and `entity_globs` fields. Note: leaving all three parameters empty will result in all entities being selected for purging. + +| Service data attribute | Optional | Description | +| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `entity_id` | yes | A list of entity_ids that should be purged from the recorder database. | +| `domains` | yes | A list of domains that should be purged from the recorder database. | +| `entity_globs` | yes | A list of regular expressions that identify entities to purge from the recorder database. | + ### Service `disable` Call the service `recorder.disable` to stop saving events and states to the database. From 715ec65119b797bc0086e3303915525bc64d6928 Mon Sep 17 00:00:00 2001 From: carstenschroeder Date: Sat, 22 May 2021 17:35:22 +0200 Subject: [PATCH 51/79] Adds Cloud Coverage to Forecast of Openweathermap (#17925) --- source/_integrations/openweathermap.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/openweathermap.markdown b/source/_integrations/openweathermap.markdown index a07bcd5d49f..f132f462f39 100644 --- a/source/_integrations/openweathermap.markdown +++ b/source/_integrations/openweathermap.markdown @@ -90,6 +90,7 @@ The time period these sensors use depends on the forecast mode selected when con | Condition | Description | | :----------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `forecast_cloud_coverage` | Cloudiness, %. | | `forecast_condition` | [Weather condition](https://developers.home-assistant.io/docs/core/entity/weather/#recommended-values-for-state-and-condition) for the forecast's time period. | | `forecast_precipitation` | Combined Rain and Snow volume for the forecast's time period, mm. | | `forecast_precipitation_probability` | Probability of precipitation for the forecast's time period. | From 62f1c51522e6c3b589f8cf78b52f6c3296cb7c80 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 22 May 2021 15:34:13 -0500 Subject: [PATCH 52/79] Update samsungtv for built-in wake on lan support (#17928) Co-authored-by: Franck Nijhof --- source/_integrations/samsungtv.markdown | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/source/_integrations/samsungtv.markdown b/source/_integrations/samsungtv.markdown index cc5e5763003..ae48b77b0c9 100644 --- a/source/_integrations/samsungtv.markdown +++ b/source/_integrations/samsungtv.markdown @@ -51,9 +51,11 @@ turn_on_action: After saving the YAML configuration, the TV must be turned on _before_ launching Home Assistant in order for the TV to be registered the first time. -#### Wake up TV +#### Wake up TV / TV does not turn on -To wake up the TV when switched off you can use the [wake-on-lan](/integrations/wake_on_lan/) integration and call a service. This is not possible with every device. +If the integration knows the MAC address of the TV from discovery, it will attempt to wake it using wake on LAN when calling turn on. Wake on LAN must be enabled on the TV for this to work. If the TV is connected to a smart strip or requires a more complex turn-on process, a `turn_on_action` can be provided that will take precedence over the built-in wake on LAN functionality. + +To wake up the TV when switched off you can use the [wake-on-lan](/integrations/wake_on_lan/) integration and call a service. ```yaml wake_on_lan: From 874081937050a9bc6301271a270ac9df3028fe38 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 23 May 2021 04:48:10 -0500 Subject: [PATCH 53/79] Add Oracle connection strings (#17912) --- source/_integrations/recorder.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_integrations/recorder.markdown b/source/_integrations/recorder.markdown index ac34167d0b1..adff936565f 100644 --- a/source/_integrations/recorder.markdown +++ b/source/_integrations/recorder.markdown @@ -252,6 +252,7 @@ The following database engines are tested when major changes are made to the rec | PostgreSQL (Socket) | `postgresql://@/DB_NAME` | | PostgreSQL (Custom socket dir) | `postgresql://@/DB_NAME?host=/path/to/dir` | | MS SQL Server | `mssql+pyodbc://username:password@SERVER_IP:1433/DB_NAME?charset=utf8&driver=DRIVER` | +| Oracle | `oracle+cx_oracle://username:password@SERVER_IP:1521/DB_NAME?encoding=UTF-8&nencoding=UTF-8` |
From f5a8eaaf08884b2e0b360f775acb5ea5db55861e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 23 May 2021 15:30:40 -0500 Subject: [PATCH 54/79] Add Pairing with an insecure setup code section (#17937) --- source/_integrations/homekit_controller.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/homekit_controller.markdown b/source/_integrations/homekit_controller.markdown index e24876d3b2c..ef9e114aa22 100644 --- a/source/_integrations/homekit_controller.markdown +++ b/source/_integrations/homekit_controller.markdown @@ -103,6 +103,10 @@ When you have filled in the rest of the form to create your migration it will sh

+## Pairing with an insecure setup code + +Some device manufacturers do not follow the HomeKit spec and will use a fixed code or trivially guessable code such as `123-45-678` for pairing. HomeKit Controller will warn when pairing about the insecure nature of this configuration and require additional consent before pairing with the accessory. Consider finding a replacement device that implements code randomization. + ## Troubleshooting ### I don't have a HomeKit PIN From b9a95e0439272a10935f1d25bf8b593d586b5046 Mon Sep 17 00:00:00 2001 From: jacekpaszkowski Date: Tue, 25 May 2021 11:16:10 +0200 Subject: [PATCH 55/79] Add support for effects, transition/brightness parameters to template light, min_mireds and max_mireds templates (#15801) --- source/_integrations/light.template.markdown | 50 +++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/source/_integrations/light.template.markdown b/source/_integrations/light.template.markdown index c4ccc917c21..92cf57d5a71 100644 --- a/source/_integrations/light.template.markdown +++ b/source/_integrations/light.template.markdown @@ -29,6 +29,7 @@ light: value_template: "{{ state_attr('sensor.theater_brightness', 'lux')|int > 0 }}" temperature_template: "{{states('input_number.temperature_input') | int}}" color_template: "({{states('input_number.h_input') | int}}, {{states('input_number.s_input') | int}})" + effect_list_template: "{{ state_attr('light.led_strip', 'effect_list') }}" turn_on: service: script.theater_lights_on turn_off: @@ -56,6 +57,21 @@ light: data: value: "{{ s }}" entity_id: input_number.s_input + - service: light.turn_on + data_template: + entity_id: + - light.led_strip + transition: "{{ transition | float }}" + hs_color: + - "{{ hs[0] }}" + - "{{ hs[1] }}" + set_effect: + - service: light.turn_on + data_template: + entity_id: + - light.led_strip + effect: "{{ effect }}" + supports_transition_template: "{{ true }}" ``` {% endraw %} @@ -99,6 +115,31 @@ light: required: false type: template default: optimistic + supports_transition_template: + description: Defines a template to get if light supports transition. Should return boolean value (True/False). If this value is `True` transition parameter in a turn on or turn off call will be passed as a named parameter `transition` to either of the scripts. + required: false + type: template + default: false + effect_list_template: + description: Defines a template to get the list of supported effects. Must render a list + required: inclusive + type: template + default: optimistic + effect_template: + description: Defines a template to get the effect of the light. + required: inclusive + type: template + default: optimistic + min_mireds_template: + description: Defines a template to get the min mireds value of the light. + required: false + type: template + default: optimistic + max_mireds_template: + description: Defines a template to get the max mireds value of the light. + required: false + type: template + default: optimistic icon_template: description: Defines a template for an icon or picture, e.g., showing a different icon for different states. required: false @@ -117,7 +158,7 @@ light: required: true type: action set_level: - description: Defines an action to run when the light is given a brightness command. + description: Defines an action to run when the light is given a brightness command. The script will only be called if the `turn_on` call only has brightness, and optionally transition. required: false type: action set_temperature: @@ -132,6 +173,10 @@ light: description: Defines an action to run when the light is given a color command. required: false type: action + set_effect: + description: Defines an action to run when the light is given a effect command. + required: inclusive + type: action {% endconfiguration %} ## Considerations @@ -145,6 +190,9 @@ For example, you would replace with this equivalent that returns `true`/`false` and never gives an unknown result: {% raw %}`{{ is_state('switch.source', 'on') }}`{% endraw %} +Transition doesn't have its own script, it will instead be passed as a named parameter `transition` to the `turn_on`, `turn_off`, `brightness`, `color_temp`, `effect`, `hs_color` or `white_value` scripts. +Brightness will be passed as a named parameter `brightness` to either of `turn_on`, `color_temp`, `effect`, `hs_color` or `white_value` scripts if the corresponding parameter is also in the call. In this case the brightness script (`set_level`) will not be called. +If only brightness is passed to `light.turn_on` service call then `set_level` script is called. ## Examples From d7b480946353fd37ea92c32fdd14e05e5996ecaa Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 25 May 2021 11:30:08 +0200 Subject: [PATCH 56/79] Document MQTT sensor state_class (#17949) --- source/_integrations/sensor.mqtt.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown index c1de8e28308..22a87f2273d 100644 --- a/source/_integrations/sensor.mqtt.markdown +++ b/source/_integrations/sensor.mqtt.markdown @@ -134,6 +134,11 @@ qos: required: false type: integer default: 0 +state_class: + description: The [state_class](https://developers.home-assistant.io/docs/core/entity/sensor#available-state-classes) of the sensor. + required: false + type: string + default: None state_topic: description: The MQTT topic subscribed to receive sensor values. required: true From e5ed3e26d530b73611c994206b5777518c9f9182 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Tue, 25 May 2021 12:08:44 +0200 Subject: [PATCH 57/79] KNX: Remove deprecated create_sensors option (#17905) --- source/_integrations/knx.markdown | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 8fdce09ed00..8d2407810ca 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -705,11 +705,6 @@ max_temp: description: Override the maximum temperature. required: false type: float -create_temperature_sensors: - description: If true, dedicated sensor entities are created for current and target temperature. - required: false - type: boolean - default: false {% endconfiguration %} ## Cover @@ -1337,7 +1332,6 @@ knx: address_day_night: "7/0/8" address_air_pressure: "7/0/9" address_humidity: "7/0/10" - create_sensors: false sync_state: true ``` @@ -1399,11 +1393,6 @@ address_humidity: description: KNX address for reading current humidity. *DPT 9.007* required: false type: [string, list] -create_sensors: - description: If true, dedicated sensor entities are created for all configured properties. - required: false - type: boolean - default: false sync_state: description: Actively read the value from the bus. If `false` no GroupValueRead telegrams will be sent to the bus. required: false From b81316a425ae950eafb0c1e45790d22e9e0857d3 Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 25 May 2021 12:30:11 +0200 Subject: [PATCH 58/79] Add integration options for Fritz (#17854) Co-authored-by: Franck Nijhof --- source/_integrations/fritz.markdown | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/_integrations/fritz.markdown b/source/_integrations/fritz.markdown index 3115d9c16bf..b89b29de118 100644 --- a/source/_integrations/fritz.markdown +++ b/source/_integrations/fritz.markdown @@ -66,8 +66,15 @@ If you have a dynamic IP address, most likely it will change. | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | | `entity_id` | no | Only act on a specific router | +## Integration Options + +It is possible to change some behaviors through the integration options. +These can be changed at **AVM FRITZ!Box Tools** -> **Configure** on the Integrations page. + +- **Consider home**: Number of seconds that must elapse before considering a disconnected device "not at home". + ## Additional info -The configuration in the UI asks for a username. Starting from FRITZ!OS 7.24 the FRITZ!Box creates a random username for the admin user if you didn't set one yourself. This can be found after logging into the FRITZ!Box and visiting System -> FRITZ!Box Users -> Users. The username starts with `fritz` followed by four random numbers. Under properties on the right it says `created automatically`. Prior to FRITZ!OS 7.24 the default username was `admin`. +**Note 1**: All devices to be tracked, even the new detected, are disabled by default. You need to enable the wanted entities manually. -See the [device tracker integration page](/integrations/device_tracker/) for instructions how to configure the people to be tracked. +**Note 2**: If you don't want to automatically track newly detected devices, disable the integration system option `Enable new added entities`. From fdbc7b7edd95d80788f548df4607a116162be2e9 Mon Sep 17 00:00:00 2001 From: hesselonline Date: Tue, 25 May 2021 12:31:34 +0200 Subject: [PATCH 59/79] Wallbox documentation (related to HA PR 48082) (#17085) * Wallbox documentation (related to HA PR 48082) related to HA PR 48082 (https://github.com/home-assistant/core/pull/48082), documentation for new wallbox sensor component. * Update wallbox.markdown added ha_config_flow = true * Update wallbox.markdown added {% include integrations/config_flow.md %} * Update source/_integrations/wallbox.markdown changed based om comment from frenck Co-authored-by: Franck Nijhof * Update source/_integrations/wallbox.markdown changed based om comment from frenck Co-authored-by: Franck Nijhof * Update wallbox.markdown fixed spelling error after comment change * Bump HA release Co-authored-by: Franck Nijhof --- source/_integrations/wallbox.markdown | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 source/_integrations/wallbox.markdown diff --git a/source/_integrations/wallbox.markdown b/source/_integrations/wallbox.markdown new file mode 100644 index 00000000000..3a77fac3987 --- /dev/null +++ b/source/_integrations/wallbox.markdown @@ -0,0 +1,32 @@ +--- +title: Wallbox +description: Instructions on how to integrate sensors Wallbox EV chargers to Home Assistant +ha_category: + - Car +ha_release: 2021.6 +ha_iot_class: Cloud Polling +ha_domain: wallbox +ha_platforms: + - sensor +ha_config_flow: true +--- + +The Wallbox integration pulls data from the [MyWallbox Portal](https://my.wallbox.com) for your Wallbox charging station. + +{% include integrations/config_flow.md %} + +## Sensors + +The integration adds the following sensors: + +- Added Energy +- Added Range +- Charging Power +- Charging Speed +- Charging Time +- Cost +- Current Mode +- Depot Price +- Max Available Power +- State of Charge +- Status Description From 977ae617e70ec8fb0afabe630601acf8b6301d80 Mon Sep 17 00:00:00 2001 From: Eduard van Valkenburg Date: Tue, 25 May 2021 13:04:35 +0200 Subject: [PATCH 60/79] docs for new SIA integration (#13718) Co-authored-by: Franck Nijhof --- source/_integrations/sia.markdown | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 source/_integrations/sia.markdown diff --git a/source/_integrations/sia.markdown b/source/_integrations/sia.markdown new file mode 100644 index 00000000000..b17603c9b13 --- /dev/null +++ b/source/_integrations/sia.markdown @@ -0,0 +1,60 @@ +--- +title: SIA Alarm Systems +description: Instructions on how to integrate SIA DC-09 Based Alarm systems into Home Assistant. +ha_category: + - Alarm +ha_release: 2021.6 +ha_iot_class: "Local Push" +ha_quality_scale: platinum +ha_config_flow: true +ha_codeowners: + - '@eavanvalkenburg' +ha_domain: sia +--- + +The SIA Alarm Systems integration provides integration with several alarm systems that implement the SIA DC-09 Protocol, including [Ajax Systems](https://ajax.systems/). This protocol is listen-only, so does not allow you to turn on/off your alarm system, it just updates the state to reflect your alarm and allows you to act on that state, for instance turning on all lights and opening the curtains when the alarm triggers. + +To use this platform, you need to setup your alarm system to communicate using the SIA Protocol and setup several things on the alarm. This integration basically works by Home Assistant listening on a port for messages from the alarm systems and handling and responding to that message and finally updating one or more entities in Home Assistant. + +## Alarm Setup (Ajax Systems Hub example) + +1. In the settings of your hub, go to the monitoring stations page. +2. Select "SIA Protocol". +3. Enable "Connect on demand". +4. Place Account Id - 3-16 ASCII hex characters. For example AAA. +5. Insert Home Assistant IP address. The hub must be able to reach this IP address. There is no cloud connection necessary. +6. Insert Home Assistant listening port. This port must not be used by anything else on the machine Home Assistant is running on, see the notes on [port usage](###Portusage) below. +7. Select Preferred Network. Ethernet is preferred if hub and HA in same network. Multiple networks are not tested. +8. Enable Periodic Reports. The interval with which the alarm systems reports to the monitoring station, default is 1 minute. This component adds 30 seconds before setting the alarm unavailable to deal with slights latencies between ajax and HA and the async nature of HA. +9. Encryption is preferred but optional. Password is 16 ASCII characters. + +{% include integrations/config_flow.md %} + +{% configuration_basic %} +port: + description: Port that your alarm will communicate with, must be set in the alarm system as explained above. +account: + description: Hub account to communicate with. 3-16 ASCII hex characters. Must be set in the alarm system as explained above. +encryption_key: + description: Encoding key. 16 ASCII characters. Must be same, as in hub properties. +ping_interval: + description: Ping interval in minutes that the alarm system uses to send "Automatic communication test report" messages, the component adds 30 seconds before marking all entities for that account (alarm and binary sensors) unavailable. Must be between 1 and 1440 minutes. +zones: + description: The number of zones configured in your alarm. +additional_account: + description: Used to ask if a additional account needs to be included, if so will open a dialog for the next account, after checking the current input. +{% endconfiguration_basic %} + +ASCII characters are 0-9 and ABCDEF, so a account is something like `346EB` and the encryption key has the same characters but needs to be 16 characters in length. + +### Note on monitoring multiple alarm systems + +If you have multiple accounts (alarm systems) that you want to monitor you can choose to have all communicating with the same port, in that case, use the additional accounts checkbox in the dialog to setup the next account and keep doing that until you have them all. You can also choose to have both running on a different port, in that case setup the component twice with the different ports. + +### Port usage + +The port used with this component must be a port no other processes use on the machine your HA instance is running. If you have a complex network setup or want to monitor alarm systems at other locations you will most likely have to open firewalls and/or create network routes for that purpose, the integration will just listen for messages coming into that port, and will not proactively send, only responding with a acknowledgement to the alarm system. + +### Entities + +In the initial version, after setup you will see one alarm_control_panel per account and zone combination. This has a attribute for `last_heartbeat` that you could use for a template sensor in order to have that separated out. There is also a attribute for the `last_message` that will hold events happening to moisture and smoke sensors in that zone, entities supporting that will follow. From e974f3fac2136aec2f60d596f1bee51bf8e3ce17 Mon Sep 17 00:00:00 2001 From: Matt Zimmerman Date: Tue, 25 May 2021 04:05:03 -0700 Subject: [PATCH 61/79] Add documentation for SmartTub services (#16721) * add documentation for smarttub services * Apply suggestions from code review Co-authored-by: Franck Nijhof --- source/_integrations/smarttub.markdown | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/source/_integrations/smarttub.markdown b/source/_integrations/smarttub.markdown index 0d2eae3e57e..e13198f38ff 100644 --- a/source/_integrations/smarttub.markdown +++ b/source/_integrations/smarttub.markdown @@ -30,3 +30,27 @@ The `smarttub` integration allows you to view and control hot tubs which use the - A SmartTub account (registration is not supported, you can use the SmartTub mobile app) {% include integrations/config_flow.md %} + +## Services + +### Service `smarttub.set_primary_filtration` + +This service allows you to update the settings for the primary filtration cycle +on a hot tub. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | yes | The entity to update. | sensor.jacuzzi_j_335_primary_filtration_cycle +| `duration` | no | The desired duration of the primary filtration cycle, in hours. | 4 +| `start_hour` | no | The desired starting hour of the day for the primary filtration cycle. | 2 (i.e. 02:00 or 2:00am) + + +### Service `smarttub.set_secondary_filtration` + +This service allows you to update the settings for the secondary filtration +cycle on a hot tub. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | yes | The entity to update. | sensor.jacuzzi_j_335_secondary_filtration_cycle +| `mode` | no | The desired secondary filtration mode. Can be frequent, infrequent or away. | away From f7b6bbaa1b97a3f0d917a02e9b16908b6edcbca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Moreno?= Date: Tue, 25 May 2021 13:20:09 +0200 Subject: [PATCH 62/79] Add documentation for new Meteoclimatic integration (#13786) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Meteoclimatic integration documentation Signed-off-by: Adrián Moreno * Set HA release target Signed-off-by: Adrián Moreno * Apply frenck's suggestions Signed-off-by: Adrian Moreno * Remove sensor redirect Signed-off-by: Adrian Moreno * Remove weather redirect Signed-off-by: Adrian Moreno * Final tweaks Co-authored-by: Franck Nijhof --- CODEOWNERS | 1 + source/_integrations/meteoclimatic.markdown | 22 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 source/_integrations/meteoclimatic.markdown diff --git a/CODEOWNERS b/CODEOWNERS index de2517f57b7..a5c84b2f2db 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -269,6 +269,7 @@ source/_integrations/met.markdown @danielhiversen @thimic source/_integrations/met_eireann.markdown @DylanGore source/_integrations/meteo_france.markdown @hacf-fr @oncleben31 @Quentame source/_integrations/meteoalarm.markdown @rolfberkenbosch +source/_integrations/meteoclimatic.markdown @adrianmo source/_integrations/metoffice.markdown @MrHarcombe source/_integrations/miflora.markdown @danielhiversen @basnijholt source/_integrations/mikrotik.markdown @engrbm87 diff --git a/source/_integrations/meteoclimatic.markdown b/source/_integrations/meteoclimatic.markdown new file mode 100644 index 00000000000..8b82f74362d --- /dev/null +++ b/source/_integrations/meteoclimatic.markdown @@ -0,0 +1,22 @@ +--- +title: Meteoclimatic +description: Instructions on how to integrate Meteoclimatic within Home Assistant. +ha_release: 2021.6 +ha_iot_class: Cloud Polling +ha_category: + - Weather +ha_codeowners: + - '@adrianmo' +ha_config_flow: true +ha_domain: meteoclimatic +--- + +The Meteoclimatic integration uses the [Meteoclimatic](https://www.meteoclimatic.net/) web service as a source for meteorological data for your location. The location is based on the Meteoclimatic station code (e.g., `ESCAT4300000043206B`) and the weather data reported is based on the capabilities of each station. + +There is currently support for the following platforms within Home Assistant: + +- Weather + +It displays the current weather reported by specific Meteoclimatic stations. + +{% include integrations/config_flow.md %} From e3c7718aea0c34ab45c1e9a9e531f281a97671b5 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Tue, 25 May 2021 13:36:43 +0200 Subject: [PATCH 63/79] Frontend docs for new dark mode themes (#17960) Co-authored-by: Franck Nijhof --- source/_integrations/frontend.markdown | 51 +++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/source/_integrations/frontend.markdown b/source/_integrations/frontend.markdown index 2eb66e3375a..d939ac9789f 100644 --- a/source/_integrations/frontend.markdown +++ b/source/_integrations/frontend.markdown @@ -49,7 +49,9 @@ frontend: ## Defining Themes -Starting with version 0.49 you can define themes: +### Theme format + +The frontend integration allows you to create custom themes to influence the look and feel of the user interface. ```yaml # Example configuration.yaml entry @@ -60,11 +62,50 @@ frontend: text-primary-color: purple mdc-theme-primary: plum sad: - primary-color: blue + primary-color: steelblue ``` -The example above defined two themes named `happy` and `sad`. For each theme you can set values for CSS variables. If you want to provide hex color values, wrap those in apostrophes, since otherwise YAML would consider them to be comments (`primary-color: '#123456'`). For a partial list of variables used by the main frontend see [ha-style.ts](https://github.com/home-assistant/home-assistant-polymer/blob/master/src/resources/ha-style.ts). +The example above defines two themes named `happy` and `sad`. For each theme, you can set values for CSS variables. If you want to provide hex color values, wrap those in apostrophes, since otherwise, YAML would consider them a comment (`primary-color: '#123456'`). For a partial list of variables used by the main frontend see [ha-style.ts](https://github.com/home-assistant/home-assistant-polymer/blob/master/src/resources/ha-style.ts). +### Dark mode support + +It is also possible to create themes that are based on the default dark mode theme. New themes can also support both light and dark mode and allow the user to switch between those on the user profile page: + +{% my profile badge %} + +Extended example to show the mode definitions. + +```yaml +# Example configuration.yaml entry +frontend: + themes: + happy: + primary-color: pink + text-primary-color: purple + mdc-theme-primary: plum + sad: + primary-color: steelblue + modes: + dark: + secondary-text-color: slategray + day_and_night: + primary-color: coral + modes: + light: + secondary-text-color: olive + dark: + secondary-text-color: slategray +``` + +Theme `happy`: Same as in the previous example. This legacy format is still supported and will behave as before and automatically use the default light theme as the base. + +Theme `sad`: By using the new `mode` key plus the subkey `dark` this theme will now be based on the default dark theme. The final theme rules are determined in three steps: First, the default dark theme CSS variables will be applied, then second the CSS variables from the top level of the theme that are mode-independent (`primary-color: steelblue` in this example) and lastly the mode-specific CSS variables will be layered on top (`secondary-text-color: slategray`). + +Note: Since this example theme only has a `dark` mode defined, this mode will automatically be used. + +Theme `day_and_night`: This theme has both a `light` and a `dark` mode section. That tells the frontend to allow the user to choose which mode to use from the user profile (default selection is based on the system settings). Independent of the selection, the primary color will be set to green, but based on the chosen mode either the default light or dark theme will be used as the basis for rendering, plus the secondary text color will be either olive or slategray. + +### Theme configuration splitting As with all configuration, you can either: - Directly specify the themes inside your `configuration.yaml` file @@ -75,9 +116,9 @@ For more details about splitting up the configuration into multiple files, see [ Check our [community forums](https://community.home-assistant.io/c/projects/themes) to find themes to use. -## Setting themes +## Setting Themes -There are 2 themes-related services: +There are two themes-related services: - `frontend.reload_themes`: Reloads theme configuration from your `configuration.yaml` file. - `frontend.set_theme`: Sets backend-preferred theme name. From b62714bfd4bf5648adb68993ee54149509ec6152 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Tue, 25 May 2021 17:18:23 +0200 Subject: [PATCH 64/79] Rework modbus documentation. (#17874) Co-authored-by: Klaas Schoute Co-authored-by: Franck Nijhof --- source/_integrations/modbus.markdown | 618 ++++++++++++++++----------- 1 file changed, 368 insertions(+), 250 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index e0d47b44a10..6123650f593 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -18,85 +18,96 @@ ha_platforms: - switch --- -[Modbus](http://www.modbus.org/) is a serial communication protocol to control PLCs (Programmable Logic Controller). -It supports various types of devices which can be controlled over serial, TCP, and UDP connections. +[Modbus](http://www.modbus.org/) is a serial communication protocol to control PLCs (Programmable Logic Controller) and RTUs (Remote Terminal Unit). The integration adheres strictly to the [protocol specification](https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf). +Modbus supports all devices adhering to the Modbus standard. The communication between the device(s) can be serial (rs-485), TCP, or UDP connections. The Modbus integration allows multiple communications e.g. serial combined with TCP or different TCP connected devices. -## Configuration +# Configuring Modbus -How to add modbus to your installation depends on the connection type, either a network or serial connection. +First, you define how to communicate with your Modbus devices and after that you define the information being exchanged. The Modbus integration allows you to use multiple connections. -Platforms: - - binary_sensor - - climate - - cover - - sensor - - switch +## Configuring Modbus common parameters -are all defined as part of the modbus configuration. The old configuration style, (having each outside the modbus configuration is still supported, but will cause a warning, and will be removed in a later release). +Part of the configuration is common for all types of communication. Add the following to your `configuration.yaml` file: -### Network connection +```yaml +modbus: + - name: "hub1" + close_comm_on_error: true + delay: 5 + timeout: 5 + type: tcp +``` -For a network connection, add the following to your `configuration.yaml` file: +{% configuration %} +close_comm_on_error: + description: Determines if the device connection is closed when an error occurs, default is true. Some serial-rs485 adapters deliver garble when opened, this leads to a disconnect and a new connect, which can continue. If in a running communication the debug log contains a message from pymodbus, with the text "cleaning....", then try this parameter. + required: false + default: true + type: boolean +delay: + description: "Time to delay sending messages in seconds after connecting. Some Modbus devices need a delay of typically 1-2 seconds after established connection to prepare the communication. If a device does not respond to messages after connecting, this parameter might help. Remark: the delay is solely between connect and the first message." + required: false + default: 0 + type: integer +name: + description: Name for this hub. Must be unique, so it is required when setting up multiple instances. + required: false + default: "modbus_hub" + type: string +timeout: + description: "Timeout while waiting for a response in seconds. Remark: a timeout of fewer than 5 seconds will be automatically adjusted to 5 seconds." + required: false + default: 5 + type: integer +type: + description: Type of communication. Possible values are `tcp` Modbus messages with Modbus TCP frame on TCP/IP, `udp` Modbus messages with Modbus TCP frame on UDP, `rtuovertcp` Modbus messages with a wrapper TCP/IP simulating a serial line. + required: true + type: string +{% endconfiguration %} + +## Configuring network connection + +For a network (type: `tcp`/`udp`/`rtuovertcp`) connection, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring-modbus-common-parameters): ```yaml # Example configuration.yaml entry for a TCP connection modbus: - - name: hub1 + - name: "hub1" type: tcp host: IP_ADDRESS port: 502 ``` {% configuration %} -close_comm_on_error: - description: Determines if the modbus communication is closed when an error occurs, default is true. Some serial-rs485 adapters send garble to HA when opened, this leads to a disconnect and a new connect, which can continue. If in a running communication the debug log contains a message from pymodbus, with the text "cleaning....", then try this parameter. - required: false - default: true - type: boolean -delay: - description: Time to delay messages in seconds after connecting. Some modbus devices need a delay typically 1-2 seconds after connection is established in order to prepare the communication. If a device accepts connecting with no response to the requests sent or the device disconnects, this parameter might help. - required: false - default: 0 - type: integer host: - description: The IP address of your Modbus device, e.g., 192.168.1.1. + description: The IP address of your Modbus device, e.g., `192.168.1.1`. required: true type: string -name: - description: Name for this hub. Must be unique, so it is required when setting up multiple instances. - required: false - default: modbus_hub - type: string port: description: The network port for the communication. required: true type: integer -timeout: - description: Timeout for slave response in seconds. - required: false - default: 3 - type: integer type: - description: Type of the connection to Modbus. Possible values are `tcp` (Modbus TCP protocol according to "MODBUS Messaging Implementation Guide version 1.0b" provided by Schneider Automation.), `udp`(Modbus TCP form, but using UDP for transport. It removes the overheads required for TCP.) and `rtuovertcp` (Modbus RTU message transmitted with a TCP/IP wrapper and sent over a network instead of serial lines.). + description: "Type of the connection to Modbus, needs to be `tcp` or `udp` or `rtuovertcp` for this setup." required: true type: string {% endconfiguration %} -### Serial connection +## Configuring serial connection -For a serial connection, add the following to your `configuration.yaml` file: +For a serial connection, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring-modbus-common-parameters): ```yaml # Example configuration.yaml entry for a serial connection modbus: - name: hub1 type: serial - method: rtu - port: /dev/ttyUSB0 baudrate: 9600 - stopbits: 1 bytesize: 8 - parity: N + method: rtu + parity: E + port: /dev/ttyUSB0 + stopbits: 1 ``` {% configuration %} @@ -108,20 +119,10 @@ bytesize: description: "The bytesize for the serial connection; can be `5`, `6`, `7` or `8`." required: true type: integer -delay: - description: Time to sleep in seconds after connecting and before sending messages. Some modbus servers need a short delay typically 1-2 seconds in order to prepare the communication. If a server accepts connecting, but there is no response to the requests send, this parameter might help. - required: false - default: 0 - type: integer method: description: "Method of the connection to Modbus, either `rtu` or `ascii`." required: true type: string -name: - description: Name for this hub. Must be unique, so it is required when setting up multiple instances. - required: false - default: modbus_hub - type: string parity: description: "The parity for the serial connection; can be `E`, `O` or `N`." required: true @@ -134,22 +135,95 @@ stopbits: description: "The stopbits for the serial connection, either `1` or `2`." required: true type: integer -timeout: - description: Timeout for slave response in seconds. - required: false - default: 3 - type: integer type: description: "Type of the connection to Modbus, needs to be `serial` for this setup." required: true type: string {% endconfiguration %} +## Configuring multiple connections + +Multiple connections are possible with identical/different `type:`. + +```yaml +# Example configuration.yaml entry for multiple TCP connections +modbus: + - type: tcp + host: IP_ADDRESS_1 + port: 2020 + name: "hub1" + + - type: udp + host: IP_ADDRESS_2 + port: 501 + name: hub2 +``` + +Remark: `name:`is required for multiple connections, because it needs to be unique. + +## Modbus services + +The Modbus integration provides two generic services in addition to the platform-specific services. + +| Service | Description | +| ------- | ----------- | +| modbus.write_register | Write register or registers | +| modbus.write_coil | Write coil or coils | + +Description: + +| Attribute | Description | +| --------- | ----------- | +| hub | Hub name (defaults to 'modbus_hub' when omitted) | +| unit | Slave address (1-255, defaults to 0) | +| address | Address of the Register (e.g. 138) | +| value | (write_register) A single value or an array of 16-bit values. Single value will call modbus function code 0x06. Array will call modbus function code 0x10. Values might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]`, this depend on the byte order of your CPU | +| state | (write_coil) A single boolean or an array of booleans. Single boolean will call modbus function code 0x05. Array will call modbus function code 0x0F | + +# configure Modbus platforms + +Modbus platform entities are configured within the Modbus configuration. + +## Configuring platform common parameters + +All modbus platforms share a set of common parameters. + +```yaml +# Example configuration.yaml entry for platform common parameters +modbus: + - type: tcp + host: IP_ADDRESS_1 + port: 2020 + name: "hub1" + sensors: + - name: sensor1 + scan_interval: 999 + slave: 0 +``` + +{% configuration %} +name: + description: Name for the platform entity which must be unique within the platform. + required: true + type: string +scan_interval: + description: Defines the update interval of the entity in seconds. If scan_interval is lower than `timeout` or 5 seconds it is automatically adjusted to `timeout` (default 5 seconds). + required: false + type: integer + default: 10 +slave: + description: The number of the slave. + required: false + type: integer + default: 0 +{% endconfiguration %} + ### Configuring platform binary sensor -The `modbus` binary sensor allows you to gather data from [Modbus](http://www.modbus.org/) coils with state ON/OFF. +The Modbus binary sensor allows you to gather data from coils which as per standard have state ON/OFF. + +To use your Modbus binary sensors in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): -To use your Modbus binary sensors in your installation, add the following to your `configuration.yaml` file: ```yaml # Example configuration.yaml entry for binary_sensor configuration modbus: @@ -158,51 +232,41 @@ modbus: host: IP_ADDRESS port: 502 binary_sensors: - - name: Sensor1 - slave: 1 + - name: "binary_sensor1" address: 100 - - name: Sensor2 + scan_interval: 20 + slave: 1 + - name: "binary_ensor2" address: 110 + device_class: door input_type: discrete_input ``` {% configuration %} binary_sensors: - description: A list of all binary_sensors available in this modbus instance. + description: A list of all binary_sensors available in this modbus instance, omit if there are no binary_sensors. required: false type: [map] keys: - device_class: - description: Device class to be used for the UI (e.g. "door"). - required: false - type: string - input_type: - description: type of adddress (discrete/coil) - required: false - default: coil - type: string - name: - description: Name for this binary_sensor. Must be unique. - required: true - type: string - scan_interval: - description: Defines the update interval of the sensor in seconds. - required: false - type: integer - default: 15 - slave: - description: The number of the slave. - required: false - type: integer address: description: Address of the Register. required: true type: integer + device_class: + description: The [type/class](/integrations/binary_sensor/#device-class) to be used for the UI (e.g. "door"). + required: false + type: string + input_type: + description: type of adddress (discrete_input/coil) + required: false + default: coil + type: string {% endconfiguration %} - ### Configuring platform climate -To use your Modbus thermostat in your installation, add the following to your `configuration.yaml` file: +The Modbus climate platform allows you to monitor your thermostat as well as set a target temperature. + +To use your Modbus thermostat in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): ```yaml # Example configuration.yaml entry @@ -212,18 +276,21 @@ modbus: host: IP_ADDRESS port: 502 climates: - - name: Watlow F4T - slave: 1 - data_type: uint + - name: "Watlow F4T" + current_temp_register: 27586 + current_temp_register_type: holding data_count: 1 - scale: 0.1 + data_type: custom + max_temp: 35 + min_temp: 15 offset: 0 precision: 1 + scale: 0.1 max_temp: 30 - min_temp: 15 - temp_step: 1 + structure: ">f" target_temp_register: 2782 - current_temp_register: 27586 + temp_step: 1 + temperature_unit: C ``` {% configuration %} @@ -233,11 +300,11 @@ climates: type: [map] keys: current_temp_register: - description: Register number for current temperature (Process value). + description: Register address for current temperature (process value). required: true type: integer current_temp_register_type: - description: Modbus register type (holding, input) for current temperature, default holding. + description: Modbus register type (`holding`, `input`) for current temperature. required: false type: string default: holding @@ -247,19 +314,20 @@ climates: type: integer default: 2 data_type: - description: Response representation (int, uint, float, custom). If float selected, value will converted to IEEE 754 floating point format. + description: Response representation (`int`, `uint`, `float`, `custom`). If `float` selected, value will converted to IEEE 754 floating point format. If `custom`is selected `structure`must de defined. required: false type: string - default: float - min_temp: + default: float + max_temp: description: Maximum setpoint temperature. required: false type: integer + default: 35 + min_temp: + description: Minimum setpoint temperature. + required: false + type: integer default: 5 - name: - description: Name of the device - required: true - type: string offset: description: Final offset (output = scale * value + offset). required: false @@ -275,22 +343,13 @@ climates: required: false type: float default: 1 - scan_interval: - description: Defines the update interval of the sensor in seconds. - required: false - type: integer - default: 15 - slave: - description: The number of the slave (Optional for tcp and upd Modbus, use 1). - required: true - type: integer structure: description: "If `data_type` is custom specified a double-quoted Python struct is expected here, to format the string to unpack the value. See Python documentation for details. Example: `>i`." required: false type: string default: ">f" target_temp_register: - description: Register number for target temperature (Setpoint). + description: Register address for target temperature (Setpoint). required: true type: integer temp_step: @@ -305,9 +364,7 @@ climates: default: C {% endconfiguration %} -## Services - -### Service `modbus.set-temperature` +#### Service `modbus.set-temperature` | Service | Description | | ------- | ----------- | @@ -315,15 +372,15 @@ climates: ### Configuring platform cover -The `modbus` cover platform allows you to control [Modbus](http://www.modbus.org/) covers (such as blinds, a roller shutter, or a garage door). +The `modbus` cover platform allows you to control covers (such as blinds, a roller shutter, or a garage door). -At the moment, we support the opening and closing of a cover. You can control your covers either using coils or holding registers. +At the moment, platform cover support the opening and closing of a cover. You can control your covers either using coils or holding registers. -Cover that uses the `coil` attribute is not able to determine intermediary states such as opening and closing. Coil stores only two states — "0" means cover closed, and "1" implies cover open. To allow detecting intermediary states, we added an optional `status_register` attribute. It will enable you to write your command (e.g., to open a cover) into a coil, and read current cover status back through the register. Additionally, you can specify values for `state_open`, `state_opening`, `state_closed`, and `state_closing` attributes. These will be matched with the value read from the `status_register`. +Cover that uses the `coil` attribute is not able to determine intermediary states such as opening and closing. Coil stores only two states — "0" means cover closed, and "1" implies cover open. To allow detecting intermediary states, there is an optional `status_register` attribute. It will enable you to write your command (e.g., to open a cover) into a coil, and read current cover status back through the register. Additionally, you can specify values for `state_open`, `state_opening`, `state_closed`, and `state_closing` attributes. These will be matched with the value read from the `status_register`. If your cover uses holding register to send commands (defined by the `register` attribute), it can also read the intermediary states. To adjust which value represents what state, you can fine-tune the optional state attributes, like `state_open`. These optional state values are also used for specifying values written into the register. If you specify an optional status_register attribute, cover states will be read from status_register instead of the register used for sending commands. -To use Modbus covers in your installation, add the following to your `configuration.yaml` file: +To use Modbus covers in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): ```yaml # Example configuration.yaml entry @@ -335,20 +392,16 @@ modbus: covers: - name: Door1 device_class: door - scan_interval: 1 - coil: 0 - - name: Door2 + coil: 117 device_class: door - scan_interval: 1 - coil: 1 - status_register: 1 - - name: Door3 - slave: 2 - device_class: door - scan_interval: 1 - register: 0 state_open: 1 + state_opening: 2 state_closed: 0 + state_closing: 3 + status_register: 119 + status_register_type: holding + - name: "Door2" + register: 117 ``` {% configuration %} @@ -358,51 +411,37 @@ covers: type: map keys: coil: - description: Coil address; can be omitted if a register attribute is specified. Coil and register attributes are mutually exclusive, and you need to always specify one of them. - required: true + description: Coil address; `coil` and `register` attributes are mutually exclusive and you need to add one of them. + required: false type: integer device_class: description: The [type/class](/integrations/cover/#device-class) of the cover to set the icon in the frontend. required: false type: device_class default: None - name: - description: Name of the switch. - required: true - type: string register: - description: Holding register address; can be omitted if a coil attribute is specified. Coil and register attributes are mutually exclusive, and you need to always specify one of them. + description: Holding register address; `coil` and `register` attributes are mutually exclusive, and you need to add one of them. required: true type: integer - scan_interval: - description: Defines the update interval of the sensor in seconds. - required: false - type: integer - default: 15 - slave: - description: The number of the slave (can be omitted for tcp and udp Modbus). - required: false - default: 1 - type: integer state_open: - description: A value in `status_register` or `register` representing an open cover. If your configuration uses an `register` attribute, this value will be also written into a holding register to open the cover. + description: A value in `status_register` or `register` representing an open cover. If your configuration uses the `register` attribute, this value will be written into the holding register to open the cover. required: false default: 1 type: integer state_closed: - description: A value in `status_register` or `register` representing a closed cover. If your configuration uses an `register` attribute, this value will be also written into a holding register to close the cover. + description: A value in `status_register` or `register` representing a closed cover. If your configuration uses the `register` attribute, this value will be written into the holding register to close the cover. required: false default: 0 type: integer state_opening: - description: A value in `status_register` or `register` telling us that the cover is opening at the moment. Note that this state should be also supported on your connected Modbus cover. If it won't write this intermediary state into the register, this state won't be detected. + description: A value in `status_register` or `register` representing a opening cover. Note that this state should be also supported on your connected Modbus cover. If it won't report the state, this state won't be detected. required: false default: 2 type: integer state_closing: - description: A value in `status_register` or `register` telling us that the cover is closing at the moment. Note that this state should be also supported on your connected Modbus cover. If it won't write this intermediary state into the register, this state won't be detected. + description: A value in `status_register` or `register` representing a closing cover. Note that this state should be also supported on your connected Modbus cover. If it won't reeport the state, this state won't be detected. required: false - default: 2 + default: 3 type: integer status_register: description: An address of an register, from which all the cover states will be read. If you specified `register` attribute, and not `status_register` attribute, your main register will also be used as a status register. @@ -506,14 +545,185 @@ modbus: state_closed: 0 ``` + + +### Configuring platform fan + +The `modbus` fan platform allows you to control [Modbus](http://www.modbus.org/) coils or registers. + +To use your Modbus fans in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): + +```yaml +# Example configuration.yaml entry +modbus: + - type: tcp + host: IP_ADDRESS + port: 502 + fans: + - name: "Fan1" + address: 13 + write_type: coil + - name: "Fan2" + slave: 2 + address: 14 + write_type: coil + verify: + - name: "Register1" + address: 11 + command_on: 1 + command_off: 0 + verify: + input_type: holding + address: 127 + state_on: 25 + state_off: 1 +``` + +{% configuration %} +fans: + description: The array contains a list of all your Modbus fans. + required: true + type: map + keys: + address: + description: Coil number or register. + required: true + type: integer + command_on: + description: Value to write to turn on the fan. + required: false + default: 0x01 + type: integer + command_off: + description: Value to write to turn off the fan. + required: false + default: 0x00 + type: integer + write_type: + description: Type of address (holding/coil). + required: false + default: holding + type: string + name: + description: Name of the fan. + required: true + type: string + verify: + description: Read from Modbus device to verify fan. If used without attributes it uses the toggle register configuration. If omitted no verification is done, but the state of the fan is set with each toggle. + required: false + type: map + keys: + address: + description: Address to read from. + required: false + default: write address + type: integer + input_type: + description: Type of adddress (holding/coil/discrete/input). + required: false + default: write_type + type: integer + state_on: + description: Value when the fan is on. + required: false + default: same as command_on + type: integer + state_off: + description: Value when the fan is off. + required: false + default: same as command_off + type: integer +{% endconfiguration %} + +### Configuring platform light + +The `modbus` light platform allows you to control [Modbus](http://www.modbus.org/) coils or registers. + +To use your Modbus lights in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): + +```yaml +# Example configuration.yaml entry +modbus: + - type: tcp + host: IP_ADDRESS + port: 502 + lights: + - name: "light1" + address: 13 + write_type: coil + - name: "light2" + slave: 2 + address: 14 + write_type: coil + verify: + - name: "Register1" + address: 11 + command_on: 1 + command_off: 0 + verify: + input_type: holding + address: 127 + state_on: 25 + state_off: 1 +``` + +{% configuration %} +lights: + description: The array contains a list of all your Modbus lights. + required: true + type: map + keys: + address: + description: Coil number or register. + required: true + type: integer + command_on: + description: Value to write to turn on the fan. + required: false + default: 0x01 + type: integer + command_off: + description: Value to write to turn off the light. + required: false + default: 0x00 + type: integer + write_type: + description: Type of address (holding/coil). + required: false + default: holding + type: string + verify: + description: Read from Modbus device to verify the light. If used without attributes it uses the toggle register configuration. If omitted no verification is done, but the state of the light is set with each toggle. + required: false + type: map + keys: + address: + description: Address to read from. + required: false + default: write address + type: integer + input_type: + description: Type of address (holding/coil/discrete/input). + required: false + default: write_type + type: integer + state_on: + description: Value when the light is on. + required: false + default: same as command_on + type: integer + state_off: + description: Value when the light is off. + required: false + default: same as command_off + type: integer +{% endconfiguration %} + ### Configuring platform sensor -The `modbus` cover platform allows you to control [Modbus](http://www.modbus.org/) covers (such as blinds, a roller shutter, or a garage door). - - The `modbus` sensor allows you to gather data from [Modbus](http://www.modbus.org/) registers. -To use your Modbus sensors in your installation, add the following to your `configuration.yaml` file: +To use your Modbus sensors in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): ```yaml # Example configuration.yaml entry @@ -647,7 +857,7 @@ modbus: The `modbus` switch platform allows you to control [Modbus](http://www.modbus.org/) coils or registers. -To use your Modbus switches in your installation, add the following to your `configuration.yaml` file: +To use your Modbus switches in your installation, add the following to your `configuration.yaml` file, in addition to the [common parameters](#configuring- platform-common-parameters): ```yaml # Example configuration.yaml entry @@ -700,20 +910,6 @@ switches: required: false default: holding type: string - name: - description: Name of the switch. - required: true - type: string - scan_interval: - description: Defines the update interval of the sensor in seconds. - required: false - type: integer - default: 15 - slave: - description: The number of the slave (can be omitted for tcp and udp Modbus). - required: false - type: integer - default: 0 verify: description: Read from modbus device to verify switch. If used without attributes it uses the toggle register configuration. If omitted no verification is done, but the state of the switch is set with each toggle. required: false @@ -741,84 +937,6 @@ switches: type: integer {% endconfiguration %} -#### Full example - -Example switches, for which the state is not polled. - -```yaml -modbus: - - name: hub1 - type: tcp - host: IP_ADDRESS - port: 502 - switches: - - name: Switch1 - slave: 1 - address: 13 - input_type: coil - - name: Switch2 - slave: 2 - address: 14 -``` - -#### Multiple connections - -Multiple connections are possible, add something like the following to your `configuration.yaml` file: - -```yaml -# Example configuration.yaml entry for multiple TCP connections -modbus: - - type: tcp - host: IP_ADDRESS_1 - port: 2020 - name: hub1 - - - type: tcp - host: IP_ADDRESS_2 - port: 501 - name: hub2 -``` - -### Service `modbus.write_register` - -| Service | Description | -| ------- | ----------- | -| write_register | Write register. Requires `hub`, `unit`, `address` and `value` fields. `value` can be either single value or an array | - -Description: - -| Attribute | Description | -| --------- | ----------- | -| hub | Hub name (defaults to 'default' when omitted) | -| unit | Slave address (1-255, mostly 255 if you talk to Modbus via TCP) | -| address | Address of the Register (e.g., 138) | -| value | A single value or an array of 16-bit values. Single value will call modbus function code 6. Array will call modbus function code 16. Array might need reverse ordering. E.g., to set 0x0004 you might need to set `[4,0]` | - -### Service `modbus.write_coil` - -| Service | Description | -| ------- | ----------- | -| write_coil | Write coil. Requires `hub`, `unit`, `address` and `state` fields. `state` can be either single bolean or an array | - -Description: - -| Attribute | Description | -| --------- | ----------- | -| hub | Hub name (defaults to 'default' when omitted) | -| unit | Slave address (1-255, mostly 255 if you talk to Modbus via TCP) | -| address | Address of the Register (e.g., 138) | -| state | A single boolean or an array of booleans. Single boolean will call modbus function code 6. Array will call modbus function code 16. -.. - -## Log warning (v1.0.8 and onwards) - -Pymodbus (which is the implementation library) was updated and issues a warning: - - - "Not Importing deprecated clients. Dependency Twisted is not Installed" - -This warning can be safely ignored, and have no influence on how the integration -works! - ## Opening an issue When opening an issue, please add your current configuration (or a scaled down version), with at least: From ffbc7c1e6f06d1889fb0d29258c24a034dc0be02 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Tue, 25 May 2021 17:24:17 +0200 Subject: [PATCH 65/79] New parameter "delay" in modbus switch.verify (#17930) --- source/_integrations/modbus.markdown | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index 6123650f593..cb7c102b0c5 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -916,10 +916,15 @@ switches: type: map keys: address: - description: address to read from. + description: Address to read from. required: false default: write address type: integer + delay: + description: delay between write and verify. + required: false + default: 0 + type: integer input_type: description: type of adddress (holding/coil/discrete/input) required: false From 27fdfa9bb5d772ef4d82b0d40fab83bfe3bb885d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 25 May 2021 17:28:08 +0200 Subject: [PATCH 66/79] Correct ha_release for 2021.6 (#17967) --- source/_integrations/kraken.markdown | 2 +- source/_integrations/syncthing.markdown | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_integrations/kraken.markdown b/source/_integrations/kraken.markdown index 78dc7be995a..712a732579e 100644 --- a/source/_integrations/kraken.markdown +++ b/source/_integrations/kraken.markdown @@ -5,7 +5,7 @@ ha_category: - Finance - Sensor ha_iot_class: Cloud Polling -ha_release: 2021.7 +ha_release: 2021.6 ha_config_flow: true ha_quality_scale: gold ha_codeowners: diff --git a/source/_integrations/syncthing.markdown b/source/_integrations/syncthing.markdown index 4bd1dacd373..53026d015ed 100644 --- a/source/_integrations/syncthing.markdown +++ b/source/_integrations/syncthing.markdown @@ -4,7 +4,7 @@ description: Instructions on how to integrate Syncthing within Home Assistant. ha_category: - Downloading - Sensor -ha_release: 2021.06 +ha_release: 2021.6 ha_iot_class: Local Polling ha_quality_scale: silver ha_config_flow: true From a5bb8d49d02c47aa4712d8fceed4ce5f6c358e6e Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 25 May 2021 18:21:21 +0200 Subject: [PATCH 67/79] Add TV channel to google assistant (#17594) --- source/_integrations/google_assistant.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/google_assistant.markdown b/source/_integrations/google_assistant.markdown index 1ccdbacd717..b74aa752606 100644 --- a/source/_integrations/google_assistant.markdown +++ b/source/_integrations/google_assistant.markdown @@ -250,6 +250,10 @@ Here are the modes that are currently available: - dry - eco +### TV Channels + +There is no TV channel object in Home Assistant. TV channel can only be changed by number, not by name (for example, `Turn to channel two`). + ### Troubleshooting #### 404 errors on request sync From 41529e5076f1246b8cb17b5100cb04ac3bc7891d Mon Sep 17 00:00:00 2001 From: Aaron David Schneider Date: Tue, 25 May 2021 18:35:32 +0200 Subject: [PATCH 68/79] Add description for alarm support (#17857) --- source/_integrations/sonos.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index fbbc636b2eb..eae108cdd17 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -28,6 +28,10 @@ Battery sensors are supported for the `Sonos Roam` and `Sonos Move` devices on S For each speaker with a battery, a `sensor` showing the current battery charge level and a `binary_sensor` showing the power state of the speaker are created. The `binary_sensor` reports if the speaker is currently powered by an external source and its `power_source` attribute shows which specific source is providing the current power. This source attribute can be one of `BATTERY`, `SONOS_CHARGING_RING` if using wireless charging, or `USB_POWER` if charging via USB cable. Note that the Roam will report `SONOS_CHARGING_RING` even when using a generic Qi charger. +## Alarm support + +The Sonos integration adds one `switch` for each alarm set in the Sonos app. The alarm switches are detected, deleted and assigned automatically and come with several attributes that help to monitor Sonos alarms. + ## Services The Sonos integration makes various custom services available. From dffd41841a6f56de378f647b16c4d35c303cd20c Mon Sep 17 00:00:00 2001 From: Matt Zimmerman Date: Tue, 25 May 2021 09:37:16 -0700 Subject: [PATCH 69/79] Add documentation for smarttub.snooze_reminder (#17966) --- source/_integrations/smarttub.markdown | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/_integrations/smarttub.markdown b/source/_integrations/smarttub.markdown index e13198f38ff..4b9ce4b5dd3 100644 --- a/source/_integrations/smarttub.markdown +++ b/source/_integrations/smarttub.markdown @@ -40,7 +40,7 @@ on a hot tub. | Service data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | -| `entity_id` | yes | The entity to update. | sensor.jacuzzi_j_335_primary_filtration_cycle +| `entity_id` | no | The entity to update. | sensor.jacuzzi_j_335_primary_filtration_cycle | `duration` | no | The desired duration of the primary filtration cycle, in hours. | 4 | `start_hour` | no | The desired starting hour of the day for the primary filtration cycle. | 2 (i.e. 02:00 or 2:00am) @@ -52,5 +52,14 @@ cycle on a hot tub. | Service data attribute | Optional | Description | Example | | ---------------------- | -------- | ----------- | ------- | -| `entity_id` | yes | The entity to update. | sensor.jacuzzi_j_335_secondary_filtration_cycle +| `entity_id` | no | The entity to update. | sensor.jacuzzi_j_335_secondary_filtration_cycle | `mode` | no | The desired secondary filtration mode. Can be frequent, infrequent or away. | away + +### Service `smarttub.snooze_reminder` + +This service allows you to temporarily suppress a maintenance reminder on a hot tub. + +| Service data attribute | Optional | Description | Example | +| ---------------------- | -------- | ----------- | ------- | +| `entity_id` | no | The entity to update. | binary_sensor.jacuzzi_j_335_refresh_water_reminder +| `days` | no | The number of days to snooze the reminder (minimum 10). | 10 From 0e77e96caf6f1482e1e4d255f70e6309dd3472fe Mon Sep 17 00:00:00 2001 From: jjlawren Date: Tue, 25 May 2021 11:42:14 -0500 Subject: [PATCH 70/79] Update Sonos S1 battery support (#17893) Co-authored-by: Franck Nijhof --- source/_integrations/sonos.markdown | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/source/_integrations/sonos.markdown b/source/_integrations/sonos.markdown index eae108cdd17..39eb5849526 100644 --- a/source/_integrations/sonos.markdown +++ b/source/_integrations/sonos.markdown @@ -24,10 +24,16 @@ The `sonos` integration allows you to control your [Sonos](https://www.sonos.com ## Battery support -Battery sensors are supported for the `Sonos Roam` and `Sonos Move` devices on S2 firmware. +Battery sensors are fully supported for the `Sonos Roam` and `Sonos Move` devices on S2 firmware. `Sonos Move` speakers still on S1 firmware are supported but may update infrequently. For each speaker with a battery, a `sensor` showing the current battery charge level and a `binary_sensor` showing the power state of the speaker are created. The `binary_sensor` reports if the speaker is currently powered by an external source and its `power_source` attribute shows which specific source is providing the current power. This source attribute can be one of `BATTERY`, `SONOS_CHARGING_RING` if using wireless charging, or `USB_POWER` if charging via USB cable. Note that the Roam will report `SONOS_CHARGING_RING` even when using a generic Qi charger. +
+ +The battery sensors rely on working change events or updates will be delayed. S1 battery sensors **require** working events to report any data. See more details in [Advanced use](#advanced-use). + +
+ ## Alarm support The Sonos integration adds one `switch` for each alarm set in the Sonos app. The alarm switches are detected, deleted and assigned automatically and come with several attributes that help to monitor Sonos alarms. From a81fa58d6c54d8dc1c03cdc142cce4f5b748ef44 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 26 May 2021 12:07:01 +0200 Subject: [PATCH 71/79] Document MQTT sensor last_reset (#17979) * Document MQTT sensor last_reset * Update source/_integrations/sensor.mqtt.markdown * Update source/_integrations/sensor.mqtt.markdown Co-authored-by: Franck Nijhof --- source/_integrations/sensor.mqtt.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/sensor.mqtt.markdown b/source/_integrations/sensor.mqtt.markdown index 22a87f2273d..82055159f79 100644 --- a/source/_integrations/sensor.mqtt.markdown +++ b/source/_integrations/sensor.mqtt.markdown @@ -114,6 +114,14 @@ json_attributes_topic: description: The MQTT topic subscribed to receive a JSON dictionary payload and then set as sensor attributes. Implies `force_update` of the current sensor state when a message is received on this topic. required: false type: string +last_reset_topic: + description: "The MQTT topic subscribed to receive timestamps for when an accumulating sensor such as an energy meter was reset. If the sensor never resets, set it to UNIX epoch 0: `1970-01-01T00:00:00+00:00`." + required: false + type: string +last_reset_value_template: + description: "Defines a [template](/docs/configuration/templating/#processing-incoming-data) to extract the last_reset. Available variables: `entity_id`. The `entity_id` can be used to reference the entity's attributes." + required: false + type: string name: description: The name of the MQTT sensor. required: false From 7fef154549987fd108c3accdcb033e56d9ad8ee9 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Wed, 26 May 2021 13:52:01 +0300 Subject: [PATCH 72/79] Document optional MQTT cover options (#17971) * Document optional MQTT cover options * Fix missing quote Co-authored-by: Franck Nijhof Co-authored-by: Franck Nijhof --- source/_integrations/cover.mqtt.markdown | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown index 476982f3e6d..f1cf7e1c19b 100644 --- a/source/_integrations/cover.mqtt.markdown +++ b/source/_integrations/cover.mqtt.markdown @@ -422,6 +422,45 @@ cover: {% endraw %} +### Configuration for disabling cover commands + +The example below shows a configuration for a cover that does not have a close command. +Setting `payload_close` empty or to `null` disables the close command and will not show the close button. + +{% raw %} + +```yaml +# Example configuration.yaml entry +cover: + - platform: mqtt + payload_open: "on" + payload_close: + payload_stop: "on" +``` + +{% endraw %} +The following commands can be disabled: `open`, `close`, `stop` by overriding their payloads: `payload_open`, `payload_close`, `payload_stop` + +For auto discovery message the payload needs to be set to `null`, example for cover without close command: +{% raw %} + +```json +{ + "cover": [ + { + "platform": "mqtt", + "payload_open": "on", + "payload_close": null, + "payload_stop": "on" + } + ] +} +``` + +{% endraw %} + +### Testing your configuration + To test, you can use the command line tool `mosquitto_pub` shipped with `mosquitto` or the `mosquitto-clients` package to send MQTT messages. This allows you to operate your cover manually: ```bash From f63415ee83e2234c7ba16e911cd9a059f871b221 Mon Sep 17 00:00:00 2001 From: Brandon Rothweiler Date: Wed, 26 May 2021 07:36:55 -0700 Subject: [PATCH 73/79] Add documentation about services for Mazda integration (#17946) --- source/_integrations/mazda.markdown | 63 +++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/source/_integrations/mazda.markdown b/source/_integrations/mazda.markdown index 3c247e70286..a2a66f5f6e9 100644 --- a/source/_integrations/mazda.markdown +++ b/source/_integrations/mazda.markdown @@ -55,6 +55,69 @@ Displays the current door lock status of the vehicle, and locks/unlocks the door The "Automatic Re-Lock" feature will automatically re-lock the doors if they are not opened shortly after being unlocked. This applies regardless of whether you are using the key, or unlocking the doors remotely using Home Assistant or the MyMazda app.
+## Services + +This integration offers several services for interacting with Mazda vehicles. + +### Service `mazda.start_engine` + +Starts the vehicle engine. The vehicle engine can only be remotely started 2 consecutive times. To reset this counter, the vehicle must be driven. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to start | + +### Service `mazda.stop_engine` + +Stops the vehicle engine. This only works if the vehicle was remotely started. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to stop | + +### Service `mazda.start_charging` + +Starts charging the vehicle battery. This only works with electric vehicles. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to start charging | + +### Service `mazda.stop_charging` + +Stops charging the vehicle battery. This only works with electric vehicles. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to stop charging | + +### Service `mazda.send_poi` + +Send a GPS location to the vehicle's navigation system as a POI (Point of Interest). Requires a navigation SD card installed in the vehicle. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to send the GPS location to | +| `latitude` | yes | The latitude of the location to send. | +| `longitude` | yes | The longitude of the location to send. | +| `poi_name` | yes | A friendly name for the location. | + +### Service `mazda.turn_on_hazard_lights` + +Turn on the vehicle hazard lights. The lights will flash briefly and then turn off. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to turn hazard lights on | + +### Service `mazda.turn_off_hazard_lights` + +Temporarily turn off the vehicle hazard lights if they have been manually turned on from inside the vehicle. If a door is opened, the hazard lights will turn back on. + +| Service Data Attribute | Required | Description | +| ---------------------- | -------- | ----------- | +| `device_id` | yes | The device ID of the vehicle to turn hazard lights off | + ## Disclaimer This integration is not affiliated with or endorsed by Mazda. \ No newline at end of file From 5f5a2fc33c8eaaf96ae79b8caf070946b2bff321 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Wed, 26 May 2021 16:50:07 +0200 Subject: [PATCH 74/79] Correct spelling: Adddress -> Address (#17984) --- source/_integrations/modbus.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_integrations/modbus.markdown b/source/_integrations/modbus.markdown index cb7c102b0c5..abf40bdea51 100644 --- a/source/_integrations/modbus.markdown +++ b/source/_integrations/modbus.markdown @@ -256,7 +256,7 @@ binary_sensors: required: false type: string input_type: - description: type of adddress (discrete_input/coil) + description: type of address (discrete_input/coil) required: false default: coil type: string @@ -619,7 +619,7 @@ fans: default: write address type: integer input_type: - description: Type of adddress (holding/coil/discrete/input). + description: Type of address (holding/coil/discrete/input). required: false default: write_type type: integer @@ -906,7 +906,7 @@ switches: default: 0x00 type: integer write_type: - description: type of adddress (holding/coil) + description: type of address (holding/coil) required: false default: holding type: string @@ -926,7 +926,7 @@ switches: default: 0 type: integer input_type: - description: type of adddress (holding/coil/discrete/input) + description: type of address (holding/coil/discrete/input) required: false default: write_type type: integer From 7e8b605f98ae3080c4f317e4690a22a280ff42d7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 26 May 2021 11:52:30 -0500 Subject: [PATCH 75/79] Add docs for network configuration (#17897) --- source/_integrations/network.markdown | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 source/_integrations/network.markdown diff --git a/source/_integrations/network.markdown b/source/_integrations/network.markdown new file mode 100644 index 00000000000..6d39bf20a2c --- /dev/null +++ b/source/_integrations/network.markdown @@ -0,0 +1,34 @@ +--- +title: Network Configuration +description: Network Configuration for Home Assistant +ha_category: + - Other +ha_release: 2021.6 +ha_domain: network +ha_iot_class: +ha_codeowners: + - '@home-assistant/core' +--- + +This integration provides network configuration for integrations such as [Zeroconf](/integrations/zeroconf/), and is managed by going to **{% my general title="Configuration >> General" %}** . + +**{% my general badge %}** + +## Auto detection + +Auto detection is based on the system routing next hop for the mDNS broadcast address (`224.0.0.251`). + +If the next-hop has non-loopback, non-link-local, non-multicast addresses, auto detection will use the interface that corresponds to the next-hop (commonly referred to as the default interface). + +If the next-hop cannot be detected or is a loopback address, auto detection will use all interfaces with non-loopback, non-link-local, non-multicast addresses. + +## Configuration + +This integration is by default enabled, unless you've disabled or removed the [`default_config:`](/integrations/default_config/) line from your configuration. If that is the case, the following example shows you how to enable this integration manually: + +Add the following section to your `configuration.yaml` file: + +```yaml +# Example configuration.yaml entry +network: +``` From 8a0fd258962682dd4a55b1bac1137c2ea688c5c6 Mon Sep 17 00:00:00 2001 From: Michael Klamminger <6277211+m1ch@users.noreply.github.com> Date: Fri, 28 May 2021 16:06:58 +0200 Subject: [PATCH 76/79] Update MQTT cover template handling (#17738) Co-authored-by: Erik Montnemery Co-authored-by: Franck Nijhof --- source/_integrations/cover.mqtt.markdown | 139 ++++++++++++++++++++++- 1 file changed, 134 insertions(+), 5 deletions(-) diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown index f1cf7e1c19b..b142c583172 100644 --- a/source/_integrations/cover.mqtt.markdown +++ b/source/_integrations/cover.mqtt.markdown @@ -168,7 +168,7 @@ position_open: type: integer default: 100 position_template: - description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `position_topic` topic." + description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `position_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;" required: false type: string position_topic: @@ -186,7 +186,7 @@ retain: type: boolean default: false set_position_template: - description: "Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{% raw %}{{ position }}{% endraw %}`. If no template is defined, the position (0-100) will be calculated according to `position_open` and `position_closed` values." + description: "Defines a [template](/topics/templating/) to define the position to be sent to the `set_position_topic` topic. Incoming position value is available for use in the template `{% raw %}{{ position }}{% endraw %}`. Within the template the following variables are available: `entity_id`, `position`, the target position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;" required: false type: string set_position_topic: @@ -228,7 +228,7 @@ tilt_closed_value: type: integer default: 0 tilt_command_template: - description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `tilt_command_topic` topic." + description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `tilt_command_topic` topic. Within the template the following variables are available: `entity_id`, `tilt_position`, the target tilt position in percent; `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;" required: false type: string tilt_command_topic: @@ -236,7 +236,7 @@ tilt_command_topic: required: false type: string tilt_max: - description: The maximum tilt value + description: The maximum tilt value. required: false type: integer default: 100 @@ -256,7 +256,7 @@ tilt_optimistic: type: boolean default: "`true` if `tilt_status_topic` is not defined, else `false`" tilt_status_template: - description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `tilt_status_topic` topic." + description: "Defines a [template](/topics/templating/) that can be used to extract the payload for the `tilt_status_topic` topic. Within the template the following variables are available: `entity_id`, `position_open`; `position_closed`; `tilt_min`; `tilt_max`. The `entity_id` can be used to reference the entity's attributes with help of the [states](/docs/configuration/templating/#states) template function;" required: false type: string tilt_status_topic: @@ -459,6 +459,135 @@ For auto discovery message the payload needs to be set to `null`, example for co {% endraw %} +### Full configuration using `entity_id`- variable in the template + +The example below shows an example of how to correct the state of the blind depending if it moved up, or down. + +{% raw %} + +```yaml +# Example configuration.yaml entry +cover: + - platform: mqtt + name: "MQTT Cover" + command_topic: "home-assistant/cover/set" + state_topic: "home-assistant/cover/state" + position_topic: "home-assistant/cover/position" + set_position_topic: "home-assistant/cover/position/set" + payload_open: "open" + payload_close: "close" + payload_stop: "stop" + state_opening: "open" + state_closing: "close" + state_stopped: "stop" + optimistic: false + position_template: |- + {% if not state_attr(entity_id, "current_position") %} + {{ value }} + {% elif state_attr(entity_id, "current_position") < (value | int) %} + {{ (value | int + 1) }} + {% elif state_attr(entity_id, "current_position") > (value | int) %} + {{ (value | int - 1) }} + {% else %} + {{ value }} + {% endif %} +``` + +{% endraw %} + +### Full configuration using advanced templating + +The example below shows a full example of how to set up a venetian blind which has a combined position and tilt topic. The blind in the example has moveable slats which tilt with a position change. In the example, it takes the blind 6% of the movement for a full rotation of the slats. + +Following variable might be used in `position_template`, `set_position_template`, `tilt_command_template` and `tilt_status_template`, `json_attributes_template` (only `entity_id`). + +- `entity_id` - The ID of the entity itself. It can be used to reference its attributes with the help of the [states](/docs/configuration/templating/#states) template function. +- `position_open` +- `position_closed` +- `tilt_min` +- `tilt_max` + +{% raw %} + +```yaml +# Example configuration.yaml entry +cover: + - platform: mqtt + name: "MQTT Cover" + command_topic: "home-assistant/cover/set" + state_topic: "home-assistant/cover/state" + position_topic: "home-assistant/cover/position" + set_position_topic: "home-assistant/cover/position/set" + tilt_command_topic: "home-assistant/cover/position/set" # same as `set_position_topic` + qos: 1 + retain: false + payload_open: "open" + payload_close: "close" + payload_stop: "stop" + state_opening: "open" + state_closing: "close" + state_stopped: "stop" + position_open: 100 + position_closed: 0 + tilt_min: 0 + tilt_max: 6 + tilt_opened_value: 3 + tilt_closed_value: 0 + optimistic: false + position_template: |- + {% if not state_attr(entity_id, "current_position") %} + { + "position" : value, + "tilt_value" : 0 + } + {% else %} + {% set position = state_attr(entity_id, "current_position") %} + {% set tilt_percent = (state_attr(entity_id, "current_tilt_position")) %} + + {% set movement = value | int - position %} + {% set tilt = (tilt_percent / 100 * (tilt_max - tilt_min)) %} + {% set tilt_value = min(max((tilt + movement), tilt_min), max) %} + + { + "postition": value, + "pos": position, + "tilt": tilt, + "tilt_value": tilt_value, + "tilt_percent" : tilt_percent, + "mov" : movement + } + {% endif %} + tilt_command_template: >- + {% set position = state_attr(entity_id, "current_position") %} + {% set tilt = state_attr(entity_id, "current_tilt_position") %} + {% set movement = (tilt_position - tilt) / 100 * tilt_max %} + {{ position + movement }} + payload_open: "on" + payload_close: + payload_stop: "on" +``` + +{% endraw %} +The following commands can be disabled: `open`, `close`, `stop` by overriding their payloads: `payload_open`, `payload_close`, `payload_stop` + +For auto discovery message the payload needs to be set to `null`, example for cover without close command: +{% raw %} + +```json +{ + "cover": [ + { + "platform": "mqtt", + "payload_open": "on", + "payload_close": null, + "payload_stop": "on" + } + ] +} +``` + +{% endraw %} + ### Testing your configuration To test, you can use the command line tool `mosquitto_pub` shipped with `mosquitto` or the `mosquitto-clients` package to send MQTT messages. This allows you to operate your cover manually: From 1e68904fc405d8fc78ce386db708baa6a87cb725 Mon Sep 17 00:00:00 2001 From: Shay Levy Date: Fri, 28 May 2021 17:33:21 +0300 Subject: [PATCH 77/79] Fix MQTT cover rebase error (#18007) --- source/_integrations/cover.mqtt.markdown | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/source/_integrations/cover.mqtt.markdown b/source/_integrations/cover.mqtt.markdown index b142c583172..2e8410b4a42 100644 --- a/source/_integrations/cover.mqtt.markdown +++ b/source/_integrations/cover.mqtt.markdown @@ -567,25 +567,6 @@ cover: payload_stop: "on" ``` -{% endraw %} -The following commands can be disabled: `open`, `close`, `stop` by overriding their payloads: `payload_open`, `payload_close`, `payload_stop` - -For auto discovery message the payload needs to be set to `null`, example for cover without close command: -{% raw %} - -```json -{ - "cover": [ - { - "platform": "mqtt", - "payload_open": "on", - "payload_close": null, - "payload_stop": "on" - } - ] -} -``` - {% endraw %} ### Testing your configuration From b855f8d2f8e7819af07f90b863e9ec9b91cd2054 Mon Sep 17 00:00:00 2001 From: Eduard van Valkenburg Date: Mon, 31 May 2021 15:06:08 +0200 Subject: [PATCH 78/79] Update to SIA docs before release (#18027) --- source/_integrations/sia.markdown | 49 +++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/source/_integrations/sia.markdown b/source/_integrations/sia.markdown index b17603c9b13..134156a5242 100644 --- a/source/_integrations/sia.markdown +++ b/source/_integrations/sia.markdown @@ -1,6 +1,6 @@ --- title: SIA Alarm Systems -description: Instructions on how to integrate SIA DC-09 Based Alarm systems into Home Assistant. +description: Instructions on how to integrate SIA Based Alarm systems. ha_category: - Alarm ha_release: 2021.6 @@ -12,7 +12,7 @@ ha_codeowners: ha_domain: sia --- -The SIA Alarm Systems integration provides integration with several alarm systems that implement the SIA DC-09 Protocol, including [Ajax Systems](https://ajax.systems/). This protocol is listen-only, so does not allow you to turn on/off your alarm system, it just updates the state to reflect your alarm and allows you to act on that state, for instance turning on all lights and opening the curtains when the alarm triggers. +The SIA Alarm Systems integration provides integration with several alarm systems that implement the SIA Protocol, including [Ajax Systems](https://ajax.systems/). This protocol is listen-only, so does not allow you to turn on/off your alarm system, it just updates the state to reflect your alarm and allows you to act on that state, for instance turning on all lights and opening the curtains when the alarm triggers. The underlying package has support for different variants of SIA, including DC-09, DC-04 and a limited set of ADM-CID. If your alarm system uses the ADM-CID standard and it isn't working, please log an issue [here](https://github.com/eavanvalkenburg/pysiaalarm/issues/new). To use this platform, you need to setup your alarm system to communicate using the SIA Protocol and setup several things on the alarm. This integration basically works by Home Assistant listening on a port for messages from the alarm systems and handling and responding to that message and finally updating one or more entities in Home Assistant. @@ -26,7 +26,7 @@ To use this platform, you need to setup your alarm system to communicate using t 6. Insert Home Assistant listening port. This port must not be used by anything else on the machine Home Assistant is running on, see the notes on [port usage](###Portusage) below. 7. Select Preferred Network. Ethernet is preferred if hub and HA in same network. Multiple networks are not tested. 8. Enable Periodic Reports. The interval with which the alarm systems reports to the monitoring station, default is 1 minute. This component adds 30 seconds before setting the alarm unavailable to deal with slights latencies between ajax and HA and the async nature of HA. -9. Encryption is preferred but optional. Password is 16 ASCII characters. +9. Encryption is preferred but optional. Password is 16, 24 or 32 ASCII characters. {% include integrations/config_flow.md %} @@ -36,7 +36,7 @@ port: account: description: Hub account to communicate with. 3-16 ASCII hex characters. Must be set in the alarm system as explained above. encryption_key: - description: Encoding key. 16 ASCII characters. Must be same, as in hub properties. + description: Encoding key. 16, 24 or 32 ASCII characters. Must be same, as in hub properties. ping_interval: description: Ping interval in minutes that the alarm system uses to send "Automatic communication test report" messages, the component adds 30 seconds before marking all entities for that account (alarm and binary sensors) unavailable. Must be between 1 and 1440 minutes. zones: @@ -45,7 +45,7 @@ additional_account: description: Used to ask if a additional account needs to be included, if so will open a dialog for the next account, after checking the current input. {% endconfiguration_basic %} -ASCII characters are 0-9 and ABCDEF, so a account is something like `346EB` and the encryption key has the same characters but needs to be 16 characters in length. +ASCII characters are 0-9 and ABCDEF, so a account is something like `346EB` and the encryption key has the same characters but needs to be 16, 24 or 32 characters in length. ### Note on monitoring multiple alarm systems @@ -57,4 +57,41 @@ The port used with this component must be a port no other processes use on the m ### Entities -In the initial version, after setup you will see one alarm_control_panel per account and zone combination. This has a attribute for `last_heartbeat` that you could use for a template sensor in order to have that separated out. There is also a attribute for the `last_message` that will hold events happening to moisture and smoke sensors in that zone, entities supporting that will follow. +In the initial version, after setup you will see one alarm_control_panel per account and zone combination. This entity will have 5 attributes that reflect all messages that came in for that account and zone, it includes fields for `last_code`, `zone`, `last_message`, `last_id`, `last_timestamp`. The alarm_control_panel state itself is changed based on a subset of values, including but not limited to codes: `CA`, `CB`, `CG`, `BA`, `TA`, `OA`, `NC`, `NL`, for the full list check the code on GitHub. If you expected the state to change then please log which code it was and create an issue on GitHub as well. + +### Events + +Each event that comes into your systems through SIA is also forwarded to the internal HA event bus, which can then be used to trigger automations directly on the codes that came in there. The events are created with event_type set to `sia_event__`. The event_data holds many fields, see details below. + +{% details "Fields in event_data for HA events emitted by the SIA integration." %} + +- message_type +- receiver +- line +- account +- sequence +- content +- ti +- id +- ri (also known as `zone`) +- code +- message +- x_data +- timestamp +- event_qualifier +- event_type +- partition +- extended_data (list) + - identifier + - name + - description + - length + - characters + - value +- sia_code + - code + - type + - description + - concerns + +{% enddetails %} From faf7c88c53bec73b547990fadb67c28afe80c566 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Tue, 1 Jun 2021 09:45:13 +0200 Subject: [PATCH 79/79] KNX: Support for XY-color lights (#18036) --- source/_integrations/knx.markdown | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/_integrations/knx.markdown b/source/_integrations/knx.markdown index 8d2407810ca..63155ba34ff 100644 --- a/source/_integrations/knx.markdown +++ b/source/_integrations/knx.markdown @@ -894,6 +894,14 @@ rgbw_state_address: description: KNX group address for retrieving the RGBW color of the light. *DPT 251.600* required: false type: [string, list] +xyy_address: + description: KNX group address for setting the xyY color of the light. *DPT 242.600* + required: false + type: [string, list] +xyy_state_address: + description: KNX group address for retrieving the xyY color of the light. *DPT 242.600* + required: false + type: [string, list] individual_colors: description: Used when the actuator only supports individual group addresses for colors. When `individual_colors` is used the root `address` key may be omitted. required: false