Introduction to KaZa
Introduction to KaZa
KaZa is an open-source home automation platform built entirely on Qt and QML. It provides a unified object model that bridges physical devices — KNX bus sensors and actuators, MQTT topics, HTTP-based appliances — into a single namespace accessible in real time from any platform: Linux, Windows, or Android.
Unlike many home automation systems that rely on web dashboards, KaZa produces native applications. The server runs as a headless systemd daemon on Linux (a Raspberry Pi is the typical target). The client is a native Qt application compiled for each target platform. The user interface is entirely written in QML, giving integrators the full power of a declarative UI toolkit with smooth animations, hardware-accelerated rendering, and full offline capability.
Architecture Overview
KaZa is built around a client/server model with a plugin-based extension system.
┌──────────────────────────────────────────────────────────────────┐
│ User Application │
│ (integrator QML code) │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ ┌─────────┐ │
│ │ KNX Plugin │ │ MQTT Plugin │ │ Helios │ │ Custom │ │
│ │ org.kazoe │ │ org.kazoe │ │ Plugin │ │ Plugin │ │
│ │ .knx 1.0 │ │ .mqtt 1.0 │ │ │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └─────┬─────┘ └────┬────┘ │
│ └────────────────┴───────────────-┴─────────────┘ │
│ │ KaZaObject │
└───────────────────────────────────┼──────────────────────────────┘
│
┌───────────────────────────────────┼──────────────────────────────┐
│ KaZa Server Core (kazad) │
│ │ │
│ ┌────────────┐ ┌─────────▼──────┐ ┌──────────┐ │
│ │ KaZaManager│◄───────│ QML Engine │ │ systemd │ │
│ │ (singleton)│ │ (user main.qml)│ │ notify │ │
│ └─────┬──────┘ └────────────────┘ └──────────┘ │
│ │ │
│ ┌─────┴──────────────────┬──────────────────┐ │
│ │ │ │ │
│ ┌─▼──────┐ ┌───────▼──┐ ┌────────▼────────┐ │
│ │SSL Port│ │ Control │ │ PostgreSQL │ │
│ │ 1756 │ │Port 43500│ │ (optional log) │ │
│ └───┬────┘ └──────────┘ └─────────────────┘ │
│ │ │
└─────┼──────────────────────────────────────────────────────────--┘
│ KaZa Protocol (binary, mutual TLS)
│
┌─────┼─────────────────────────────────────────────────────┐
│ │ Connected Clients │
│ ┌──▼──────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Linux Client│ │ Android │ │ Windows │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────--┘
Components
KaZa Server (kazad)
The server is the central piece of the system. It runs as a Linux daemon (systemd service) and is the only always-on process. It is designed to run on low-power hardware such as a Raspberry Pi, though any x86_64 or ARM Linux machine works.
The server has two responsibilities:
1. Running the user automation QML
The server embeds a QML engine that loads the integrator's main.qml file. This file is where all automation logic lives: plugin instantiation, object bindings, schedulers, database logging. The QML runs continuously for as long as the daemon is alive.
2. Serving clients
The server opens two TCP ports:
| Port | Protocol | Purpose |
|---|---|---|
| 1756 (configurable) | Binary, mutual TLS | Real-time client connections |
| 43500 (configurable) | Plain TCP, localhost only | Administration and certificate provisioning |
The SSL port carries the KaZa binary protocol and requires mutual TLS: both server and client must present a certificate signed by a shared Certificate Authority. On connection, the server sends the complete current state of all objects to the new client, then streams only value changes.
The control port (43500) is intended for localhost use only. It exposes text commands for querying and setting objects, and a special command that generates signed client certificates on demand (the provisioning flow for new devices).
Key C++ classes:
| Class | File | Role |
|---|---|---|
KaZaManager |
src/kazamanager.h |
Central singleton — owns the QML engine, object registry, and both ports |
KaZaObject |
src/kazaobject.h |
Base class for every automation object. Carries name, value (QVariant), and unit
|
KzObject |
src/kzobject.h |
QML reference type — binds to a named KaZaObject by string |
KaZaElement |
src/kazaelement.h |
Mandatory root element for user server QML |
KaZaConnection |
src/kazaconnection.h |
Handles one SSL client connection |
KaZaRemoteConnection |
src/kazaremoteconnection.h |
Handles control port commands |
KaZaCertificateGenerator |
src/kazacertificategenerator.h |
OpenSSL C API wrapper for on-demand client certificate generation |
Scheduler |
src/scheduler.h |
Cron-like QML element for time-based automation |
KaZa Client
The client is a native Qt application compiled for Linux, Windows, or Android. It connects to the server over the SSL port using mutual TLS and keeps a local mirror of all registered objects. When the server pushes a value change the client updates its mirror immediately; when the user acts on the UI the client sends a write frame to the server.
The client is a "shell": it provides the connection logic, the object mirror, and a manager singleton exposed to QML. The actual UI — every screen, widget, and navigation flow — comes from the user application's compiled .rcc resource bundle, which the server distributes over the SSL connection on first connect. This means deploying a UI update requires only replacing the .rcc file on the server; all clients download it automatically on their next connection.
Supported platforms: Linux x86_64, Windows x86_64, Android arm64.
KaZa Protocol
A compact binary protocol shared between server and client (the KaZa-Protocol submodule). All frames have a 5-byte header: 4 bytes payload length + 1 byte type.
| Frame Type | Direction | Purpose |
|---|---|---|
FRAME_SYSTEM (0) |
Both | Text commands: PING/PONG, POSITION, notifications |
FRAME_FILE (1) |
Server→Client | Distribute client UI bundle (.rcc) |
FRAME_OBJVALUE (2) |
Both | Object value update — most frequent frame |
FRAME_DBQUERY (3) |
Client→Server | Execute SQL query on the server database |
FRAME_DBRESULT (4) |
Server→Client | Return SQL result set |
FRAME_SOCKET_CONNECT (5) |
Client→Server | Open a proxied TCP connection through the server |
FRAME_SOCKET_DATA (6) |
Both | Data through a proxied TCP connection |
FRAME_SOCKET_STATE (7) |
Both | State of a proxied TCP connection |
FRAME_VERSION (255) |
Both | Protocol version negotiation — mandatory first frame |
A FRAME_OBJVALUE payload is minimal: 2 bytes for the object ID, the value serialized with Qt's QDataStream, and 1 boolean byte for the confirm flag. A typical boolean or integer update is under 10 bytes of payload. Values can be bool, int, double, QString, QDateTime, or any other type supported by QDataStream.
KaZa Control Panel
A Qt Widgets desktop application (Linux and Windows) for administration and debugging. It connects to the server's control port and displays the live value of every registered object in a table. Values can be inspected and manually overridden. The control panel also provides a GUI for generating SSL client certificates, which removes the need to use the command-line provisioning flow for day-to-day device onboarding.
Security Model
KaZa uses mutual TLS for all client connections. Both the server and every client present a certificate signed by a single private Certificate Authority that the integrator creates during initial setup.
- The CA key and certificate live on the server. The CA is never exposed to clients.
- The server generates signed client certificates on request through the control port's
clientconf?command (or through the Control Panel GUI). The client's private key is encrypted with a user-chosen password before being returned. - The control port (43500) transmits the admin password in plain text over TCP and should be firewalled to localhost or trusted network segments only.
Certificate files are stored in /var/lib/kazad/:
| File | Purpose | Permissions |
|---|---|---|
ca.cert.pem |
CA certificate — trust anchor for all clients | 644 |
ca.key |
CA private key — keep offline if possible | 600 |
server.cert.pem |
Server identity certificate | 644 |
server.key |
Server private key | 600 |
<user>.cert.pem |
Per-client certificate | 644 |
<user>.key |
Per-client private key (DES3-CBC encrypted) | 600 |
Plugin Ecosystem
Plugins are standard Qt QML extension modules. They are installed into the system Qt QML path (e.g. /usr/lib/qml/org/kazoe/<name>/) and imported in user QML with a normal import statement. Plugins are packaged as Debian .deb files and installed alongside the server package.
KNX (org.kazoe.knx)
Integrates a KNX installation via knxd. The integrator provides an ETS .knxproj export file; the plugin parses it and creates one KaZaObject per group address. Group address values flow bidirectionally: a KNX telegram updates the object and propagates to clients; a client write sends a KNX telegram to the bus.
import org.kazoe.knx 1.0 KnxBus { knxd: "ip:192.168.1.250" knxProj: "/etc/kaza/home.knxproj" }
After instantiation, all group addresses from the ETS project are accessible by name as KzObject bindings. The object names are taken from the ETS group address names.
Dependencies: knxd daemon running and reachable at the configured address.
MQTT (org.kazoe.mqtt)
Connects to a Mosquitto (or any compatible MQTT) broker. Each MqttTopic child maps a topic to a KaZaObject; incoming messages update the object's value; writing to the object publishes to the topic.
import org.kazoe.mqtt 1.0 MqttClient { hostname: "localhost" port: 1883 clientId: "kaza-server" MqttTopic { topic: "home/sensors/temperature" } MqttTopic { topic: "home/sensors/humidity" } }
Dependencies: A running MQTT broker (Mosquitto recommended).
Helios (org.kazoe.helios)
Integrates a Helios Easycontrol controlled ventilation unit (VMC/HRV) via its HTTP API. Exposes: - Fan speed (supply and extract) - Ventilation mode - Inside and outside temperature sensors - Filter status
Dependencies: Helios Easycontrol unit accessible on the local network.
Palazzetti (org.kazoe.palazzetti)
Integrates a Palazzetti pellet stove via its ConnBox HTTP/JSON interface. Exposes: - Stove on/off state - Target temperature - Fan speed - Pellet feed status - Alarm codes
Dependencies: Palazzetti ConnBox connected to the stove and accessible on the local network.
Server Installation
Requirements
- Debian 11+ / Ubuntu 22.04+ / Raspberry Pi OS 64-bit
- Qt 6.2+ runtime libraries
- OpenSSL 1.1+ or 3.0+
- systemd
- PostgreSQL 12+ (optional, for logging and graphs)
From the Debian Repository
# Add the KaZa repository echo "deb https://repo.kazoe.org/kaza stable main" | \ sudo tee /etc/apt/sources.list.d/kaza.list sudo apt update # Install server sudo apt install kaza-server-bin # Install plugins as needed sudo apt install kaza-knx kaza-mqtt kaza-helios kaza-palazzetti
Systemd Service
The package installs a systemd service (kazad.service). After configuring /etc/kazad.conf, enable and start:
sudo systemctl enable kazad sudo systemctl start kazad sudo journalctl -u kazad -f # tail logs
Configuration: /etc/kazad.conf
[ssl] port=1756 keypassword="server_key_password" hostname="home.example.com" # Hostname clients will connect to [control] port=43500 password="admin_password" enable=true [database] # Optional — remove section if not used driver="QPSQL" hostname="127.0.0.1" port=5432 dbName="kaza" username="kaza" password="db_password" [qml] server=/opt/kaza/main.qml # Integrator's server-side QML client=/opt/kaza/app.rcc # Integrator's compiled client bundle
Generating Certificates
# From the server — generates CA, server cert, and an initial client cert sudo /usr/share/kazad/make_certificate.sh \ "home.example.com" \ "client_key_password" \ "server_key_password"
Generated files are placed in /var/lib/kazad/. For additional client devices, use the control port or the KaZa Control Panel.
Packaging and Distribution
All KaZa components are distributed as Debian .deb packages targeting Debian 11+ and Ubuntu 22.04+. The build system uses CMake with CPack.
| Package | Contents |
|---|---|
kaza-server-bin |
Server daemon (kazad), kls tool, systemd unit |
kaza-server-dev |
Headers (kazaobject.h, kazamanager.h) and libKaZaLib.so for plugin development |
kaza-knx |
KNX plugin |
kaza-mqtt |
MQTT plugin |
kaza-helios |
Helios ventilation plugin |
kaza-palazzetti |
Palazzetti pellet stove plugin |
Target platforms:
| Role | Platform |
|---|---|
| Server | Linux x86_64, armhf (Raspberry Pi 2/3), arm64 (Raspberry Pi 3B+/4) |
| Client | Linux x86_64, Windows x86_64, Android arm64 |
| Control Panel | Linux x86_64, Windows x86_64 |
Real-World Example: KaZaExample
KaZaExample is a production home automation installation that demonstrates the full KaZa stack. It integrates:
- KNX — lights, shutters, presence detectors, power meters for 20+ individual circuits, hot water boiler temperature sensors, EDF tariff mode actuators
- Helios — controlled ventilation (VMC) with inside temperature monitoring and automation
- Victron Energy — solar inverter and battery system (state of charge, grid export/import, solar production)
- Tesla — electric vehicle charge state and smart charging control
- Palazzetti (via custom HTTP) — swimming pool controller (Ines: water temperature, filtration, pH, robot)
- HTTP REST — French electricity Tempo tariff API (next-day tariff color) for smart scheduling
- Internal objects — WiFi-based presence detection for household members
- PostgreSQL — time-series logging of power consumption per circuit, temperatures, water levels
The server-side QML spans 10 files:
| File | Contents |
|---|---|
main.qml |
Root element; imports sub-components; fetches Tempo tariff data every 15 min |
Knx.qml |
KNX bus configuration and per-circuit power logging to database |
Helios.qml |
Ventilation system object mapping and automation |
Victron.qml |
Solar/battery object mapping (via MQTT) |
Tesla.qml |
EV charge state and smart charging control |
Program.qml |
Schedules: morning routines, evening mode, detector resets |
DataLogger.qml |
Periodic temperature and water level inserts |
Piscine.qml |
Pool controller HTTP integration |
Wifi.qml |
Network presence detection for household members |
Ines.qml |
Additional pool automation |
The client-side QML provides a mobile-friendly UI (360×668 portrait layout) with:
- Home page — temperatures, battery level, rain water tank, EDF tariff indicator, mode buttons (TV mode, night mode)
- Floor plan views — ground floor and upper floor touch targets for lights and shutters, room by room
- Energy screens — power consumption by circuit, solar production history, grid exchange graphs
- Device screens — EV charging, ventilation, pool status
- History screens — min/average/max trends for any object, selectable time range
- Debug page — live list of all object values for troubleshooting
- Settings — SSL connection configuration, certificate management
The client widget library (Widget/) includes over 15 reusable components: light switches, dimmers, shutter controls, temperature sensors, power meters, battery indicators, tank level gauges, and presence dots.