--- title: "SQL Sensor" description: "Instructions how to integrate SQL sensors into Home Assistant." logo: sql.png ha_category: - Utility ha_release: 0.63 redirect_from: - /components/sensor.sql/ --- 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. ## Configuration 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: To enable it, add the following lines to your `configuration.yaml`: {% raw %} ```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](/components/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 %} ## Examples In this section, you find some real-life examples of how to use this sensor. ### Current state of an entity This example shows the previously *recorded* state of the sensor `sensor.temperature_in`. ```yaml sensor: - platform: random name: Temperature in unit_of_measurement: '°C' ``` The query will look like this: ```sql SELECT * FROM states WHERE entity_id = 'sensor.temperature_in' ORDER BY state_id DESC LIMIT 1; ``` {% raw %} ```yaml # 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' ``` {% endraw %} Note that the SQL sensor state corresponds to the last row of the SQL result set. ### Previous state of an entity This example only works with *binary_sensors*: ```sql SELECT * FROM states WHERE entity_id = 'binary_sensor.xyz789' GROUP BY state ORDER BY last_changed DESC LIMIT 1; ``` ### Database size #### Database size in Postgres {% raw %} ```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 ``` {% endraw %} #### MariaDB/MySQL Change `table_schema="hass"` to the name that you use as the database name, to ensure that your sensor will work properly. {% raw %} ```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 ``` {% endraw %}