Apollo AIR-1 Dashboard

I recently bought Apollo AIR sensors, but didn’t find great examples on how to display all the data they show in a compact way. I have a 3D printer and various devices in my techroom, which is why I want to monitor the air there, and in the office I want to know the level of CO2, mostly.

Here’s what I came up with, using ApexCharts Card:

Note that you’ll have to enable the PM sensors (e.g. sensor.office_air_pm_0_3_to_1_m that are disabled by default in HA. I use these for the stacked chart, as I think it gives a good representation of what particulates are in the air, as opposed to charting the inclusive “<x μm” weight concentration metrics.

I’m not 100% happy with the color gradient of the charts at the bottom, as it makes it harder to identify which line represents what, but at the same time I want to know a qualitative assessment as well, which colors achieve quite well.

I’m also using the recently introduced Sections type dashboard, which works really well for this use-case. I especially like the small badges in the heading that allow to show the temperature and humidity in a really compact way. Also I’ve configured the tap_action to navigate to the device’s URL, so that I can see all the raw numbers and configure the sensor if needed.

The YAML entry is for the whole dashboard view, so if you want to copy-paste directly (after replacing sensor names, of course), then you’ll have to use the raw configuration editor. Or you can just pick and choose different sections to just get parts of the YAML.

 - title: Air
    path: air
    icon: mdi:air-filter
    type: sections
    max_columns: 2
    sections:
      - type: grid
        cards:
          - type: heading
            heading_style: title
            heading: Office
            badges:
              - type: entity
                show_state: true
                show_icon: true
                entity: sensor.office_air_sen55_temperature
              - type: entity
                entity: sensor.office_air_sen55_humidity
            tap_action:
              action: navigate
              navigation_path: /config/devices/device/a5c8e2af41ddc9a6981f4789912c646c
          - type: custom:apexcharts-card
            header:
              show: true
              title: Office Particulate Matter
              show_states: true
              colorize_states: true
            apex_config:
              grid:
                show: false
              legend:
                show: false
              tooltip:
                shared: true
                marker:
                  show: true
            graph_span: 4h
            stacked: true
            series:
              - entity: sensor.office_air_pm_0_3_to_1_m
                name: 0.3-1 µm
              - entity: sensor.office_air_pm_1_to_2_5_m
                name: 1-2.5 µm
              - entity: sensor.office_air_pm_2_5_to_4_m
                name: 2.5-4 µm
              - entity: sensor.office_air_pm_4_to_10_m
                name: 4-10 µm
            all_series_config:
              stroke_width: 2
              type: column
              group_by:
                func: avg
                duration: 5m
          - type: custom:apexcharts-card
            graph_span: 4h
            experimental:
              color_threshold: true
            header:
              show: true
              title: Office Air Quality
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
              float_precision: 0
              group_by:
                func: avg
                duration: 5m
            apex_config:
              grid:
                show: false
              legend:
                show: false
              tooltip:
                shared: true
                marker:
                  show: true
            yaxis:
              - id: co2
                apex_config:
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)} ppm`
              - id: voc
                opposite: true
                apex_config:
                  tickAmount: 2
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)}`
              - id: nox
                opposite: true
                apex_config:
                  tickAmount: 2
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)} ppm`
            series:
              - entity: sensor.office_air_co2
                name: CO2
                yaxis_id: co2
                color_threshold:
                  - value: 0
                    color: green
                  - value: 1000
                    color: yellow
                  - value: 2000
                    color: red
              - entity: sensor.office_air_sen55_voc
                name: VOC Index
                yaxis_id: voc
                color_threshold:
                  - value: 0
                    color: green
                  - value: 80
                    color: blue
                  - value: 120
                    color: orange
                  - value: 200
                    color: red
                  - value: 300
                    color: purple
              - entity: sensor.office_air_sen55_nox
                name: NOx
                yaxis_id: nox
                type: column
                color: rgb(75,75,75)
      - type: grid
        cards:
          - type: heading
            heading_style: title
            heading: Techroom
            badges:
              - type: entity
                show_state: true
                show_icon: true
                entity: sensor.techroom_air_sen55_temperature
              - type: entity
                entity: sensor.techroom_air_sen55_humidity
            tap_action:
              action: navigate
              navigation_path: /config/devices/device/155f7aeef44e6419a8dc3c991cc3e686
          - type: custom:apexcharts-card
            header:
              show: true
              title: Techroom Particulate Matter
              show_states: true
              colorize_states: true
            apex_config:
              grid:
                show: false
              legend:
                show: false
              tooltip:
                shared: true
                marker:
                  show: true
            graph_span: 4h
            stacked: true
            series:
              - entity: sensor.techroom_air_pm_0_3_to_1_m
                name: 0.3-1 µm
              - entity: sensor.techroom_air_pm_1_to_2_5_m
                name: 1-2.5 µm
              - entity: sensor.techroom_air_pm_2_5_to_4_m
                name: 2.5-4 µm
              - entity: sensor.techroom_air_pm_4_to_10_m
                name: 4-10 µm
            all_series_config:
              stroke_width: 2
              type: column
              group_by:
                func: avg
                duration: 5m
          - type: custom:apexcharts-card
            graph_span: 4h
            experimental:
              color_threshold: true
            header:
              show: true
              title: Techroom Air Quality
              show_states: true
              colorize_states: true
            all_series_config:
              stroke_width: 2
              float_precision: 0
              group_by:
                func: avg
                duration: 5m
            apex_config:
              grid:
                show: false
              legend:
                show: false
              tooltip:
                shared: true
                marker:
                  show: true
            yaxis:
              - id: co2
                apex_config:
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)} ppm`
              - id: voc
                opposite: true
                apex_config:
                  tickAmount: 2
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)}`
              - id: nox
                opposite: true
                apex_config:
                  tickAmount: 2
                  labels:
                    formatter: |
                      EVAL:v => `${v.toFixed(0)} ppm`
            series:
              - entity: sensor.techroom_air_co2
                name: CO2
                yaxis_id: co2
                color_threshold:
                  - value: 0
                    color: green
                  - value: 1000
                    color: yellow
                  - value: 2000
                    color: red
              - entity: sensor.techroom_air_sen55_voc
                name: VOC Index
                yaxis_id: voc
                color_threshold:
                  - value: 0
                    color: green
                  - value: 80
                    color: blue
                  - value: 120
                    color: orange
                  - value: 200
                    color: red
                  - value: 300
                    color: purple
              - entity: sensor.techroom_air_sen55_nox
                name: NOx
                yaxis_id: nox
                type: column
                color: rgb(75,75,75)
    cards: []

I’ll be updating the main post if I come up with something better, so feel free to leave your comments and suggestions :slight_smile:

2 Likes