Initial commit of Simple Home Assistant Addon with web interface

This commit is contained in:
Manu
2025-06-01 12:04:22 +02:00
commit 3d987c3eb6
12 changed files with 660 additions and 0 deletions

111
main.py Normal file
View File

@ -0,0 +1,111 @@
import logging
import asyncio
import os
import json
from aiohttp import web
import aiohttp_cors
from homeassistant.const import EVENT_HOMEASSISTANT_START
from homeassistant.core import HomeAssistant
from homeassistant.helpers import discovery
from homeassistant.components.http import HomeAssistantView
_LOGGER = logging.getLogger(__name__)
# Define the web server port
WEB_PORT = 8099
async def async_setup(hass: HomeAssistant, config: dict):
"""Set up the simple addon component."""
# Log that the addon is starting
_LOGGER.info("Simple Addon is starting")
# Get the directory of this file
current_dir = os.path.dirname(os.path.realpath(__file__))
web_dir = os.path.join(current_dir, 'web')
# Create a simple service
async def handle_hello(call):
"""Handle the service call."""
message = call.data.get('message', 'No message provided')
_LOGGER.info(f"Hello service called with message: {message}")
# Store the message in the state
hass.states.async_set('simple_addon.last_message', message)
return {"success": True, "message": message}
# Register our service
hass.services.async_register(
'simple_addon',
'hello',
handle_hello
)
# Set up the web server
app = web.Application()
# Configure CORS
cors = aiohttp_cors.setup(app, defaults={
"*": aiohttp_cors.ResourceOptions(
allow_credentials=True,
expose_headers="*",
allow_headers="*",
)
})
# API endpoint for sending messages
class MessageView(HomeAssistantView):
url = "/api/message"
name = "api:message"
async def post(self, request):
data = await request.json()
message = data.get('message', '')
# Call the hello service
await hass.services.async_call(
'simple_addon', 'hello',
{"message": message}
)
return web.json_response({"success": True})
# API endpoint for getting status
class StatusView(HomeAssistantView):
url = "/api/status"
name = "api:status"
async def get(self, request):
return web.json_response({
"status": "online",
"last_message": hass.states.get('simple_addon.last_message').state
if hass.states.get('simple_addon.last_message') else None
})
# Register the API endpoints
hass.http.register_view(MessageView)
hass.http.register_view(StatusView)
# Serve static files
app.router.add_static('/addon/', web_dir)
# Start the web server
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, '0.0.0.0', WEB_PORT)
await site.start()
_LOGGER.info(f"Web interface started on port {WEB_PORT}")
# Set the webui URL in the addon configuration
hass.states.async_set('simple_addon.webui', f"http://localhost:{WEB_PORT}/addon/")
# Return boolean to indicate that initialization was successfully
return True
async def async_setup_entry(hass: HomeAssistant, entry):
"""Set up the addon from a config entry."""
hass.async_create_task(
hass.config_entries.async_forward_entry_setup(entry, "sensor")
)
return True