Downloads · 30 days
61
23% of all-time downloads
Xx-Vexento-xX/openhome-nova
openhome-nova is a text generation model from Xx-Vexento-xX. Use it when you need the model to write or continue text. It is set up for peft. The card lists the license as mit.
LoRA fine-tune of Qwen/Qwen2.5-0.5B-Instruct for smart home event reasoning and action dispatch. Built for OpenHome — a fully local, open-source smart home security system running on a Raspberry Pi with no cloud depen…
Downloads · 30 days
61
23% of all-time downloads
All-time downloads
269
Public
Parameters
501M
2 GB on disk
Likes
0
Public
Click a slice to open those files.
.gguf531 MB · 51%
How the weights are stored.
U8358M · 71%
From the Hugging Face model README
LoRA fine-tune of Qwen/Qwen2.5-0.5B-Instruct for smart home event reasoning and action dispatch. Built for OpenHome — a fully local, open-source smart home security system running on a Raspberry Pi with no cloud dependency.
Given a sensor event (door opened, motion detected, smoke alarm, etc.) and the current state of all smart home devices, NOVA returns a structured JSON action list:
[
{"action": "notify", "message": "Smoke detected in kitchen — evacuate!", "severity": "critical"},
{"action": "all_lights", "mode": "alert"}
]
It handles:
Deployed in OpenHome via Ollama on a Raspberry Pi. The hub loads NOVA as the reasoning layer between raw sensor events and actuator commands.
Load it:
# After cloning the OpenHome repo and downloading this adapter to openhome-model/lora/
ollama create openhome-nova -f pi/Modelfile
Or load directly with PEFT:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
model = PeftModel.from_pretrained(base, "Xx-Vexento-xX/openhome-nova")
tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
| Base model | Qwen/Qwen2.5-0.5B-Instruct |
| Method | LoRA (PEFT) |
| LoRA rank | 8 |
| LoRA alpha | 16 |
| Target modules | q_proj, v_proj |
| Training examples | 1718 |
| Validation examples | 191 |
| Epochs | 2 |
| Learning rate | 2e-4 |
| Batch size | 1 (gradient accumulation 4) |
| Max sequence length | 1024 (truncation_side=left) |
| Hardware | CPU only — AMD Ryzen 7 5800X3D, 34 GB RAM |
| Training time | ~9 hours |
| Final eval loss | 0.044 |
Training was done entirely on CPU using transformers + peft + trl (no CUDA, no Unsloth). The truncation_side="left" setting was critical to preserve the assistant's response tokens when sequences exceeded max length.
Tested against 10 OpenHome scenarios immediately after training:
| Scenario | Result |
|---|---|
| Panic button pressed | PASS |
| Smoke alarm triggered | PASS |
| Lights off command | PASS |
| Goodnight routine | PASS |
| Thermostat adjustment | PASS |
| Flood sensor wet | PASS |
| No-op (no action needed) | PASS |
| Door open at night | PASS |
| Movie mode | PASS |
| I'm home routine | PASS |
10/10 valid JSON, 9/10 action-correct (90%). The one partial-pass was smoke/CO outputting "alert" instead of "notify" as the action type — handled in the OpenHome receiver with an alias rather than requiring retraining.
The dataset covers 18 categories. Key examples:
[] instead of inventing actions for benign eventsRegenerate or expand: python3 dataset/generate_training_data.py in the OpenHome repo.
NOVA outputs arrays of these action types:
{"action": "control_device", "device_id": "plug_kitchen", "state": "on|off|toggle"}
{"action": "set_thermostat", "device_id": "thermostat_main", "setpoint": 72, "mode": "heat|cool|auto|off"}
{"action": "set_light_mode", "device_id": "rgb_living", "mode": "alert|rainbow|pulse|fire|solid", "color": "#FF0000"}
{"action": "notify", "message": "...", "severity": "low|medium|high|critical"}
{"action": "all_lights", "mode": "alert|off|on"}
{"action": "log", "message": "..."}
Full system source, ESP32 firmware, Pi hub, dashboard, and training pipeline: github.com/DaEpickid540/OpenHome
MIT