Is GY-GPS6MV2 Neo-6M GPS Receiver Compatible with Home Assistant (ESPHome)?
Electrical Specifications
Always confirm pin assignments against the manufacturer datasheet before wiring.
Compatibility Overview
Satellite geolocation receiver module for vehicle tracking asset positioning and accurate UTC clock synchronization.
Wiring GY-GPS6MV2 Neo-6M GPS Receiver to ESP32
| Module pin | ESP32 | Note |
|---|---|---|
| VCC | 5V | The GY-GPS6MV2 carries its own 3.3V regulator for the receiver, so 5V is fine. 3V3 works too: the NEO-6M itself runs from 2.7V. |
| GND | GND | |
| TX | GPIO16 | NMEA out of the receiver into the uart rx_pin. The only data line the gps component needs. |
| RX | GPIO17 | From tx_pin. Optional: it carries commands to the receiver, and ESPHome sends none unless you add them. |
| Antenna | U.FL connector | The square ceramic patch, ceramic face towards the sky and nothing metal above it. |
Host pins are the ones the configuration on this page uses. Move a pin here and change it in the YAML — they are documented together so they cannot disagree.
Technical Specification Matrix
| Feature / Attribute | Specification / Status |
|---|---|
| Hardware Protocol | UART Serial / 3.3V |
| Bridge Required | NO |
| Border Router Needed | None |
| Hardware Capabilities & Peripherals | Latitude Longitude Altitude (m) Satellites Note: these entities come from the ESPHome configuration you flash — each one needs its matching component in that YAML before it appears. |
| Pairing Complexity | Intermediate |
| Factory Reset Instruction | Hold BOOT button for 3s. |
Wire, Flash, Adopt, Check
Wire it up
Follow the wiring table above. The ESP32 pins there are the ones the configuration uses, so if you move one, change it in both places.
Flash the configuration
Create a new device in the ESPHome dashboard (the Home Assistant add-on) and paste the configuration below into it, or save it as emb_esp32_neo6m_ha.yaml and run esphome run emb_esp32_neo6m_ha.yaml. The first flash goes over USB. If it is not detected, hold BOOT button for 3s to put it in download mode. Every update after that is over the air.
Adopt it in Home Assistant
Settings → Devices & Services. A node on the same network shows up as a discovered ESPHome device within a minute of joining Wi-Fi; choose Configure and enter the API encryption key from your secrets.yaml. If discovery does not find it, add the ESPHome integration by hand with the node's IP address.
Check it works
Outdoors, within a minute or two the board's LED starts blinking and Latitude and Longitude change from unknown to a position that matches a map, with Satellites above zero. Unknown values with the LED blinking mean the receiver has a fix but the ESP32 is not hearing it — TX on the wrong pin, or the baud rate. Unknown with no blinking is still searching: more sky, or more time.
ESPHome Configuration
Starting configuration for GY-GPS6MV2 Neo-6M GPS Receiver on ESP32. Untested on hardware — verify wiring and pins against your own board.
# ESPHome configuration for GY-GPS6MV2 Neo-6M GPS Receiver
# Host: ESP32. Pin numbers below are host-side defaults — any free
# GPIO will do, and you should change them to match your own wiring.
esphome:
name: emb_esp32_neo6m_ha
friendly_name: "GY-GPS6MV2 Neo-6M GPS Receiver"
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
uart:
rx_pin: GPIO16
tx_pin: GPIO17
baud_rate: 9600
# There is no sensor.gps platform — the gps component nests its own
# sensors, and "sensor: - platform: gps" fails with "Platform not found".
gps:
latitude:
name: "Latitude"
longitude:
name: "Longitude"
altitude:
name: "Altitude"
satellites:
name: "Satellites"
Before you flash:
the !secret values come from your
secrets.yaml, and the GPIO numbers are host-side
defaults rather than properties of this part — change them to match how you actually wired it.
What Appears in Home Assistant
Degrees, to six decimal places. Two plain sensors, not a device_tracker — ESPHome has no such entity type — so the node does not put itself on the Home Assistant map.
Metres, from the same fix. GPS altitude wanders more than the horizontal position does.
The number of satellites in use, from the GGA sentence. It reports without a fix, so 0 next to an unknown Latitude means no lock yet.
Not in the config: speed:, course: and hdop: go under the same gps: block. A time: entry with platform: gps sets the node's clock from the satellites, with no network needed.
Known Problems and Fixes
It needs to see the sky
The 27-second cold start in u-blox's datasheet assumes strong signals from every satellite. Indoors, away from a window, the receiver can take many minutes or never get a fix. For the first test put the antenna outside, or on a window sill with open sky above it.
The LED says whether it has a fix
The board's LED does not blink while the receiver is searching and blinks once a second once it has a position. No blinking, no position — however long the node has been running.
Restarts are fast only with the backup cell
The small rechargeable cell on the board keeps the receiver's clock and satellite data while the power is off, which is what lets a restart get a fix in about a second instead of starting cold. It holds that data for a limited time — weeks, not months — so a board that has sat unplugged starts cold.
GPIO16 and GPIO17 are not free on every ESP32
They are the UART pins in the config, and on boards built around an ESP32-WROVER module Espressif reserves both for internal use. On a WROVER board move rx_pin and tx_pin to other free GPIOs; the ESP32 can route a UART to most pins.
9600 baud, unless someone changed it
The NEO-6M ships sending NMEA at 9600 baud, once a second, which is what the uart: block expects. u-blox's u-center software can change that, and the EEPROM on this board keeps the change through a power cycle. If the rate was changed, nothing decodes until the config matches.
Metres of wander, standing still
Horizontal accuracy is 2.5m CEP: half of all fixes land within 2.5m of the true point and half further out. A receiver on a shelf draws a small cloud on a map. Good enough for which town the van is in; not for whether the car is on the drive or in the street.
It publishes every 20 seconds
The receiver produces a fix every second, but the gps component publishes on its own update_interval, which defaults to 20s. Shorten it for something moving; for a clock source it can be far longer.
Report a Pinout Error or Submit Tested Code Snippets
Found a pin mapping quirk or built a custom ESPHome YAML driver for GY-GPS6MV2 Neo-6M GPS Receiver? Submit a pull request or report corrections to our index.
Hardware Correction Reporter (emb-esp32-neo6m-ha)
Frequently Asked Questions
Does GY-GPS6MV2 Neo-6M GPS Receiver work without an internet connection?
How is GY-GPS6MV2 Neo-6M GPS Receiver powered and wired to the host board?
How does the host board reach Home Assistant (ESPHome)?
Alternatives
DS3231 High Precision Real-Time Clock
If the GPS was for the time rather than the position, a DS3231 real-time clock keeps accurate time indoors with no view of the sky.
Home Assistant Companion app ↗
A phone already reports its location to Home Assistant as a device_tracker, with no hardware to fit.
ESPHome SNTP time ↗
Network time for a node that has Wi-Fi anyway: no module and no antenna.