| .env.example | ||
| .gitignore | ||
| ha_observer.py | ||
| install_cron.sh | ||
| llm_instructions.md.sample | ||
| README.md | ||
| requirements.txt | ||
| run_ha_observer.sh | ||
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
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:
HA_URL="http://homeassistant.local:8123"
HA_TOKEN="your_long_lived_home_assistant_token"
Create the token in Home Assistant:
Profile → Security → Long-lived access tokens
AI mode for the 05:00 report
Use your logged-in pi subscription:
pi
/login
Then set:
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:
LLM_MODE="ollama"
OLLAMA_MODEL="llama3.1"
OpenAI cloud API:
LLM_MODE="openai"
OPENAI_API_KEY="..."
OPENAI_MODEL="gpt-4o-mini"
No AI, but still publish a placeholder page:
LLM_MODE="none"
Calendar events
If Home Assistant has calendar.* entities, the collector fetches upcoming events through the Home Assistant calendar API and includes them in the analysis.
Relevant settings:
CALENDAR_LOOKAHEAD_DAYS="7"
MAX_CALENDAR_EVENTS_PER_CALENDAR="8"
Extra LLM instructions
Edit a local, gitignored instructions file to change how the 05:00 AI analysis behaves:
cp llm_instructions.md.sample llm_instructions.md
Then customize:
./llm_instructions.md
For example, add specific questions, preferred tone, things to ignore, property/entity naming notes, or extra privacy/security concerns. The file is automatically appended to the AI prompt during analyze.
The tracked llm_instructions.md.sample is only a generic template. Keep private names/locations in the gitignored llm_instructions.md.
You can change the path in .env:
PROMPT_FILE="./llm_instructions.md"
Test manually
Collect one snapshot:
./run_ha_observer.sh collect
Run the 05:00-style analysis/publishing step:
./run_ha_observer.sh analyze
Open the blog served by nginx:
https://hapi.novosel.dk/
This instance publishes to the web root with:
WEB_DIR="/var/www/html"
SITE_BASE_PATH="/"
SITE_URL="https://hapi.novosel.dk"
For a subdirectory install, use for example:
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 minutes0 5 * * *analyze with AI and publish the funny local webpage
./install_cron.sh
Manual crontab equivalent:
*/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
/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.