LXC container on Proxmox running a JSON to MQTT script. It is rough, so it needs hourly reboots, but that’s where containers are great, right. Just a couple of cron jobs and I don’t think about it.
3M Ultra-Fine 2800 / Merve 14 filters
Homeassitant running Mosquito.
With crazy wildfires becoming an annual thing, we decided to get a PurpleAir indoor sensor to see how the air quality is in our house and business. Today the 2.5 AQI outdoor in San Jose was 165, and my indoor was creeping up to 90. So I decided to swap out the “FilterBuy” MERV 13 filter with a 3m MERV 14 filter (2800 in their numbering). It was amazing to see the drop at different particulate sizes. Three hours later, we’re down below 50 AQI indoors. More impressive to me is the drop in 0.3um particulates
You could pull the PurpleAir via a REST sensor directly in HA.
Look at the PurpleAir threads (there are not many). There are some nice canvas gauges you can utilize.
We have had a good clear stretch for a week in Western Washington.
I tried the built in json parsing that I found on here, but had lots of problems with them. I couldn’t see the data. Do you know if there is a way to debug the built in jdon parsing to see where the issue was?
Since I use python and json in my day job, and already have a procmox homeland, it was much faster for me to spin up this little script.
When I get back home I will post my sensor yaml for everything PurpleAir. I have a sensor that states the nomenclature of the air quality such as Good, Moderate, Unheathy…
I also have automations that announce the change from one category to another over smart speakers and notifications to phones.
Phones:
alias: Notification Air Quality Change - Phones
description: Phones
trigger:
- platform: state
entity_id: sensor.purpleair_description
for: '0:10:00'
condition:
- condition: time
before: '20:30:00'
after: '04:00:00'
action:
- service: notify.mobile_app_glenn_s21
data:
message: >-
{{states['sensor.time'].state}} Air Quality is
{{states('sensor.purpleair_description') }} at AQI
{{states('sensor.purpleair_aqi_a')}}
- service: notify.mobile_app_karen_s21
data:
message: >-
{{states['sensor.time'].state}} Air Quality is
{{states('sensor.purpleair_description')}} at AQI
{{states('sensor.purpleair_aqi_a')}}
- service: notify.mobile_app_ktab
data:
message: >-
{{states['sensor.time'].state}} Air Quality is
{{states('sensor.purpleair_description')}} at AQI
{{states('sensor.purpleair_aqi_a')}}
- service: input_text.set_value
target:
entity_id: input_text.aqi_last
data:
value: '{{states(''sensor.purpleair_description'') | string}}'
mode: single
Speakers:
alias: Notification Air Quality Change - Speaker Office
description: WiFi Speaker
trigger:
- platform: state
entity_id: sensor.purpleair_description
for: '0:10:00'
condition:
- condition: state
entity_id: light.leviton_light_office
state: 'on'
action:
- service: media_player.volume_set
data:
volume_level: 0.9
entity_id: media_player.rpispeaker2
- service: tts.marytts_say
entity_id: media_player.rpispeaker2
data_template:
message: >-
Air Quality Index is {{ states('sensor.purpleair_description') }} at {{
states('sensor.purpleair_aqi_a') }}
mode: single
Here is my yaml for importing the local PurpleAir. Change the IP to whatever yours is at.
I don’t bring in the three you see commented out since I saw no need to.