158 lines
3.5 KiB
Markdown
158 lines
3.5 KiB
Markdown
# Home Assistant Observer
|
|
|
|
Cron-friendly Home Assistant observer:
|
|
|
|
- every 30 minutes: collect compact Home Assistant snapshots into `./data`
|
|
- every day at 05:00: send the last day of snapshots to AI
|
|
- publish a funny local blog with daily article archive links
|
|
- save Markdown AI reports in `./reports`
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
cd /home/hbrain/ha
|
|
python3 -m venv .venv
|
|
. .venv/bin/activate
|
|
pip install -r requirements.txt
|
|
cp .env.example .env
|
|
chmod 600 .env
|
|
chmod +x run_ha_observer.sh ha_observer.py install_cron.sh
|
|
```
|
|
|
|
Edit `.env` and set:
|
|
|
|
```bash
|
|
HA_URL="http://homeassistant.local:8123"
|
|
HA_TOKEN="your_long_lived_home_assistant_token"
|
|
```
|
|
|
|
Create the token in Home Assistant:
|
|
|
|
```text
|
|
Profile → Security → Long-lived access tokens
|
|
```
|
|
|
|
## AI mode for the 05:00 report
|
|
|
|
Use your logged-in pi subscription:
|
|
|
|
```bash
|
|
pi
|
|
/login
|
|
```
|
|
|
|
Then set:
|
|
|
|
```bash
|
|
LLM_MODE="pi"
|
|
PI_BIN="/usr/local/bin/pi"
|
|
PI_MODEL=""
|
|
```
|
|
|
|
`PI_MODEL` is optional; leave it empty to use pi's current/default model.
|
|
|
|
Local Ollama is recommended for privacy:
|
|
|
|
```bash
|
|
LLM_MODE="ollama"
|
|
OLLAMA_MODEL="llama3.1"
|
|
```
|
|
|
|
OpenAI cloud API:
|
|
|
|
```bash
|
|
LLM_MODE="openai"
|
|
OPENAI_API_KEY="..."
|
|
OPENAI_MODEL="gpt-4o-mini"
|
|
```
|
|
|
|
No AI, but still publish a placeholder page:
|
|
|
|
```bash
|
|
LLM_MODE="none"
|
|
```
|
|
|
|
## Extra LLM instructions
|
|
|
|
Edit this file to change how the 05:00 AI analysis behaves:
|
|
|
|
```text
|
|
/home/hbrain/ha/llm_instructions.md
|
|
```
|
|
|
|
For example, add specific questions, preferred tone, things to ignore, or extra privacy/security concerns. The file is automatically appended to the AI prompt during `analyze`.
|
|
|
|
You can change the path in `.env`:
|
|
|
|
```bash
|
|
PROMPT_FILE="./llm_instructions.md"
|
|
```
|
|
|
|
## Test manually
|
|
|
|
Collect one snapshot:
|
|
|
|
```bash
|
|
./run_ha_observer.sh collect
|
|
```
|
|
|
|
Run the 05:00-style analysis/publishing step:
|
|
|
|
```bash
|
|
./run_ha_observer.sh analyze
|
|
```
|
|
|
|
Open the blog served by nginx:
|
|
|
|
```text
|
|
https://hapi.novosel.dk/
|
|
```
|
|
|
|
This instance publishes to the web root with:
|
|
|
|
```bash
|
|
WEB_DIR="/var/www/html"
|
|
SITE_BASE_PATH="/"
|
|
SITE_URL="https://hapi.novosel.dk"
|
|
```
|
|
|
|
For a subdirectory install, use for example:
|
|
|
|
```bash
|
|
WEB_DIR="/var/www/html/haobserver"
|
|
SITE_BASE_PATH="/haobserver"
|
|
SITE_URL="https://hapi.novosel.dk"
|
|
```
|
|
|
|
Daily articles are written under `articles/YYYY-MM-DD.html` inside `WEB_DIR`, and `index.html` links to the archive. A clean RSS feed is published at `rss.xml` using `SITE_URL` for absolute links, and a sci-fi favicon is published at `favicon.svg`. New articles include context from previous reports from the last `ARTICLE_CONTEXT_DAYS` days.
|
|
|
|
## Install cron jobs
|
|
|
|
This installs exactly these jobs:
|
|
|
|
- `*/30 * * * *` collect snapshots every 30 minutes
|
|
- `0 5 * * *` analyze with AI and publish the funny local webpage
|
|
|
|
```bash
|
|
./install_cron.sh
|
|
```
|
|
|
|
Manual crontab equivalent:
|
|
|
|
```cron
|
|
*/30 * * * * /home/hbrain/haobserver/run_ha_observer.sh collect >> /home/hbrain/haobserver/cron.log 2>&1
|
|
0 5 * * * /home/hbrain/haobserver/run_ha_observer.sh analyze >> /home/hbrain/haobserver/cron.log 2>&1
|
|
```
|
|
|
|
## Output locations
|
|
|
|
```text
|
|
/home/hbrain/haobserver/data/ 30-minute JSON snapshots
|
|
/home/hbrain/haobserver/reports/ daily Markdown AI reports
|
|
/var/www/html/ local funny blog, index.html, rss.xml, favicon.svg, and articles/*.html
|
|
/home/hbrain/haobserver/cron.log cron logs
|
|
```
|
|
|
|
## Privacy notes
|
|
|
|
Home Assistant data can reveal sleep schedule, occupancy, work patterns, visitors, location habits, and security weaknesses. Prefer `LLM_MODE=ollama` to keep analysis local. Use `EXCLUDED_ENTITIES` in `.env` to omit sensitive/noisy entities.
|