Pick a Side: Cloud or Your Couch
You’ve got a bag of ESP32 boards, a BME280 sensor you bought in a 10-pack for seven dollars, and a growing Home Assistant setup that’s slowly colonizing your entire server rack. Now you’re standing at the firmware crossroads: Particle’s Photon ecosystem on one side, ESPHome on the other.
Both will get your sensor reporting temperature. The difference is where that data goes, how much it costs you, and how much pain you’ll experience at 11 PM when the cloud goes down and your automation doesn’t fire.
Let’s break it down.
What You’re Actually Comparing
Before diving in, one clarification that saves you from a forum argument later.
Particle Photon 2 is hardware and platform. The Photon 2 board runs Particle’s Device OS on a RTL8721DM chip (ARM Cortex-M33 + Cortex-M23 dual core, Wi-Fi + BLE). It’s not an ESP32. You write firmware in a C++ dialect, flash via Particle’s cloud tools or Particle Workbench in VS Code, and devices communicate with Particle Cloud by default. There’s a freemium tier — generous for tinkering, but the ceiling matters if you scale.
ESPHome is firmware-generation software. You write YAML, ESPHome compiles it into native C++ firmware and flashes your ESP32/ESP8266. No custom hardware required — any of the roughly ten thousand ESP32 board variants work. It integrates natively with Home Assistant via the ESPHome integration and mDNS discovery. Everything runs locally. No account required. No subscription ceiling.
Same goal. Very different philosophy.
Developer Experience
Particle: C++ With Training Wheels (That Cost Money)
Particle’s dev experience is genuinely polished. Particle Workbench (VS Code extension) gives you IntelliSense, a real debugger via Particle’s USB debug interface, and a curated library ecosystem at build.particle.io. The Device OS abstracts a lot of the hardware nastiness.
Here’s what a minimal Particle firmware sketch looks like for a DHT22 temperature sensor:
#include "Particle.h"#include "Grove_Temperature_And_Humidity_Sensor.h"
DHT dht(D2, DHT22);
void setup() { dht.begin();}
void loop() { float temp = dht.getTempCelcius(); float humidity = dht.getHumidity();
if (!isnan(temp) && !isnan(humidity)) { Particle.publish("env/temp", String(temp), PRIVATE); Particle.publish("env/humidity", String(humidity), PRIVATE); }
delay(30000);}Clean, readable, works. Particle.publish() sends that data to Particle Cloud, where you can set up webhooks to forward it to HA or wherever.
The problem: on Particle’s free tier you get 100 device-to-cloud events per second across all devices (shared pool), and the API calls are rate-limited. Fine for one board. Less fine when you’ve got eight sensors pinging every 30 seconds and a Particle webhook chain that sometimes silently fails. The paid tiers (Growth plan starts around $29/month as of early 2026) unlock higher limits and SLAs, but you’re now paying a subscription to read your own garage temperature.
ESPHome: YAML Until You Don’t Need To Write Code Anymore
ESPHome’s DX is a different kind of smooth. You install it as a Home Assistant add-on or standalone container, point a browser at the dashboard, and write YAML. For the majority of common sensors and actuators, someone’s already written the component. You describe what you have; ESPHome figures out the firmware.
The mental model shift: you’re not writing firmware, you’re declaring a device. This is either liberating or maddening depending on your background.
When you need custom logic, ESPHome gives you lambda: blocks — inline C++ that slots into the YAML flow without breaking everything. It’s not the most elegant escape hatch, but it works for 90% of “I just need to do something slightly weird” cases.
OTA flashing is first-class. The ESPHome dashboard shows you every device, its connectivity status, and a one-click “Upload” button. Under the hood it’s pushing firmware over the network via the ESPHome native API. No USB cable required after the first flash.
A Real ESPHome Config: BME280 Temperature + Humidity
This is what a production-ready ESPHome config looks like for a BME280 sensor over I2C, reporting to Home Assistant:
esphome: name: garage-climate friendly_name: Garage Climate Sensor
esp32: board: esp32dev framework: type: arduino
logger:
api: encryption: key: "your-32-byte-base64-key-here"
ota: - platform: esphome password: "your-ota-password-here"
wifi: ssid: !secret wifi_ssid password: !secret wifi_password ap: ssid: "Garage Climate Fallback" password: "fallback-password"
captive_portal:
i2c: sda: GPIO21 scl: GPIO22 scan: true
sensor: - platform: bme280_i2c temperature: name: "Garage Temperature" oversampling: 16x pressure: name: "Garage Pressure" humidity: name: "Garage Humidity" address: 0x76 update_interval: 60sThat’s it. Flash once via USB, and from that point forward every change goes OTA. Home Assistant discovers it automatically — within about 30 seconds of boot you’ll see entities in HA without touching a webhook or integration config.
The !secret references pull from a secrets.yaml in your ESPHome config directory, keeping credentials out of your device YAML. Sensible defaults.
Cloud Lock-In: The Part That Should Worry You
This is where the gap between the two platforms gets uncomfortable.
Particle runs its platform infrastructure. Your devices phone home to device.spark.io (yes, they used to be Spark Industries). If Particle’s servers are unreachable — planned maintenance, outage, or the company pivoting/shutting down — your devices stop reporting. The Photon 2 can operate in “manual” or “semi-automatic” mode to reduce cloud dependency, and Particle does have a local cloud option for enterprise customers, but that’s not the default experience and it’s not cheap.
Particle has been around since 2012 and raised significant funding. They’re not a fly-by-night operation. But they’re a VC-backed startup, and “the infrastructure your home automation depends on is controlled by a company with investors” is a sentence worth sitting with.
ESPHome devices communicate directly with your Home Assistant instance over your local network. The ESPHome integration uses an encrypted native API — no cloud relay, no account, no internet required after initial setup. If your router goes down, devices still respond to local commands and automations that don’t need external data still run.
The comparison isn’t really “cloud vs local” as a philosophical debate. It’s “do you want your garage temperature sensor to stop working when a cloud provider has an incident?” For home automation, where you’re building automations that affect lights, thermostats, and security, the answer is usually no.
Hardware Ecosystem: Particle’s Garden vs the ESP32 Jungle
Particle’s ecosystem is curated. The Photon 2 is a well-documented board with a module form factor designed for product development. Particle sells official accessories, has Grove connector compatibility, and the hardware docs are excellent. If you’re building a product with a defined BOM, this matters.
The flip side: you’re buying into Particle’s hardware. The Photon 2 runs around $30-35 per unit. You can’t substitute a $4 ESP32-C3 Supermini when the budget gets tight.
ESPHome works with essentially the entire ESP32 and ESP8266 lineup. ESP32-S3 with PSRAM for camera projects? Supported. ESP32-C3 for cost-sensitive deployments? Supported. The $2 Seeed XIAO ESP32C3? Supported. Boards from a dozen manufacturers, hundreds of sensor chips, displays, LED controllers, IR blasters, BLE trackers — there are 400+ built-in components in ESPHome as of 2026.
This is also a liability. The ESP32 board market is a mess. “ESP32-DevKit” means different things from different vendors. Pin mappings drift. Boards labeled ESP32-S3 sometimes aren’t. You’ll spend time in datasheets and community threads figuring out which GPIO your board actually uses for SPI CS. Particle doesn’t have this problem because they control the hardware.
Home Assistant Integration
Particle + HA: You’re using webhooks. Particle Cloud receives events from your device, fires a webhook to your HA instance, and HA parses the payload. This works, but it’s fragile by nature — you’re adding an external cloud hop, a webhook payload schema you maintain, and a dependency on your HA instance being externally reachable (or you using Nabu Casa / a tunnel). Every moving part is a failure point.
There are community integrations that use the Particle Cloud API to pull data into HA on a poll interval, which removes the external reachability requirement, but you’re still going through Particle’s cloud.
ESPHome + HA: This is where ESPHome wins, full stop. Install the ESPHome integration in HA, flash a device with the API component configured, and HA discovers it on your local network. Entities appear. Automations work. The connection is encrypted, direct, and local. No webhook maintenance. No cloud dependency.
For anyone using Home Assistant as their automation hub — and if you’re self-hosting home automation in 2026, you probably are — ESPHome’s integration experience is dramatically better.
OTA Updates
Both platforms handle OTA, but differently.
Particle OTA: You can push firmware to individual devices or fleet-wide. This is genuinely impressive for product scenarios — imagine updating firmware on 500 deployed devices without touching them. For home use, it means you can push from Particle’s console or CLI and devices update themselves. The tradeoff: updates go through Particle’s cloud, so you’re dependent on their infrastructure and your device’s internet connectivity.
ESPHome OTA: Handled directly on your local network. Open the ESPHome dashboard, click Upload, firmware goes device → router → device. No internet required. Devices can also be configured to pull updates automatically, though most users push manually. The fallback AP mode (see the captive_portal: in the config above) means you can recover a misconfigured device without a USB cable — it broadcasts its own hotspot if it can’t connect to your network.
For self-hosters, local OTA is an obvious win. You’re not dependent on anyone’s uptime.
Community and Templates
Particle community is active and technical. Forums at community.particle.io cover product development use cases well. If you’re building something product-shaped — PCB integration, fleet management, cellular fallback with the Boron — you’ll find help there. For pure home automation use cases, coverage is thinner.
ESPHome community is enormous and home automation-focused. The ESPHome components registry covers hundreds of chips and sensors. The community template ecosystem on GitHub and the HA community forums means you can find working YAML for almost any sensor within 10 minutes of Googling. Someone has already solved your BME280 wiring question, your IR remote frequency capture, your BLE tracker configuration.
This matters at 2 AM when your automation breaks and you need an answer fast.
Particle’s Actual Strengths
To be fair: Particle isn’t the wrong choice in every scenario.
If you’re building an IoT product — something that goes to customers, needs a fleet management dashboard, requires cellular fallback, needs professional support SLAs — Particle’s platform is genuinely well-suited. Their Boron (cellular) and Argon (Wi-Fi) modules combined with their cloud make commercial IoT development approachable in ways that cobbling together ESPHome + cellular would not.
For prototyping a quick IoT concept that needs to work without a local server, the Photon 2 and Particle’s free tier are solid. Spin up a device, have it posting to the cloud in an hour, set up a webhook to Slack or IFTTT, done. No Home Assistant required. No local infrastructure to maintain.
The use case that makes sense: you need internet connectivity in a location without stable networking, you’re building something for a non-technical user who doesn’t self-host, or you’re building a product with a defined cloud budget.
When To Use Which
Pick Particle if:
- You’re building a product with external customers and need fleet management
- You need cellular fallback (Particle Boron covers this well)
- You’re prototyping something quick that needs cloud connectivity and you don’t want to maintain local infrastructure
- Your org already pays for Particle’s Growth tier
Pick ESPHome if:
- You’re running Home Assistant (honestly just pick ESPHome)
- Local-first operation matters more than cloud convenience
- You want to buy $4 boards instead of $35 boards
- You have more than two or three sensors (Particle’s event limits add up)
- You value not depending on a company’s infrastructure for your home automation
- You want a 500-line YAML config that an LLM can help you debug in five minutes
For most self-hosters: ESPHome. It’s not even close. The local integration, the hardware flexibility, the community support for home automation use cases, and the absence of a subscription ceiling all point the same direction.
The Bottom Line
Particle Photon 2 is a well-engineered platform that’s genuinely good at what it’s designed for — commercial and semi-commercial IoT development where cloud management and fleet scale matter. It’s not the right tool for “I want my shower temperature sensor to update a card in Home Assistant without routing through a server in California.”
ESPHome is not trying to be a commercial IoT platform. It’s trying to make self-hosted home automation with cheap hardware as painless as possible, and it succeeds. YAML config, local OTA, native HA integration, and a community that’s solved basically every sensor combination you’ll ever want — that’s a hard combination to argue against.
Grab your ESP32-S3 devkit, wire up the BME280, paste the config above, and you’ll have a working climate sensor in HA before your coffee gets cold. The Photon 2 is cool hardware. Just use it for a different problem.