Integrate Home Assistant API support with new service, enhance UI to display entity states, and update configuration for web UI.

This commit is contained in:
hvanranden
2026-01-22 20:25:42 +01:00
parent d82f0baacd
commit a38d3a1c1c
5 changed files with 134 additions and 6 deletions
+43 -2
View File
@@ -1,7 +1,48 @@
@page "/" @page "/"
@using Intentor.Services
@using Intentor.Models
@inject HomeAssistantService HomeAssistant
<PageTitle>Home</PageTitle> <PageTitle>Home</PageTitle>
<h1>Hello, world!</h1> <h1>Entity States</h1>
Welcome to your new app. @if (states == null)
{
<p>Loading...</p>
}
else if (!states.Any())
{
<p>No entities found.</p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Entity ID</th>
<th>State</th>
<th>Last Changed</th>
</tr>
</thead>
<tbody>
@foreach (var state in states)
{
<tr>
<td>@state.EntityId</td>
<td>@state.State</td>
<td>@state.LastChanged.ToString("g")</td>
</tr>
}
</tbody>
</table>
}
@code {
private List<EntityState>? states;
protected override async Task OnInitializedAsync()
{
states = await HomeAssistant.GetStatesAsync();
}
}
+18
View File
@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace Intentor.Models;
public class EntityState
{
[JsonPropertyName("entity_id")]
public string EntityId { get; set; } = string.Empty;
[JsonPropertyName("state")]
public string State { get; set; } = string.Empty;
[JsonPropertyName("last_changed")]
public DateTime LastChanged { get; set; }
[JsonPropertyName("attributes")]
public Dictionary<string, object> Attributes { get; set; } = new();
}
+12
View File
@@ -1,4 +1,5 @@
using Intentor.Components; using Intentor.Components;
using Intentor.Services;
namespace Intentor; namespace Intentor;
@@ -8,7 +9,18 @@ public class Program
{ {
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Get Home Assistant Supervisor token
var supervisorToken = Environment.GetEnvironmentVariable("SUPERVISOR_TOKEN")
?? throw new InvalidOperationException("SUPERVISOR_TOKEN environment variable is required");
// Add services to the container. // Add services to the container.
builder.Services.AddHttpClient<HomeAssistantService>(client =>
{
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {supervisorToken}");
});
builder.Services.AddSingleton(sp =>
new HomeAssistantService(sp.GetRequiredService<IHttpClientFactory>().CreateClient(nameof(HomeAssistantService)), supervisorToken));
builder.Services.AddRazorComponents() builder.Services.AddRazorComponents()
.AddInteractiveServerComponents(); .AddInteractiveServerComponents();
+58
View File
@@ -0,0 +1,58 @@
using Intentor.Models;
namespace Intentor.Services;
public class HomeAssistantService
{
private readonly HttpClient _httpClient;
private readonly string _supervisorToken;
private const string SupervisorApiBase = "http://supervisor";
public HomeAssistantService(HttpClient httpClient, string supervisorToken)
{
_httpClient = httpClient;
_supervisorToken = supervisorToken;
_httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {supervisorToken}");
}
public async Task<List<EntityState>> GetStatesAsync()
{
var states = await GetAsync<List<EntityState>>("core/api/states");
return states ?? new List<EntityState>();
}
public async Task<T?> GetAsync<T>(string endpoint)
{
var response = await _httpClient.GetAsync($"{SupervisorApiBase}/{endpoint}");
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<T>();
}
public async Task<HttpResponseMessage> PostAsync(string endpoint, object? content = null)
{
var response = await _httpClient.PostAsJsonAsync($"{SupervisorApiBase}/{endpoint}", content);
response.EnsureSuccessStatusCode();
return response;
}
public async Task<T?> PostAsync<T>(string endpoint, object? content = null)
{
var response = await _httpClient.PostAsJsonAsync($"{SupervisorApiBase}/{endpoint}", content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<T>();
}
public async Task<HttpResponseMessage> PutAsync(string endpoint, object content)
{
var response = await _httpClient.PutAsJsonAsync($"{SupervisorApiBase}/{endpoint}", content);
response.EnsureSuccessStatusCode();
return response;
}
public async Task<HttpResponseMessage> DeleteAsync(string endpoint)
{
var response = await _httpClient.DeleteAsync($"{SupervisorApiBase}/{endpoint}");
response.EnsureSuccessStatusCode();
return response;
}
}
+3 -4
View File
@@ -1,6 +1,6 @@
name: "Intentor" name: "Intentor"
description: "Intent based automation platform" description: "Intent based automation platform"
version: "0.0.4" version: 0.0.5
slug: "intentor" slug: "intentor"
init: false init: false
arch: arch:
@@ -9,6 +9,5 @@ arch:
startup: application startup: application
ports: ports:
8080/tcp: 8080 8080/tcp: 8080
ingress: true webui: "http://[HOST]:[PORT:8080]"
ingress_entry: / homeassistant_api: true
ingress_port: 8080