Update sql for config flow (#22162)

This commit is contained in:
G Johansson 2022-04-24 20:52:33 +02:00 committed by GitHub
parent e975bbd528
commit 30097b38df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -6,8 +6,10 @@ ha_category:
- Utility - Utility
ha_release: 0.63 ha_release: 0.63
ha_iot_class: Local Polling ha_iot_class: Local Polling
ha_config_flow: true
ha_codeowners: ha_codeowners:
- '@dgomes' - '@dgomes'
- '@gjohansson-ST'
ha_domain: sql ha_domain: sql
ha_platforms: ha_platforms:
- sensor - sensor
@ -17,56 +19,13 @@ ha_integration_type: integration
The `sql` sensor platform enables you to use values from an [SQL](https://en.wikipedia.org/wiki/SQL) database supported by the [sqlalchemy](https://www.sqlalchemy.org) library, to populate a sensor state (and attributes). The `sql` sensor platform enables you to use values from an [SQL](https://en.wikipedia.org/wiki/SQL) database supported by the [sqlalchemy](https://www.sqlalchemy.org) library, to populate a sensor state (and attributes).
This can be used to present statistics about Home Assistant sensors if used with the `recorder` integration database. It can also be used with an external data source. This can be used to present statistics about Home Assistant sensors if used with the `recorder` integration database. It can also be used with an external data source.
## Configuration {% include integrations/config_flow.md %}
To configure this sensor, you need to define the sensor connection variables and a list of queries to your `configuration.yaml` file. A sensor will be created for each query: ## Information
To enable it, add the following lines to your `configuration.yaml` file: See [supported engines](/integrations/recorder/#custom-database-engines) for which you can connect with this integration.
{% raw %} The SQL integration will connect to default recorder if Database URL is not specified.
```yaml
# Example configuration.yaml
sensor:
- platform: sql
queries:
- name: Sun state
query: "SELECT * FROM states WHERE entity_id = 'sun.sun' ORDER BY state_id DESC LIMIT 1;"
column: "state"
```
{% endraw %}
{% configuration %}
db_url:
description: The URL which points to your database. See [supported engines](/integrations/recorder/#custom-database-engines).
required: false
default: "Defaults to the default recorder `db_url` (not the current `db_url` of recorder)."
type: string
queries:
description: List of your queries.
required: true
type: map
keys:
name:
description: The name of the sensor.
required: true
type: string
query:
description: An SQL QUERY string, should return 1 result at most.
required: true
type: string
column:
description: The field name to select.
required: true
type: string
unit_of_measurement:
description: Defines the units of measurement of the sensor, if any.
required: false
type: string
value_template:
description: Defines a template to extract a value from the payload.
required: false
type: template
{% endconfiguration %}
There is no explicit configuration required for attributes. The integration will set all additional columns returned by the query as attributes. There is no explicit configuration required for attributes. The integration will set all additional columns returned by the query as attributes.
@ -93,17 +52,7 @@ The query will look like this:
SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 1; SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 1;
``` ```
```yaml Use `state` as column for value.
# Example configuration.yaml
sensor:
- platform: sql
queries:
- name: Temperature in
query: "SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 1;"
column: "state"
```
Note that the SQL sensor state corresponds to the last row of the SQL result set.
### Previous state of an entity ### Previous state of an entity
@ -111,86 +60,42 @@ Based on previous example with temperature, the query to get the former state is
```sql ```sql
SELECT * FROM (SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 2) two_entity ORDER BY state_id ASC LIMIT 1; SELECT * FROM (SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 2) two_entity ORDER BY state_id ASC LIMIT 1;
``` ```
Thus in yaml Use `state` as column for value.
```yaml
# Example configuration.yaml
sensor:
- platform: sql
queries:
- name: Former_Temperature_In
query: "SELECT * FROM (SELECT state, state_id FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 2) two_entity ORDER BY state_id ASC LIMIT 1;"
column: "state"
```
### Database size ### Database size
#### Postgres #### Postgres
{% raw %} ```sql
"SELECT (pg_database_size('dsmrreader')/1024/1024) as db_size;"
```yaml
sensor:
- platform: sql
db_url: postgresql://user:password@host/dbname
queries:
- name: DB size
query: "SELECT (pg_database_size('dsmrreader')/1024/1024) as db_size;"
column: "db_size"
unit_of_measurement: MB
``` ```
Use `db_size` as column for value.
{% endraw %}
#### MariaDB/MySQL #### MariaDB/MySQL
Change `table_schema="hass"` to the name that you use as the database name, to ensure that your sensor will work properly. Change `table_schema="hass"` to the name that you use as the database name, to ensure that your sensor will work properly.
{% raw %} ```sql
'SELECT table_schema "database", Round(Sum(data_length + index_length) / 1024, 1) "value" FROM information_schema.tables WHERE table_schema="hass" GROUP BY table_schema;'
```yaml
sensor:
- platform: sql
db_url: mysql://user:password@localhost/hass
queries:
- name: DB size
query: 'SELECT table_schema "database", Round(Sum(data_length + index_length) / 1024, 1) "value" FROM information_schema.tables WHERE table_schema="hass" GROUP BY table_schema;'
column: "value"
unit_of_measurement: kB
``` ```
Use `value` as column for value.
{% endraw %}
#### SQLite #### SQLite
If you are using the `recorder` integration then you don't need to specify the location of the database. For all other cases, add `db_url: sqlite:////path/to/database.db`. If you are using the `recorder` integration then you don't need to specify the location of the database. For all other cases, add `sqlite:////path/to/database.db` as Database URL.
{% raw %} ```sql
'SELECT ROUND(page_count * page_size / 1024 / 1024, 1) as size FROM pragma_page_count(), pragma_page_size();'
```yaml
sensor:
- platform: sql
queries:
- name: DB Size
query: 'SELECT ROUND(page_count * page_size / 1024 / 1024, 1) as size FROM pragma_page_count(), pragma_page_size();'
column: "size"
unit_of_measurement: "MiB"
``` ```
Use `size` as column for value.
{% endraw %}
#### MS SQL #### MS SQL
Use the same `db_url` as for the `recorder` integration. Change `DB_NAME` to the name that you use as the database name, to ensure that your sensor will work properly. Be sure `username` has enough rights to access the sys tables. Use the same Database URL as for the `recorder` integration. Change `DB_NAME` to the name that you use as the database name, to ensure that your sensor will work properly. Be sure `username` has enough rights to access the sys tables.
{% raw %} Example Database URL: `"mssql+pyodbc://username:password@SERVER_IP:1433/DB_NAME?charset=utf8&driver=FreeTDS"`
```yaml
sensor: ```sql
- platform: sql "SELECT TOP 1 SUM(m.size) * 8 / 1024 as size FROM sys.master_files m INNER JOIN sys.databases d ON d.database_id=m.database_id WHERE d.name='DB_NAME';"
db_url: "mssql+pyodbc://username:password@SERVER_IP:1433/DB_NAME?charset=utf8&driver=FreeTDS"
queries:
- name: DB size
query: "SELECT TOP 1 SUM(m.size) * 8 / 1024 as size FROM sys.master_files m INNER JOIN sys.databases d ON d.database_id=m.database_id WHERE d.name='DB_NAME';"
column: "size"
unit_of_measurement: MiB
``` ```
{% endraw %} Use `size` as column for value.