Skip to main content

Home Assistant events

Home Assistant has a generic event mechanism. Using HassModel you can respond to events as well as trigger events in Home Assistant.

Respond to Events

All events in Home Assistant are made available to your apps as an IObservable<Event> via the Events property of the IHaContext interface.

ha.Events.Where(e => e.EventType == "zha_event").Subscribe(e => { /*...*/ });

The event has a public JsonElement? DataElement property that contains the payload of the event.

To make it easy to listen to a specific type of event and handle the payload via a typed class you can use the Filter extension method. It will filter events on the event_type and deserialize the payload into a specified type ready for use:

ha.Events.Filter<ZhaEventData>("zha_event")
.Where(e => e.Data?.DeviceIeee == id && e.Data.Command == "shake")
.Subscribe(HandleCubeShaked);


record ZhaEventData
{
[JsonPropertyName("device_ieee")] public string? DeviceIeee { get; init; }
[JsonPropertyName("unique_id")] public string? UniqueId { get; init; }
[JsonPropertyName("endpoint_id")] public int? EndpointId { get; init; }
[JsonPropertyName("cluster_id")] public int? ClusterId { get; init; }
[JsonPropertyName("command")] public string? Command { get; init; }
[JsonPropertyName("args")] public JsonElement? Args { get; init; }
}

Triggering Events

Sending an event is also very easy. IHaContext has a SendEvent method with just two arguments, the event_type and the data to send

ha.SendEvent("custom_event", new { mode="Standby", duration = 200 });

The payload wil be JSON serialized using System.Text.Json it can be an anonymous type or any other type that serializes to the desired JSON payload.