Skip to main content
ESPHome exposes all platform components — sensors, switches, lights, climate units, covers, and more — as entities. Each entity has a stable numeric key, a name, an object ID, and a domain that identifies its type. The client maintains an EntityRegistry that caches entity metadata and the most recent state for each entity.

Listing entities

Call ListEntities() after connecting to fetch all entity definitions from the device. The registry is populated automatically as responses arrive.
entities, err := client.ListEntities()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("discovered %d entities\n", len(entities))
After ListEntities returns, the registry is available through client.Entities():
registry := client.Entities()

Accessing entities by type

The registry provides typed accessor methods that return slices of entity structs for each domain.
for _, s := range client.Entities().Sensors() {
    fmt.Printf("sensor: %s  unit=%s  class=%s\n",
        s.Name, s.UnitOfMeasurement, s.DeviceClass)
}

Looking up an entity by key

ByKey performs a unified lookup across all domains and returns the Entity interface, or nil if not found.
entity := client.Entities().ByKey(0x12345678)
if entity != nil {
    fmt.Printf("%s (%s)\n", entity.GetName(), entity.GetDomain())
}
You can also look up by name:
entity := client.Entities().ByName("temperature_sensor")

The Entity interface

Every entity type implements the Entity interface:
type Entity interface {
    GetKey()      uint32
    GetName()     string
    GetObjectID() string
    GetDomain()   EntityDomain
}
GetDomain() returns an EntityDomain constant whose String() method produces the ESPHome domain name (e.g. "sensor", "binary_sensor").

SensorEntity fields

SensorEntity exposes both metadata from ListEntities and cached state from the most recent SensorStateResponse:
FieldTypeDescription
Keyuint32Stable entity identifier
NamestringHuman-readable name
ObjectIDstringEntity object ID
UnitOfMeasurementstringe.g. "°C", "%", "hPa"
DeviceClassstringe.g. "temperature", "humidity"
StateClasspb.SensorStateClassMeasurement, total, or total increasing
AccuracyDecimalsint32Display precision
Statefloat32Latest received value
MissingStateboolTrue until the first state is received

Entity domains

The library defines 16 entity domains:
ConstantDomain stringRegistry accessorList response type
DomainSensorsensorSensors()*pb.ListEntitiesSensorResponse
DomainBinarySensorbinary_sensorBinarySensors()*pb.ListEntitiesBinarySensorResponse
DomainCovercoverCovers()*pb.ListEntitiesCoverResponse
DomainFanfanFans()*pb.ListEntitiesFanResponse
DomainLightlightLights()*pb.ListEntitiesLightResponse
DomainSwitchswitchSwitches()*pb.ListEntitiesSwitchResponse
DomainTextSensortext_sensorTextSensors()*pb.ListEntitiesTextSensorResponse
DomainCameracameraCameras()*pb.ListEntitiesCameraResponse
DomainClimateclimateClimates()*pb.ListEntitiesClimateResponse
DomainNumbernumberNumbers()*pb.ListEntitiesNumberResponse
DomainSelectselectSelects()*pb.ListEntitiesSelectResponse
DomainSirensirenSirens()*pb.ListEntitiesSirenResponse
DomainLocklockLocks()*pb.ListEntitiesLockResponse
DomainButtonbuttonButtons()*pb.ListEntitiesButtonResponse
DomainMediaPlayermedia_playerMediaPlayers()*pb.ListEntitiesMediaPlayerResponse
DomainWaterHeaterwater_heaterWaterHeaters()*pb.ListEntitiesWaterHeaterResponse

EntityRegistry methods

registry := client.Entities()

registry.ByKey(key uint32) Entity           // look up any entity by key
registry.ByName(name string) Entity         // look up any entity by name
registry.Len() int                          // total number of entities

registry.Sensors() []*SensorEntity
registry.BinarySensors() []*BinarySensorEntity
registry.Switches() []*SwitchEntity
registry.Lights() []*LightEntity
registry.Covers() []*CoverEntity
registry.Fans() []*FanEntity
registry.Climates() []*ClimateEntity
registry.Numbers() []*NumberEntity
registry.Selects() []*SelectEntity
registry.Sirens() []*SirenEntity
registry.Locks() []*LockEntity
registry.Buttons() []*ButtonEntity
registry.MediaPlayers() []*MediaPlayerEntity
registry.TextSensors() []*TextSensorEntity
registry.Cameras() []*CameraEntity
registry.WaterHeaters() []*WaterHeaterEntity