{"id":264,"date":"2026-04-10T09:55:24","date_gmt":"2026-04-10T07:55:24","guid":{"rendered":"https:\/\/raspitips.com\/?p=264"},"modified":"2026-04-10T10:03:56","modified_gmt":"2026-04-10T08:03:56","slug":"build-a-smart-air-quality-monitor-with-ai-alerts","status":"publish","type":"post","link":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/","title":{"rendered":"Build a Smart Air Quality Monitor with AI Alerts"},"content":{"rendered":"<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">We spend most of our lives indoors \u2014 but how often do we actually think about the air we&#8217;re breathing? CO\u2082 buildup, VOCs from furniture, humidity swings, and invisible pollutants all quietly affect focus, sleep, and long-term health. With a Raspberry Pi, a few cheap sensors, and a touch of machine learning, you can build a <strong>Smart Air Quality Monitor<\/strong> that tracks your environment 24\/7 and pings your phone the moment something&#8217;s off.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Perfect for health-conscious makers, home office dwellers, and small businesses who want a healthier workspace.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">What You&#8217;ll Need<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Grab the following:<\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\n<li class=\"whitespace-normal break-words pl-2\"><strong>Raspberry Pi 4 (2GB or more)<\/strong> \u2014 4GB is comfortable overkill<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>MicroSD card (32GB+)<\/strong> with Raspberry Pi OS (64-bit)<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>BME280 sensor<\/strong> \u2014 temperature, humidity, pressure (I\u00b2C)<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>MQ-135 sensor<\/strong> \u2014 general air quality \/ VOCs \/ CO\u2082 proxy<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>SGP30 or CCS811 sensor<\/strong> <em>(optional)<\/em> \u2014 more accurate eCO\u2082 and TVOC readings<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>PMS5003 sensor<\/strong> <em>(optional)<\/em> \u2014 PM2.5 and PM10 particulate matter<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>MCP3008 ADC chip<\/strong> \u2014 needed to read the analog MQ-135<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Breadboard + jumper wires<\/strong><\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Official Raspberry Pi power supply<\/strong><\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Small case with ventilation holes<\/strong> (airflow matters!)<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Wi-Fi connection<\/strong><\/li>\n<\/ul>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 1: Prepare the Raspberry Pi<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Flash Raspberry Pi OS (64-bit), boot up, connect to Wi-Fi, and update:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-bash\"><span class=\"token token\">sudo<\/span> <span class=\"token token\">apt<\/span> update <span class=\"token token\">&amp;&amp;<\/span> <span class=\"token token\">sudo<\/span> <span class=\"token token\">apt<\/span> full-upgrade -y\r\n<span class=\"token token\">sudo<\/span> <span class=\"token token\">apt<\/span> <span class=\"token token\">install<\/span> python3-pip python3-smbus i2c-tools -y\r\npip3 <span class=\"token token\">install<\/span> adafruit-circuitpython-bme280 adafruit-circuitpython-mcp3xxx flask pandas scikit-learn requests<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Enable <strong>I\u00b2C<\/strong> and <strong>SPI<\/strong> via <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">sudo raspi-config<\/code> \u2192 Interface Options, then reboot.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Confirm your sensors are detected:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"bash code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">bash<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-bash\">i2cdetect -y <span class=\"token token\">1<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 2: Wire Up the Sensors<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>BME280 (I\u00b2C):<\/strong><\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\n<li class=\"whitespace-normal break-words pl-2\">VCC \u2192 3.3V<\/li>\n<li class=\"whitespace-normal break-words pl-2\">GND \u2192 GND<\/li>\n<li class=\"whitespace-normal break-words pl-2\">SDA \u2192 GPIO 2<\/li>\n<li class=\"whitespace-normal break-words pl-2\">SCL \u2192 GPIO 3<\/li>\n<\/ul>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>MQ-135 via MCP3008 (SPI):<\/strong><\/p>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\n<li class=\"whitespace-normal break-words pl-2\">MQ-135 AOUT \u2192 MCP3008 CH0<\/li>\n<li class=\"whitespace-normal break-words pl-2\">MCP3008 \u2192 3.3V, GND, CLK (GPIO 11), MISO (GPIO 9), MOSI (GPIO 10), CS (GPIO 8)<\/li>\n<\/ul>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><strong>PMS5003 (optional):<\/strong> connects via USB-to-serial or directly to the Pi&#8217;s UART pins.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Keep sensors away from direct heat sources like the Pi&#8217;s CPU \u2014 heat skews temperature and humidity readings badly.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 3: Write the Sensor Reading Script<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Create <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">monitor.py<\/code> to poll your sensors every minute and log data to a CSV + SQLite database:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"python code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">python<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-python\"><span class=\"token token\">import<\/span> time<span class=\"token token\">,<\/span> sqlite3<span class=\"token token\">,<\/span> board<span class=\"token token\">,<\/span> busio\r\n<span class=\"token token\">from<\/span> adafruit_bme280 <span class=\"token token\">import<\/span> basic <span class=\"token token\">as<\/span> bme280\r\n<span class=\"token token\">import<\/span> digitalio<span class=\"token token\">,<\/span> adafruit_mcp3xxx<span class=\"token token\">.<\/span>mcp3008 <span class=\"token token\">as<\/span> MCP\r\n<span class=\"token token\">from<\/span> adafruit_mcp3xxx<span class=\"token token\">.<\/span>analog_in <span class=\"token token\">import<\/span> AnalogIn\r\n\r\ni2c <span class=\"token token\">=<\/span> busio<span class=\"token token\">.<\/span>I2C<span class=\"token token\">(<\/span>board<span class=\"token token\">.<\/span>SCL<span class=\"token token\">,<\/span> board<span class=\"token token\">.<\/span>SDA<span class=\"token token\">)<\/span>\r\nbme <span class=\"token token\">=<\/span> bme280<span class=\"token token\">.<\/span>Adafruit_BME280_I2C<span class=\"token token\">(<\/span>i2c<span class=\"token token\">,<\/span> address<span class=\"token token\">=<\/span><span class=\"token token\">0x76<\/span><span class=\"token token\">)<\/span>\r\n\r\nspi <span class=\"token token\">=<\/span> busio<span class=\"token token\">.<\/span>SPI<span class=\"token token\">(<\/span>clock<span class=\"token token\">=<\/span>board<span class=\"token token\">.<\/span>SCK<span class=\"token token\">,<\/span> MISO<span class=\"token token\">=<\/span>board<span class=\"token token\">.<\/span>MISO<span class=\"token token\">,<\/span> MOSI<span class=\"token token\">=<\/span>board<span class=\"token token\">.<\/span>MOSI<span class=\"token token\">)<\/span>\r\ncs <span class=\"token token\">=<\/span> digitalio<span class=\"token token\">.<\/span>DigitalInOut<span class=\"token token\">(<\/span>board<span class=\"token token\">.<\/span>D8<span class=\"token token\">)<\/span>\r\nmcp <span class=\"token token\">=<\/span> MCP<span class=\"token token\">.<\/span>MCP3008<span class=\"token token\">(<\/span>spi<span class=\"token token\">,<\/span> cs<span class=\"token token\">)<\/span>\r\nmq135 <span class=\"token token\">=<\/span> AnalogIn<span class=\"token token\">(<\/span>mcp<span class=\"token token\">,<\/span> MCP<span class=\"token token\">.<\/span>P0<span class=\"token token\">)<\/span>\r\n\r\ndb <span class=\"token token\">=<\/span> sqlite3<span class=\"token token\">.<\/span>connect<span class=\"token token\">(<\/span><span class=\"token token\">\"air.db\"<\/span><span class=\"token token\">)<\/span>\r\ndb<span class=\"token token\">.<\/span>execute<span class=\"token token\">(<\/span><span class=\"token token triple-quoted-string\">\"\"\"CREATE TABLE IF NOT EXISTS readings\r\n<\/span><span class=\"token token triple-quoted-string\">              (ts TEXT, temp REAL, humidity REAL, pressure REAL, voc REAL)\"\"\"<\/span><span class=\"token token\">)<\/span>\r\n\r\n<span class=\"token token\">while<\/span> <span class=\"token token\">True<\/span><span class=\"token token\">:<\/span>\r\n    t <span class=\"token token\">=<\/span> bme<span class=\"token token\">.<\/span>temperature\r\n    h <span class=\"token token\">=<\/span> bme<span class=\"token token\">.<\/span>humidity\r\n    p <span class=\"token token\">=<\/span> bme<span class=\"token token\">.<\/span>pressure\r\n    v <span class=\"token token\">=<\/span> mq135<span class=\"token token\">.<\/span>value\r\n    db<span class=\"token token\">.<\/span>execute<span class=\"token token\">(<\/span><span class=\"token token\">\"INSERT INTO readings VALUES (?,?,?,?,?)\"<\/span><span class=\"token token\">,<\/span>\r\n               <span class=\"token token\">(<\/span>time<span class=\"token token\">.<\/span>strftime<span class=\"token token\">(<\/span><span class=\"token token\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"token token\">)<\/span><span class=\"token token\">,<\/span> t<span class=\"token token\">,<\/span> h<span class=\"token token\">,<\/span> p<span class=\"token token\">,<\/span> v<span class=\"token token\">)<\/span><span class=\"token token\">)<\/span>\r\n    db<span class=\"token token\">.<\/span>commit<span class=\"token token\">(<\/span><span class=\"token token\">)<\/span>\r\n    <span class=\"token token\">print<\/span><span class=\"token token\">(<\/span><span class=\"token token string-interpolation\">f\"<\/span><span class=\"token token string-interpolation interpolation\">{<\/span><span class=\"token token string-interpolation interpolation\">t<\/span><span class=\"token token string-interpolation interpolation\">:<\/span><span class=\"token token string-interpolation interpolation format-spec\">.1f<\/span><span class=\"token token string-interpolation interpolation\">}<\/span><span class=\"token token string-interpolation\">\u00b0C  <\/span><span class=\"token token string-interpolation interpolation\">{<\/span><span class=\"token token string-interpolation interpolation\">h<\/span><span class=\"token token string-interpolation interpolation\">:<\/span><span class=\"token token string-interpolation interpolation format-spec\">.0f<\/span><span class=\"token token string-interpolation interpolation\">}<\/span><span class=\"token token string-interpolation\">%  <\/span><span class=\"token token string-interpolation interpolation\">{<\/span><span class=\"token token string-interpolation interpolation\">p<\/span><span class=\"token token string-interpolation interpolation\">:<\/span><span class=\"token token string-interpolation interpolation format-spec\">.0f<\/span><span class=\"token token string-interpolation interpolation\">}<\/span><span class=\"token token string-interpolation\">hPa  VOC:<\/span><span class=\"token token string-interpolation interpolation\">{<\/span><span class=\"token token string-interpolation interpolation\">v<\/span><span class=\"token token string-interpolation interpolation\">}<\/span><span class=\"token token string-interpolation\">\"<\/span><span class=\"token token\">)<\/span>\r\n    time<span class=\"token token\">.<\/span>sleep<span class=\"token token\">(<\/span><span class=\"token token\">60<\/span><span class=\"token token\">)<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 4: Add AI-Powered Anomaly Detection<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Instead of dumb fixed thresholds, let a simple ML model learn <em>your<\/em> normal baseline and alert you when things drift.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Use <strong>Isolation Forest<\/strong> from scikit-learn \u2014 lightweight and perfect for spotting weird air quality patterns:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"python code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">python<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-python\"><span class=\"token token\">from<\/span> sklearn<span class=\"token token\">.<\/span>ensemble <span class=\"token token\">import<\/span> IsolationForest\r\n<span class=\"token token\">import<\/span> pandas <span class=\"token token\">as<\/span> pd\r\n\r\ndf <span class=\"token token\">=<\/span> pd<span class=\"token token\">.<\/span>read_sql<span class=\"token token\">(<\/span><span class=\"token token\">\"SELECT temp, humidity, voc FROM readings\"<\/span><span class=\"token token\">,<\/span> sqlite3<span class=\"token token\">.<\/span>connect<span class=\"token token\">(<\/span><span class=\"token token\">\"air.db\"<\/span><span class=\"token token\">)<\/span><span class=\"token token\">)<\/span>\r\nmodel <span class=\"token token\">=<\/span> IsolationForest<span class=\"token token\">(<\/span>contamination<span class=\"token token\">=<\/span><span class=\"token token\">0.05<\/span><span class=\"token token\">)<\/span><span class=\"token token\">.<\/span>fit<span class=\"token token\">(<\/span>df<span class=\"token token\">)<\/span>\r\n\r\n<span class=\"token token\">def<\/span> <span class=\"token token\">is_anomaly<\/span><span class=\"token token\">(<\/span>temp<span class=\"token token\">,<\/span> hum<span class=\"token token\">,<\/span> voc<span class=\"token token\">)<\/span><span class=\"token token\">:<\/span>\r\n    <span class=\"token token\">return<\/span> model<span class=\"token token\">.<\/span>predict<span class=\"token token\">(<\/span><span class=\"token token\">[<\/span><span class=\"token token\">[<\/span>temp<span class=\"token token\">,<\/span> hum<span class=\"token token\">,<\/span> voc<span class=\"token token\">]<\/span><span class=\"token token\">]<\/span><span class=\"token token\">)<\/span><span class=\"token token\">[<\/span><span class=\"token token\">0<\/span><span class=\"token token\">]<\/span> <span class=\"token token\">==<\/span> <span class=\"token token\">-<\/span><span class=\"token token\">1<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Retrain it weekly on your latest data so it adapts to seasons and daily rhythms.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 5: Send Smart Alerts to Your Phone<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Hook it up to <strong>Telegram<\/strong> for instant notifications:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"python code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">python<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-python\"><span class=\"token token\">import<\/span> requests\r\n<span class=\"token token\">def<\/span> <span class=\"token token\">alert<\/span><span class=\"token token\">(<\/span>msg<span class=\"token token\">)<\/span><span class=\"token token\">:<\/span>\r\n    requests<span class=\"token token\">.<\/span>post<span class=\"token token\">(<\/span><span class=\"token token\">\"https:\/\/api.telegram.org\/bot&lt;TOKEN&gt;\/sendMessage\"<\/span><span class=\"token token\">,<\/span>\r\n                  data<span class=\"token token\">=<\/span><span class=\"token token\">{<\/span><span class=\"token token\">\"chat_id\"<\/span><span class=\"token token\">:<\/span> <span class=\"token token\">\"&lt;CHAT_ID&gt;\"<\/span><span class=\"token token\">,<\/span> <span class=\"token token\">\"text\"<\/span><span class=\"token token\">:<\/span> <span class=\"token token string-interpolation\">f\"\u26a0\ufe0f Air Alert: <\/span><span class=\"token token string-interpolation interpolation\">{<\/span><span class=\"token token string-interpolation interpolation\">msg<\/span><span class=\"token token string-interpolation interpolation\">}<\/span><span class=\"token token string-interpolation\">\"<\/span><span class=\"token token\">}<\/span><span class=\"token token\">)<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Trigger an alert whenever <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">is_anomaly()<\/code> returns True, or when values cross health-based limits (e.g., humidity &lt;30% or &gt;60%, VOC spikes, CO\u2082 &gt; 1000 ppm).<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 6: Build a Live Dashboard<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">A quick Flask + Chart.js dashboard lets you visualize trends from any device:<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"python code\">\n<div class=\"sticky opacity-0 group-hover\/copy:opacity-100 group-focus-within\/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\n<div class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\n<div class=\"relative\">\n<div class=\"transition-all opacity-100 scale-100\"><\/div>\n<div class=\"absolute inset-0 flex items-center justify-center\">\n<div class=\"transition-all opacity-0 scale-50\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"text-text-500 font-small p-3.5 pb-0\">python<\/div>\n<div class=\"overflow-x-auto\">\n<pre class=\"code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5\"><code class=\"language-python\"><span class=\"token token\">from<\/span> flask <span class=\"token token\">import<\/span> Flask<span class=\"token token\">,<\/span> render_template_string\r\n<span class=\"token token\">import<\/span> sqlite3\r\n\r\napp <span class=\"token token\">=<\/span> Flask<span class=\"token token\">(<\/span>__name__<span class=\"token token\">)<\/span>\r\n\r\n<span class=\"token token decorator annotation\">@app<\/span><span class=\"token token decorator annotation\">.<\/span><span class=\"token token decorator annotation\">route<\/span><span class=\"token token\">(<\/span><span class=\"token token\">\"\/\"<\/span><span class=\"token token\">)<\/span>\r\n<span class=\"token token\">def<\/span> <span class=\"token token\">home<\/span><span class=\"token token\">(<\/span><span class=\"token token\">)<\/span><span class=\"token token\">:<\/span>\r\n    db <span class=\"token token\">=<\/span> sqlite3<span class=\"token token\">.<\/span>connect<span class=\"token token\">(<\/span><span class=\"token token\">\"air.db\"<\/span><span class=\"token token\">)<\/span>\r\n    rows <span class=\"token token\">=<\/span> db<span class=\"token token\">.<\/span>execute<span class=\"token token\">(<\/span><span class=\"token token\">\"SELECT ts, temp, humidity, voc FROM readings ORDER BY ts DESC LIMIT 100\"<\/span><span class=\"token token\">)<\/span><span class=\"token token\">.<\/span>fetchall<span class=\"token token\">(<\/span><span class=\"token token\">)<\/span>\r\n    <span class=\"token token\">return<\/span> render_template_string<span class=\"token token\">(<\/span><span class=\"token token triple-quoted-string\">\"\"\"\r\n<\/span>    &lt;h1&gt;\ud83c\udf3f Air Quality Monitor&lt;\/h1&gt;\r\n    &lt;table border=1 cellpadding=5&gt;\r\n    &lt;tr&gt;&lt;th&gt;Time&lt;\/th&gt;&lt;th&gt;Temp&lt;\/th&gt;&lt;th&gt;Humidity&lt;\/th&gt;&lt;th&gt;VOC&lt;\/th&gt;&lt;\/tr&gt;\r\n    {% for r in rows %}&lt;tr&gt;&lt;td&gt;{{r[0]}}&lt;\/td&gt;&lt;td&gt;{{r[1]}}&lt;\/td&gt;&lt;td&gt;{{r[2]}}&lt;\/td&gt;&lt;td&gt;{{r[3]}}&lt;\/td&gt;&lt;\/tr&gt;{% endfor %}\r\n    &lt;\/table&gt;\r\n<span class=\"token token triple-quoted-string\">    \"\"\"<\/span><span class=\"token token\">,<\/span> rows<span class=\"token token\">=<\/span>rows<span class=\"token token\">)<\/span>\r\n\r\napp<span class=\"token token\">.<\/span>run<span class=\"token token\">(<\/span>host<span class=\"token token\">=<\/span><span class=\"token token\">\"0.0.0.0\"<\/span><span class=\"token token\">,<\/span> port<span class=\"token token\">=<\/span><span class=\"token token\">5000<\/span><span class=\"token token\">)<\/span><\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Open <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">http:\/\/&lt;your-pi-ip&gt;:5000<\/code> on any device to see live readings. For fancier graphs, pipe data into <strong>Grafana<\/strong> + <strong>InfluxDB<\/strong> \u2014 a popular combo for IoT dashboards.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Step 7: Auto-Start on Boot<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Wrap both scripts in <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">systemd<\/code> services so the Pi starts monitoring automatically after power cuts. Set it, forget it, breathe easier.<\/p>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Tips for Accurate Readings<\/h2>\n<ul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\n<li class=\"whitespace-normal break-words pl-2\"><strong>Let the MQ-135 &#8220;burn in&#8221; for 24\u201348 hours<\/strong> before trusting its numbers<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Place the monitor at head height<\/strong>, away from windows and vents<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Avoid direct sunlight<\/strong> \u2014 it cooks sensors and skews temperature<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Ventilate the case<\/strong> \u2014 stagnant air = useless readings<\/li>\n<li class=\"whitespace-normal break-words pl-2\"><strong>Calibrate periodically<\/strong> by comparing against a known reference meter<\/li>\n<\/ul>\n<h2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Wrapping Up<\/h2>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">You&#8217;ve just built a private, intelligent air quality monitor that doesn&#8217;t just log numbers \u2014 it actually learns what your home normally feels like and warns you when something changes. Expand it with outdoor sensors, room-by-room units, or automate your air purifier to switch on when VOCs spike.<\/p>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Because the first step to breathing better\u2026 is knowing what you&#8217;re breathing. \ud83c\udf2c\ufe0f\ud83d\udc9a<\/p>\n<hr class=\"border-border-200 border-t-0.5 my-3 mx-1.5\" \/>\n<p class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\"><em>Loved this project? Follow <strong>@raspitips<\/strong> on Instagram for more Raspberry Pi builds, tips, and tutorials.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We spend most of our lives indoors \u2014 but how  [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":265,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_total_topic_count_hidden":0,"_bbp_total_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[36],"tags":[],"class_list":["post-264","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Build a Smart Air Quality Monitor\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"mitsoshsr\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_GB\" \/>\n\t\t<meta property=\"og:site_name\" content=\"RaspiTips - Turn Your Ideas Into Reality.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Build a Smart Air Quality Monitor\" \/>\n\t\t<meta property=\"og:description\" content=\"Build a Smart Air Quality Monitor\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-04-10T07:55:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-04-10T08:03:56+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Build a Smart Air Quality Monitor\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Build a Smart Air Quality Monitor\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#blogposting\",\"name\":\"Build a Smart Air Quality Monitor\",\"headline\":\"Build a Smart Air Quality Monitor with AI Alerts\",\"author\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/author\\\/mitsoshsr\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/raspitips.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Gemini_Generated_Image_msj93omsj93omsj9.png?fit=2048%2C2048&ssl=1\",\"width\":2048,\"height\":2048},\"datePublished\":\"2026-04-10T09:55:24+02:00\",\"dateModified\":\"2026-04-10T10:03:56+02:00\",\"inLanguage\":\"en-GB\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#webpage\"},\"articleSection\":\"Projects\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/raspitips.com\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/category\\\/projects\\\/#listItem\",\"name\":\"Projects\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/category\\\/projects\\\/#listItem\",\"position\":2,\"name\":\"Projects\",\"item\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/category\\\/projects\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#listItem\",\"name\":\"Build a Smart Air Quality Monitor with AI Alerts\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#listItem\",\"position\":3,\"name\":\"Build a Smart Air Quality Monitor with AI Alerts\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/category\\\/projects\\\/#listItem\",\"name\":\"Projects\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/#organization\",\"name\":\"Raspi Tipes\",\"description\":\"Turn Your Ideas Into Reality.\",\"url\":\"https:\\\/\\\/raspitips.com\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/author\\\/mitsoshsr\\\/#author\",\"url\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/author\\\/mitsoshsr\\\/\",\"name\":\"mitsoshsr\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/752973f69ab63ff1abc0b2fed0194223d942a401ab68b7c7f6ebc1ec7c1ded0b?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"mitsoshsr\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#webpage\",\"url\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/\",\"name\":\"Build a Smart Air Quality Monitor\",\"description\":\"Build a Smart Air Quality Monitor\",\"inLanguage\":\"en-GB\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/author\\\/mitsoshsr\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/author\\\/mitsoshsr\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/raspitips.com\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Gemini_Generated_Image_msj93omsj93omsj9.png?fit=2048%2C2048&ssl=1\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#mainImage\",\"width\":2048,\"height\":2048},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/index.php\\\/2026\\\/04\\\/10\\\/build-a-smart-air-quality-monitor-with-ai-alerts\\\/#mainImage\"},\"datePublished\":\"2026-04-10T09:55:24+02:00\",\"dateModified\":\"2026-04-10T10:03:56+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/raspitips.com\\\/#website\",\"url\":\"https:\\\/\\\/raspitips.com\\\/\",\"name\":\"Raspi Tips\",\"description\":\"Turn Your Ideas Into Reality.\",\"inLanguage\":\"en-GB\",\"publisher\":{\"@id\":\"https:\\\/\\\/raspitips.com\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Build a Smart Air Quality Monitor","description":"Build a Smart Air Quality Monitor","canonical_url":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#blogposting","name":"Build a Smart Air Quality Monitor","headline":"Build a Smart Air Quality Monitor with AI Alerts","author":{"@id":"https:\/\/raspitips.com\/index.php\/author\/mitsoshsr\/#author"},"publisher":{"@id":"https:\/\/raspitips.com\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/raspitips.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_msj93omsj93omsj9.png?fit=2048%2C2048&ssl=1","width":2048,"height":2048},"datePublished":"2026-04-10T09:55:24+02:00","dateModified":"2026-04-10T10:03:56+02:00","inLanguage":"en-GB","mainEntityOfPage":{"@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#webpage"},"isPartOf":{"@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#webpage"},"articleSection":"Projects"},{"@type":"BreadcrumbList","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/raspitips.com#listItem","position":1,"name":"Home","item":"https:\/\/raspitips.com","nextItem":{"@type":"ListItem","@id":"https:\/\/raspitips.com\/index.php\/category\/projects\/#listItem","name":"Projects"}},{"@type":"ListItem","@id":"https:\/\/raspitips.com\/index.php\/category\/projects\/#listItem","position":2,"name":"Projects","item":"https:\/\/raspitips.com\/index.php\/category\/projects\/","nextItem":{"@type":"ListItem","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#listItem","name":"Build a Smart Air Quality Monitor with AI Alerts"},"previousItem":{"@type":"ListItem","@id":"https:\/\/raspitips.com#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#listItem","position":3,"name":"Build a Smart Air Quality Monitor with AI Alerts","previousItem":{"@type":"ListItem","@id":"https:\/\/raspitips.com\/index.php\/category\/projects\/#listItem","name":"Projects"}}]},{"@type":"Organization","@id":"https:\/\/raspitips.com\/#organization","name":"Raspi Tipes","description":"Turn Your Ideas Into Reality.","url":"https:\/\/raspitips.com\/"},{"@type":"Person","@id":"https:\/\/raspitips.com\/index.php\/author\/mitsoshsr\/#author","url":"https:\/\/raspitips.com\/index.php\/author\/mitsoshsr\/","name":"mitsoshsr","image":{"@type":"ImageObject","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/752973f69ab63ff1abc0b2fed0194223d942a401ab68b7c7f6ebc1ec7c1ded0b?s=96&d=mm&r=g","width":96,"height":96,"caption":"mitsoshsr"}},{"@type":"WebPage","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#webpage","url":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/","name":"Build a Smart Air Quality Monitor","description":"Build a Smart Air Quality Monitor","inLanguage":"en-GB","isPartOf":{"@id":"https:\/\/raspitips.com\/#website"},"breadcrumb":{"@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#breadcrumblist"},"author":{"@id":"https:\/\/raspitips.com\/index.php\/author\/mitsoshsr\/#author"},"creator":{"@id":"https:\/\/raspitips.com\/index.php\/author\/mitsoshsr\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/raspitips.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_msj93omsj93omsj9.png?fit=2048%2C2048&ssl=1","@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#mainImage","width":2048,"height":2048},"primaryImageOfPage":{"@id":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/#mainImage"},"datePublished":"2026-04-10T09:55:24+02:00","dateModified":"2026-04-10T10:03:56+02:00"},{"@type":"WebSite","@id":"https:\/\/raspitips.com\/#website","url":"https:\/\/raspitips.com\/","name":"Raspi Tips","description":"Turn Your Ideas Into Reality.","inLanguage":"en-GB","publisher":{"@id":"https:\/\/raspitips.com\/#organization"}}]},"og:locale":"en_GB","og:site_name":"RaspiTips - Turn Your Ideas Into Reality.","og:type":"article","og:title":"Build a Smart Air Quality Monitor","og:description":"Build a Smart Air Quality Monitor","og:url":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/","article:published_time":"2026-04-10T07:55:24+00:00","article:modified_time":"2026-04-10T08:03:56+00:00","twitter:card":"summary_large_image","twitter:title":"Build a Smart Air Quality Monitor","twitter:description":"Build a Smart Air Quality Monitor"},"aioseo_meta_data":{"post_id":"264","title":"Build a Smart Air Quality Monitor","description":"Build a Smart Air Quality Monitor","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-04-10 07:55:24","updated":"2026-04-10 08:47:00","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/raspitips.com\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/raspitips.com\/index.php\/category\/projects\/\" title=\"Projects\">Projects<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tBuild a Smart Air Quality Monitor with AI Alerts\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/raspitips.com"},{"label":"Projects","link":"https:\/\/raspitips.com\/index.php\/category\/projects\/"},{"label":"Build a Smart Air Quality Monitor with AI Alerts","link":"https:\/\/raspitips.com\/index.php\/2026\/04\/10\/build-a-smart-air-quality-monitor-with-ai-alerts\/"}],"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/raspitips.com\/wp-content\/uploads\/2026\/04\/Gemini_Generated_Image_msj93omsj93omsj9.png?fit=2048%2C2048&ssl=1","_links":{"self":[{"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/posts\/264","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/comments?post=264"}],"version-history":[{"count":1,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/posts\/264\/revisions"}],"predecessor-version":[{"id":266,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/posts\/264\/revisions\/266"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/media\/265"}],"wp:attachment":[{"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/media?parent=264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/categories?post=264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/raspitips.com\/index.php\/wp-json\/wp\/v2\/tags?post=264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}