From e84a1cf6d84c031f364ff8dc5c991fea3dfe0023 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Wed, 10 Jul 2019 17:19:27 -0600 Subject: [PATCH] finished sql guide, added downloadable sample data --- content/v2.0/query-data/guides/histograms.md | 2 +- content/v2.0/query-data/guides/sql.md | 194 ++++ content/v2.0/query-data/guides/use-sql.md | 62 - .../v2.0/reference/flux/functions/sql/from.md | 10 +- static/downloads/air-sensor-data | 131 +++ static/downloads/air_sensors_dashboard.json | 1029 +++++++++++++++++ static/downloads/sample-sensor-info.csv | 9 + static/img/2-0-sql-dashboard-variable.png | Bin 0 -> 51475 bytes 8 files changed, 1369 insertions(+), 68 deletions(-) create mode 100644 content/v2.0/query-data/guides/sql.md delete mode 100644 content/v2.0/query-data/guides/use-sql.md create mode 100755 static/downloads/air-sensor-data create mode 100644 static/downloads/air_sensors_dashboard.json create mode 100644 static/downloads/sample-sensor-info.csv create mode 100644 static/img/2-0-sql-dashboard-variable.png diff --git a/content/v2.0/query-data/guides/histograms.md b/content/v2.0/query-data/guides/histograms.md index 8baa0cce2..ea5980a6e 100644 --- a/content/v2.0/query-data/guides/histograms.md +++ b/content/v2.0/query-data/guides/histograms.md @@ -6,7 +6,7 @@ menu: v2_0: name: Create histograms parent: How-to guides -weight: 207 +weight: 208 --- diff --git a/content/v2.0/query-data/guides/sql.md b/content/v2.0/query-data/guides/sql.md new file mode 100644 index 000000000..c05993532 --- /dev/null +++ b/content/v2.0/query-data/guides/sql.md @@ -0,0 +1,194 @@ +--- +title: Query SQL data sources +seotitle: Query SQL data sources with InfluxDB +description: > + placeholder +v2.0/tags: [query, flux, sql] +menu: + v2_0: + parent: How-to guides +weight: 207 +--- + +The [Flux](/v2.0/reference/flux) `sql` package provides functions for working with SQL data sources. +[`sql.from()`](/v2.0/reference/flux/functions/sql/from/) lets you query SQL databases +like [PostgreSQL](https://www.postgresql.org/) and [MySQL](https://www.mysql.com/) +and use the results with InfluxDB dashboards, tasks, and other operations. + +To query a SQL data source, import the `sql` package in your Flux query and use +the `sql.from()` function: + +{{< code-tabs-wrapper >}} +{{% code-tabs %}} +[Postgres](#) +[MySQL](#) +{{% /code-tabs %}} + +{{% code-tab-content %}} +```js +import "sql" + +sql.from( + driverName: "postgres", + dataSourceName: "postgresql://user:password@localhost", + query: "SELECT * FROM exampleTable" +) +``` +{{% /code-tab-content %}} + +{{% code-tab-content %}} +```js +import "sql" + +sql.from( + driverName: "mysql", + dataSourceName: "user:password@tcp(localhost:3306)/db", + query: "SELECT * FROM exampleTable" +) +``` +{{% /code-tab-content %}} +{{< /code-tabs-wrapper >}} + +_See the [`sql.from()` documentation](/v2.0/reference/flux/functions/sql/from/) for +information about required function parameters._ + +## Use cases + +### Join SQL results with time series data +One of the primary benefits of querying SQL data sources from InfluxDB +is the ability to enrich query results with data stored outside of InfluxDB. + +Using the [air sensor sample data](#sample-data) below, the following query +joins air sensor metrics stored in InfluxDB with sensor information stored in PostgreSQL. +The joined data lets you query and filter results based on sensor information +that isn't stored in InfluxDB. + +```js +import "sql" + +sensorInfo = sql.from( + driverName: "postgres", + dataSourceName: "postgresql://localhost?sslmode=disable", + query: "SELECT * FROM sensors" +) + +sensorMetrics = from(bucket: "example-bucket") + |> range(start: -1h) + |> filter(fn: (r) => r._measurement == "airSensors") + +join(tables: {metric: sensorMetrics, info: sensorInfo}, on: ["sensor_id"]) +``` + +### Create dashboard variables using SQL results +With the `sql.from()` function you're able to [create dashboard variables](/v2.0/visualize-data/variables/create-variable/) +from SQL query results. +The following example uses the [air sensor sample data](#sample-data) below to +create a variable that lets you select the location of a sensor. + +```js +import "sql" + +sql.from( + driverName: "postgres", + dataSourceName: "postgresql://localhost?sslmode=disable", + query: "SELECT * FROM sensors" + ) + |> rename(columns: {location: "_value"}) + |> keep(columns: ["_value"]) +``` + +You can then use this variable to manipulate queries in your dashboards. + +{{< img-hd src="/img/2-0-sql-dashboard-variable.png" alt="Dashboard variable from SQL query results" />}} + +--- + +## Sample data +The [sample data generator](#sample-data-generator) and [sample sensor information](#sample-sensor-information) +simulate a fleet of sensors installed throughout a facility measuring the temperature, +humidity, and carbon monoxide in each room. +Each collected data point is stored in InfluxDB with a `sensor_id` tag that identifies +the specific sensor it came from. + +Observed sensor data is stored in the `airSensors` measurement which contains the following fields: + +- temperature +- humidity +- co + +Information about each sensor is stored in a `sensors` table in a Postgres database: + +- sensor_id +- location +- model_number +- last_inspected + +#### Sample data generator +`air-sensor-data` is a CLI that generates air sensor data and stores in InfluxDB. +To use it: + +1. [Create a bucket](/v2.0/organizations/buckets/create-bucket/) in which to store the generated data. +2. Get your [authorization token](/v2.0/security/tokens/view-tokens/). +3. Download the sample data generator. _This tool requires **Ruby**._ + + Download Air Sensor Generator + +4. Give `air-sensor-data` executable permissions: + + ```sh + chmod +x air-sensor-data + ``` + +5. Start the generator by providing it with your organization, bucket, and authorization token: + + ```sh + air-sensor-data -o your-org -b your-bucket -t YOURAUTHTOKEN + ``` + + The generator will begin writing data to InfluxDB. + + _**Note:** Use the `--help` flag to view other configuration options._ + +## Sample sensor information +1. [Download and install Postgres](https://www.postgresql.org/download/). +2. Download the sample sensor information CSV. + + Download Sample Data + +3. Use a Postgres client (`psql` or a GUI) to import the CSV file using the following: + +```sql +DO $$ +DECLARE + filepath VARCHAR(200) := '/path/to/sample-sensor-info.csv'; +BEGIN + -- Create the sensors table + CREATE TABLE sensors ( + sensor_id character varying(50), + location character varying(50), + model_number character varying(50), + last_inspected date + ); + -- Import sample CSV from your filesystem + COPY sensors(sensor_id,location,model_number,last_inspected) + FROM filepath DELIMITER ',' CSV HEADER; +END $$ +``` + +{{% note %}} +Update the `filepath` variable to match the path of your to your downloaded sample data CSV. +{{% /note %}} + +Query the table to ensure the data was imported correctly: + +```sql +SELECT * FROM sensors; +``` + +#### Sample dashboard +Download and import the Air Sensors dashboard to visualize the generated data: + +Download Air Sensors dashboard + +_See [Create a dashboard](/v2.0/visualize-data/dashboards/create-dashboard/#create-a-new-dashboard) +for information about importing a dashboard._ diff --git a/content/v2.0/query-data/guides/use-sql.md b/content/v2.0/query-data/guides/use-sql.md deleted file mode 100644 index 25ffbc6dd..000000000 --- a/content/v2.0/query-data/guides/use-sql.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Use SQL data -seotitle: Use SQL data with InfluxDB -description: > - placeholder -v2.0/tags: [query, flux, sql] -menu: - v2_0: - parent: How-to guides -weight: 210 ---- - - -- Import Flux's `sql` package and use `sql.from` to query data from a SQL database such as Postgres or MySQL. - -### Benefits -- Some data schemas are better suited for SQL databases. With the ability to query a SQL data source, - you can store SQL-suited data there and join it with your time series data. - This allows you to reduce your InfluxDB schema complexity and improve performance. - - - -## Use cases - -### Reduce cardinality by storing tag data in a SQL data source -High series cardinality can lead to high memory usage, higher hardware costs, and impact the overall performance of InfluxDB. -The primary culprit behind cardinality is unique tag values. -Using a SQL data source, you can offload much of your tag data to the SQL database. -As long as you have at least one common tag on which to join in InfluxDB, that tag data can still be associated data in InfluxDB. - -For example: - -#### Join relation data with time series data -- Sensor data with relational sensor information - - SensorID - - Name - - Type - - Location - - Model -- Sensor metrics stored in InfluxDB, each with a `sensorID` tag. - Each type of sensor metric is stored in a different measurement. - - air_quality - - temperature - - humidity - - co2 - - methane - - light - - uv - - -```js -import "sql" - -sensorInfo = sql.from( - driver: "postgres", - driverName: "", - query: "" -) - -sensorMetrics = from(bucket: "sensors" ) - |> range(start: -1d) - -``` diff --git a/content/v2.0/reference/flux/functions/sql/from.md b/content/v2.0/reference/flux/functions/sql/from.md index e55e074d0..fedbe981f 100644 --- a/content/v2.0/reference/flux/functions/sql/from.md +++ b/content/v2.0/reference/flux/functions/sql/from.md @@ -60,11 +60,11 @@ _**Data type:** String_ ```js import "sql" - sql.from( - driverName: "mysql", - dataSourceName: "user:password@tcp(localhost:3306)/db", - query:"SELECT * FROM ExampleTable" - ) +sql.from( + driverName: "mysql", + dataSourceName: "user:password@tcp(localhost:3306)/db", + query:"SELECT * FROM ExampleTable" +) ``` ### Query a Postgres database diff --git a/static/downloads/air-sensor-data b/static/downloads/air-sensor-data new file mode 100755 index 000000000..70fd9136f --- /dev/null +++ b/static/downloads/air-sensor-data @@ -0,0 +1,131 @@ +#! /usr/bin/ruby +require "optparse" +require "net/http" +require"openssl" +require "uri" + +# CLI Options +options = { + protocol: "http", + host: "localhost", + port: "9999", + interval: 5 +} + +OptionParser.new do |opt| + opt.banner = "Usage: air-sensor-data [OPTIONS]" + + opt.on("-o","--org ORG","The organization to write data to. REQUIRED.") do |org| + options[:org] = org + end + + opt.on("-b","--bucket BUCKET","The bucket to write data to. REQUIRED.") do |bucket| + options[:bucket] = bucket + end + + opt.on("-t","--token TOKEN","Your InfluxDB authentication token. REQUIRED.") do |token| + options[:token] = token + end + + opt.on("-h","--host host","Your InfluxDB host. Defaults to 'localhost'") do |host| + options[:host] = host + end + + opt.on("-p","--port port","Your InfluxDB port. Defaults to '9999'") do |port| + options[:port] = port + end + + opt.on("-i","--interval interval",Integer,"The interval (in seconds) at which to write data. Defaults to '5'.") do |interval| + options[:interval] = interval + end + + opt.on("-s","--tls", "Sends data over HTTPS.") do |tls| + options[:protocol] = "https" + end + + opt.on("--help","Displays this help information.") do + puts opt + exit + end +end.parse! + +unless options[:org] && options[:bucket] && options[:token] + $stderr.puts "\nError: you must specify an organization, bucket, and token.\nUse the '--help' flag for more info.\n\n" + exit 1 +end + +# Global Variables +$protocol = options[:protocol] +$host = options[:host] +$port = options[:port] +$org = options[:org] +$bucket = options[:bucket] +$token = options[:token] +$interval = options[:interval] + +# Seed Data +seeds = [ + {id: 100, t: 71.2, h: 35.1, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 101, t: 71.8, h: 34.9, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 102, t: 72.0, h: 34.9, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 103, t: 71.3, h: 35.2, c: 0.4, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 200, t: 73.6, h: 35.8, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.05}, + {id: 201, t: 74.0, h: 35.2, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 202, t: 75.3, h: 35.7, c: 0.5, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, + {id: 203, t: 74.8, h: 35.9, c: 0.4, t_inc: -0.05..0.05, h_inc: -0.05..0.05, c_inc: -0.02..0.02}, +] + +def increment_data(data={}) + data[:t] += rand(data[:t_inc]) + data[:h] += rand(data[:h_inc]) + data[:c] += rand(data[:c_inc]) + + # Avoid negative humidity and co + if data[:h] < 0 + data[:h] = 0 + end + if data[:c] < 0 + data[:c] = 0 + end + + return data +end + +def line_protocol_batch(point_data=[]) + batch = [] + point_data.each do |v| + batch << "airSensors,sensor_id=TLM0#{v[:id]} temperature=#{v[:t]},humidity=#{v[:h]},co=#{v[:c]}" + end + return batch.join("\n") +end + +def send_data(batch) + uri = URI.parse("#{$protocol}://#{$host}:#{$port}/api/v2/write?org=#{URI::encode($org)}&bucket=#{URI::encode($bucket)}") + request = Net::HTTP::Post.new(uri) + request["Authorization"] = "Token #{$token}" + request.body = "#{batch}" + + req_options = { + use_ssl: uri.scheme == "https", + ssl_version: :SSLv23 + } + + response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http| + http.request(request) + end +end + +def send_batches(dataset=[], interval=$interval) + dataset.map! { |seed| increment_data(seed) } + send_data(line_protocol_batch(dataset)) + sleep interval + send_batches(dataset,interval) +end + +begin + puts "Sending data to #{$protocol}://#{$host}:#{$port}..." + puts " (ctrl-c to kill the data stream)" + send_batches(seeds) +rescue Interrupt + puts "\nStopping data stream..." +end diff --git a/static/downloads/air_sensors_dashboard.json b/static/downloads/air_sensors_dashboard.json new file mode 100644 index 000000000..e5639d66d --- /dev/null +++ b/static/downloads/air_sensors_dashboard.json @@ -0,0 +1,1029 @@ +{ + "meta": { + "version": "1", + "type": "dashboard", + "name": "Air Sensors-Template", + "description": "template created from dashboard: Air Sensors" + }, + "content": { + "data": { + "type": "dashboard", + "attributes": { + "name": "Air Sensors", + "description": "" + }, + "relationships": { + "label": { + "data": [] + }, + "cell": { + "data": [ + { + "type": "cell", + "id": "0423614244f70000" + }, + { + "type": "cell", + "id": "042361d158770000" + }, + { + "type": "cell", + "id": "04236a6e6cf70000" + }, + { + "type": "cell", + "id": "042372352a770000" + }, + { + "type": "cell", + "id": "04237241bf770000" + }, + { + "type": "cell", + "id": "042372d4bcf70000" + }, + { + "type": "cell", + "id": "0423737a1ff70000" + }, + { + "type": "cell", + "id": "042373fce5370000" + }, + { + "type": "cell", + "id": "0423753affb70000" + }, + { + "type": "cell", + "id": "04237b90e1370000" + } + ] + }, + "variable": { + "data": [ + { + "type": "variable", + "id": "03bdc0c5a4ff0000" + }, + { + "type": "variable", + "id": "04237161ad770000" + } + ] + } + } + }, + "included": [ + { + "id": "0423614244f70000", + "type": "cell", + "attributes": { + "x": 4, + "y": 1, + "w": 4, + "h": 2 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "0423614244f70000" + } + } + } + }, + { + "id": "042361d158770000", + "type": "cell", + "attributes": { + "x": 8, + "y": 1, + "w": 4, + "h": 2 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "042361d158770000" + } + } + } + }, + { + "id": "04236a6e6cf70000", + "type": "cell", + "attributes": { + "x": 0, + "y": 7, + "w": 12, + "h": 4 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "04236a6e6cf70000" + } + } + } + }, + { + "id": "042372352a770000", + "type": "cell", + "attributes": { + "x": 0, + "y": 4, + "w": 3, + "h": 3 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "042372352a770000" + } + } + } + }, + { + "id": "04237241bf770000", + "type": "cell", + "attributes": { + "x": 0, + "y": 1, + "w": 4, + "h": 2 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "04237241bf770000" + } + } + } + }, + { + "id": "042372d4bcf70000", + "type": "cell", + "attributes": { + "x": 3, + "y": 4, + "w": 3, + "h": 3 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "042372d4bcf70000" + } + } + } + }, + { + "id": "0423737a1ff70000", + "type": "cell", + "attributes": { + "x": 6, + "y": 4, + "w": 3, + "h": 3 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "0423737a1ff70000" + } + } + } + }, + { + "id": "042373fce5370000", + "type": "cell", + "attributes": { + "x": 9, + "y": 4, + "w": 3, + "h": 3 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "042373fce5370000" + } + } + } + }, + { + "id": "0423753affb70000", + "type": "cell", + "attributes": { + "x": 0, + "y": 3, + "w": 12, + "h": 1 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "0423753affb70000" + } + } + } + }, + { + "id": "04237b90e1370000", + "type": "cell", + "attributes": { + "x": 0, + "y": 0, + "w": 12, + "h": 1 + }, + "relationships": { + "view": { + "data": { + "type": "view", + "id": "04237b90e1370000" + } + } + } + }, + { + "type": "view", + "id": "0423614244f70000", + "attributes": { + "name": "Humidity (All Rooms)", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"humidity\")\n |> keep(columns: [\"_time\",\"_value\",\"location\"])\n |> group(columns: [\"location\"])", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "%", + "base": "10", + "scale": "linear" + } + }, + "type": "xy", + "legend": {}, + "geom": "monotoneX", + "colors": [ + { + "id": "cb8568fb-29b5-4c17-9399-05dcce537935", + "type": "scale", + "hex": "#FDC44F", + "name": "Cthulhu", + "value": 0 + }, + { + "id": "4f1a924d-009b-45f5-8419-9fa53204bdf7", + "type": "scale", + "hex": "#007C76", + "name": "Cthulhu", + "value": 0 + }, + { + "id": "3f2c8336-6b0d-431a-a3c2-8c5713479225", + "type": "scale", + "hex": "#8983FF", + "name": "Cthulhu", + "value": 0 + } + ], + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "042361d158770000", + "attributes": { + "name": "Carbon Monoxide (All Rooms)", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"co\")\n |> keep(columns: [\"_time\",\"_value\",\"location\"])\n |> group(columns: [\"location\"])", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": " ppm", + "base": "10", + "scale": "linear" + } + }, + "type": "xy", + "legend": {}, + "geom": "monotoneX", + "colors": [ + { + "id": "d6574d38-e7b7-447b-8ca1-ad3f36296bba", + "type": "scale", + "hex": "#8F8AF4", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + }, + { + "id": "67ce5515-4411-4fc0-a5a6-282b4ee76b97", + "type": "scale", + "hex": "#A51414", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + }, + { + "id": "5168db82-ac7e-4d57-b8ff-5747fa01762b", + "type": "scale", + "hex": "#F4CF31", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + } + ], + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "04236a6e6cf70000", + "attributes": { + "name": "Sensor Info", + "properties": { + "shape": "chronograf-v2", + "type": "table", + "queries": [ + { + "text": "import \"sql\"\n\nsql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n |> drop(columns: [\"sensor_id\"])\n |> rename(columns: {location: \"Sensor Location\", model_number: \"Sensor Model Number\", last_inspected: \"Last Inspected\"})", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "colors": [ + { + "id": "base", + "type": "text", + "hex": "#00C9FF", + "name": "laser", + "value": 0 + } + ], + "tableOptions": { + "verticalTimeAxis": true, + "sortBy": { + "internalName": "", + "displayName": "", + "visible": false + }, + "wrapping": "", + "fixFirstColumn": false + }, + "fieldOptions": [ + { + "internalName": "", + "displayName": "", + "visible": true + }, + { + "internalName": "result", + "displayName": "result", + "visible": true + }, + { + "internalName": "table", + "displayName": "table", + "visible": true + }, + { + "internalName": "Sensor Location", + "displayName": "Sensor Location", + "visible": true + }, + { + "internalName": "Sensor Model Number", + "displayName": "Sensor Model Number", + "visible": true + }, + { + "internalName": "Last Inspected", + "displayName": "Last Inspected", + "visible": true + } + ], + "timeFormat": "YYYY-MM-DD HH:mm:ss", + "decimalPlaces": { + "isEnforced": false, + "digits": 2 + }, + "note": "", + "showNoteWhenEmpty": false + } + } + }, + { + "type": "view", + "id": "042372352a770000", + "attributes": { + "name": "Temperature", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"temperature\" and r.location == v.room)", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "65", + "85" + ], + "label": "", + "prefix": "", + "suffix": "°F", + "base": "10", + "scale": "linear" + } + }, + "type": "line-plus-single-stat", + "legend": {}, + "colors": [ + { + "id": "base", + "type": "text", + "hex": "#00C9FF", + "name": "laser", + "value": 0 + }, + { + "id": "22088d41-bea2-47bc-a697-ab8093e3d447", + "type": "scale", + "hex": "#FDC44F", + "name": "Cthulhu", + "value": 0 + }, + { + "id": "9edb23f5-6e0c-4365-80e3-320736c7334c", + "type": "scale", + "hex": "#007C76", + "name": "Cthulhu", + "value": 0 + }, + { + "id": "2c39bd4c-4954-4991-8c03-89e9186e4271", + "type": "scale", + "hex": "#8983FF", + "name": "Cthulhu", + "value": 0 + } + ], + "prefix": "", + "suffix": "°F", + "decimalPlaces": { + "isEnforced": true, + "digits": 1 + }, + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "04237241bf770000", + "attributes": { + "name": "Temperature (All Rooms)", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"temperature\")\n |> keep(columns: [\"_time\",\"_value\",\"location\"])\n |> group(columns: [\"location\"])", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "°F", + "base": "10", + "scale": "linear" + } + }, + "type": "xy", + "legend": {}, + "geom": "monotoneX", + "colors": [ + { + "id": "9ae217cd-ae69-42b2-b5b9-229a450d854c", + "type": "scale", + "hex": "#31C0F6", + "name": "Nineteen Eighty Four", + "value": 0 + }, + { + "id": "03684e9b-7ad4-478a-afcc-11c46ff136cb", + "type": "scale", + "hex": "#A500A5", + "name": "Nineteen Eighty Four", + "value": 0 + }, + { + "id": "4e437663-7938-4429-b772-913cb82c8b08", + "type": "scale", + "hex": "#FF7E27", + "name": "Nineteen Eighty Four", + "value": 0 + } + ], + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "042372d4bcf70000", + "attributes": { + "name": "Humidity", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"humidity\" and r.location == v.room)", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "25", + "55" + ], + "label": "", + "prefix": "", + "suffix": "%", + "base": "10", + "scale": "linear" + } + }, + "type": "line-plus-single-stat", + "legend": {}, + "colors": [ + { + "id": "base", + "type": "text", + "hex": "#00C9FF", + "name": "laser", + "value": 0 + }, + { + "id": "99f3c23b-c495-451e-8b30-162ba1739972", + "type": "scale", + "hex": "#8F8AF4", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + }, + { + "id": "2b27ca35-0a93-4506-99ce-b6c338c4f0e1", + "type": "scale", + "hex": "#A51414", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + }, + { + "id": "44866d00-0182-4136-b8a2-ea991e1300af", + "type": "scale", + "hex": "#F4CF31", + "name": "Do Androids Dream of Electric Sheep?", + "value": 0 + } + ], + "prefix": "", + "suffix": "%", + "decimalPlaces": { + "isEnforced": true, + "digits": 2 + }, + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "0423737a1ff70000", + "attributes": { + "name": "Carbon Monoxide", + "properties": { + "shape": "chronograf-v2", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"co\" and r.location == v.room)", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "axes": { + "x": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": "", + "base": "10", + "scale": "linear" + }, + "y": { + "bounds": [ + "", + "" + ], + "label": "", + "prefix": "", + "suffix": " ppm", + "base": "10", + "scale": "linear" + } + }, + "type": "line-plus-single-stat", + "legend": {}, + "colors": [ + { + "id": "base", + "type": "text", + "hex": "#00C9FF", + "name": "laser", + "value": 0 + }, + { + "id": "6618c85e-1b5f-4c4f-9a03-c852a1a3cc47", + "type": "scale", + "hex": "#DA6FF1", + "name": "Ectoplasm", + "value": 0 + }, + { + "id": "ea594da3-a224-4f9d-b592-3623b9e84b0f", + "type": "scale", + "hex": "#00717A", + "name": "Ectoplasm", + "value": 0 + }, + { + "id": "0add3620-1c62-4798-89ab-7435f19caec6", + "type": "scale", + "hex": "#ACFF76", + "name": "Ectoplasm", + "value": 0 + } + ], + "prefix": "", + "suffix": " ppm", + "decimalPlaces": { + "isEnforced": true, + "digits": 1 + }, + "note": "", + "showNoteWhenEmpty": false, + "xColumn": "_time", + "yColumn": "_value", + "shadeBelow": false + } + } + }, + { + "type": "view", + "id": "042373fce5370000", + "attributes": { + "name": "Carbon Monoxide Level", + "properties": { + "shape": "chronograf-v2", + "type": "gauge", + "queries": [ + { + "text": "import \"sql\"\n\nsensorInfo = sql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n\nsensorMetrics = from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"airSensors\")\n\ndata = join(tables: {metric: sensorMetrics, info: sensorInfo}, on: [\"sensor_id\"])\n\ndata\n |> filter(fn: (r) => r._field == \"co\" and r.location == v.room)", + "editMode": "advanced", + "name": "", + "builderConfig": { + "buckets": [], + "tags": [ + { + "key": "_measurement", + "values": [] + } + ], + "functions": [], + "aggregateWindow": { + "period": "auto" + } + } + } + ], + "prefix": "", + "suffix": " ppm", + "colors": [ + { + "id": "0", + "type": "min", + "hex": "#4ED8A0", + "name": "rainforest", + "value": 0 + }, + { + "id": "eba43308-b8ae-40fd-bc0a-d056f4ceb435", + "type": "threshold", + "hex": "#FFB94A", + "name": "pineapple", + "value": 30 + }, + { + "id": "5a51cc65-ec3d-45a4-b5c9-94156cdf279b", + "type": "threshold", + "hex": "#BF3D5E", + "name": "ruby", + "value": 70 + }, + { + "id": "1", + "type": "max", + "hex": "#BF3D5E", + "name": "ruby", + "value": 140 + } + ], + "decimalPlaces": { + "isEnforced": true, + "digits": 2 + }, + "note": "", + "showNoteWhenEmpty": false + } + } + }, + { + "type": "view", + "id": "0423753affb70000", + "attributes": { + "name": "Name this Cell", + "properties": { + "shape": "chronograf-v2", + "type": "markdown", + "note": " \n**`⬆` View metrics for a specific room by selecting the a room above.**" + } + } + }, + { + "type": "view", + "id": "04237b90e1370000", + "attributes": { + "name": "Name this Cell", + "properties": { + "shape": "chronograf-v2", + "type": "markdown", + "note": " \n**`⬆` Select the bucket that contains the airSensor measurement.**" + } + } + }, + { + "id": "03bdc0c5a4ff0000", + "type": "variable", + "attributes": { + "name": "bucket", + "arguments": { + "type": "query", + "values": { + "query": "buckets()\n |> map(fn: (r) => r.name)\n", + "language": "flux" + } + }, + "selected": null + }, + "relationships": { + "label": { + "data": [] + } + } + }, + { + "id": "04237161ad770000", + "type": "variable", + "attributes": { + "name": "room", + "arguments": { + "type": "query", + "values": { + "query": "import \"sql\"\n\nsql.from(\n driverName: \"postgres\",\n dataSourceName: \"postgresql://localhost?sslmode=disable\",\n query: \"SELECT * FROM sensors\"\n)\n |> rename(columns: {location: \"_value\"})\n |> keep(columns: [\"_value\"])\n", + "language": "flux" + } + }, + "selected": null + }, + "relationships": { + "label": { + "data": [] + } + } + } + ] + }, + "labels": [] +} \ No newline at end of file diff --git a/static/downloads/sample-sensor-info.csv b/static/downloads/sample-sensor-info.csv new file mode 100644 index 000000000..07ce7c2f3 --- /dev/null +++ b/static/downloads/sample-sensor-info.csv @@ -0,0 +1,9 @@ +sensor_id,location,model_number,last_inspected +TLM0100,Main Lobby,TLM89092A,1/11/2019 +TLM0101,Room 101,TLM89092A,1/11/2019 +TLM0102,Room 102,TLM89092B,1/11/2019 +TLM0103,Mechanical Room,TLM90012Z,1/14/2019 +TLM0200,Conference Room,TLM89092B,9/24/2018 +TLM0201,Room 201,TLM89092B,9/24/2018 +TLM0202,Room 202,TLM89092A,9/24/2018 +TLM0203,Room 203,TLM89092A,9/24/2018 diff --git a/static/img/2-0-sql-dashboard-variable.png b/static/img/2-0-sql-dashboard-variable.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8238f04215e01385d974e0bdc351598eb95b57 GIT binary patch literal 51475 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

g6u`xEZF)*7=73p*Qm6XE3hNj6UMOfk}v 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 N002ovPDHLkV1oTM+phos literal 0 HcmV?d00001