.NET 8 client for Home Assistant (WebSocket + REST + SSE + MJPEG) with registries, statistics, energy, typed models.
$ dotnet add package Harmony.HomeAssistant
Nowoczesna / modern .NET 8 library for Home Assistant (WebSocket + REST + Streaming).
/api/stream event stream alternativeIAsyncEnumerable<byte[]>)Install-Package Harmony.HomeAssistant
var parameters = new ConnectionParameters
{
WebSocketEndpoint = new Uri("ws://homeassistant.local:8123/api/websocket"),
AccessToken = "LONG_LIVED_TOKEN"
};
var services = new ServiceCollection()
.AddLogging(b => b.AddConsole())
.AddHomeAssistant(parameters)
.BuildServiceProvider();
var client = services.GetRequiredService<IHomeAssistantClient>();
await client.ConnectAsync();
await client.CallServiceAsync("light", "turn_on", new JsonObject { ["entity_id"] = "light.kitchen" });
await foreach (var frame in rest.GetCameraStreamAsync("camera.front")) { /* handle frame */ }
var stream = services.GetRequiredService<IHomeAssistantEventStream>();
await foreach (var evt in stream.ReadEventsAsync()) Console.WriteLine(evt.Type);
var zones = (await rest.ListZonesAsync()).ToZones();
Additional focused docs:
docs/configuration.mddocs/resilience.mddocs/observability.mddocs/testing.mdEnable retry + metrics:
services.AddHomeAssistantClient(p =>
{
p.WebSocketEndpoint = new Uri("ws://homeassistant.local:8123/api/websocket");
p.AccessToken = token;
}, opts =>
{
opts.EnableResilience = true; // domyślnie true
opts.HttpRetryCount = 5; // exponential backoff (2^n * base)
opts.HttpRetryBaseDelay = TimeSpan.FromMilliseconds(150);
opts.EnableMetrics = true; // domyślnie true
});
Metrics (System.Diagnostics.Metrics):
OpenTelemetry integration example:
services.AddOpenTelemetry()
.WithMetrics(b => b
.AddMeter("Harmony.HomeAssistant")
.AddPrometheusExporter());
Default enabled unless you set EnableTracing = false.
Spans:
Register source in OTEL:
services.AddOpenTelemetry()
.WithTracing(b => b
.AddSource("Harmony.HomeAssistant")
.AddConsoleExporter());
HomeAssistantClientOptions)| Option | Default | Description |
|---|---|---|
| EnableResilience | true | Enables retry (+ circuit breaker if enabled). |
| HttpRetryCount | 3 | Retry attempts (exponential backoff). |
| HttpRetryBaseDelay | 200ms | Base delay for first retry. |
| EnableCircuitBreaker | true | Adds circuit breaker. |
| CircuitBreakerFailures | 5 | Failures to open circuit. |
| CircuitBreakerDuration | 30s | Open duration. |
| EnableMetrics | true | Emits Meter instruments. |
| EnableTracing | true | Emits ActivitySource spans. |
| SharedMeter | null | Inject external Meter. |
| SharedActivitySource | null | Use external ActivitySource. |
You can override only what you need via the configureOptions delegate.
See CHANGELOG for detailed version history.
See CONTRIBUTING.md:
dotnet test must passvX.Y.Z triggers publish workflow (requires NUGET_API_KEY secret)MIT (see LICENSE)