Skip to content

Instantly share code, notes, and snippets.

@gyng
Last active April 30, 2024 10:32
Show Gist options
  • Save gyng/32762088c9c40a9293957a14801bae2b to your computer and use it in GitHub Desktop.
Save gyng/32762088c9c40a9293957a14801bae2b to your computer and use it in GitHub Desktop.
Setting up AirGradient ONE v9 with ESPHome to export Prometheus metrics

Setting up AirGradient ONE v9 with ESPHome to export Prometheus metrics

image

This guide uses https://github.com/geerlingguy/airgradient-prometheus/ to set things up

  1. Run ESPHome locally

    # docker-compose.yml
    version: "3"
    services:
      esphome:
        container_name: esphome
        image: esphome/esphome
        volumes:
          - ./hass/esphome/config:/config
          - /etc/localtime:/etc/localtime:ro
        restart: always
        ports:
          - 6052:6052

    Run docker-compose up --build.

    Visit http://localhost:6052 in a browser that supports WebSerial such as Chrome.

    Do any initial setup.

  2. Configure ESPHome secrets

    Following instructions on geerlingguy/airgradient-prometheus, configure and add the following (copied from geerlingguy's readme) to the "Secrets" popup in ESPHome

    ---
    # Provide a unique name for this AirGradient.
    name: airgradient-office
    
    # Encryption key for HA API access.
    # Generate a random 32-bit key with `openssl rand -base64 32`
    api_encryption_key: PASTE_BASE64_KEY_HERE
    
    # Set password for OTA updates.
    ota_password: otapassword
    
    # Configure a WiFi network connection.
    wifi_ssid: my-wifi-network
    wifi_password: my-wifi-password

    Make sure to click "Save".

  3. Connect your AirGradient device to your machine via USB.

  4. Add device in ESPHome.

    First open your browser console for useful information.

    Click "Add device" in ESPHome. If it errors, click "Skip this step".

    When prompted to select a device type, pick the device model listed in the console

    The AirGradient ONE v9 is an ESP32-C3.

  5. Add configuration for device and fix minor bugs.

    Click "Edit" on the new device, and paste in the appropriate YAML from https://github.com/geerlingguy/airgradient-prometheus/blob/master/AirGradient-ESPHome/airgradient-one.yaml.

    As of Feb 2024, the airgradient-one.yaml configuration is missing the required prometheus: key in the YAML configuration.

    Append prometheus: at the end of the configuration.

    If not connecting to Home Assistant, add reboot_timeout: 0s to the API block.

    See: geerlingguy/airgradient-prometheus#39

  6. Go ahead and click on validate and then install.

  7. Obtain the IP of your AirGradient, and open up

    • http://DEVICE_ADDRESS:9926
    • http://DEVICE_ADDRESS:9926/metrics
  8. Now add to your Prometheus config

    scrape_configs:
      - job_name: 'airgradient-bedroom'
        metrics_path: /metrics
        scrape_interval: 30s
        static_configs:
          - targets: ['airgradient-ip-address:9926']
    
# AirGradient ONE - Board v9
# https://www.airgradient.com/open-airgradient/instructions/overview/
#
# This configuration was blatantly yoinked from:
# https://github.com/MallocArray/airgradient_esphome/blob/main/airgradient-one.yaml
#
# (see https://github.com/geerlingguy/airgradient-prometheus/issues/39)
# Needs ESPHome 2023.7.0 or later
# Reference for substitutions: https://github.com/ajfriesen/ESPHome-AirGradient/blob/main/air-gradient-pro-diy.yaml
substitutions:
devicename: !secret name
ag_esphome_config_version: 0.1.0
led_strip_brightness: "25%"
esphome:
name: "${devicename}"
esp32:
board: esp32-c3-devkitm-1
# Disable logging
# https://esphome.io/components/logger.html
logger:
baud_rate: 0 # Must disable serial logging as ESP32-C3 only has 2 hardware UART and both are in use
logs:
component: ERROR # Hiding warning messages about component taking a long time https://github.com/esphome/issues/issues/4717
# Enable Home Assistant API
# api:
# encryption:
# key: !secret api_encryption_key
ota:
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
fast_connect: true
web_server:
port: 9926
version: 1
# Create a switch for safe_mode in order to flash the device
# Solution from this thread:
# https://community.home-assistant.io/t/esphome-flashing-over-wifi-does-not-work/357352/1
switch:
- platform: safe_mode
name: "Flash Mode (Safe Mode)"
icon: "mdi:cellphone-arrow-down"
- platform: template
name: "Display Temperature in °F"
icon: "mdi:thermometer"
id: display_in_f
restore_mode: RESTORE_DEFAULT_ON
optimistic: True
uart:
# https://esphome.io/components/uart.html#uart
- rx_pin: GPIO0 # Pin 12
tx_pin: GPIO1 # Pin 13
baud_rate: 9600
id: senseair_s8_uart
- rx_pin: GPIO20 # Pin 30 or RX
tx_pin: GPIO21 # Pin 31, or TX
baud_rate: 9600
id: pms5003_uart
i2c:
# https://esphome.io/components/i2c.html
sda: GPIO7
scl: GPIO6
frequency: 400kHz # 400kHz eliminates warnings about components taking a long time other than SGP40 component: https://github.com/esphome/issues/issues/4717
sensor:
- platform: pmsx003
# PMS5003 https://esphome.io/components/sensor/pmsx003.html
type: PMSX003
uart_id: pms5003_uart
pm_2_5:
name: "PM 2.5"
id: pm_2_5
on_value:
lambda: |-
// https://en.wikipedia.org/wiki/Air_quality_index#Computing_the_AQI
// Borrowed from https://github.com/kylemanna/sniffer/blob/master/esphome/sniffer_common.yaml
if (id(pm_2_5).state <= 12.0) {
// good
id(pm_2_5_aqi).publish_state((50.0 - 0.0) / (12.0 - 0.0) * (id(pm_2_5).state - 0.0) + 0.0);
} else if (id(pm_2_5).state <= 35.4) {
// moderate
id(pm_2_5_aqi).publish_state((100.0 - 51.0) / (35.4 - 12.1) * (id(pm_2_5).state - 12.1) + 51.0);
} else if (id(pm_2_5).state <= 55.4) {
// usg
id(pm_2_5_aqi).publish_state((150.0 - 101.0) / (55.4 - 35.5) * (id(pm_2_5).state - 35.5) + 101.0);
} else if (id(pm_2_5).state <= 150.4) {
// unhealthy
id(pm_2_5_aqi).publish_state((200.0 - 151.0) / (150.4 - 55.5) * (id(pm_2_5).state - 55.5) + 151.0);
} else if (id(pm_2_5).state <= 250.4) {
// very unhealthy
id(pm_2_5_aqi).publish_state((300.0 - 201.0) / (250.4 - 150.5) * (id(pm_2_5).state - 150.5) + 201.0);
} else if (id(pm_2_5).state <= 350.4) {
// hazardous
id(pm_2_5_aqi).publish_state((400.0 - 301.0) / (350.4 - 250.5) * (id(pm_2_5).state - 250.5) + 301.0);
} else if (id(pm_2_5).state <= 500.4) {
// hazardous 2
id(pm_2_5_aqi).publish_state((500.0 - 401.0) / (500.4 - 350.5) * (id(pm_2_5).state - 350.5) + 401.0);
} else {
id(pm_2_5_aqi).publish_state(500);
}
pm_1_0:
name: "PM 1.0"
id: pm_1_0
pm_10_0:
name: "PM 10.0"
id: pm_10_0
pm_0_3um:
name: "PM 0.3"
id: pm_0_3um
update_interval: 2min
- platform: template
name: "PM 2.5 AQI"
unit_of_measurement: "AQI"
icon: "mdi:air-filter"
accuracy_decimals: 0
id: pm_2_5_aqi
- platform: senseair
# SenseAir S8 https://esphome.io/components/sensor/senseair.html
# https://senseair.com/products/size-counts/s8-lp/
co2:
name: "SenseAir S8 CO2"
id: co2
filters:
- skip_initial: 2
- clamp:
min_value: 400 # 419 as of 2023-06 https://gml.noaa.gov/ccgg/trends/global.html
on_value:
- if:
condition:
lambda: 'return id(co2).state < 800;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 0%
green: 100%
blue: 0%
- if:
condition:
lambda: 'return id(co2).state >= 800 && id(co2).state < 1000;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 100%
green: 100%
blue: 0%
- if:
condition:
lambda: 'return id(co2).state >= 1000 && id(co2).state < 1500;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 100%
green: 50%
blue: 0%
- if:
condition:
lambda: 'return id(co2).state >= 1500 && id(co2).state < 2000;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 100%
green: 0%
blue: 0%
- if:
condition:
lambda: 'return id(co2).state >= 2000 && id(co2).state < 3000;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 60%
green: 0%
blue: 60%
- if:
condition:
lambda: 'return id(co2).state >= 3000 && id(co2).state < 10000;'
then:
- light.turn_on:
id: led_strip
brightness: "${led_strip_brightness}"
red: 40%
green: 0%
blue: 0%
id: senseair_s8
uart_id: senseair_s8_uart
- platform: sht4x
# SHT40 https://esphome.io/components/sensor/sht4x.html
temperature:
name: "Temperature"
id: temp
humidity:
name: "Humidity"
id: humidity
address: 0x44
- platform: wifi_signal
name: "WiFi Signal"
id: wifi_dbm
update_interval: 60s
- platform: uptime
name: "Uptime"
id: device_uptime
update_interval: 10s
- platform: sgp4x
# SGP41 https://esphome.io/components/sensor/sgp4x.html
voc:
name: "VOC Index"
id: voc
nox:
name: "NOx Index"
id: nox
compensation: # Remove this block if no temp/humidity sensor present for compensation
temperature_source: temp
humidity_source: humidity
font:
# Font to use on the display
# Open Source font Liberation Sans by Red Hat
# https://www.dafont.com/liberation-sans.font
# - file: "./fonts/liberation_sans/LiberationSans-Regular.ttf"
- file:
type: gfonts
family: Poppins
weight: light
id: poppins_light
size: 14
glyphs: '!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/µ³'
- file:
type: gfonts
family: Poppins
weight: light
id: poppins_light_12
size: 12
glyphs: '!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/µ³'
- file: "gfonts://Ubuntu Mono"
id: ubuntu
size: 22
glyphs: '!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz/µ³'
display:
# https://esphome.io/components/display/ssd1306.html
# Formatting reference: https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm
- platform: ssd1306_i2c
model: "SH1106 128x64"
id: oled_display
address: 0x3C
# rotation: 180°
pages:
- id: summary1
lambda: |-
it.printf(0, 0, id(poppins_light), "CO2:");
it.printf(128, 0, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f ppm", id(co2).state);
it.printf(0, 16, id(poppins_light), "PM2.5:");
it.printf(128, 16, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f µg/m³", id(pm_2_5).state);
it.printf(0, 32, id(poppins_light), "Temp:");
if (id(display_in_f).state) {
it.printf(128, 32, id(poppins_light), TextAlign::TOP_RIGHT, "%.1f°F", id(temp).state*9/5+32);
} else {
it.printf(128, 32, id(poppins_light), TextAlign::TOP_RIGHT, "%.1f°C", id(temp).state);
}
it.printf(0, 48, id(poppins_light), "Humidity:");
it.printf(128, 48, id(poppins_light), TextAlign::TOP_RIGHT, "%.1f%%", id(humidity).state);
- id: summary2
lambda: |-
it.printf(0, 0, id(poppins_light), "CO2:");
it.printf(128, 0, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f ppm", id(co2).state);
it.printf(0, 16, id(poppins_light), "PM2.5:");
it.printf(128, 16, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f µg/m³", id(pm_2_5).state);
it.printf(0, 32, id(poppins_light), "VOC:");
it.printf(128, 32, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f", id(voc).state);
it.printf(0, 48, id(poppins_light), "NOx:");
it.printf(128, 48, id(poppins_light), TextAlign::TOP_RIGHT, "%.0f", id(nox).state);
- id: boot
lambda: |-
it.printf(0, 0, id(poppins_light), "ID:");
it.printf(128, 0, id(poppins_light), TextAlign::TOP_RIGHT, "%s", get_mac_address().c_str());
it.printf(0, 21, id(poppins_light), "Config Ver: $ag_esphome_config_version");
it.printf(0, 42, id(poppins_light), "$devicename");
on_page_change:
to: boot
then:
- if:
# Skip the boot page after initial boot
condition:
lambda: 'return id(device_uptime).state > 30;'
then:
- display.page.show_next: oled_display
- component.update: oled_display
button:
# https://github.com/esphome/issues/issues/2444
- platform: template
name: SenseAir S8 Calibration
id: senseair_s8_calibrate_button
on_press:
then:
- senseair.background_calibration: senseair_s8
- delay: 70s
- senseair.background_calibration_result: senseair_s8
- platform: template
name: SenseAir S8 Enable Automatic Calibration
id: senseair_s8_enable_calibrate_button
on_press:
then:
- senseair.abc_enable: senseair_s8
- platform: template
name: SenseAir S8 Disable Automatic Calibration
id: senseair_s8_disable_calibrate_button
on_press:
then:
- senseair.abc_disable: senseair_s8
output:
- platform: gpio
# Watchdog to reboot if no activity
id: watchdog
pin: GPIO2
light:
# https://esphome.io/components/light/esp32_rmt_led_strip.html
- platform: esp32_rmt_led_strip
rgb_order: GRB
pin: GPIO10 # Pin 16
num_leds: 11
rmt_channel: 0
chipset: ws2812
name: "LED Strip"
id: led_strip
interval:
- interval: 30s
# Notify watchdog device is still alive
then:
- output.turn_on: watchdog
- delay: 20ms
- output.turn_off: watchdog
- interval: 5s
# Automatically switch to the next page every five seconds
then:
- if:
# Show boot screen for first 10 seconds with serial number and config version
condition:
lambda: 'return id(device_uptime).state < 10;'
then:
- display.page.show: boot
- lambda: id(device_uptime).set_update_interval(1);
else:
# Change page on display
- display.page.show_next: oled_display
- component.update: oled_display
prometheus:
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "datasource",
"uid": "grafana"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
}
]
},
"description": "",
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": 1,
"links": [],
"panels": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "continuous-BlYlRd"
},
"mappings": [],
"max": 35,
"min": 15,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "text",
"value": null
}
]
},
"unit": "celsius"
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 4,
"x": 0,
"y": 0
},
"id": 20,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": false,
"showThresholdMarkers": true,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "temp",
"interval": "",
"legendFormat": "Temperature",
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "-8.78469475556 + sum(1.61139411 * esphome_sensor_value{id=\"temperature\"}) + sum(2.33854883889 * esphome_sensor_value{id=\"humidity\"}) + sum(-0.14611605 * sum(esphome_sensor_value{id=\"temperature\"}) * sum(esphome_sensor_value{id=\"humidity\"})) + sum(-0.012308094 * esphome_sensor_value{id=\"temperature\"} ^ 2) + sum(-0.0164248277778 * esphome_sensor_value{id=\"humidity\"} ^ 2) + sum(0.002211732 * sum(esphome_sensor_value{id=\"humidity\"}) * sum(esphome_sensor_value{id=\"temperature\"}) ^ 2) + sum(0.00072546 * sum(esphome_sensor_value{id=\"temperature\"}) * sum(esphome_sensor_value{id=\"humidity\"}) ^ 2) + sum(-0.000003582 * sum(esphome_sensor_value{id=\"temperature\"}) ^ 2 * sum(esphome_sensor_value{id=\"humidity\"}) ^ 2)",
"hide": false,
"interval": "",
"legendFormat": "Heat index",
"refId": "B"
}
],
"title": "Temperature",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "Heat index: [https://en.wikipedia.org/wiki/Heat_index](https://en.wikipedia.org/wiki/Heat_index)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "continuous-BlYlRd"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"axisSoftMax": 35,
"axisSoftMin": 15,
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "scheme",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineStyle": {
"fill": "solid"
},
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "super-light-blue",
"value": null
}
]
},
"unit": "celsius"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "Dew point (°C)"
},
"properties": [
{
"id": "color",
"value": {
"mode": "continuous-blues"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Heat index (°C)"
},
"properties": [
{
"id": "custom.lineStyle",
"value": {
"dash": [
10,
10
],
"fill": "dash"
}
}
]
},
{
"matcher": {
"id": "byName",
"options": "Wet bulb temperature (°C)"
},
"properties": [
{
"id": "custom.lineStyle",
"value": {
"dash": [
0,
10
],
"fill": "dot"
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 8,
"x": 4,
"y": 0
},
"id": 7,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "none"
}
},
"pluginVersion": "8.1.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"temperature\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}} ({{unit}})",
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"editorMode": "code",
"exemplar": true,
"expr": "-8.78469475556 + sum(1.61139411 * esphome_sensor_value{id=\"temperature\"}) + sum(2.33854883889 * esphome_sensor_value{id=\"humidity\"}) + sum(-0.14611605 * sum(esphome_sensor_value{id=\"temperature\"}) * sum(esphome_sensor_value{id=\"humidity\"})) + sum(-0.012308094 * esphome_sensor_value{id=\"temperature\"} ^ 2) + sum(-0.0164248277778 * esphome_sensor_value{id=\"humidity\"} ^ 2) + sum(0.002211732 * sum(esphome_sensor_value{id=\"humidity\"}) * sum(esphome_sensor_value{id=\"temperature\"}) ^ 2) + sum(0.00072546 * sum(esphome_sensor_value{id=\"temperature\"}) * sum(esphome_sensor_value{id=\"humidity\"}) ^ 2) + sum(-0.000003582 * sum(esphome_sensor_value{id=\"temperature\"}) ^ 2 * sum(esphome_sensor_value{id=\"humidity\"}) ^ 2)",
"hide": false,
"interval": "",
"legendFormat": "Heat index (°C)",
"range": true,
"refId": "C"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"disableTextWrap": false,
"editorMode": "code",
"expr": "sum(esphome_sensor_value{id=\"temperature\"}) * atan(0.151977 * sqrt(sum(esphome_sensor_value{id=\"humidity\"}) + 8.313659)) + (0.00391838 * sqrt(sum(esphome_sensor_value{id=\"humidity\"}) ^ 3) * atan(0.023101 * sum(esphome_sensor_value{id=\"humidity\"}))) - atan(sum(esphome_sensor_value{id=\"humidity\"}) - 1.676331) + atan(sum(esphome_sensor_value{id=\"temperature\"}) + sum(esphome_sensor_value{id=\"humidity\"})) - 4.686035",
"fullMetaSearch": false,
"hide": false,
"includeNullMetadata": true,
"instant": false,
"legendFormat": "Wet bulb temperature (°C)",
"range": true,
"refId": "B",
"useBackend": false
}
],
"title": "Temperature",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "|Where|What|\n|-|-|\n|US NIOSH, HK EPD|<1000 ppm|\n|UK EFSA (BB101)|<1500 ppm|\n|EU|?|\n\n[Atmospheric concentration: >400ppm](https://en.wikipedia.org/wiki/Carbon_dioxide_in_Earth%27s_atmosphere#Current_concentration) \n[Awair CO₂ floor: 400ppm](https://support.getawair.com/hc/en-us/articles/115004440608-Why-doesn-t-my-CO2-reading-go-below-400ppm-)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"axisSoftMax": 2000,
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "light-green",
"value": 500
},
{
"color": "light-yellow",
"value": 1000
},
{
"color": "dark-orange",
"value": 2000
},
{
"color": "dark-red",
"value": 5000
}
]
},
"unit": "ppm"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "CO₂ (ppm)"
},
"properties": [
{
"id": "custom.gradientMode",
"value": "scheme"
}
]
},
{
"matcher": {
"id": "byName",
"options": "30m mean CO₂ (ppm)"
},
"properties": [
{
"id": "custom.lineStyle",
"value": {
"dash": [
10,
10
],
"fill": "dash"
}
},
{
"id": "custom.gradientMode",
"value": "scheme"
}
]
},
{
"__systemRef": "hideSeriesFrom",
"matcher": {
"id": "byNames",
"options": {
"mode": "exclude",
"names": [
"CO₂ (ppm)"
],
"prefix": "All except:",
"readOnly": true
}
},
"properties": [
{
"id": "custom.hideFrom",
"value": {
"legend": false,
"tooltip": false,
"viz": true
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 8,
"x": 12,
"y": 0
},
"id": 12,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"senseair_s8_co2\"}",
"interval": "",
"legendFormat": "CO₂ ({{unit}})",
"refId": "CO2"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "avg_over_time(esphome_sensor_value{id=\"senseair_s8_co2\"}[30m])",
"hide": false,
"interval": "",
"legendFormat": "30m mean CO₂ (ppm)",
"refId": "CO2 30m avg"
}
],
"thresholds": [
{
"colorMode": "critical",
"op": "gt",
"value": 1750,
"visible": true
}
],
"title": "CO₂",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"max": 6000,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "green",
"value": 500
},
{
"color": "light-yellow",
"value": 1000
},
{
"color": "dark-orange",
"value": 2000
},
{
"color": "dark-red",
"value": 5000
}
]
},
"unit": "ppm"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "temp{instance=\"192.168.1.168:9290\", job=\"awair-study\"}"
},
"properties": [
{
"id": "color",
"value": {
"fixedColor": "#FADE2A",
"mode": "fixed"
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 4,
"x": 20,
"y": 0
},
"id": 10,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"last"
],
"fields": "",
"values": false
},
"showThresholdLabels": true,
"showThresholdMarkers": false,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"senseair_s8_co2\"}",
"interval": "",
"legendFormat": "CO₂ ({{unit}})",
"refId": "CO2"
}
],
"title": "CO₂",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "continuous-BlPu"
},
"mappings": [],
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "semi-dark-blue",
"value": null
}
]
},
"unit": "humidity"
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 4,
"x": 0,
"y": 10
},
"id": 21,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": false,
"showThresholdMarkers": true,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "humid",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
"title": "Relative humidity",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "continuous-BlPu"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "scheme",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"max": 100,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "humidity"
},
"overrides": [
{
"__systemRef": "hideSeriesFrom",
"matcher": {
"id": "byNames",
"options": {
"mode": "exclude",
"names": [
"Relative humidity (%)"
],
"prefix": "All except:",
"readOnly": true
}
},
"properties": [
{
"id": "custom.hideFrom",
"value": {
"legend": false,
"tooltip": false,
"viz": true
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 8,
"x": 4,
"y": 10
},
"id": 8,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"pluginVersion": "8.1.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"humidity\",name=\"Humidity\",unit=\"%\"} ",
"hide": false,
"interval": "",
"legendFormat": "Relative humidity (%)",
"refId": "B"
}
],
"title": "Relative humidity",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "Fine particulate matter.\n\n[Thresholds according to EPA 2012 AQI guidelines](https://www.epa.gov/sites/default/files/2016-04/documents/2012_aqi_factsheet.pdf)",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "semi-dark-green",
"value": 12
},
{
"color": "light-green",
"value": 35.4
},
{
"color": "super-light-orange",
"value": 55.4
},
{
"color": "semi-dark-red",
"value": 150.4
},
{
"color": "dark-red",
"value": 250.4
},
{
"color": "semi-dark-purple",
"value": 350.4
},
{
"color": "dark-purple",
"value": 500.4
}
]
},
"unit": "conμgm3"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": " PM₂.₅ (µg/m ³)"
},
"properties": [
{
"id": "custom.gradientMode",
"value": "scheme"
}
]
},
{
"matcher": {
"id": "byName",
"options": "24hr mean PM₂.₅ (µg/m ³)"
},
"properties": [
{
"id": "custom.lineStyle",
"value": {
"dash": [
10,
10
],
"fill": "dash"
}
},
{
"id": "custom.gradientMode",
"value": "scheme"
}
]
},
{
"__systemRef": "hideSeriesFrom",
"matcher": {
"id": "byNames",
"options": {
"mode": "exclude",
"names": [
"PM 2.5 (µg/m³)",
"24hr mean PM₂.₅ (µg/m ³)"
],
"prefix": "All except:",
"readOnly": true
}
},
"properties": [
{
"id": "custom.hideFrom",
"value": {
"legend": false,
"tooltip": false,
"viz": true
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 8,
"x": 12,
"y": 10
},
"id": 9,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_2_5\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}} ({{unit}})",
"refId": "D"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_1_0\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}} ({{unit}})",
"refId": "A"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_10_0\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}} ({{unit}})",
"refId": "B"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_0_3\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}} ({{unit}})",
"refId": "E"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "avg_over_time(esphome_sensor_value{id=\"pm_2_5\"}[24h])",
"hide": false,
"interval": "",
"legendFormat": "24hr mean PM₂.₅ (µg/m ³)",
"refId": "C"
}
],
"title": " PM",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"max": 200,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "semi-dark-green",
"value": 12
},
{
"color": "light-yellow",
"value": 35.4
},
{
"color": "dark-orange",
"value": 55.4
},
{
"color": "semi-dark-red",
"value": 150.4
},
{
"color": "dark-red",
"value": 250.4
},
{
"color": "semi-dark-purple",
"value": 350.4
},
{
"color": "dark-purple",
"value": 500.4
}
]
},
"unit": "conμgm3"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "temp{instance=\"192.168.1.168:9290\", job=\"awair-study\"}"
},
"properties": [
{
"id": "color",
"value": {
"fixedColor": "#FADE2A",
"mode": "fixed"
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 4,
"x": 20,
"y": 10
},
"id": 15,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": true,
"showThresholdMarkers": false,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_2_5\"}",
"hide": false,
"interval": "",
"legendFormat": " PM₂.₅ (µg/m ³)",
"refId": "D"
}
],
"title": " PM₂.₅",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"max": 250,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 66
},
{
"color": "orange",
"value": 100
},
{
"color": "red",
"value": 150
},
{
"color": "purple",
"value": 200
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 4,
"x": 0,
"y": 20
},
"id": 34,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": true,
"showThresholdMarkers": true,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_2_5_aqi\"} ",
"interval": "",
"legendFormat": "{{name}} {{unit}}",
"refId": "A"
}
],
"title": "AQI",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "scheme",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "green",
"value": 0
},
{
"color": "yellow",
"value": 66
},
{
"color": "orange",
"value": 100
},
{
"color": "red",
"value": 150
},
{
"color": "purple",
"value": 200
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 10,
"w": 8,
"x": 4,
"y": 20
},
"id": 18,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"pm_2_5_aqi\"} ",
"interval": "",
"legendFormat": "{{name}} {{unit}}",
"refId": "A"
}
],
"title": "AQI",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "Total volatile organic compounds",
"fieldConfig": {
"defaults": {
"color": {
"mode": "continuous-GrYlRd"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "right",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "scheme",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "light-yellow",
"value": 100
},
{
"color": "semi-dark-orange",
"value": 200
},
{
"color": "semi-dark-red",
"value": 300
},
{
"color": "dark-purple",
"value": 400
}
]
},
"unit": "none"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "TVOC (ppb)"
},
"properties": [
{
"id": "custom.gradientMode",
"value": "scheme"
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 8,
"x": 12,
"y": 20
},
"id": 6,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"voc_index\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}}",
"refId": "C"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"nox_index\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}}",
"refId": "E"
}
],
"title": "TVOC Sensirion index",
"type": "timeseries"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "Up to 500\n===\n* https://sensirion.com/media/documents/02232963/6294E043/Info_Note_VOC_Index.pdf\n===\n* https://sensirion.com/media/documents/9F289B95/6294DFFC/Info_Note_NOx_Index.pdf",
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"max": 500,
"min": 0,
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "dark-green",
"value": null
},
{
"color": "light-yellow",
"value": 200
},
{
"color": "semi-dark-orange",
"value": 300
},
{
"color": "semi-dark-red",
"value": 400
},
{
"color": "dark-purple",
"value": 500
}
]
},
"unit": "none"
},
"overrides": [
{
"matcher": {
"id": "byName",
"options": "temp{instance=\"192.168.1.168:9290\", job=\"awair-study\"}"
},
"properties": [
{
"id": "color",
"value": {
"fixedColor": "#FADE2A",
"mode": "fixed"
}
}
]
}
]
},
"gridPos": {
"h": 10,
"w": 4,
"x": 20,
"y": 20
},
"id": 16,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": true,
"showThresholdMarkers": false,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"voc_index\"}",
"hide": false,
"interval": "",
"legendFormat": "{{name}}",
"refId": "D"
}
],
"title": "TVOC Sensirion index",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"description": "BBC (MeteoGroup) forecast",
"gridPos": {
"h": 10,
"w": 4,
"x": 0,
"y": 30
},
"id": 25,
"options": {
"feedUrl": "https://weather-broker-cdn.api.bbci.co.uk/en/forecast/rss/3day/1880252",
"showImage": true,
"useProxy": false
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"refId": "A"
}
],
"title": "Forecast",
"type": "news"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "s"
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 4,
"x": 4,
"y": 30
},
"id": 29,
"options": {
"colorMode": "value",
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showPercentChange": false,
"text": {},
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"uptime\",name=\"Uptime\",unit=\"s\"}",
"format": "time_series",
"interval": "",
"legendFormat": "{{name}} {{unit}}",
"refId": "A"
}
],
"title": "Uptime",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "thresholds"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": -80
},
{
"color": "#EAB839",
"value": -70
},
{
"color": "green",
"value": -60
},
{
"color": "blue",
"value": -30
}
]
},
"unit": "dBm"
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 4,
"x": 8,
"y": 30
},
"id": 31,
"options": {
"minVizHeight": 75,
"minVizWidth": 75,
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"showThresholdLabels": false,
"showThresholdMarkers": true,
"sizing": "auto",
"text": {}
},
"pluginVersion": "10.4.2",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value{id=\"wifi_signal\",name=\"WiFi Signal\",unit=\"dBm\"}",
"interval": "",
"legendFormat": "",
"refId": "A"
}
],
"title": "Wifi signal",
"type": "gauge"
},
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisBorderShow": false,
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"insertNulls": false,
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": [
{
"__systemRef": "hideSeriesFrom",
"matcher": {
"id": "byNames",
"options": {
"mode": "exclude",
"names": [
"Humidity %",
"NOx Index ",
"PM 0.3 /dL",
"PM 10.0 µg/m³",
"PM 1.0 µg/m³",
"PM 2.5 µg/m³",
"PM 2.5 AQI AQI",
"SenseAir S8 CO2 ppm",
"Temperature °C",
"VOC Index ",
"WiFi Signal dBm"
],
"prefix": "All except:",
"readOnly": true
}
},
"properties": [
{
"id": "custom.hideFrom",
"value": {
"legend": false,
"tooltip": false,
"viz": true
}
}
]
}
]
},
"gridPos": {
"h": 9,
"w": 8,
"x": 12,
"y": 30
},
"id": 27,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "cdkaaxl605u68c"
},
"exemplar": true,
"expr": "esphome_sensor_value",
"interval": "",
"legendFormat": "{{name}} {{unit}}",
"refId": "A"
}
],
"title": "esphome_sensor_value",
"type": "timeseries"
}
],
"refresh": "1m",
"schemaVersion": 39,
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-24h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Air quality (AirGradient)",
"uid": "4mCnR9bSz",
"version": 2,
"weekStart": ""
}
---
# Provide a unique name for this AirGradient.
name: airgradient-office
# Encryption key for HA API access.
# Generate a random 32-bit key with `openssl rand -base64 32`
api_encryption_key: deadbeef...d00d=
# Set password for OTA updates.
ota_password: otapassword
# Configure a WiFi network connection.
wifi_ssid: "fbivan"
wifi_password: "hunter2"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment