12 czerwca 2026
Jak zintegrować protokół KNX z nowoczesną aplikacją webową w TypeScript
Systemy Smart Home oparte na KNX są niezwykle stabilne i odporne na awarie, ale z natury nie są zaprojektowane do pracy z nowoczesnymi aplikacjami webowymi. Żeby wyświetlić stan rolet czy temperatury w aplikacji React, potrzebujemy mostu między światem magistrali KNX a światem HTTP/WebSocket.
Architektura integracji
W większości realizacji stosuję trzywarstwowy model:
- Magistrala KNX — urządzenia, aktuatory, czujniki.
- Bramka KNX/IP — punkt wejścia do sieci IP (np. przez
knxdlub komercyjny interfejs IP). - Serwis integracyjny (Node.js) — tłumaczy telegramy KNX na zdarzenia zrozumiałe dla aplikacji webowej.
Bramka KNX/IP komunikuje się protokołem KNXnet/IP, dlatego
warstwa integracyjna po stronie serwera jest wymagana niezależnie od
wybranego frameworka frontendowego.
Nasłuchiwanie zdarzeń KNX w Node.js
Do komunikacji z magistralą wykorzystuję biblioteki takie jak knx lub
własny klient oparty na knxd. Kluczowy jest moment odbioru telegramu i
jego bezpieczne przetworzenie:
import { Connection, DataPoint } from 'knx';
interface KnxEvent {
groupAddress: string;
value: number | boolean;
timestamp: Date;
}
function onKnxTelegram(raw: RawTelegram): KnxEvent {
const dpt = new DataPoint(raw.dpt);
return {
groupAddress: raw.destination,
value: dpt.decode(raw.payload),
timestamp: new Date(),
};
}
Otypowanie KnxEvent już na tym etapie eliminuje całą klasę błędów, które w
projektach IoT zwykle wychodzą dopiero na produkcji — np. pomylenie typu
danych punktu (DPT) przesyłanego po magistrali.
Publikacja zdarzeń do aplikacji webowej
Zdarzenia z magistrali trafiają do brokera MQTT, a stamtąd — przez WebSocket — do klienta:
import mqtt from 'mqtt';
const client = mqtt.connect('mqtt://broker.local:1883');
client.on('message', (topic, payload) => {
const event: KnxEvent = JSON.parse(payload.toString());
websocketServer.broadcast({ topic, event });
});
Po stronie frontendu (React + TypeScript) wystarczy prosty hook subskrybujący WebSocket i mapujący zdarzenia na stan interfejsu:
function useKnxDevice(groupAddress: string) {
const [value, setValue] = useState<number | boolean | null>(null);
useEffect(() => {
const unsubscribe = knxSocket.subscribe(groupAddress, setValue);
return unsubscribe;
}, [groupAddress]);
return value;
}
Na co zwrócić szczególną uwagę
- Idempotencja — telegramy KNX mogą się powtarzać (np. przy retransmisji), logika po stronie aplikacji powinna być odporna na duplikaty.
- Mapowanie DPT → typ TypeScript — warto trzymać jedną, wspólną definicję typów punktów danych, współdzieloną między backendem a frontendem.
- Bezpieczeństwo sieci — bramka KNX/IP nie powinna być bezpośrednio wystawiona do internetu; cała komunikacja z aplikacją webową powinna przechodzić przez kontrolowany serwis pośredniczący.
Połączenie solidnej instalacji KNX z dobrze zaprojektowaną warstwą integracyjną w TypeScript pozwala budować interfejsy Smart Home, które są zarówno responsywne, jak i tak niezawodne, jak sama magistrala.