3D Printing COVID-19

DIY CO2 Monitoring on a Budget


There is clear, long proven evidence that spread and infection of our novel fiend SARS-CoV-2 is via airborne particles. These particles could spend up to a whole 24 hours in the air before capturing to a surface without proper filtration or ventilation. As a result we’re seeing experts encouraging more effective respirators like N95s over surgical or medical masks. The push for HEPA filters and improved ventilation in schools and other public spaces has grown immensely. One way to measure how effective a given space’s ventilation is to measure the amount of CO2 (Carbon Dioxide) in the room.

Carbon Dioxide is what we humans constantly exhale as a waste gas. It spreads easily in the atmosphere so changes in the CO2 concentration in a space is a useful indicator how well ventilated (or not) it is such as this tracking board in a Japanese movie theatre.

Originally tweeted by NOG (@NOGjp) on July 17, 2021.

Through knowing the CO2 concentrations in a given space, we can make an inference that the higher CO2 concentration the higher risk to being exposed to SARS-CoV-2 and therefore contracting COVID-19.

Commercial CO2 Monitors

There’s a number of commercially available CO2/air quality monitors available including the Aranet4, but they’re generally pretty expensive (USD$200+) and as a result not accessible to the average person let alone education or the arts.

The Atmo Monitor v1

Assembly and Programming Video

Getting Started

Introducing the Atmo Monitor v1! This ultra compact device has been designed to be much more inexpensive than commercially available CO2 monitoring options and I’ve decided to open source this for educational purposes. This is in no way intended to be used as a medical device.

The Atmo Monitor v1 is based on a Raspberry Pico, a USD$4 microcontroller with plenty of Input/Output for our various peripheral sensors we’ll be attaching. The code is written in MicroPython, similar to Python 3 but optimized to run on a microcontroller.

As with all my projects, I started on a breadboard. This helped me visualize the I2C bus for chip communication and the power needs along the way. All of the chips required me to solder on their header pins and using a breadboard to make sure everything was nice and straight makes it all the easier.

What to expect

Upon plugging in the monitor, the LED will be white. Once the monitor has initialized it will turn blue indicating it received its first readings from the sensors and is starting the warm up phase. This phase lasts twenty minutes.

If, within the first five seconds of starting it starts getting reasonable readings from the sensors it will switch to its operating mode. The LED will now indicate the level of CO2 being detected in your air.

LED ColourDescription
BlueWarm Up Mode
GreenCO2 < 1000ppm
Yellow1400ppm < CO2 > 1000ppm
RedCO2 > 1400ppm
LED Colour table

You may find that the sensor resets itself after a random period of time. It does this if the sensors send back a value that’s completely out of line. Rarely, and I mean rarely, the device may hang in the white or blue phase with the OLED not refreshing. Simply unplug the monitor and plug it back in.

When you first power on your monitor it’s important to let it sit for two days to allow the sensors to calibrate.

Bill of Materials

  • Raspberry Pico
  • ScioSense CCS811 breakout
  • Bosch-Sensortec BME280 breakout
  • An I2C-compatible 128×64 OLED package (SSD1306 recommended)
  • Common cathode RGB LED
  • Package of Dupont Wires
  • 830-Point Breadboard for prototyping
  • Header pins (if not included with your Pico or breakouts)

The CCS811 from ScioSense is a teeny tiny little chip that detects both CO2 and Total Volatile Organic Compounds (TVOC) that exist in the air you are sampling via what’s called a Metal-Oxide(MOX) sensor, also known as a chemiresistor.

Pictured here is the breakout board by SparkFun which made this project simpler was not cheap to ship to Canada.

The Bosch-Sensortec BME280 is the other important piece of the puzzle. The CCS811 on its own will report pretty okay values but it’s strongly recommended to pair it with some humidity and temperature values.

Pictured here is the breakout board by SparkFun.

Where to Buy

For those in the States or are unconcerned about shipping costs otherwise, I’d recommend the boards from SparkFun. They offer the Raspberry Pico, CCS811, and BME280. SparkFun does have distributors in Canada, like Calgary based Solarbotics. I would shop around if you’re looking for these specific boards.

One thing to note about SparkFun, the OLED I purchased from them was DOA and though it’s been two weeks since I inquired with them about a replacement I have not heard back.

Otherwise, I’m stuck having to recommend Amazon. The SSD1306 OLED package I ordered had five parts and included the header pins which made the price very right. I was able to pick up both sensor boards in bulk as well.

TAKE NOTE of the arrangement of the pins on the boards you purchase as we will be soldering them directly to the PCB. If you plan to use my PCB, the GND and 3V3 pins may be swapped on the boards you’re planning to purchase and you will have to modify the part footprints and wire paths to match.

The WAKE pin on the CCS811 may be the fifth or sixth pin so the PCB allows for either. If the WAKE pin is sixth pin, do not populate the fifth pin on the breakout board.


You can find the complete program plus the required libraries in my GitHub repository.

I recommend using the Thonny IDE. It makes interfacing with the Raspberry Pico very easy and helps manage required libraries pretty simple. For the libraries I include in the repo, open and save them to the Pico under a folder called libs.

It’s important to note that when you save a file to the Pico named that the next time the Pico is power cycled it will automatically execute the program that exists inside that file. It’s pretty difficult to get the Pico to accept an interrupt at that point so until you’re completely satisfied that you aren’t going to make any more changes to that you run the program from the Thonny IDE.

If you do end up wanting to flash a new to the Pico, hold down the BOOT SEL button on the Pico while you plug it in. It will appear on your computer as a USB drive where you should uncompress and upload this file to. Unplug and hold down BOOT SEL again, return to the Thonny IDE and reflash the Micropython bootloader to the Pico. Your will have been renamed so you can continue to work with your Pico. (Thanks to the MicroPython Forum for this tip.)


I designed the PCB in a free software suite called KiCad. The files available will only open in KiCad 6.0 and above. I use JLCPCB for the PCB construction as I’ve been very happy with them in the past with their super fast turn around time and reasonable pricing. Simply upload the Gerber files, specify your options, and they take care of the rest. Most importantly for this project (being it could end up in classrooms) is that they offer HASL lead-free finishing.

3D Printed Case

I’m in no way an expert in CAD design but I designed this 3D printed case in Autodesk Inventor. They offer discount pricing for education.

To download the STL files, find the design on Thingiverse.

MOX vs NDIR Sensors

Some familiar in this field may know that most commercially available air quality monitors use NDIR (Non-Dispersive Infrared) sensors. They use a specific wavelength of light to measure the amount of CO2 in the air. It powers a special LED on one side of the package and it collects on a sensor on the other side. When CO2 passes through the beam it absorbs this light so the sensor knows when less light is being detected by the sensor there’s CO2 present. They have a long life span, up to ten years.

Sensirion SCD30 CO2 NDIR I2C Package

Metal-Oxide (MOX) sensors measure the resistivity of specific metal compounds to test the amount of CO2 in the air. They have a tiny metal strip exposed to the air you want to test and when CO2 comes in contact it changes the chemical composition of the metal and the resistance across it changes.

Both of these sensors can be affected by temperature and humidity but the price difference and size of these two sensors is what helped me make this important design decision. I may design a version 2 which incorporates an NDIR sensor in the future but until then I’m confident the MOX sensor accomplishes what we’re going after.


This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

I have chosen this license so others can adapt upon the various aspects of it but I do not believe that others should financially benefit from it as the goal of documenting this project is to encourage others to build these to help make their spaces safer in respect to exposure to SARS-CoV-2.



Updated: November 20, 2021 at 01:40

How it all started

On Sunday, September 26, 2021, I started up Microsoft Flight Simulator 2020 and spent the day streaming a flight of a Beechcraft King Air 300i from Edmonton Intl (YEG) to Toronto Pearson Intl (YYZ) with a fuel stop at Winnipeg Intl (YWG) to show the logistical nightmare it would be to have to transport a patient out of Alberta to Ontario for care. The Beechcraft King Air is the same plane that Alberta Health Services contacts to operate their eleven fixed-wing air ambulances. Over the course of the event I tracked the same plane in real life make four flights to various cities in the South Zone, Calgary, and Central Zone, transporting up to five patients during that time.

Folks were/are able to donate to the effort through Buy Me a Coffee or via Interac E-Transfer (DM me on Twitter for info) to avoid the service fees.

I set (what I thought was) a lofty goal of $600. This would cover a coffee for the teams in the Intensive Care Units (ICUs) in the Edmonton Zone. By the end of the stream we’d raised an incredible $1274.06 from 37 donors.

Those donors are: @nymama3, Trish, @lilygrimmer, Cindy, Marianne, Jillian, @ugillespie, @jjmckenz, @leomancini, Bonnie, Cait, @lorian_h, @nicoleorange74, @pathuot001, Angela, Janet, Leah, Heidi, @DiverDoc, ljf, @Bnkr_Chk2, Bev, Michelle, Anson, Chloe, @elisefarand, Jaen plus 10 anonymous donors.

Alberta’s health care workers tirelessly empty their cups into their patients, it’s important we help to refill theirs.


I was blown away by the support post-flight. Folks have shared my delivery stories around Facebook and Twitter and we’ve raised a total of $6018.39 from a total of 171 donors. (Updated Nov 20 at 01:40)

On October 8th, we met and exceeded my goal of $5000. I can’t thank everyone enough for their amazing generosity. This is making a great impact on the spirits in our hospitals. I haven’t closed off donations but won’t actively seek any more.

Those donors are: Marianne, Carol, Marion, RC35545907, Bimbimbop, @possibilitywork, Julie, Allison, Lindsey, @chandrakasper, @heathergayle, @angryABmama, Judith, Dave, @superschwagirl, Natasha and Wesley, @conductorange, Lisa, @riley__dawn, Chrissy, SJ, Darlene, @MeliBee44, @SueWithersDraws, @ejfudd, Erika, Roxanne, Mark, Elise, @JEbethechange, Cory, Laurine, @montgomary, G E, Melanie, Rhonda, @inglewitch, Amanda & Kevin, Sally-Ann, @aspen_tree_, @mcmannkrtaylor3, @japaequipment, @iammikebrazeau, Sho, RH, Dall, @ReneAAAllen, Maggie, Joe, @firstcoffeeyeg, Kay, @hoo99k, Dayna, @SkipIsChris, Jessie, @olsonshanew, Virginia, @dorothydawe, @fouririshlads, Jeff, Paulina, Drew, Velia, Dana, @stephpearlrobin, Jenn, Rhonda’s Mom, @Norm, @LawrenceALim, @chuckwurster, @kimberleydeley, @litmasterg, @Wpg_Nana, Evelyn, Donna, @Homesteader86, Elizabeth, @TheEdmontonGal, @JValShuster, Brittany, Chris and Rod, @Twreck1031, Mackenzie, Sam, Heidi, Maggie, Marianne, @Murphnik, @conductorange, Brian K plus 31 anonymous donors.

Under the cover of night I started deliveries on Thursday, September 30th, starting with the hardest hit unit, the Royal Alexandra ICU. I intend on continuing to deliver the coffee cards at this hour to catch the night shift.

Delivering the first thirty coffee cards to the Royal Alex ICU.

As of November 19, 2021 – the final tally – I’ve delivered $5550 in coffee cards (1180 cards) to 35 departments across the Edmonton and Central Zones:

Thank you to everyone who contributed to the fund! I am no longer accepting donations.

Interac E-Transfers also accepted, please DM me on Twitter.

Throughout this crazy journey it’s important to know that I’ve always represented myself and only myself as a citizen. My views, opinions, this endeavour is of my own accord and not that of my employer. Without 171 of you, none of this would have been possible.

Nominate a Unit

As long as funds continue I would like to start a program to nominate a hospital unit. We know that many units across Alberta have been converted for intensive care. RNs and LPNs have been asked to do the unthinkable, converting from surgical, labour and delivery, and other care to intensive care. There isn’t much for visibility on which units these are but I have a suspicion that Albertans do if we crowd-think this. Click here to access the submission form to nominate a unit for #CoffeeforHCWsAB. I’ll list the units below as submissions come in.

Note: Nominations are now closed. Thank you everyone!

Nominated units:

  • Royal Alexandra Hospital: DOR/PACU (Tues, Oct 12)
    • Nominee: Chloe C.
    • This unit went from being the operating room post-anaesthesia care unit to a strictly COVID-19 unit. All of the staff are amazing and I know that it would be so appreciated there.
  • Northeast Community Health Centre: Emergency (Mon, Oct 11)
    • Nominee: Megan R.
    • It is a small hospital and the numbers they see here are compatible to larger urban sites. The staff work so hard to keep the community safe during this pandemic. Regardless of how hard the day can be they always show up with a smile on their face ready to give it their best.
  • Foothills Medical Centre: Entrance Management
    • Nominee: Jen B.
    • Working with angry members of the public who are not allowed to visit their loved ones.
  • Royal Alexandra Hospital: Pharmacy (Fri, Oct 23)
    • Nominee: Theresa D.
    • They work so hard behind the scenes filling drug orders; some need to be made by special techniques using raw ingredients. These patients in ICU and Covid wards often need complicated medication treatments. This means more consults for pharmacists, more compounding and checking for technicians and more repackaging and deliveries for assistants. All done with the utmost care for patient safety.
  • Walter C. Mackenzie Centre (U of A): 3C3/3C4 (ICU) (Fri, Oct 1)
    • Nominee: Megan T.
    • My mother was in the ICU in this unit for most of three months before she passed away on August 18, 2021 (due to non-Covid related issues). During our time there, we saw the extraordinary care those healthcare workers in that unit provided every single day. We also saw how exhausted they were, and, day by day, we saw staffing shortages and bed shortages as Wave 4 started, even in late July. My mother received world-class care there, despite all of the challenges facing the doctors, nurses and frontline healthcare workers. For that, my family and I are eternally and forever grateful.
  • Royal Alexandra Hospital: CVICU (Fri, Oct 15)
    • Nominee: Melissa R.
    • Longer shifts, staff shortages, higher patient load, not to mention dealing with anti-vax protesters outside the front door.
  • Sturgeon Community Hospital: Emergency (Mon, Oct 25)
    • Nominee: Donna S.
    • The staff at the Sturgeon ER including EMS is tired & overworked. Everyday they battle through the increased patient load and amped up safety procedures, in full PPE. Despite this they continue to go above & beyond, taking the time to reassure patients & family members and providing quick responses to emergencies. We experienced this first hand due to a recent 911 call that resulted in an ambulance trip and visit to the ER. Thank God the response was still fast & efficient. The paramedics were so reassuring. Love them!
  • RAAPID North (Thurs, Oct 14)
    • Nominee: Anonymous
    • RAAPID is a provincial service that assists physicians in connecting to specialist colleagues and in mobilizing patients around the province. During the entire pandemic, RAAPID has been working with many physicians and services, including the air and helicopter services, to assist in the load levelling of facilities. This group’s workload and scope of practice increased significantly during the pandemic and they have been working tirelessly for the last year and a half to assist in offsetting the workload of their hospital colleagues by ensuring patients are transferred between facilities as seamlessly as possible. An essential service that is often not well known nor recognized.
  • Fort Saskatchewan Community Hospital: Emergency (Tues, Oct 5)
    • Nominee: Kevin C.
    • They don’t get to stop. They are all so tired. I’ve spent a lot of time there this year due to gall bladder and newly diagnosed type 2. You can see how tired they are.
  • Walter C. Mackenzie Centre (U of A): 3D3 Plastic Surgery Unit (Wed, Oct 20)
    • Nominee: Anonymous
    • This unit has stepped up and become a covid unit during each one of the 4th waves. The nurses and staff have worked self lessly despite normally being a plastic surgery unit.
  • Walter C. Mackenzie Centre (U of A): Bed Coordinators Office
    • Nominee: Maddi D.
    • The bed coordinators and site managers are some of the hardest working people I have ever had the pleasure of working alongside. When the pandemic hit, admissions to the hospital increased, and subsequently, the number of beds available decreased. As the pandemic continued, they had to adapt and overcome many different challenges, such as non-COVID units being converted to COVID units (meaning fewer beds for our non-COVID services), morgue capacity and overcapacity protocols, longer stays in the ED due to lack of appropriate beds to put patients in, and so on and so forth. In the face of all this adversity, this team never gave up. I learned a lot from them, and I’m grateful to be able to work with them.
  • Grey Nuns Community Hospital: Emergency (Sun, Oct 24)
    • Nominee: Mackenzie B.
    • My friend works at the Grey Nuns in the ER, and boy has she been working a lot. A lot to the point where the basically lives there. The Grey Nuns is my community hospital, and the nurses in this unit are rockstars. There’s nothing I want more than to put a smile on their faces!
  • U of A Campus: FM&E Project Team
    • Nominee: Lisa L.
    • Throughout Covid, this crew has worked tirelessly to accommodate all of the requests for installation of copious pieces of equipment being installed in the Provincial Lab and throughout the hospital. They were/are involved in the process of testing, moving and installing equipment required to increase bed and testing capacity. Although not on the front lines of patient care, they are definitely a ‘behind the scenes’ hero!
  • Walter C. Mackenzie Centre (U of A): 5D3/5D4 (Sat, Oct 30)
    • Nominee: Anonymous
    • Another group of covid units at the U. The staff are fatigued with all the losses, codes and constant putting on and taking off of PPE.
  • Stollery Children’s Hospital (Mon, Nov 1)
    • Nominee: Maggie S.
    • In discussing with the nominee, the Royal Alexandra Hospital NICU (a wing of the Stollery) was chosen for this nomination.
    • My daughter is 4 months and has had her cleft lip surgery delayed past January. This surgery is normally done around 3 months, and hers won’t be done until she’s past 7. Thankfully, getting the lip repaired doesn’t effect much other than cosmetics. However, getting this surgery delayed can effect all the rest that she needs.
    • The one I’m most worried about is her palate, without it she won’t learn to speak.
    • All non-urgent surgeries and procedures (sic) that involve putting a baby/child under have been delayed until [past] January. I’d like to donate to the Stollery nurses who suddenly became adult nurses. Or worse, the ones taking care of children with covid. Taking care of children is very, very different than taking care of adults.
3 month old Sarah, waiting for her palatoplasty.
  • Walter C. Mackenzie Centre (U of A): 3A7/3A8 CVICU (Tue, Nov 2)
    • Nominee: Theresa E.
    • This already busy cardiac surgery unit has taken on a huge number of COVID patients on ECMO – the absolute highest level of life support. They have had to deal with so many patient deaths and delayed surgeries, with 1/3 fewer beds than usual as the non surgical cardiac ICU has also moved in after their usual unit became a COVID ICU.
  • Royal Alexandra Hospital: Unit 54 (Wed, Nov 3)
    • Nominee: Theresa F.
    • This is and has been the main Covid inpatient unit for the second, third, and fourth waves at RAH. Staff are very tired dealing with the very high acuity at all times on this unit. Staff are always friendly and always working with a smile on their face even when they are tasked to do so much all the time.
  • COVID-19 Vaccine Centres
    • Nominee: Darlene
    • While not on the front lines fighting the disease they are out there every single day trying to prevent it while fighting misinformation!
  • Walter Mackenzie Centre (U of A): 3C3/3C4 General Systems ICU (Fri, Nov 20)
    • Nominee: Brian K.
    • Brian would like this delivery be made in memory of his wife Mary-Ann, where the staff of 3C3/3C4 cared for her.
    • A heartfelt thank you to all the support staff at the U of A ICU. They really do run on coffee.

A Final Thank You

Thanks from the Front Line

Media Headlines

‘I See You ICU:’ Albertans express gratitude for health-care workers at Thanksgiving – CTV News

“Hundreds of Albertans are sending coffee, gift cards and Thanksgiving meals to those working in intensive care units overwhelmed with COVID-19 patients.” – Oct 9, 2021

One Man is helping hundreds of Albertans to say ‘Thank you’

CBC Edmonton – Oct 10, 2021

Edmonton man giving back to frontline workers – CityNews Edmonton

“An Edmonton man is giving back to Alberta’s healthcare workers, who have been tirelessly working on the front lines for the duration of the pandemic.” – Oct 11, 2021

Messages of Support

Besides being fully vaccinated, masked, & cautious this is the least i can do.


sending love and support to HCWs


Appreciate our healthcare workers! Hang in there!

Angela in Bonnyville

We’re so grateful for all our health care workers! ♥️

Cait Barker

Thank you for all you do!


Thank you, thank you, thank you!!!


Thanks to all the amazing HCW’s for your care, kindness, and hard work.


You made our week with the report about the gift card delivery to RAH ICU, one of the units I worked on many years ago. Thank you from the bottom of our hearts. This support makes an incredible difference to morale.


Thank you for everything, you all are heroes ❤️


Thanks to ALL staff doing their best under these dreadful conditions!


the Real MVPs of Alberta ❤️


Thank Heavens you are there…where would we be without you? I shudder to think. Thank you….we know youre there and I salute you!


we appreciate all your work more than can be expressed.


From the bottom of my heart, thank you.


Hang in there! Sending love and support!


I wish there was more we could do. You are saving lives and we appreciate you! Please take care of yourselves. 💜


Dear HCWs, your work is so appreciated by so many!


Thank you for your courage to show up and work so tirelessly.

Lisa Losole

There are not enough words of gratitude 🙏

Chrissy Smith

Thank you HCWs for all that you do. Majority of people support you. 😍😍

SJ Savrtka

You are all incredible and appreciated more than you’ll ever truly know.

Darlene Halsey

thank you for you committnent and your hardwork.


thank you ♥️


We couldn’t do this without you! Stay strong!

Elise Gilligan

thank you for the immense burden you are carrying and invalueable service you provide! We stand with you!


Please know that you’re loved. I am so very, very grateful for the compassion and love you carry within your hearts. Stay strong, stay healthy, stay safe.


I’m in awe of your strength and courage each and every day. Thank you.


Thank you hospital staff. We will always have your backs!


Thank you for all you do!

Amanda & Kevin

HCWs, I want you to know again how much you are appreciated! Heroes!

Sally-Ann Mowat

Im so sorry that you have been put in this terrible situation of a completely preventable 4th wave. thank you so very much for not giving up and taking care of Albertans.. even when they dont always do much to take care of you.


Hi Chad. My family would like to donate all 30 to one ward for their next shift. May they get just a few moments of comfort from a hot coffee… in exchange for the hours of comfort they tirelessly provide for their patients. Thank you.


We love our Edmonton doctors, nurses, RTs and healthcare workers!


If it wasn’t for the EMT’s and the staff at the RAH ICU, my wife probably wouldn’t be here today. I certainly owe them a lot more than a couple cups of coffee…


Thank you, ICU nurses.


This is the smallest of tokens of my appreciation for everything HCWs do. I spent a few days in the RAH after shattering my ankle last winter, and the staff there worked so hard to make a tough period in my life better. From sharing their own lives in conversations, to getting me middle-of-the-night Jello, to listening to my worries of not being able to dance again, they went above and beyond what their jobs called for. Thank you all!


Thanks for all that you do, you are so appreciated!


Cheers to Chad for enabling me to give a little thanks for the incredible work and sacrifices our YEG hospital staff are doing every day!


Think about you every day. Wishing all of you strength. 🙏

Kay Mulcaster

theres more good in Edmonton than you think. You are all doing amazing work!!♥️♥️


I don’t have the words to thank every single health worker who has put their heart and soul and expertise into taking care of us for the last two years, at great personal expense. Instead, I’ll send love and kindness and a little bit of coffee. Thank you all.


Pleased to make a contribution, just learned of this today! thank you to our health care workers! We see you and appreciate you!


…only wish more could be done to help HCW right now. Hoping a coffee makes things a tiny bit better.

Virginia Clevette

health care workers saved my brother’s life in the third wave. Thank you, thank you, thank you.


sending love from Ontario to the health care support staff who are saving our asses.😘


Many thanks, you are deeply appreciated.


Thank you so much HCW’s!!!


Many thanks, you are deeply appreciated.


Love and respect from Calgary


Thank you for your selfless dedication.

Velia Watts

thank you for your dedication in the worst of times – so many benefit from all you do

Dana Turton

A small thank you to our heroes


Thanks for doing this Chad. I work in the Strathcona Community Hospital Emergency Department and I know you are travelling there tonight. I’m not working tonight so won’t see you but so happy you get to meet my amazing friends and co-workers. They are awesome do so much great work for Sherwood Park and Edmonton.


Thank you doctors and nurses!


I can’t even imagine the toll that the #intentionallycruelwave is taking on all of you, but thank you for stepping up to protect and care for all of us. You guys are heroes, and you shouldn’t have to be so strong for all of us–but you’re there doing it anyway, day in and day out.


Our healthcare workers need our support now more than ever.💗

Donna Soetaert

We are so grateful for the tireless work of the AHS employees! THANK YOU to all of you.

Elizabeth Stolte

Grateful for all the tireless work by all AHS staff.


Thank you so much for looking after so many. Words are not enough. Your dedication and compassion are so appreciated. I hope you enjoy the coffee!


“Thank you for helping us help our healthcare heroes!”

Brittany Kunst

All health care workers are critical at this time and they deserve a big thankyou. We don’t know when all this will be over however, all I can say is that I have seen very tired overworked healthcare staff and they need some hope and appreciation from all of us. A coffee that comes from the heart goes a very long way and is a fabulous idea.

Chris and Rod Forrester

Even with the dysfunctional government handling of the pandemic, our Healthcare Workers continue to go above and beyond. Thank you all for all you do to help your fellow Albertans.

IT Sys Admin Networking Ubiquiti

TELUS Optik IPTV on Ubiquiti UniFi

Taking back the consumer LAN one step at a time…

As many have been, I’ve been tearing my hair out trying to get around using TELUS‘ blasted Actiontec router. Sure, I could have just bridged it but that’s just one more hop before it hits my network. I recently had PureFibre Gigabit installed (albeit the installer left a little too much of the fibre exposed which I’m nervous around) which runs from the pole in the back alley, over my back yard, and down into my basement. Note, this house was built in 1921 and has quite the history (being one of the first houses in my city to have have a POTS line being the fire chief at the time built the home) and I’m quite sure no one was thinking about CAT6 let alone fibre back then!

TELUS installed a Nokia branded ONT (of which I’m unsure the model as it’s screwed to the wall and I’m lazy) and left me with a Actiontec T3200M router. As soon as the installer left I threw a TP-Link PoE Gigabit switch I had laying around between the ONT and the Actiontec and ran CAT6 through the floor up into my den to my Unifi Security Gateway (USG). TELUS has no problem leasing a second IPv4 address. I could have left it this way however I prefer if I can to have things done in a centralized way (as far away from the ISP’s bloatware as possible).

Until today. After some research I’d left myself running in circles as to the right way to go about this (knowing that multicast is fidgety) and plugged the repurposed that same switch and plugged it into the WAN 2/LAN 2 port on the USG. From there I plugged both the 4K PVR receiver and 4K WiFi receiver into the switch and started cracking this nut.

Note: since writing this article, I’ve since moved the STBs to the USG port LAN 1. This is due to problems with Optik on the Go. I’ve connected the STBs to a port on one of my Unifi Switch 8 60W switches and set the port accordingly in the Unifi SDN. Please watch for more writer’s notes as we go along. There’s also two Addendums located at the bottom of the article.

Starting with IPv6

First, because I’d prefer to be future forward, configure your WAN interface for IPv6. TELUS uses DHCPv6 with a Prefix Delegation Size of 56. Configure this in Settings > Networks.

IPTV Configuration


Once you’ve got that physical connection out of the way and part of the IPv6 configuration taken care of (more on that later), head on into the Unifi SDR UI into Settings > Network and create a new network. I named mine “IPTV” and configured it as below:

It’s a good idea to segregate this traffic from the rest of your network by using the WAN 2/LAN 2 port for a number of reasons, firstly it’s not your own equipment – if it were somehow compromised I’d rather it be at an arm’s length. Most importantly – the IGMP proxy we’ll be configuring has a tendency to flood your network if it’s not just right. Having it on a separate interface prevents this.

DHCPv6 & IGMP Proxy

From here, you’ll see some activity light up that port and you’ll notice your TV start playing and then freeze about 15 seconds later. This is because of the way TELUS Optik IPTV works. TELUS licenses the use of Ericsson Mediaroom (formerly Microsoft Mediaroom prior to 2013) to deliver their service. You may remember the product as WebTV or MSN TV way back in the early 2000’s. When you initially tune to a channel the provider pushes a unicast connection to your receiver while your receiver joins the multicast stream (via IGMP) and starts listening. This takes less than 15 seconds and the transition is seamless. This means your provider can stream one connection to the multicast address and from there the network takes over. It’s impressive tech really.

You’re going to want to connect to your Unifi Controller, in this case my Unifi Cloud Key G2+. If you haven’t done this before I’d suggest having a look at this article in Ubiquiti’s Knowledge Base.

Once logged into your controller, go ahead and enter the following commands:

cd /srv/unifi/data/sites/default
apt update
apt install nano -y

This will change your directory to the default site configuration override directory and install nano because I hate vi. If your site name is different you’ll get an error. Change directory to /srv/unifi/data/sites/ and ls to find out which directory is right for you.

We need to create a new file named config.gateway.json. Go ahead and run nano config.gateway.json.

There’s two things we need to accomplish here. First, finish up our IPv6 configuration.

         "interfaces": {
                 "ethernet": {
                         "eth0": {
                                 "dhcpv6-pd": {
                                         "prefix-only": "''"

TELUS provides only endpoint addresses (DHCPv6-IA) and does not delegate prefixes (DHCPv6-PD). There’s no configuration in the web GUI to indicate this so we’re needing to add this here. Without it your USG will not get an IPv6 address from TELUS and your CPU will be pinned at 40-50%.

Next, we need to activate the IGMP proxy on the USG, this also is not configurable via the web GUI hence why we need to get down and dirty.

Append this to the previous chunk of JSON:

    "protocols": {
            "igmp-proxy": {
                    "disable-quicksave": "''",
                    "interface": {
                            "eth0": {
                                    "alt-subnet": "",
                                    "role": "upstream",
                                    "threshold": "1"
                            "eth2": {
                                    "alt-subnet": "",
                                    "role": "downstream",
                                    "threshold": "1"

We’re playing with some fire here, so it’s a good idea to run your JSON through a validator first before saving the file to your controller. What this JSON is doing is letting the USG know to start the IGMP proxy and configure eth0 (WAN) as the upstream IGMP interface and eth2 (WAN 2/LAN 2) as the downstream.

Note: if you use Optik on the Go or would otherwise prefer to have the Optik STBs on LAN 1, your downstream interface should be eth1.

From here, save your file by pressing CTRL+X, Y, and ENTER.

We need to do one more JSON configuration change and that will go into another new file,

Run nano and put the following line into the file:


Normally if we were only making changes to these two files we would need to force provision the USG. As we’re going to continue on in the Unifi SDR UI we can skip that step. If you’re still following along, awesome work. You’re killing it. I’m proud of you. Really, I am. This, for me, is the culmination of about 7 hours of experimentation, WireShark-ing, and a bottle of Wine O’Clock Shiraz.

Static Routes

We can head back into the Unifi SDR and head to Settings > Routing & Firewall. We need to create three routes:

These routes will be consistent across the country however the “Next Hop” will be different. This is the USG’s gateway, something you can find by running a traceroute from your computer to somewhere on the internet. logging into the USG via SSH and executing: ip route show

Look for a line indicating your WAN IP address routed to a subnet such as below:

I blocked out my full IP address however you’ll see that eth0 is pointed to For the purposes of creating the routes in Unifi, the address will instead be, in my example. This will ensure that the traffic to the Optik servers is routed as efficiently as possible.

Creating the routes in Unifi is pretty quick and painless, as depicted below:

These instruct the USG to route all traffic to any of the three subnets through the “Next Hop” and only the next hop. The Destination Networks we need to configure are:


Firewall Configuration

Next, we’ll jump over to the “Firewall” tab and configure a couple of firewall rules. Before we do that, click the “Groups” subtab and we’ll define a couple of firewall groups. Choose “Create new group” and configure your first group as follows:

This defines the groups of machines that will be permitted through the firewall into your IPTV network over UDP that we will create next. Before we can do that we need to define one more group as follows:

This group defines the subnet of IPv4 space reserved for multicasting. Move back to the “Rules IPv4” subtab, make sure you’re looking at the “WAN IN” rules and choose “Create new rule“. Configure your rule as follows:

This will allow all UDP traffic from the IPv4 Address Group we created just a moment ago through into the IGMP proxy we set up earlier. The IGMP proxy will do exactly as it’s named: proxy the IGMP packets into your network as we defined earlier, specifically to the eth2 interface. (Note: if you have the STBs connected via the USG’s LAN 1 port, this is the eth1 interface instead.)

We need to create one more firewall rule under “WAN LOCAL”:

This rule will allow IGMP packets to flow freely from the IGMP proxy into your IPTV network – your eth2 (WAN 2/LAN 2) interface. This also allows IGMP traffic to flow between receivers (for watching PVR recorded video). (Again, note: if you have the STBs connected via the USG’s LAN 1 port, this is the eth1 interface instead.)

Wrapping it up…

And with that, you should be able to tune your Optik TV receiver to a channel and have uninterrupted TV. So what we’ve accomplished is the following:

Thanks for reading along. If you have any questions or comments please reach out in the comments below. I hope that this helps you liberate yourself of that damn Actiontec router, too!

Addendum 1: Using the USG’s LAN 1 & VLAN

As with any project I learned a good amount and after writing this article decided to open TELUS’ Optik on the Go to find that I ran into the multicast issue. I quickly realized that this was due to all multicast traffic being routed to the USG’s WAN 2/LAN 2 (eth2) interface.

I’ve made some writer’s notes to the guide above however the physical connection bears to be clarified. The STBs instead were connected to the Unifi Switch 8 60W and within the Unifi SDN I’ve manually assigned the IPTV VLAN we created to those ports.

Navigate to the Devices screen and click on the switch you wish to configure. From there, click on the Ports icon and choose the ports you wish to edit. For me, this was ports 2 and 3.

Choose your IPTV VLAN from the Switch Port Profile dropdown selector and choose Apply. If you have already connected your STBs to those ports you’ll need to reboot them for the changes to take effect.

Addendum 2: VDSL applications

A huge thanks to u/JACK_DAGNIELS on the r/telus subreddit for asking this rather important question for those that do not have the ability to remove the Actiontec router from their deployment due to it being the hardware that has the DSL modem in it.

Unfortunately in this type of installation we’ll have to consider the Actiontec router. To use the USG as your LAN’s gateway (and to prevent a painful double-NAT situation), log into the Actiontec’s configuration and enable Bridge Mode. Then connect the LAN 1 port on the Actiontec to the WAN 1 port on the USG. That’s it!

If you have any questions or comments about getting this sort of project done, please don’t hesitate to leave a comment!

IT Sys Admin Windows 10

Acer Swift 3 – Fix the Brightness Settings

If you’re like me you’ve been thrilled with how great your little 14″ Ultrabook from Acer. You’ve kept it up to date and suddenly you’ve found the F3/F4 brightness controls aren’t working. You may have also found that you can’t change the brightness from the Notification Center off to the right of your Windows 10 task bar. For me the slider or indicator changes but the display itself isn’t reflecting the new setting.

There’s a fix. Follow the steps below to get that display listening again!

Windows Updates

Head on over to your Windows Settings panel, click on Update & Security. Run a check to make sure your machine is fully up to date. Reboot after your system finishes with any updates. Even if it doesn’t prompt you to restart it’s a good idea to do a power cycle just to make sure any changes are in place.

Check your brightness buttons. If you’re still facing problems, continue on!

Update Drivers

If Windows Update didn’t solve your problem, head on over to the Device Manager by right clicking on the Start Menu and choosing “Device Manager.”

Click on the + icon beside “Display adapters” and chose “Update driver” from the context menu. From there, choose “Search automatically for updated driver software.”

Windows will advise you that “The best device drivers are already installed.” It’s lying to you. Continue on by clicking “Search for updated drivers on Windows Update.”

You’ll find that Windows will start downloading updated drivers for the display adapter. About 5-10 minutes later and a couple of flickers of the screen Windows will prompt you that you’re done with the process.

Test your brightness buttons. They work! Hurrah. Problem solved.

If this guide helped you or if you have any questions, comments, or concerns, please leave them in the comments below. Thanks for reading!

3D Printing Creality Ender-3 Pro

Setting up OctoPrint with your Ender 3 Printer

I recently got back into the 3D printing game and realized what my bottle neck was previously. Having my main machine on and not being able to reboot, etc while I was printing. Then I discovered OctoPrint.

The idea of OctoPrint is to offload the printing to a web-based interface so you can rest easy and monitor the print from any device at any time. The platform is incredibly scale-able with hundreds of plugins available from wi-fi switch control, filament inventory management, to timelapse generation. My OctoPrint configuration is a little customized and I’ll go into that later.

For this tutorial I’m using OctoPrint the most recent version at the time of writing, version 0.16.0. This also is the case with balenaEtcher, version 1.5.33. I’m doing this on Windows 10 however balenaEtcher is available on MacOS and Linux as well. If you’re missing any of the items needed to get started I’ve linked my recommendations below.

What you’ll need:

Getting started

First thing you’ll want to do is head over to the OctoPrint website and download the most recent version of the OctoPi distribution. For this tutorial I’m using 0.16.0. You’re also going to need a copy of balenaEtcher. Plug in your USB SD card reader with the micro SD card attached to your computer.

OctoPrint is the software that runs on the Raspberry Pi however the operating system distribution is called OctoPi. Extract the OctoPi image from the zip file you downloaded and open balenaEtcher. Select the img file you extracted and ensure that the software has your micro SD card selected. Then press “Flash!”

balenaEtcher with the OctoPi image and microSD card selected, ready to flash.

This will take a few minutes. When it’s done flashing it will attempt to verify that the operation was successful. In my experience I’ve never had this verification process end successfully and does not impact the rest of the guide.

When balenaEtcher confirms that it’s done go ahead and unplug your SD card reader and plug it back in. Open up “This PC” and you’ll find a new drive called “boot.” In my case it’s been assigned drive letter F:. Go ahead and open that drive.

If you plan on connecting your Raspberry Pi via WiFi, follow this. If you plan on connecting it via Ethernet, skip this entirely, Find the text file called “octopi-wpa-supplicant.txt”. I recommend using Notepad++ for this however Windows Notepad will work just fine. Scroll down to line 26 and remove the # beside lines 27, 28, 29, and 30 as I’ve done below. Fill in your WiFi SSID and password here. You’ll also want to ensure that the correct country is selected farther down in the file starting at Line 49. For me, that was adding a # beside "country=GB" and removing the # beside "country=CA". Lastly, save and close the file.

octopi-wpa-supplicant.txt with the WPA/WPA2 (most common) settings uncommented.

Safely eject and remove the SD card reader from your PC. Slide the SD card into your Raspberry Pi and plug it into power with the kit’s supplied mains power adapter. You should see a red LED indicator light on steady indicating the Raspberry Pi has power and a green LED indicator light flashing from time to time indicating it is accessing the micro SD card. Give it about 45-60 seconds to boot up.

Generally you should be able to point your web browser to octopi.local. It will bring you to the OctoPrint setup wizard. If not, log into your router and find the IP address for your OctoPrint instance. Every router/modem is different so if you’re not familiar on how to do this I would recommend doing a quick Google search.

OctoPrint’s Setup Wizard Welcome screen

When you’re successful in connecting to OctoPrint you’ll be greeted by this Setup Wizard screen. It’s pretty straight forward and each screen explains what’s recommended.

It’s really required that you set up a username and password for OctoPrint. Even if you don’t plan on having the interface accessible outside your network it’s a good idea to have some sort of access control to a device that heats up and potentially could set fire to your home, right? Set up your username and password on the Access Control screen and choose “Keep Access Control Enabled” to continue.

OctoPrint’s developers ask that you enable Anonymous Usage Tracking – you have the option to disable it but for me it’s not really a big deal that OctoPrint phones home about bugs and such. There’s also more granular controls later on in the settings related to this.

The connectivity check helps to confirm your Raspberry Pi has internet connectivity. Turning this off will only slow down your Pi if you don’t have an internet connection. The default check interval is 15 minutes but I bumped it up to 60. They also use Google’s DNS servers – which do track all requests – so I went ahead and changed to OpenDNS’ first DNS server,

Next up is the plugin blacklist. Go ahead and enable it for safety’s sake. It’ll ask you to set up a slicing profile – I don’t recommend slicing directly on a Raspberry Pi and even still you’d need an older version of Cura to actually export a profile that this would support.

Finally, finish up by giving your printer a name, ensure the print bed and all other settings are correct.

That’s it! You’re done. Congratulations. Start by uploading your GCode and start printing. You can either click the upload button or drag the file over to the left hand side of the screen. The right hand “Upload to SD” is not active and not needed. It’s that easy!

Next I’d take a look through the OctoPrint Plugin Repository and see if you find anything that would make printing easier for you. For me, I use the following plugins:

There’s a lot there and not all of them are going to be applicable for your own particular use cases. It’s worth having a look through the Repository and seeing the possibilities OctoPrint can bring to your 3D printing experience.

I hope that this guide helped and if you have any questions, comments, or concerns don’t hesitate to leave a comment below. If this guide helped you please give it a share on your favourite social media platform. Good luck!



Hi there!

Welcome to my new blog. I’m a student of IT System Administration, Web Development, and have a great interest in Amateur Radio.

I plan on sharing my experiences on this blog and share tips, tricks, and musings. Stay tuned!