├── requirements.txt ├── config.ini ├── LICENSE ├── .gitignore ├── README.md ├── senddata.py └── grafana_dashboard.json /requirements.txt: -------------------------------------------------------------------------------- 1 | bme680 2 | influxdb 3 | dotenv 4 | -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [influxserver] 2 | ; IP address of your InfluxDB server 3 | host = 192.168.178.54 4 | ; Port of the InfluxDB server 5 | port = 8086 6 | ; Username for the InfluxDB database 7 | user = root 8 | ; Password for the InfluxDB database 9 | password = root 10 | ; Database name in InfluxDB 11 | dbname = logger 12 | 13 | [sensor] 14 | ; session identifier allows better filtering later 15 | session = dev 16 | ; locations identifies where you sensor is placed 17 | location = livingroom 18 | ; enable_gas activates the air quality sensor 19 | enable_gas = True 20 | ; temp_offset defines the temperature offset of the sensor 21 | temp_offset = -3.5 22 | ; intervall defines the reading intervall of the sensor in seconds 23 | interval = 5 24 | ; burn_in_tim defines the time in seconds the sensor will heat up until sending data 25 | burn_in_time = 500 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Lars Lühr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bme680_to_influxdb - BME680 Monitoring with InfluxDB 2 | 3 | This script sends the data from the RaspberryPI Bosch BME680 module to a InfluxDB. The script itself and the documentation is work-in-progress. However, feel free to open issues for your questions and ideas. 4 | 5 | Feel free to read the full story on how to send BME680 sensor logs with a RaspberryPi to InfluxDB and into Grafana on [ayeks.de](https://ayeks.de/post/2018-05-29-bme680-influxdb-grafana/). 6 | 7 | ## Installation 8 | 9 | ### InfluxDB on a RaspberryPI 10 | 11 | Download and install the InfluxDB ARM package: 12 | ``` 13 | wget http://ftp.us.debian.org/debian/pool/main/i/influxdb/influxdb_1.1.1+dfsg1-4+b2_armhf.deb 14 | sudo dpkg -i influxdb_1.1.1+dfsg1-4+b2_armhf.deb 15 | 16 | ``` 17 | 18 | Modify influxdb.conf to enable admin GUI and restart the database. 19 | ``` 20 | sudo nano /etc/influxdb/influxdb.conf 21 | sudo service influxdb restart 22 | ``` 23 | 24 | Go to the admin GUI of the InfluxDB and create a new database with the name `logger`: 25 | ``` 26 | # goto: http://localhost:8083/ 27 | CREATE DATABASE "logger" 28 | ``` 29 | 30 | 31 | ### BME680_to_InfluxDB on a RaspberryPI 32 | 33 | You need the [bme680 python lib](https://github.com/pimoroni/bme680), the InfluxDB client and the bme680_to_influx script. 34 | ``` 35 | git clone https://github.com/ayeks/bme680_to_influxdb 36 | cd bme680_to_influxdb 37 | pip3 install -r requirements.txt 38 | ``` 39 | 40 | Go to the config.ini file and change the values to match your environment. You should change at least `host`, `user` and the `password`. 41 | 42 | 43 | ## Execution 44 | 45 | Simply call: `python3 senddata.py "./config.ini" `. 46 | 47 | Often you want your Raspberry to execute the senddata script automatically after it started. Use the following to do so: 48 | ``` 49 | # automated startup: 50 | sudo nano /etc/rc.local 51 | python3 /home/pi/senddata.py "/home/pi/config.ini" & 52 | ``` 53 | 54 | 55 | ## Analysis 56 | Collecting data is just half the fun without proper analyzing. To crawl through your data just use the InfluxDB admin GUI: 57 | ``` 58 | # select the "logger" database first! 59 | # show all available measurements 60 | SHOW MEASUREMENTS 61 | 62 | # show available tags for measurement 63 | SHOW TAG KEYS FROM "dev" 64 | 65 | # get results by measurement 66 | select * from dev 67 | 68 | ``` 69 | 70 | In this repo is the [JSON](./grafana_dashboard.json) included that generates the following Grafana Dashboard: 71 | 72 | ![Grafana BME680 Dashboard](https://ayeks.de/img/blog/2018-05-29-bme680-influxdb-grafana/grafana-complete-bme680.png) 73 | 74 | ## Credits 75 | 76 | Thanks to John Whittington who wrote [an awesome tutorial for InfluxDB on a RaspberryPI](https://engineer.john-whittington.co.uk/2016/11/raspberry-pi-data-logger-influxdb-grafana/), to Sandy Macdonald who wrote the [Pimoroni tutorial Getting Started with BME680 Breakout](https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-bme680-breakout) and all the contributors on the [bme680 python lib](https://github.com/pimoroni/bme680). 77 | 78 | -------------------------------------------------------------------------------- /senddata.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import time # for time and delay 3 | import sys # for arguments 4 | import datetime # for time and delay 5 | from influxdb import InfluxDBClient # for collecting data 6 | import socket # for hostname 7 | import bme680 # for sensor data 8 | import configparser # for parsing config.ini file 9 | 10 | def get_raspid(): 11 | # Extract serial from cpuinfo file 12 | cpuserial = "0000000000000000" 13 | with open('/proc/cpuinfo', 'r') as f: 14 | for line in f: 15 | if line[0:6] == 'Serial': 16 | cpuserial = line[10:26] 17 | return cpuserial 18 | 19 | 20 | 21 | # Allow user to set session and runno via args otherwise auto-generate 22 | if len(sys.argv) is 2: 23 | configpath = sys.argv[1] 24 | else: 25 | print("ParameterError: You must define the path to the config.ini!") 26 | sys.exit() 27 | 28 | # Parsing the config parameters from config.ini 29 | config = configparser.ConfigParser() 30 | try: 31 | config.read(configpath) 32 | influxserver = config['influxserver'] 33 | host = influxserver.get('host') 34 | port = influxserver.get('port') 35 | user = influxserver.get('user') 36 | password = influxserver.get('password') 37 | dbname = influxserver.get('dbname') 38 | sensor = config['sensor'] 39 | enable_gas = sensor.getboolean('enable_gas') 40 | session = sensor.get('session') 41 | location = sensor.get('location') 42 | temp_offset = float(sensor['temp_offset']) 43 | interval = int(sensor['interval']) 44 | burn_in_time = float(sensor['burn_in_time']) 45 | 46 | except TypeError: 47 | print("TypeError parsing config.ini file. Check boolean datatypes!") 48 | sys.exit() 49 | except KeyError: 50 | print("KeyError parsing config.ini file. Check file and its structure!") 51 | sys.exit() 52 | except ValueError: 53 | print("ValueError parsing config.ini file. Check number datatypes!") 54 | sys.exit() 55 | 56 | try: 57 | sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY) 58 | except IOError: 59 | sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY) 60 | 61 | raspid = get_raspid() 62 | 63 | now = datetime.datetime.now() 64 | runNo = now.strftime("%Y%m%d%H%M") 65 | hostname = socket.gethostname() 66 | 67 | print("Session: ", session) 68 | print("runNo: ", runNo) 69 | print("raspid: ", raspid) 70 | print("hostname: ", hostname) 71 | print("location: ", location) 72 | 73 | # Create the InfluxDB object 74 | client = InfluxDBClient(host, port, user, password, dbname) 75 | 76 | 77 | # BME680 configuration 78 | # Set sensor configs 79 | sensor.set_humidity_oversample(bme680.OS_2X) 80 | sensor.set_pressure_oversample(bme680.OS_4X) 81 | sensor.set_temperature_oversample(bme680.OS_8X) 82 | sensor.set_filter(bme680.FILTER_SIZE_3) 83 | sensor.set_temp_offset(temp_offset) 84 | 85 | if enable_gas: 86 | sensor.set_gas_status(bme680.ENABLE_GAS_MEAS) 87 | sensor.set_gas_heater_temperature(320) 88 | sensor.set_gas_heater_duration(150) 89 | sensor.select_gas_heater_profile(0) 90 | else: 91 | sensor.set_gas_status(bme680.DISABLE_GAS_MEAS) 92 | 93 | # start_time and curr_time ensure that the 94 | # burn_in_time (in seconds) is kept track of. 95 | start_time = time.time() 96 | curr_time = time.time() 97 | burn_in_data = [] 98 | 99 | # Run until keyboard out 100 | try: 101 | # Collect gas resistance burn-in values, then use the average 102 | # of the last 50 values to set the upper limit for calculating 103 | # gas_baseline. 104 | if enable_gas: 105 | print("Collecting gas resistance burn-in data\n") 106 | while curr_time - start_time < burn_in_time: 107 | curr_time = time.time() 108 | if sensor.get_sensor_data() and sensor.data.heat_stable: 109 | gas = sensor.data.gas_resistance 110 | burn_in_data.append(gas) 111 | print("Gas: {0} Ohms".format(gas)) 112 | time.sleep(1) 113 | 114 | gas_baseline = int(sum(burn_in_data[-50:]) / 50.0) 115 | 116 | # Set the humidity baseline to 40%, an optimal indoor humidity. 117 | hum_baseline = 40.0 118 | 119 | # This sets the balance between humidity and gas reading in the 120 | # calculation of air_quality_score (25:75, humidity:gas) 121 | hum_weighting = 0.25 122 | 123 | print("Gas baseline: {0} Ohms, humidity baseline: {1:.2f} %RH\n".format(gas_baseline, hum_baseline)) 124 | 125 | # Sensor read loop 126 | while True: 127 | if sensor.get_sensor_data(): 128 | 129 | # Reset the attempt var 130 | attempt = 0 131 | 132 | hum = sensor.data.humidity 133 | temp = sensor.data.temperature 134 | press = sensor.data.pressure 135 | 136 | iso = time.asctime(time.gmtime()) 137 | 138 | if enable_gas: 139 | 140 | hum_offset = hum - hum_baseline 141 | gas = int(sensor.data.gas_resistance) 142 | gas_offset = gas_baseline - gas 143 | 144 | # Calculate hum_score as the distance from the hum_baseline. 145 | if hum_offset > 0: 146 | hum_score = (100 - hum_baseline - hum_offset) / (100 - hum_baseline) * (hum_weighting * 100) 147 | 148 | else: 149 | hum_score = (hum_baseline + hum_offset) / hum_baseline * (hum_weighting * 100) 150 | 151 | # Calculate gas_score as the distance from the gas_baseline. 152 | if gas_offset > 0: 153 | gas_score = (gas / gas_baseline) * (100 - (hum_weighting * 100)) 154 | 155 | else: 156 | gas_score = 100 - (hum_weighting * 100) 157 | 158 | # Calculate air_quality_score. 159 | air_quality_score = hum_score + gas_score 160 | # Round to full 161 | air_quality_score = round(air_quality_score, 0) 162 | 163 | json_body = [ 164 | { 165 | "measurement": session, 166 | "tags": { 167 | "run": runNo, 168 | "raspid": raspid, 169 | "hostname": hostname, 170 | "location": location 171 | }, 172 | "time": iso, 173 | "fields": { 174 | "temp": temp, 175 | "press": press, 176 | "humi": hum, 177 | "gas": gas, 178 | "iaq": air_quality_score, 179 | "gasbaseline": gas_baseline, 180 | "humbaseline": hum_baseline 181 | } 182 | } 183 | ] 184 | 185 | else: 186 | json_body = [ 187 | { 188 | "measurement": session, 189 | "tags": { 190 | "run": runNo, 191 | "raspid": raspid, 192 | "hostname": hostname, 193 | "location": location 194 | }, 195 | "time": iso, 196 | "fields": { 197 | "temp": temp, 198 | "press": press, 199 | "humi": hum, 200 | } 201 | } 202 | ] 203 | 204 | print(json_body) 205 | 206 | # Write JSON to InfluxDB 207 | res = client.write_points(json_body) 208 | print(res) 209 | else: 210 | print("Error: .get_sensor_data() or heat_stable failed.") 211 | 212 | # Try again up to five times 213 | attempt += 1 214 | if attempt == 5: 215 | break 216 | # Wait for next sample 217 | time.sleep(interval) 218 | 219 | except KeyboardInterrupt: 220 | pass 221 | -------------------------------------------------------------------------------- /grafana_dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "$$hashKey": "object:2331", 6 | "builtIn": 1, 7 | "datasource": "-- Grafana --", 8 | "enable": true, 9 | "hide": true, 10 | "iconColor": "rgba(0, 211, 255, 1)", 11 | "name": "Annotations & Alerts", 12 | "type": "dashboard" 13 | } 14 | ] 15 | }, 16 | "editable": true, 17 | "gnetId": null, 18 | "graphTooltip": 2, 19 | "id": 14, 20 | "iteration": 1527631768163, 21 | "links": [], 22 | "panels": [ 23 | { 24 | "cacheTimeout": null, 25 | "colorBackground": false, 26 | "colorValue": true, 27 | "colors": [ 28 | "#bf1b00", 29 | "#299c46", 30 | "#d44a3a" 31 | ], 32 | "datasource": "raspibiginflux", 33 | "format": "none", 34 | "gauge": { 35 | "maxValue": 100, 36 | "minValue": 0, 37 | "show": false, 38 | "thresholdLabels": false, 39 | "thresholdMarkers": true 40 | }, 41 | "gridPos": { 42 | "h": 4, 43 | "w": 3, 44 | "x": 0, 45 | "y": 0 46 | }, 47 | "id": 6, 48 | "interval": null, 49 | "links": [], 50 | "mappingType": 1, 51 | "mappingTypes": [ 52 | { 53 | "name": "value to text", 54 | "value": 1 55 | }, 56 | { 57 | "name": "range to text", 58 | "value": 2 59 | } 60 | ], 61 | "maxDataPoints": 100, 62 | "nullPointMode": "connected", 63 | "nullText": null, 64 | "postfix": "", 65 | "postfixFontSize": "50%", 66 | "prefix": "", 67 | "prefixFontSize": "50%", 68 | "rangeMaps": [ 69 | { 70 | "from": "null", 71 | "text": "N/A", 72 | "to": "null" 73 | } 74 | ], 75 | "sparkline": { 76 | "fillColor": "rgba(31, 118, 189, 0.18)", 77 | "full": true, 78 | "lineColor": "rgb(31, 120, 193)", 79 | "show": true 80 | }, 81 | "tableColumn": "", 82 | "targets": [ 83 | { 84 | "alias": "livingroom", 85 | "groupBy": [ 86 | { 87 | "params": [ 88 | "$__interval" 89 | ], 90 | "type": "time" 91 | }, 92 | { 93 | "params": [ 94 | "null" 95 | ], 96 | "type": "fill" 97 | } 98 | ], 99 | "measurement": "/^$measurement$/", 100 | "orderByTime": "ASC", 101 | "policy": "default", 102 | "refId": "A", 103 | "resultFormat": "time_series", 104 | "select": [ 105 | [ 106 | { 107 | "params": [ 108 | "temp" 109 | ], 110 | "type": "field" 111 | }, 112 | { 113 | "params": [], 114 | "type": "last" 115 | } 116 | ] 117 | ], 118 | "tags": [ 119 | { 120 | "key": "run", 121 | "operator": "=~", 122 | "value": "/^$run$/" 123 | }, 124 | { 125 | "condition": "AND", 126 | "key": "location", 127 | "operator": "=", 128 | "value": "livingroom" 129 | } 130 | ] 131 | } 132 | ], 133 | "thresholds": "15,30", 134 | "title": "Temp Livingroom", 135 | "transparent": false, 136 | "type": "singlestat", 137 | "valueFontSize": "80%", 138 | "valueMaps": [ 139 | { 140 | "op": "=", 141 | "text": "N/A", 142 | "value": "null" 143 | } 144 | ], 145 | "valueName": "avg" 146 | }, 147 | { 148 | "cacheTimeout": null, 149 | "colorBackground": false, 150 | "colorValue": true, 151 | "colors": [ 152 | "#bf1b00", 153 | "#299c46", 154 | "#d44a3a" 155 | ], 156 | "datasource": "raspibiginflux", 157 | "format": "none", 158 | "gauge": { 159 | "maxValue": 100, 160 | "minValue": 0, 161 | "show": false, 162 | "thresholdLabels": false, 163 | "thresholdMarkers": true 164 | }, 165 | "gridPos": { 166 | "h": 4, 167 | "w": 3, 168 | "x": 3, 169 | "y": 0 170 | }, 171 | "id": 7, 172 | "interval": null, 173 | "links": [], 174 | "mappingType": 1, 175 | "mappingTypes": [ 176 | { 177 | "name": "value to text", 178 | "value": 1 179 | }, 180 | { 181 | "name": "range to text", 182 | "value": 2 183 | } 184 | ], 185 | "maxDataPoints": 100, 186 | "nullPointMode": "connected", 187 | "nullText": null, 188 | "postfix": "", 189 | "postfixFontSize": "50%", 190 | "prefix": "", 191 | "prefixFontSize": "50%", 192 | "rangeMaps": [ 193 | { 194 | "from": "null", 195 | "text": "N/A", 196 | "to": "null" 197 | } 198 | ], 199 | "sparkline": { 200 | "fillColor": "rgba(31, 118, 189, 0.18)", 201 | "full": true, 202 | "lineColor": "rgb(31, 120, 193)", 203 | "show": true 204 | }, 205 | "tableColumn": "", 206 | "targets": [ 207 | { 208 | "alias": "raspizero1", 209 | "groupBy": [ 210 | { 211 | "params": [ 212 | "$__interval" 213 | ], 214 | "type": "time" 215 | }, 216 | { 217 | "params": [ 218 | "null" 219 | ], 220 | "type": "fill" 221 | } 222 | ], 223 | "measurement": "/^$measurement$/", 224 | "orderByTime": "ASC", 225 | "policy": "default", 226 | "refId": "A", 227 | "resultFormat": "time_series", 228 | "select": [ 229 | [ 230 | { 231 | "params": [ 232 | "humi" 233 | ], 234 | "type": "field" 235 | }, 236 | { 237 | "params": [], 238 | "type": "last" 239 | } 240 | ] 241 | ], 242 | "tags": [ 243 | { 244 | "key": "run", 245 | "operator": "=~", 246 | "value": "/^$run$/" 247 | }, 248 | { 249 | "condition": "AND", 250 | "key": "location", 251 | "operator": "=", 252 | "value": "livingroom" 253 | } 254 | ] 255 | } 256 | ], 257 | "thresholds": "15,60", 258 | "title": "Humid Livingroom", 259 | "transparent": false, 260 | "type": "singlestat", 261 | "valueFontSize": "80%", 262 | "valueMaps": [ 263 | { 264 | "op": "=", 265 | "text": "N/A", 266 | "value": "null" 267 | } 268 | ], 269 | "valueName": "avg" 270 | }, 271 | { 272 | "cacheTimeout": null, 273 | "colorBackground": false, 274 | "colorValue": false, 275 | "colors": [ 276 | "#bf1b00", 277 | "#299c46", 278 | "#d44a3a" 279 | ], 280 | "datasource": "raspibiginflux", 281 | "format": "none", 282 | "gauge": { 283 | "maxValue": 100, 284 | "minValue": 0, 285 | "show": false, 286 | "thresholdLabels": false, 287 | "thresholdMarkers": true 288 | }, 289 | "gridPos": { 290 | "h": 4, 291 | "w": 3, 292 | "x": 6, 293 | "y": 0 294 | }, 295 | "id": 8, 296 | "interval": null, 297 | "links": [], 298 | "mappingType": 1, 299 | "mappingTypes": [ 300 | { 301 | "name": "value to text", 302 | "value": 1 303 | }, 304 | { 305 | "name": "range to text", 306 | "value": 2 307 | } 308 | ], 309 | "maxDataPoints": 100, 310 | "nullPointMode": "connected", 311 | "nullText": null, 312 | "postfix": "", 313 | "postfixFontSize": "50%", 314 | "prefix": "", 315 | "prefixFontSize": "50%", 316 | "rangeMaps": [ 317 | { 318 | "from": "null", 319 | "text": "N/A", 320 | "to": "null" 321 | } 322 | ], 323 | "sparkline": { 324 | "fillColor": "rgba(31, 118, 189, 0.18)", 325 | "full": true, 326 | "lineColor": "rgb(31, 120, 193)", 327 | "show": true 328 | }, 329 | "tableColumn": "", 330 | "targets": [ 331 | { 332 | "alias": "livingroom", 333 | "groupBy": [ 334 | { 335 | "params": [ 336 | "$__interval" 337 | ], 338 | "type": "time" 339 | }, 340 | { 341 | "params": [ 342 | "null" 343 | ], 344 | "type": "fill" 345 | } 346 | ], 347 | "measurement": "/^$measurement$/", 348 | "orderByTime": "ASC", 349 | "policy": "default", 350 | "refId": "A", 351 | "resultFormat": "time_series", 352 | "select": [ 353 | [ 354 | { 355 | "params": [ 356 | "press" 357 | ], 358 | "type": "field" 359 | }, 360 | { 361 | "params": [], 362 | "type": "last" 363 | } 364 | ] 365 | ], 366 | "tags": [ 367 | { 368 | "key": "run", 369 | "operator": "=~", 370 | "value": "/^$run$/" 371 | }, 372 | { 373 | "condition": "AND", 374 | "key": "location", 375 | "operator": "=", 376 | "value": "livingroom" 377 | } 378 | ] 379 | } 380 | ], 381 | "thresholds": "15,60", 382 | "title": "Pressure Livingroom", 383 | "transparent": false, 384 | "type": "singlestat", 385 | "valueFontSize": "80%", 386 | "valueMaps": [ 387 | { 388 | "op": "=", 389 | "text": "N/A", 390 | "value": "null" 391 | } 392 | ], 393 | "valueName": "avg" 394 | }, 395 | { 396 | "cacheTimeout": null, 397 | "colorBackground": false, 398 | "colorValue": false, 399 | "colors": [ 400 | "#bf1b00", 401 | "#299c46", 402 | "#d44a3a" 403 | ], 404 | "datasource": "raspibiginflux", 405 | "format": "none", 406 | "gauge": { 407 | "maxValue": 100, 408 | "minValue": 0, 409 | "show": false, 410 | "thresholdLabels": false, 411 | "thresholdMarkers": true 412 | }, 413 | "gridPos": { 414 | "h": 4, 415 | "w": 3, 416 | "x": 9, 417 | "y": 0 418 | }, 419 | "id": 11, 420 | "interval": null, 421 | "links": [], 422 | "mappingType": 1, 423 | "mappingTypes": [ 424 | { 425 | "name": "value to text", 426 | "value": 1 427 | }, 428 | { 429 | "name": "range to text", 430 | "value": 2 431 | } 432 | ], 433 | "maxDataPoints": 100, 434 | "nullPointMode": "connected", 435 | "nullText": null, 436 | "postfix": "", 437 | "postfixFontSize": "50%", 438 | "prefix": "", 439 | "prefixFontSize": "50%", 440 | "rangeMaps": [ 441 | { 442 | "from": "null", 443 | "text": "N/A", 444 | "to": "null" 445 | } 446 | ], 447 | "sparkline": { 448 | "fillColor": "rgba(31, 118, 189, 0.18)", 449 | "full": true, 450 | "lineColor": "rgb(31, 120, 193)", 451 | "show": true 452 | }, 453 | "tableColumn": "", 454 | "targets": [ 455 | { 456 | "alias": "", 457 | "groupBy": [ 458 | { 459 | "params": [ 460 | "$__interval" 461 | ], 462 | "type": "time" 463 | }, 464 | { 465 | "params": [ 466 | "null" 467 | ], 468 | "type": "fill" 469 | } 470 | ], 471 | "measurement": "/^$measurement$/", 472 | "orderByTime": "ASC", 473 | "policy": "default", 474 | "refId": "A", 475 | "resultFormat": "time_series", 476 | "select": [ 477 | [ 478 | { 479 | "params": [ 480 | "press" 481 | ], 482 | "type": "field" 483 | }, 484 | { 485 | "params": [], 486 | "type": "last" 487 | } 488 | ] 489 | ], 490 | "tags": [ 491 | { 492 | "key": "run", 493 | "operator": "=~", 494 | "value": "/^$run$/" 495 | }, 496 | { 497 | "condition": "AND", 498 | "key": "location", 499 | "operator": "=", 500 | "value": "livingroom" 501 | } 502 | ] 503 | } 504 | ], 505 | "thresholds": "15,60", 506 | "title": "IAQ Livingroom", 507 | "transparent": false, 508 | "type": "singlestat", 509 | "valueFontSize": "80%", 510 | "valueMaps": [ 511 | { 512 | "op": "=", 513 | "text": "N/A", 514 | "value": "null" 515 | } 516 | ], 517 | "valueName": "avg" 518 | }, 519 | { 520 | "cacheTimeout": null, 521 | "colorBackground": false, 522 | "colorValue": true, 523 | "colors": [ 524 | "#bf1b00", 525 | "#299c46", 526 | "#d44a3a" 527 | ], 528 | "datasource": "raspibiginflux", 529 | "format": "none", 530 | "gauge": { 531 | "maxValue": 100, 532 | "minValue": 0, 533 | "show": false, 534 | "thresholdLabels": false, 535 | "thresholdMarkers": true 536 | }, 537 | "gridPos": { 538 | "h": 4, 539 | "w": 3, 540 | "x": 12, 541 | "y": 0 542 | }, 543 | "id": 12, 544 | "interval": null, 545 | "links": [], 546 | "mappingType": 1, 547 | "mappingTypes": [ 548 | { 549 | "name": "value to text", 550 | "value": 1 551 | }, 552 | { 553 | "name": "range to text", 554 | "value": 2 555 | } 556 | ], 557 | "maxDataPoints": 100, 558 | "nullPointMode": "connected", 559 | "nullText": null, 560 | "postfix": "", 561 | "postfixFontSize": "50%", 562 | "prefix": "", 563 | "prefixFontSize": "50%", 564 | "rangeMaps": [ 565 | { 566 | "from": "null", 567 | "text": "N/A", 568 | "to": "null" 569 | } 570 | ], 571 | "sparkline": { 572 | "fillColor": "rgba(31, 118, 189, 0.18)", 573 | "full": true, 574 | "lineColor": "rgb(31, 120, 193)", 575 | "show": true 576 | }, 577 | "tableColumn": "", 578 | "targets": [ 579 | { 580 | "alias": "raspizero2", 581 | "groupBy": [ 582 | { 583 | "params": [ 584 | "$__interval" 585 | ], 586 | "type": "time" 587 | }, 588 | { 589 | "params": [ 590 | "null" 591 | ], 592 | "type": "fill" 593 | } 594 | ], 595 | "measurement": "/^$measurement$/", 596 | "orderByTime": "ASC", 597 | "policy": "default", 598 | "refId": "A", 599 | "resultFormat": "time_series", 600 | "select": [ 601 | [ 602 | { 603 | "params": [ 604 | "temp" 605 | ], 606 | "type": "field" 607 | }, 608 | { 609 | "params": [], 610 | "type": "last" 611 | } 612 | ] 613 | ], 614 | "tags": [ 615 | { 616 | "key": "run", 617 | "operator": "=~", 618 | "value": "/^$run$/" 619 | }, 620 | { 621 | "condition": "AND", 622 | "key": "location", 623 | "operator": "=", 624 | "value": "bedroom" 625 | } 626 | ] 627 | } 628 | ], 629 | "thresholds": "15,30", 630 | "title": "Temperature Bedroom", 631 | "transparent": false, 632 | "type": "singlestat", 633 | "valueFontSize": "80%", 634 | "valueMaps": [ 635 | { 636 | "op": "=", 637 | "text": "N/A", 638 | "value": "null" 639 | } 640 | ], 641 | "valueName": "avg" 642 | }, 643 | { 644 | "cacheTimeout": null, 645 | "colorBackground": false, 646 | "colorValue": true, 647 | "colors": [ 648 | "#bf1b00", 649 | "#299c46", 650 | "#d44a3a" 651 | ], 652 | "datasource": "raspibiginflux", 653 | "format": "none", 654 | "gauge": { 655 | "maxValue": 100, 656 | "minValue": 0, 657 | "show": false, 658 | "thresholdLabels": false, 659 | "thresholdMarkers": true 660 | }, 661 | "gridPos": { 662 | "h": 4, 663 | "w": 3, 664 | "x": 15, 665 | "y": 0 666 | }, 667 | "id": 13, 668 | "interval": null, 669 | "links": [], 670 | "mappingType": 1, 671 | "mappingTypes": [ 672 | { 673 | "name": "value to text", 674 | "value": 1 675 | }, 676 | { 677 | "name": "range to text", 678 | "value": 2 679 | } 680 | ], 681 | "maxDataPoints": 100, 682 | "nullPointMode": "connected", 683 | "nullText": null, 684 | "postfix": "", 685 | "postfixFontSize": "50%", 686 | "prefix": "", 687 | "prefixFontSize": "50%", 688 | "rangeMaps": [ 689 | { 690 | "from": "null", 691 | "text": "N/A", 692 | "to": "null" 693 | } 694 | ], 695 | "sparkline": { 696 | "fillColor": "rgba(31, 118, 189, 0.18)", 697 | "full": true, 698 | "lineColor": "rgb(31, 120, 193)", 699 | "show": true 700 | }, 701 | "tableColumn": "", 702 | "targets": [ 703 | { 704 | "alias": "raspizero2", 705 | "groupBy": [ 706 | { 707 | "params": [ 708 | "$__interval" 709 | ], 710 | "type": "time" 711 | }, 712 | { 713 | "params": [ 714 | "null" 715 | ], 716 | "type": "fill" 717 | } 718 | ], 719 | "measurement": "/^$measurement$/", 720 | "orderByTime": "ASC", 721 | "policy": "default", 722 | "refId": "A", 723 | "resultFormat": "time_series", 724 | "select": [ 725 | [ 726 | { 727 | "params": [ 728 | "humi" 729 | ], 730 | "type": "field" 731 | }, 732 | { 733 | "params": [], 734 | "type": "last" 735 | } 736 | ] 737 | ], 738 | "tags": [ 739 | { 740 | "key": "run", 741 | "operator": "=~", 742 | "value": "/^$run$/" 743 | }, 744 | { 745 | "condition": "AND", 746 | "key": "location", 747 | "operator": "=", 748 | "value": "bedroom" 749 | } 750 | ] 751 | } 752 | ], 753 | "thresholds": "15,60", 754 | "title": "Humidity Bedroom", 755 | "transparent": false, 756 | "type": "singlestat", 757 | "valueFontSize": "80%", 758 | "valueMaps": [ 759 | { 760 | "op": "=", 761 | "text": "N/A", 762 | "value": "null" 763 | } 764 | ], 765 | "valueName": "avg" 766 | }, 767 | { 768 | "cacheTimeout": null, 769 | "colorBackground": false, 770 | "colorValue": false, 771 | "colors": [ 772 | "#bf1b00", 773 | "#299c46", 774 | "#d44a3a" 775 | ], 776 | "datasource": "raspibiginflux", 777 | "format": "none", 778 | "gauge": { 779 | "maxValue": 100, 780 | "minValue": 0, 781 | "show": false, 782 | "thresholdLabels": false, 783 | "thresholdMarkers": true 784 | }, 785 | "gridPos": { 786 | "h": 4, 787 | "w": 3, 788 | "x": 18, 789 | "y": 0 790 | }, 791 | "id": 14, 792 | "interval": null, 793 | "links": [], 794 | "mappingType": 1, 795 | "mappingTypes": [ 796 | { 797 | "name": "value to text", 798 | "value": 1 799 | }, 800 | { 801 | "name": "range to text", 802 | "value": 2 803 | } 804 | ], 805 | "maxDataPoints": 100, 806 | "nullPointMode": "connected", 807 | "nullText": null, 808 | "postfix": "", 809 | "postfixFontSize": "50%", 810 | "prefix": "", 811 | "prefixFontSize": "50%", 812 | "rangeMaps": [ 813 | { 814 | "from": "null", 815 | "text": "N/A", 816 | "to": "null" 817 | } 818 | ], 819 | "sparkline": { 820 | "fillColor": "rgba(31, 118, 189, 0.18)", 821 | "full": true, 822 | "lineColor": "rgb(31, 120, 193)", 823 | "show": true 824 | }, 825 | "tableColumn": "", 826 | "targets": [ 827 | { 828 | "alias": "raspizero2", 829 | "groupBy": [ 830 | { 831 | "params": [ 832 | "$__interval" 833 | ], 834 | "type": "time" 835 | }, 836 | { 837 | "params": [ 838 | "null" 839 | ], 840 | "type": "fill" 841 | } 842 | ], 843 | "measurement": "/^$measurement$/", 844 | "orderByTime": "ASC", 845 | "policy": "default", 846 | "refId": "A", 847 | "resultFormat": "time_series", 848 | "select": [ 849 | [ 850 | { 851 | "params": [ 852 | "press" 853 | ], 854 | "type": "field" 855 | }, 856 | { 857 | "params": [], 858 | "type": "last" 859 | } 860 | ] 861 | ], 862 | "tags": [ 863 | { 864 | "key": "run", 865 | "operator": "=~", 866 | "value": "/^$run$/" 867 | }, 868 | { 869 | "condition": "AND", 870 | "key": "location", 871 | "operator": "=", 872 | "value": "bedroom" 873 | } 874 | ] 875 | } 876 | ], 877 | "thresholds": "15,60", 878 | "title": "Pressure Bedroom", 879 | "transparent": false, 880 | "type": "singlestat", 881 | "valueFontSize": "80%", 882 | "valueMaps": [ 883 | { 884 | "op": "=", 885 | "text": "N/A", 886 | "value": "null" 887 | } 888 | ], 889 | "valueName": "avg" 890 | }, 891 | { 892 | "cacheTimeout": null, 893 | "colorBackground": false, 894 | "colorValue": false, 895 | "colors": [ 896 | "#bf1b00", 897 | "#299c46", 898 | "#d44a3a" 899 | ], 900 | "datasource": "raspibiginflux", 901 | "format": "none", 902 | "gauge": { 903 | "maxValue": 100, 904 | "minValue": 0, 905 | "show": false, 906 | "thresholdLabels": false, 907 | "thresholdMarkers": true 908 | }, 909 | "gridPos": { 910 | "h": 4, 911 | "w": 3, 912 | "x": 21, 913 | "y": 0 914 | }, 915 | "id": 15, 916 | "interval": null, 917 | "links": [], 918 | "mappingType": 1, 919 | "mappingTypes": [ 920 | { 921 | "name": "value to text", 922 | "value": 1 923 | }, 924 | { 925 | "name": "range to text", 926 | "value": 2 927 | } 928 | ], 929 | "maxDataPoints": 100, 930 | "nullPointMode": "connected", 931 | "nullText": null, 932 | "postfix": "", 933 | "postfixFontSize": "50%", 934 | "prefix": "", 935 | "prefixFontSize": "50%", 936 | "rangeMaps": [ 937 | { 938 | "from": "null", 939 | "text": "N/A", 940 | "to": "null" 941 | } 942 | ], 943 | "sparkline": { 944 | "fillColor": "rgba(31, 118, 189, 0.18)", 945 | "full": true, 946 | "lineColor": "rgb(31, 120, 193)", 947 | "show": true 948 | }, 949 | "tableColumn": "", 950 | "targets": [ 951 | { 952 | "alias": "raspizero2", 953 | "groupBy": [ 954 | { 955 | "params": [ 956 | "$__interval" 957 | ], 958 | "type": "time" 959 | }, 960 | { 961 | "params": [ 962 | "null" 963 | ], 964 | "type": "fill" 965 | } 966 | ], 967 | "measurement": "/^$measurement$/", 968 | "orderByTime": "ASC", 969 | "policy": "default", 970 | "refId": "A", 971 | "resultFormat": "time_series", 972 | "select": [ 973 | [ 974 | { 975 | "params": [ 976 | "press" 977 | ], 978 | "type": "field" 979 | }, 980 | { 981 | "params": [], 982 | "type": "last" 983 | } 984 | ] 985 | ], 986 | "tags": [ 987 | { 988 | "key": "run", 989 | "operator": "=~", 990 | "value": "/^$run$/" 991 | }, 992 | { 993 | "condition": "AND", 994 | "key": "location", 995 | "operator": "=", 996 | "value": "bedroom" 997 | } 998 | ] 999 | } 1000 | ], 1001 | "thresholds": "15,60", 1002 | "title": "IAQ Bedroom", 1003 | "transparent": false, 1004 | "type": "singlestat", 1005 | "valueFontSize": "80%", 1006 | "valueMaps": [ 1007 | { 1008 | "op": "=", 1009 | "text": "N/A", 1010 | "value": "null" 1011 | } 1012 | ], 1013 | "valueName": "avg" 1014 | }, 1015 | { 1016 | "aliasColors": {}, 1017 | "bars": false, 1018 | "dashLength": 10, 1019 | "dashes": false, 1020 | "datasource": "raspibiginflux", 1021 | "fill": 1, 1022 | "gridPos": { 1023 | "h": 6, 1024 | "w": 24, 1025 | "x": 0, 1026 | "y": 4 1027 | }, 1028 | "id": 10, 1029 | "legend": { 1030 | "alignAsTable": false, 1031 | "avg": true, 1032 | "current": false, 1033 | "max": true, 1034 | "min": true, 1035 | "rightSide": false, 1036 | "show": true, 1037 | "total": false, 1038 | "values": true 1039 | }, 1040 | "lines": true, 1041 | "linewidth": 1, 1042 | "links": [], 1043 | "nullPointMode": "null", 1044 | "percentage": false, 1045 | "pointradius": 5, 1046 | "points": false, 1047 | "renderer": "flot", 1048 | "seriesOverrides": [], 1049 | "spaceLength": 10, 1050 | "stack": false, 1051 | "steppedLine": false, 1052 | "targets": [ 1053 | { 1054 | "alias": "livingroom", 1055 | "groupBy": [ 1056 | { 1057 | "params": [ 1058 | "$__interval" 1059 | ], 1060 | "type": "time" 1061 | }, 1062 | { 1063 | "params": [ 1064 | "null" 1065 | ], 1066 | "type": "fill" 1067 | } 1068 | ], 1069 | "measurement": "/^$measurement$/", 1070 | "orderByTime": "ASC", 1071 | "policy": "default", 1072 | "refId": "A", 1073 | "resultFormat": "time_series", 1074 | "select": [ 1075 | [ 1076 | { 1077 | "params": [ 1078 | "iaq" 1079 | ], 1080 | "type": "field" 1081 | }, 1082 | { 1083 | "params": [], 1084 | "type": "mean" 1085 | } 1086 | ] 1087 | ], 1088 | "tags": [ 1089 | { 1090 | "key": "run", 1091 | "operator": "=~", 1092 | "value": "/^$run$/" 1093 | }, 1094 | { 1095 | "condition": "AND", 1096 | "key": "location", 1097 | "operator": "=", 1098 | "value": "livingroom" 1099 | } 1100 | ] 1101 | }, 1102 | { 1103 | "alias": "bedroom", 1104 | "groupBy": [ 1105 | { 1106 | "params": [ 1107 | "$__interval" 1108 | ], 1109 | "type": "time" 1110 | }, 1111 | { 1112 | "params": [ 1113 | "null" 1114 | ], 1115 | "type": "fill" 1116 | } 1117 | ], 1118 | "measurement": "/^$measurement$/", 1119 | "orderByTime": "ASC", 1120 | "policy": "default", 1121 | "refId": "B", 1122 | "resultFormat": "time_series", 1123 | "select": [ 1124 | [ 1125 | { 1126 | "params": [ 1127 | "iaq" 1128 | ], 1129 | "type": "field" 1130 | }, 1131 | { 1132 | "params": [], 1133 | "type": "mean" 1134 | } 1135 | ] 1136 | ], 1137 | "tags": [ 1138 | { 1139 | "key": "run", 1140 | "operator": "=~", 1141 | "value": "/^$run$/" 1142 | }, 1143 | { 1144 | "condition": "AND", 1145 | "key": "location", 1146 | "operator": "=", 1147 | "value": "bedroom" 1148 | } 1149 | ] 1150 | } 1151 | ], 1152 | "thresholds": [], 1153 | "timeFrom": null, 1154 | "timeShift": null, 1155 | "title": "Indoor Air Quality", 1156 | "tooltip": { 1157 | "shared": true, 1158 | "sort": 0, 1159 | "value_type": "individual" 1160 | }, 1161 | "transparent": false, 1162 | "type": "graph", 1163 | "xaxis": { 1164 | "buckets": null, 1165 | "mode": "time", 1166 | "name": null, 1167 | "show": true, 1168 | "values": [] 1169 | }, 1170 | "yaxes": [ 1171 | { 1172 | "decimals": null, 1173 | "format": "short", 1174 | "label": "%", 1175 | "logBase": 1, 1176 | "max": null, 1177 | "min": null, 1178 | "show": true 1179 | }, 1180 | { 1181 | "format": "short", 1182 | "label": null, 1183 | "logBase": 1, 1184 | "max": null, 1185 | "min": null, 1186 | "show": true 1187 | } 1188 | ], 1189 | "yaxis": { 1190 | "align": false, 1191 | "alignLevel": null 1192 | } 1193 | }, 1194 | { 1195 | "aliasColors": {}, 1196 | "bars": false, 1197 | "dashLength": 10, 1198 | "dashes": false, 1199 | "datasource": "raspibiginflux", 1200 | "fill": 1, 1201 | "gridPos": { 1202 | "h": 9, 1203 | "w": 12, 1204 | "x": 0, 1205 | "y": 10 1206 | }, 1207 | "id": 2, 1208 | "legend": { 1209 | "alignAsTable": false, 1210 | "avg": true, 1211 | "current": false, 1212 | "max": true, 1213 | "min": true, 1214 | "rightSide": false, 1215 | "show": true, 1216 | "total": false, 1217 | "values": true 1218 | }, 1219 | "lines": true, 1220 | "linewidth": 1, 1221 | "links": [], 1222 | "nullPointMode": "null", 1223 | "percentage": false, 1224 | "pointradius": 5, 1225 | "points": false, 1226 | "renderer": "flot", 1227 | "seriesOverrides": [], 1228 | "spaceLength": 10, 1229 | "stack": false, 1230 | "steppedLine": false, 1231 | "targets": [ 1232 | { 1233 | "$$hashKey": "object:2458", 1234 | "alias": "livingroom", 1235 | "groupBy": [ 1236 | { 1237 | "params": [ 1238 | "$__interval" 1239 | ], 1240 | "type": "time" 1241 | }, 1242 | { 1243 | "params": [ 1244 | "null" 1245 | ], 1246 | "type": "fill" 1247 | } 1248 | ], 1249 | "hide": false, 1250 | "measurement": "/^$measurement$/", 1251 | "orderByTime": "ASC", 1252 | "policy": "default", 1253 | "refId": "A", 1254 | "resultFormat": "time_series", 1255 | "select": [ 1256 | [ 1257 | { 1258 | "params": [ 1259 | "temp" 1260 | ], 1261 | "type": "field" 1262 | }, 1263 | { 1264 | "params": [], 1265 | "type": "mean" 1266 | } 1267 | ] 1268 | ], 1269 | "tags": [ 1270 | { 1271 | "key": "run", 1272 | "operator": "=~", 1273 | "value": "/^$run$/" 1274 | }, 1275 | { 1276 | "condition": "AND", 1277 | "key": "location", 1278 | "operator": "=", 1279 | "value": "livingroom" 1280 | } 1281 | ] 1282 | }, 1283 | { 1284 | "$$hashKey": "object:2459", 1285 | "alias": "bedroom", 1286 | "groupBy": [ 1287 | { 1288 | "params": [ 1289 | "$__interval" 1290 | ], 1291 | "type": "time" 1292 | }, 1293 | { 1294 | "params": [ 1295 | "null" 1296 | ], 1297 | "type": "fill" 1298 | } 1299 | ], 1300 | "measurement": "/^$measurement$/", 1301 | "orderByTime": "ASC", 1302 | "policy": "default", 1303 | "refId": "B", 1304 | "resultFormat": "time_series", 1305 | "select": [ 1306 | [ 1307 | { 1308 | "params": [ 1309 | "temp" 1310 | ], 1311 | "type": "field" 1312 | }, 1313 | { 1314 | "params": [], 1315 | "type": "mean" 1316 | } 1317 | ] 1318 | ], 1319 | "tags": [ 1320 | { 1321 | "key": "run", 1322 | "operator": "=~", 1323 | "value": "/^$run$/" 1324 | }, 1325 | { 1326 | "condition": "AND", 1327 | "key": "location", 1328 | "operator": "=", 1329 | "value": "bedroom" 1330 | } 1331 | ] 1332 | } 1333 | ], 1334 | "thresholds": [], 1335 | "timeFrom": null, 1336 | "timeShift": null, 1337 | "title": "Temperatures", 1338 | "tooltip": { 1339 | "shared": true, 1340 | "sort": 0, 1341 | "value_type": "individual" 1342 | }, 1343 | "transparent": false, 1344 | "type": "graph", 1345 | "xaxis": { 1346 | "buckets": null, 1347 | "mode": "time", 1348 | "name": null, 1349 | "show": true, 1350 | "values": [] 1351 | }, 1352 | "yaxes": [ 1353 | { 1354 | "$$hashKey": "object:2704", 1355 | "format": "celsius", 1356 | "label": "", 1357 | "logBase": 1, 1358 | "max": null, 1359 | "min": null, 1360 | "show": true 1361 | }, 1362 | { 1363 | "$$hashKey": "object:2705", 1364 | "format": "short", 1365 | "label": null, 1366 | "logBase": 1, 1367 | "max": null, 1368 | "min": null, 1369 | "show": true 1370 | } 1371 | ], 1372 | "yaxis": { 1373 | "align": false, 1374 | "alignLevel": null 1375 | } 1376 | }, 1377 | { 1378 | "aliasColors": {}, 1379 | "bars": false, 1380 | "dashLength": 10, 1381 | "dashes": false, 1382 | "datasource": "raspibiginflux", 1383 | "fill": 1, 1384 | "gridPos": { 1385 | "h": 9, 1386 | "w": 12, 1387 | "x": 12, 1388 | "y": 10 1389 | }, 1390 | "id": 4, 1391 | "legend": { 1392 | "alignAsTable": false, 1393 | "avg": true, 1394 | "current": false, 1395 | "max": true, 1396 | "min": true, 1397 | "rightSide": false, 1398 | "show": true, 1399 | "total": false, 1400 | "values": true 1401 | }, 1402 | "lines": true, 1403 | "linewidth": 1, 1404 | "links": [], 1405 | "nullPointMode": "null", 1406 | "percentage": false, 1407 | "pointradius": 5, 1408 | "points": false, 1409 | "renderer": "flot", 1410 | "seriesOverrides": [], 1411 | "spaceLength": 10, 1412 | "stack": false, 1413 | "steppedLine": false, 1414 | "targets": [ 1415 | { 1416 | "alias": "livingroom", 1417 | "groupBy": [ 1418 | { 1419 | "params": [ 1420 | "$__interval" 1421 | ], 1422 | "type": "time" 1423 | }, 1424 | { 1425 | "params": [ 1426 | "null" 1427 | ], 1428 | "type": "fill" 1429 | } 1430 | ], 1431 | "measurement": "/^$measurement$/", 1432 | "orderByTime": "ASC", 1433 | "policy": "default", 1434 | "refId": "A", 1435 | "resultFormat": "time_series", 1436 | "select": [ 1437 | [ 1438 | { 1439 | "params": [ 1440 | "press" 1441 | ], 1442 | "type": "field" 1443 | }, 1444 | { 1445 | "params": [], 1446 | "type": "mean" 1447 | } 1448 | ] 1449 | ], 1450 | "tags": [ 1451 | { 1452 | "key": "run", 1453 | "operator": "=~", 1454 | "value": "/^$run$/" 1455 | }, 1456 | { 1457 | "condition": "AND", 1458 | "key": "location", 1459 | "operator": "=", 1460 | "value": "livingroom" 1461 | } 1462 | ] 1463 | }, 1464 | { 1465 | "alias": "bedroom", 1466 | "groupBy": [ 1467 | { 1468 | "params": [ 1469 | "$__interval" 1470 | ], 1471 | "type": "time" 1472 | }, 1473 | { 1474 | "params": [ 1475 | "null" 1476 | ], 1477 | "type": "fill" 1478 | } 1479 | ], 1480 | "measurement": "/^$measurement$/", 1481 | "orderByTime": "ASC", 1482 | "policy": "default", 1483 | "refId": "B", 1484 | "resultFormat": "time_series", 1485 | "select": [ 1486 | [ 1487 | { 1488 | "params": [ 1489 | "press" 1490 | ], 1491 | "type": "field" 1492 | }, 1493 | { 1494 | "params": [], 1495 | "type": "mean" 1496 | } 1497 | ] 1498 | ], 1499 | "tags": [ 1500 | { 1501 | "key": "run", 1502 | "operator": "=~", 1503 | "value": "/^$run$/" 1504 | }, 1505 | { 1506 | "condition": "AND", 1507 | "key": "location", 1508 | "operator": "=", 1509 | "value": "bedroom" 1510 | } 1511 | ] 1512 | } 1513 | ], 1514 | "thresholds": [], 1515 | "timeFrom": null, 1516 | "timeShift": null, 1517 | "title": "Pressure", 1518 | "tooltip": { 1519 | "shared": true, 1520 | "sort": 0, 1521 | "value_type": "individual" 1522 | }, 1523 | "transparent": false, 1524 | "type": "graph", 1525 | "xaxis": { 1526 | "buckets": null, 1527 | "mode": "time", 1528 | "name": null, 1529 | "show": true, 1530 | "values": [] 1531 | }, 1532 | "yaxes": [ 1533 | { 1534 | "decimals": null, 1535 | "format": "pressurembar", 1536 | "label": "", 1537 | "logBase": 1, 1538 | "max": null, 1539 | "min": null, 1540 | "show": true 1541 | }, 1542 | { 1543 | "format": "short", 1544 | "label": null, 1545 | "logBase": 1, 1546 | "max": null, 1547 | "min": null, 1548 | "show": true 1549 | } 1550 | ], 1551 | "yaxis": { 1552 | "align": false, 1553 | "alignLevel": null 1554 | } 1555 | }, 1556 | { 1557 | "aliasColors": {}, 1558 | "bars": false, 1559 | "dashLength": 10, 1560 | "dashes": false, 1561 | "datasource": "raspibiginflux", 1562 | "fill": 1, 1563 | "gridPos": { 1564 | "h": 9, 1565 | "w": 12, 1566 | "x": 0, 1567 | "y": 19 1568 | }, 1569 | "id": 3, 1570 | "legend": { 1571 | "alignAsTable": false, 1572 | "avg": true, 1573 | "current": false, 1574 | "max": true, 1575 | "min": true, 1576 | "rightSide": false, 1577 | "show": true, 1578 | "total": false, 1579 | "values": true 1580 | }, 1581 | "lines": true, 1582 | "linewidth": 1, 1583 | "links": [], 1584 | "nullPointMode": "null", 1585 | "percentage": false, 1586 | "pointradius": 5, 1587 | "points": false, 1588 | "renderer": "flot", 1589 | "seriesOverrides": [], 1590 | "spaceLength": 10, 1591 | "stack": false, 1592 | "steppedLine": false, 1593 | "targets": [ 1594 | { 1595 | "alias": "livingroom", 1596 | "groupBy": [ 1597 | { 1598 | "params": [ 1599 | "$__interval" 1600 | ], 1601 | "type": "time" 1602 | }, 1603 | { 1604 | "params": [ 1605 | "null" 1606 | ], 1607 | "type": "fill" 1608 | } 1609 | ], 1610 | "measurement": "/^$measurement$/", 1611 | "orderByTime": "ASC", 1612 | "policy": "default", 1613 | "refId": "A", 1614 | "resultFormat": "time_series", 1615 | "select": [ 1616 | [ 1617 | { 1618 | "params": [ 1619 | "humi" 1620 | ], 1621 | "type": "field" 1622 | }, 1623 | { 1624 | "params": [], 1625 | "type": "mean" 1626 | } 1627 | ] 1628 | ], 1629 | "tags": [ 1630 | { 1631 | "key": "run", 1632 | "operator": "=~", 1633 | "value": "/^$run$/" 1634 | }, 1635 | { 1636 | "condition": "AND", 1637 | "key": "location", 1638 | "operator": "=", 1639 | "value": "livingroom" 1640 | } 1641 | ] 1642 | }, 1643 | { 1644 | "alias": "bedroom", 1645 | "groupBy": [ 1646 | { 1647 | "params": [ 1648 | "$__interval" 1649 | ], 1650 | "type": "time" 1651 | }, 1652 | { 1653 | "params": [ 1654 | "null" 1655 | ], 1656 | "type": "fill" 1657 | } 1658 | ], 1659 | "measurement": "/^$measurement$/", 1660 | "orderByTime": "ASC", 1661 | "policy": "default", 1662 | "refId": "B", 1663 | "resultFormat": "time_series", 1664 | "select": [ 1665 | [ 1666 | { 1667 | "params": [ 1668 | "humi" 1669 | ], 1670 | "type": "field" 1671 | }, 1672 | { 1673 | "params": [], 1674 | "type": "mean" 1675 | } 1676 | ] 1677 | ], 1678 | "tags": [ 1679 | { 1680 | "key": "run", 1681 | "operator": "=~", 1682 | "value": "/^$run$/" 1683 | }, 1684 | { 1685 | "condition": "AND", 1686 | "key": "location", 1687 | "operator": "=", 1688 | "value": "bedroom" 1689 | } 1690 | ] 1691 | } 1692 | ], 1693 | "thresholds": [ 1694 | { 1695 | "colorMode": "critical", 1696 | "fill": true, 1697 | "line": true, 1698 | "op": "gt", 1699 | "value": 80, 1700 | "yaxis": "left" 1701 | } 1702 | ], 1703 | "timeFrom": null, 1704 | "timeShift": null, 1705 | "title": "Humidity", 1706 | "tooltip": { 1707 | "shared": true, 1708 | "sort": 0, 1709 | "value_type": "individual" 1710 | }, 1711 | "transparent": false, 1712 | "type": "graph", 1713 | "xaxis": { 1714 | "buckets": null, 1715 | "mode": "time", 1716 | "name": null, 1717 | "show": true, 1718 | "values": [] 1719 | }, 1720 | "yaxes": [ 1721 | { 1722 | "decimals": null, 1723 | "format": "humidity", 1724 | "label": "", 1725 | "logBase": 1, 1726 | "max": null, 1727 | "min": null, 1728 | "show": true 1729 | }, 1730 | { 1731 | "format": "short", 1732 | "label": null, 1733 | "logBase": 1, 1734 | "max": null, 1735 | "min": null, 1736 | "show": true 1737 | } 1738 | ], 1739 | "yaxis": { 1740 | "align": false, 1741 | "alignLevel": null 1742 | } 1743 | }, 1744 | { 1745 | "aliasColors": {}, 1746 | "bars": false, 1747 | "dashLength": 10, 1748 | "dashes": false, 1749 | "datasource": "raspibiginflux", 1750 | "fill": 1, 1751 | "gridPos": { 1752 | "h": 9, 1753 | "w": 12, 1754 | "x": 12, 1755 | "y": 19 1756 | }, 1757 | "id": 9, 1758 | "legend": { 1759 | "alignAsTable": false, 1760 | "avg": true, 1761 | "current": false, 1762 | "max": true, 1763 | "min": true, 1764 | "rightSide": false, 1765 | "show": true, 1766 | "total": false, 1767 | "values": true 1768 | }, 1769 | "lines": true, 1770 | "linewidth": 1, 1771 | "links": [], 1772 | "nullPointMode": "null", 1773 | "percentage": false, 1774 | "pointradius": 5, 1775 | "points": false, 1776 | "renderer": "flot", 1777 | "seriesOverrides": [], 1778 | "spaceLength": 10, 1779 | "stack": false, 1780 | "steppedLine": false, 1781 | "targets": [ 1782 | { 1783 | "alias": "livingroom", 1784 | "groupBy": [ 1785 | { 1786 | "params": [ 1787 | "$__interval" 1788 | ], 1789 | "type": "time" 1790 | }, 1791 | { 1792 | "params": [ 1793 | "null" 1794 | ], 1795 | "type": "fill" 1796 | } 1797 | ], 1798 | "measurement": "/^$measurement$/", 1799 | "orderByTime": "ASC", 1800 | "policy": "default", 1801 | "refId": "A", 1802 | "resultFormat": "time_series", 1803 | "select": [ 1804 | [ 1805 | { 1806 | "params": [ 1807 | "gas" 1808 | ], 1809 | "type": "field" 1810 | }, 1811 | { 1812 | "params": [], 1813 | "type": "mean" 1814 | } 1815 | ] 1816 | ], 1817 | "tags": [ 1818 | { 1819 | "key": "run", 1820 | "operator": "=~", 1821 | "value": "/^$run$/" 1822 | }, 1823 | { 1824 | "condition": "AND", 1825 | "key": "location", 1826 | "operator": "=", 1827 | "value": "livingroom" 1828 | } 1829 | ] 1830 | }, 1831 | { 1832 | "alias": "bedroom", 1833 | "groupBy": [ 1834 | { 1835 | "params": [ 1836 | "$__interval" 1837 | ], 1838 | "type": "time" 1839 | }, 1840 | { 1841 | "params": [ 1842 | "null" 1843 | ], 1844 | "type": "fill" 1845 | } 1846 | ], 1847 | "measurement": "/^$measurement$/", 1848 | "orderByTime": "ASC", 1849 | "policy": "default", 1850 | "refId": "B", 1851 | "resultFormat": "time_series", 1852 | "select": [ 1853 | [ 1854 | { 1855 | "params": [ 1856 | "gas" 1857 | ], 1858 | "type": "field" 1859 | }, 1860 | { 1861 | "params": [], 1862 | "type": "mean" 1863 | } 1864 | ] 1865 | ], 1866 | "tags": [ 1867 | { 1868 | "key": "run", 1869 | "operator": "=~", 1870 | "value": "/^$run$/" 1871 | }, 1872 | { 1873 | "condition": "AND", 1874 | "key": "location", 1875 | "operator": "=", 1876 | "value": "bedroom" 1877 | } 1878 | ] 1879 | }, 1880 | { 1881 | "alias": "livingroom baseline", 1882 | "groupBy": [ 1883 | { 1884 | "params": [ 1885 | "$__interval" 1886 | ], 1887 | "type": "time" 1888 | }, 1889 | { 1890 | "params": [ 1891 | "null" 1892 | ], 1893 | "type": "fill" 1894 | } 1895 | ], 1896 | "measurement": "/^$measurement$/", 1897 | "orderByTime": "ASC", 1898 | "policy": "default", 1899 | "refId": "C", 1900 | "resultFormat": "time_series", 1901 | "select": [ 1902 | [ 1903 | { 1904 | "params": [ 1905 | "gasbaseline" 1906 | ], 1907 | "type": "field" 1908 | }, 1909 | { 1910 | "params": [], 1911 | "type": "last" 1912 | } 1913 | ] 1914 | ], 1915 | "tags": [ 1916 | { 1917 | "key": "run", 1918 | "operator": "=~", 1919 | "value": "/^$run$/" 1920 | }, 1921 | { 1922 | "condition": "AND", 1923 | "key": "location", 1924 | "operator": "=", 1925 | "value": "livingroom" 1926 | } 1927 | ] 1928 | }, 1929 | { 1930 | "alias": "bedroom baseline", 1931 | "groupBy": [ 1932 | { 1933 | "params": [ 1934 | "$__interval" 1935 | ], 1936 | "type": "time" 1937 | }, 1938 | { 1939 | "params": [ 1940 | "null" 1941 | ], 1942 | "type": "fill" 1943 | } 1944 | ], 1945 | "measurement": "/^$measurement$/", 1946 | "orderByTime": "ASC", 1947 | "policy": "default", 1948 | "refId": "D", 1949 | "resultFormat": "time_series", 1950 | "select": [ 1951 | [ 1952 | { 1953 | "params": [ 1954 | "gasbaseline" 1955 | ], 1956 | "type": "field" 1957 | }, 1958 | { 1959 | "params": [], 1960 | "type": "mean" 1961 | } 1962 | ] 1963 | ], 1964 | "tags": [ 1965 | { 1966 | "key": "run", 1967 | "operator": "=~", 1968 | "value": "/^$run$/" 1969 | }, 1970 | { 1971 | "condition": "AND", 1972 | "key": "location", 1973 | "operator": "=", 1974 | "value": "bedroom" 1975 | } 1976 | ] 1977 | } 1978 | ], 1979 | "thresholds": [], 1980 | "timeFrom": null, 1981 | "timeShift": null, 1982 | "title": "Gas", 1983 | "tooltip": { 1984 | "shared": true, 1985 | "sort": 0, 1986 | "value_type": "individual" 1987 | }, 1988 | "transparent": false, 1989 | "type": "graph", 1990 | "xaxis": { 1991 | "buckets": null, 1992 | "mode": "time", 1993 | "name": null, 1994 | "show": true, 1995 | "values": [] 1996 | }, 1997 | "yaxes": [ 1998 | { 1999 | "decimals": null, 2000 | "format": "ohm", 2001 | "label": "", 2002 | "logBase": 1, 2003 | "max": null, 2004 | "min": null, 2005 | "show": true 2006 | }, 2007 | { 2008 | "format": "short", 2009 | "label": null, 2010 | "logBase": 1, 2011 | "max": null, 2012 | "min": null, 2013 | "show": true 2014 | } 2015 | ], 2016 | "yaxis": { 2017 | "align": false, 2018 | "alignLevel": null 2019 | } 2020 | }, 2021 | { 2022 | "columns": [], 2023 | "datasource": "raspibiginflux", 2024 | "fontSize": "100%", 2025 | "gridPos": { 2026 | "h": 14, 2027 | "w": 24, 2028 | "x": 0, 2029 | "y": 28 2030 | }, 2031 | "id": 17, 2032 | "links": [], 2033 | "pageSize": null, 2034 | "scroll": true, 2035 | "showHeader": true, 2036 | "sort": { 2037 | "col": 0, 2038 | "desc": true 2039 | }, 2040 | "styles": [ 2041 | { 2042 | "alias": "Time", 2043 | "dateFormat": "YYYY-MM-DD HH:mm:ss", 2044 | "link": false, 2045 | "pattern": "Time", 2046 | "type": "date" 2047 | }, 2048 | { 2049 | "alias": "", 2050 | "colorMode": null, 2051 | "colors": [ 2052 | "rgba(245, 54, 54, 0.9)", 2053 | "rgba(237, 129, 40, 0.89)", 2054 | "rgba(50, 172, 45, 0.97)" 2055 | ], 2056 | "decimals": 2, 2057 | "pattern": "/.*/", 2058 | "thresholds": [], 2059 | "type": "number", 2060 | "unit": "short" 2061 | } 2062 | ], 2063 | "targets": [ 2064 | { 2065 | "$$hashKey": "object:2895", 2066 | "groupBy": [], 2067 | "measurement": "dev", 2068 | "orderByTime": "ASC", 2069 | "policy": "default", 2070 | "refId": "A", 2071 | "resultFormat": "table", 2072 | "select": [ 2073 | [ 2074 | { 2075 | "params": [ 2076 | "*" 2077 | ], 2078 | "type": "field" 2079 | } 2080 | ] 2081 | ], 2082 | "tags": [] 2083 | } 2084 | ], 2085 | "title": "Raw data from InfluxDB", 2086 | "transform": "table", 2087 | "type": "table" 2088 | } 2089 | ], 2090 | "refresh": false, 2091 | "schemaVersion": 16, 2092 | "style": "dark", 2093 | "tags": [], 2094 | "templating": { 2095 | "list": [ 2096 | { 2097 | "allValue": null, 2098 | "current": { 2099 | "text": "All", 2100 | "value": "$__all" 2101 | }, 2102 | "datasource": "raspibiginflux", 2103 | "hide": 0, 2104 | "includeAll": true, 2105 | "label": null, 2106 | "multi": true, 2107 | "name": "run", 2108 | "options": [], 2109 | "query": "SHOW TAG VALUES FROM dev WITH KEY = \"run\"", 2110 | "refresh": 2, 2111 | "regex": "", 2112 | "sort": 0, 2113 | "tagValuesQuery": "", 2114 | "tags": [], 2115 | "tagsQuery": "", 2116 | "type": "query", 2117 | "useTags": false 2118 | }, 2119 | { 2120 | "allValue": null, 2121 | "current": { 2122 | "text": "All", 2123 | "value": "$__all" 2124 | }, 2125 | "datasource": "raspibiginflux", 2126 | "hide": 0, 2127 | "includeAll": true, 2128 | "label": null, 2129 | "multi": true, 2130 | "name": "measurement", 2131 | "options": [], 2132 | "query": "SHOW MEASUREMENTS", 2133 | "refresh": 2, 2134 | "regex": "", 2135 | "sort": 0, 2136 | "tagValuesQuery": "", 2137 | "tags": [], 2138 | "tagsQuery": "", 2139 | "type": "query", 2140 | "useTags": false 2141 | } 2142 | ] 2143 | }, 2144 | "time": { 2145 | "from": "now-3h", 2146 | "to": "now" 2147 | }, 2148 | "timepicker": { 2149 | "refresh_intervals": [ 2150 | "5s", 2151 | "10s", 2152 | "30s", 2153 | "1m", 2154 | "5m", 2155 | "15m", 2156 | "30m", 2157 | "1h", 2158 | "2h", 2159 | "1d" 2160 | ], 2161 | "time_options": [ 2162 | "5m", 2163 | "15m", 2164 | "1h", 2165 | "6h", 2166 | "12h", 2167 | "24h", 2168 | "2d", 2169 | "7d", 2170 | "30d" 2171 | ] 2172 | }, 2173 | "timezone": "", 2174 | "title": "Klima", 2175 | "uid": "I5Tk8DMmk", 2176 | "version": 33 2177 | } --------------------------------------------------------------------------------