diff --git a/source/_integrations/purpleair.markdown b/source/_integrations/purpleair.markdown index 50db9eaa0a8..3efe64059b8 100644 --- a/source/_integrations/purpleair.markdown +++ b/source/_integrations/purpleair.markdown @@ -15,7 +15,8 @@ ha_integration_type: integration ha_config_flow: true --- -[PurpleAir](https://www2.purpleair.com/) makes sensors that measure hyper-local air quality data and share it with the public. +[PurpleAir](https://www2.purpleair.com/) makes sensors that measure hyper-local air +quality data and share it with the public. {% include integrations/config_flow.md %} @@ -27,3 +28,120 @@ Add Sensor: Remove Sensor: description: Untrack a sensor. {% endconfiguration_basic %} + +## Creating an AQI Rating from Raw Particulate Data + +The PurpleAir API does not provide AQI data; therefore, the integration does not create +an AQI sensor automatically. However, sensors providing raw particulate data can be used +to create a human-friendly AQI rating sensor. + +
+The guidelines within this documentation constitute estimates and are intended to help +informed decision making. They should not replace analysis, advice or diagnosis from a +trained medical professional. +
+ +### Understanding EPA Guidelines + +The United States Environmental Protection Agency (EPA) provides +[guidelines](https://aqs.epa.gov/aqsweb/documents/codetables/aqi_breakpoints.html) on +correlating the concentration of pollution over a time period to overall "healthiness." +For example, a PM2.5 concentration between 0.0 and 12.0 µg/m³ over a 24-hour period +equates to a "Good" AQI rating. + +Therefore, a common strategy would be to use the guidelines for the particulate types +provided by the PurpleAir integration and "merge" them into a single AQI rating. + +### Creating Statistics Sensors + +With the EPA guidelines in hand, the next step is to create +[`statistics`](/integrations/statistics/) sensors for each particulate sensor you are +interested. This example uses PM2.5 and PM10.0 over a 24-hour period: + +
+The entity IDs provided below are simulated; make sure that you use entity IDs that +actually exist in your Home Assistant instance. +
+ +```yaml +sensor: + - platform: statistics + name: "Average Outdoor PM2.5 (24h)" + entity_id: sensor.sensor_pm2_5_mass_concentration + state_characteristic: mean + max_age: + hours: 24 + + - platform: statistics + name: "Average Outdoor PM10.0 (24h)" + entity_id: sensor.sensor_pm10_0_mass_concentration + state_characteristic: mean + max_age: + hours: 24 +``` + +### Creating the AQI Rating Sensor + +The [`statistics`](/integrations/statistics/) sensors can then be combined into a template +sensor. Note that this example takes a conservative approach: the "worse" of the two +values (PM2.5 or PM10.0) is used to determine the overall rating. + +
+Reminder that the breakpoints used below can be determined from the aforementioned EPA +guidelines. +
+ +{% raw %} + +```yaml +sensor: + - name: "Local Outdoor Air Quality" + state: > + {% set pm2_5_avg = states("sensor.average_outdoor_pm2_5_24h") | int %} + {% if 0 <= pm2_5_avg <= 12.0 %} + {% set pm2_5_rating = 0 %} + {% elif 12.0 < pm2_5_avg <= 35.4 %} + {% set pm2_5_rating = 1 %} + {% elif 35.4 < pm2_5_avg <= 55.4 %} + {% set pm2_5_rating = 2 %} + {% elif 55.4 < pm2_5_avg <= 150.4 %} + {% set pm2_5_rating = 3 %} + {% elif 150.4 < pm2_5_avg <= 250.4 %} + {% set pm2_5_rating = 4 %} + {% else %} + {% set pm2_5_rating = 5 %} + {% endif %} + + {% set pm10_0_avg = states("sensor.average_outdoor_pm10_0_24h") | int %} + {% if 0 <= pm10_0_avg <= 54.0 %} + {% set pm10_0_rating = 0 %} + {% elif 54.0 < pm10_0_avg <= 154.0 %} + {% set pm10_0_rating = 1 %} + {% elif 154.0 < pm10_0_avg <= 254.0 %} + {% set pm10_0_rating = 2 %} + {% elif 254.0 < pm10_0_avg <= 354.0 %} + {% set pm10_0_rating = 3 %} + {% elif 354.0 < pm10_0_avg <= 424.0 %} + {% set pm10_0_rating = 4 %} + {% else %} + {% set pm10_0_rating = 5 %} + {% endif %} + + {% set rating = [pm2_5_rating, pm10_0_rating] | max %} + {% if rating == 0 %} + Good + {% elif rating == 1 %} + Moderate + {% elif rating == 2 %} + Unhealthy for sensitive groups + {% elif rating == 3 %} + Unhealthy + {% elif rating == 4 %} + Very unhealthy + {% else %} + Hazardous + {% endif %} + unique_id: local_outdoor_air_quality +``` + +{% endraw %}