MQTT-integratie
MQTT verbindt HyperVisu met de publish/subscribe-wereld: Zigbee2MQTT, Tasmota, Shelly (MQTT-modus), ESPHome, energie-gateways en alle aangepaste firmware die communiceert met een MQTT-broker. HyperVisu is een MQTT-client — het abonneert op de topics waarop apparaten hun status publiceren en publiceert commando's op de topics waarnaar apparaten luisteren. Er is geen polling: een apparaat waarvan de status verandert, publiceert direct, en de widget wordt meteen bijgewerkt.
Een broker bevindt zich in het midden. Dit kan een broker zijn die u al gebruikt (Mosquitto, EMQX, de broker die wordt meegeleverd met een Zigbee2MQTT-installatie, …) of de in HyperVisu ingebouwde broker, die de server zelf kan uitvoeren zodat apparaten er rechtstreeks verbinding mee maken (zie "De ingebouwde MQTT-broker"). Alles in dit artikel is op beide manieren van toepassing — de ingebouwde broker is een gewone broker, bereikbaar via een reguliere verbinding.
Wat u nodig heeft: het brokeradres en de poort, de inloggegevens indien vereist, en de topics en het payload-formaat van het apparaat — uit de documentatie van het apparaat, of direct uitgelezen van de broker met de topic-browser (hieronder).
Verbindingen. Schakel eerst MQTT Protocol in op de pagina Diensten (zie "Diensten & protocollen"); dit staat standaard uit op een nieuwe server. MQTT ondersteunt meerdere verbindingen: één verbinding per broker (zie "Verbindingen"). Selecteer bij Verbinding toevoegen de kaart MQTT: het dialoogvenster vraagt om een Instantienaam, het Brokeradres, de Poort, de Client-ID en de inloggegevens, en bevat een knop Testen. CA-certificaat en de Broker-opties (Keepalive, Standaard QoS, Beschikbaarheidstopic, Clean session) staan niet in het dialoogvenster: stel deze in op de opgeslagen verbinding, die direct in de editor opent zodra u op Verbinding aanmaken klikt. De verbindingseditor bevat:
| Veld | Omschrijving |
|---|---|
| Brokeradres | Host, of een volledige URL: mqtt://, mqtts://, ws://, wss:// (een gewone host betekent mqtt://). Een pad in het adres blijft behouden, bijvoorbeeld ws://192.168.1.30/mqtt. |
| Poort | De poort van de listener — meestal 1883 voor gewone MQTT en 8883 voor MQTT via TLS. Voer deze altijd in: in het dialoogvenster Verbinding toevoegen wordt een lege poort opgeslagen als 1883, ongeacht het schema, en het veld Poort overschrijft een poort die in het adres is opgegeven. |
| Gebruikersnaam / Wachtwoord | Leeg laten voor een anonieme broker. |
| Client-ID | Leeg laten om er een af te leiden van het MAC-adres van de server. |
| Zelfondertekende certificaten accepteren | Wordt alleen weergegeven voor mqtts:// / wss://. Standaard uitgeschakeld: het brokercertificaat moet zijn ondertekend door een vertrouwde autoriteit. Indien ingeschakeld, wordt het certificaat helemaal niet geverifieerd. |
| CA-certificaat | Alleen weergegeven voor TLS: het PEM-certificaat van de autoriteit die de broker heeft ondertekend, wanneer dit geen openbare autoriteit is. |
| Keepalive | Hoe lang een inactieve verbinding open mag blijven vóór een ping (standaard 60 s). |
| Standaard QoS | 0 · hoogstens één keer, 1 · minstens één keer of 2 · precies één keer — gebruikt door elk object dat geen eigen QoS instelt. |
| Beschikbaarheidstopic / HyperVisu-beschikbaarheid aankondigen | Waar HyperVisu online / offline voor zichzelf publiceert (standaard hypervisu/status, retained). De broker publiceert namens HyperVisu offline als de verbinding wegvalt. |
| Clean session | Aan (standaard): de broker vergeet de abonnementen wanneer de verbinding wegvalt en HyperVisu abonneert zich opnieuw bij het herverbinden. Schakel dit alleen uit voor een broker die berichten in de wachtrij moet plaatsen terwijl HyperVisu offline is. |
Testen op een MQTT-verbinding is een echte test: de server maakt verbinding met de broker en wacht op de bevestiging (binnen 10 s). Een goed resultaat toont Verbinding geslaagd. In het dialoogvenster Verbinding toevoegen test Testen de ingevoerde waarden voordat u de verbinding aanmaakt. Bij een opgeslagen verbinding controleert Testen de opgeslagen configuratie, niet de nog niet opgeslagen velden: klik eerst op Verbinding opslaan en daarna op Testen. Een geslaagde test bewijst dat het adres, de poort, de inloggegevens en de TLS-instellingen door de broker worden geaccepteerd; het bewijst niet dat een topic gegevens bevat.
De status van de verbinding geeft Verbonden weer zolang de brokerverbinding actief is. Een broker die wegvalt, wordt elke paar seconden opnieuw geprobeerd, zonder limiet — er is nooit een herstart van de server nodig.
📘 Opmerking: Nadat u een verbinding heeft aangemaakt of opgeslagen, verschijnt Wijzigingen toepassen met een teller in de zijbalk. De verbinding werkt al zonder dit; toepassen herlaadt de serverconfiguratie en wist de teller.

Een object koppelen (zie "MQTT koppelen" hieronder). Per object voert u een Topic in; de beheerinterface slaat dit op als <verbinding>:<topic> zodat twee brokers dezelfde topicnaam kunnen gebruiken. De richting van het object bepaalt wat er gebeurt:
| Richting | Gedrag |
|---|---|
| In | Abonneert op het topic (statustopic). Wildcards zijn toegestaan: + voor één niveau, # voor de rest. |
| Uit | Publiceert naar het topic (commandotopic). Moet een concreet topic zijn — geen wildcards. |
| In/Uit | Abonneert en publiceert op hetzelfde topic. Alleen correct voor apparaten die de retained status op één topic behouden; gebruik bij voorkeur twee objecten (één In, één Uit). |
De payload-codec — hoe de payload wordt omgezet in een waarde en omgekeerd — is de gegevenstypereeks van het object, samengesteld door de editor uit deze velden:
| Veld | Opgeslagen als | Betekenis |
|---|---|---|
| Payload-formaat | — / PATH= | Ruwe waarde: de volledige payload is de waarde. JSON: de waarde wordt gelezen op het JSON-pad (state, sensor.temperature, values[0]). |
| AAN-teken / UIT-teken | ON= / OFF= | Voor binaire objecten: wat het apparaat schrijft en verwacht voor waar/onwaar (bijv. ON / OFF). Zonder tekens worden true/false, 1/0, on/off begrepen bij inkomende berichten en wordt true/false gepubliceerd. |
| Schaal / Offset | SCALE= / OFFSET= | Lezen: waarde = ruw × schaal + offset; publiceren gebruikt het omgekeerde, ruw = (waarde − offset) ÷ schaal. Een commando-object en het bijbehorende feedbackobject gebruiken daarom dezelfde schaal. |
| Payload-sjabloon | PUB= | Optioneel publicatiesjabloon; {{value}} wordt vervangen door de waarde, bijv. {"state":"{{value}}"}. Laat leeg om de kale waarde te publiceren. |
| QoS | QOS= | Broker-standaard, 0, 1 of 2 voor dit commando. |
| Gepubliceerde berichten behouden (retain) | RETAIN=1 | Standaard uitgeschakeld. |
| Minimuminterval (ms) | THROTTLE= | Frequente sensormeldingen worden beperkt tot dit tempo (standaard 100 ms); de laatste waarde komt altijd door. 0 schakelt dit uit. |
De tekenreeks heeft de vorm TYPE:param:param… — bijvoorbeeld BOOL:PATH=state:ON=ON:OFF=OFF of FLOAT:SCALE=0.3937:PUB={"brightness":{{value}}}. Een lege reeks betekent "gebruik de ruwe payload als het type van het object". De objecteditor heeft geen veld voor het gegevenstype: het type is het type dat wordt weergegeven op het veld waarop u klikt in de topic-browser (hieronder), en het aanklikken van een veld past het type van het object hierop aan. Kleurobjecten (RGB) accepteren inkomend {"r","g","b"}, {"red","green","blue"}, [r,g,b], #RRGGBB en 255,128,0, en publiceren {"r":…,"g":…,"b":…} tenzij een sjabloon anders aangeeft.
⚠️ Waarschuwing: Een retained commando wordt opnieuw uitgevoerd telkens wanneer het apparaat opnieuw verbinding maakt met de broker. Behoud statussen, geen commando's — de editor waarschuwt wanneer u retain inschakelt voor een uitgaand object.
Topic-browser. MQTT is het enige protocol waarvan de adressen rechtstreeks van het netwerk kunnen worden uitgelezen. Klik in de objecteditor onder MQTT-topicconfiguratie op Broker scannen: de server luistert vier seconden naar de volledige broker en meldt hoeveel topics er zijn gedetecteerd (retained topics komen direct binnen, dus een korte scan toont al snel de meeste relevante topics; activeer voor een apparaat dat niet retaint een nieuwe meting en scan opnieuw). De lijst is beperkt tot 500 topics. De objecteditor kan niet een deel van de broker scannen: open Topic en typ in Topics zoeken… om de resultaten te filteren, of typ zelf het volledige topic. Elke rij toont het topic en de laatste payload, met een retained-label. Kies een topic en:
- voor een JSON-payload wordt elk veld vermeld onder Kies de waarde die dit object moet volgen — één klik stelt het JSON-pad, het objecttype en, voor booleans, de AAN/UIT-tekens in volgens de notatie van het apparaat;
- voor een eenvoudige payload stelt Gebruik de ruwe payload als
het type in.
Kies het topic voordat u op een veld klikt: het selecteren van een ander topic reset het payload-formaat, het JSON-pad en de tekens. De klik vult Schaal en Offset niet in.
U kunt nog steeds een topic invoeren dat de scan niet heeft opgevangen — een commandotopic is mogelijk nog nooit gepubliceerd en een inkomend object vereist mogelijk een wildcard. Typ het in Topic en klik op Gebruik "…" in de lijst.

Gedrag dat handig is om te weten
- Directe status na een herstart. Retained berichten worden door de broker bij elke (her)verbinding opnieuw verzonden, zodat widgets waarden weergeven zonder te hoeven wachten op de volgende publicatie van het apparaat.
- Geen verzonnen feedback. Een commando wordt pas bevestigd wanneer het apparaat zijn statustopic publiceert (of de broker dit opnieuw verzendt) — exact zoals bij KNX-statusobjecten. Als het apparaat offline is, doet de widget niet alsof het werkt.
- Commando's tijdens een onderbreking. Commando's met QoS 1 of 2 worden in de wachtrij geplaatst zolang de broker onbereikbaar is en afgeleverd bij het herstellen van de verbinding; QoS 0-commando's naar een onbereikbare broker mislukken en worden gelogd.
- Beveiliging. Payloads groter dan 64 KB worden genegeerd met een waarschuwing; er wordt één abonnement per uniek topicfilter geopend, ongeacht hoeveel objecten dit delen.
Praktijkvoorbeeld — een dimbare Zigbee2MQTT-lamp
Zigbee2MQTT publiceert de status van de lamp als JSON op zigbee2mqtt/lamp ({"state":"ON","brightness":178}) en accepteert commando's op zigbee2mqtt/lamp/set. De helderheid loopt van 0–254.
- Maak een MQTT-verbinding aan voor de broker (zie "Verbindingen"): brokeradres
192.168.1.10, poort1883, de inloggegevens van de Zigbee2MQTT-broker indien van toepassing. Klik op Testen — dit moet succes melden. - Voeg onder Apparaten een Dimmer-widget toe met de naam "Kantoorlamp". Selecteer onder Protocol uw brokerverbinding, aangeduid met de naam die u eraan heeft gegeven. Het apparaat verschijnt met vier objecten: Schakelen AAN/UIT, Schakelfeedback, Dimwaarde en Dimfeedback.
- Op Schakelen AAN/UIT (het aan/uit-commando): typ
zigbee2mqtt/lamp/setin Topic en klik op Gebruik "…" in de lijst. Stel AAN-teken in opON, UIT-teken opOFFen Payload-sjabloon op{"state":"{{value}}"}. Typ de tekens daadwerkelijk in: de grijzeONenOFFzijn slechts voorbeelden, en zonder tekens publiceert de schakelaartrueoffalse. - Op Schakelfeedback (de aan/uit-status): klik op Broker scannen, kies
zigbee2mqtt/lampen klik vervolgens op het veldstate— de editor stelt het JSON-pad in opstateen de tekens opON/OFF. - Op Dimwaarde (het helderheidscommando): topic
zigbee2mqtt/lamp/set, Payload-sjabloon{"brightness":{{value}}}, Schaal0.3937, Offset0. - Op Dimfeedback (de helderheidsstatus): topic
zigbee2mqtt/lamp, klik op het veldbrightnessen stel dezelfde Schaal in op0.3937. Dit is ongeveer100/254: inkomende waarden worden hiermee vermenigvuldigd (Zigbee 0–254 wordt 0–100 %), uitgaande waarden worden hierdoor gedeeld (0–100 % wordt 0–254). - Klik op Object opslaan bij elk object, klik vervolgens op Wijzigingen toepassen in de zijbalk en bevestig.
- Stel de helderheid in op
50 %in de app. De lamp ontvangt ongeveer127en de feedback retourneert ongeveer50 %. De schuifregelaar bevestigt dit aan de hand van het statustopic, en het bedienen van de lamp met de fysieke afstandsbediening werkt de app eveneens bij.
📘 Opmerking: De verzonden waarde wordt niet afgerond:
50 %wordt gepubliceerd als127.000254. De objecteditor heeft geen veld voor het gegevenstype, dus u kunt een commando-object geen geheel getal laten verzenden. Controleer of uw lamp een decimale helderheidswaarde accepteert.
MQTT koppelen
MQTT-objecten worden geconfigureerd in het dialoogvenster voor objectinstellingen (open het object met Bewerken, zie "Objectinstellingen, logboekregistratie & meldingen"). Het protocolspecifieke gedeelte bevindt zich in drie kaarten:
MQTT-topicconfiguratie
| Veld | Omschrijving |
|---|---|
| Topic | Het topic waarop dit object zich abonneert (In: een statustopic — wildcards + en # toegestaan) of waarnaar het publiceert (Uit: een commandotopic — geen wildcards). Kies het uit de lijst na Broker scannen, of typ het in. Het opgeslagen adres is <verbinding>:<topic>. |
| Broker scannen | Luistert enkele seconden op de broker en toont de gedetecteerde topics, elk met de Laatste payload en een retained-label. Bij een geselecteerd topic toont een JSON-payload de beschikbare velden onder Kies de waarde die dit object moet volgen — één klik vult het JSON-pad, het gegevenstype en de AAN/UIT-tekens in; een eenvoudige payload biedt Gebruik de ruwe payload als |
| Payload-formaat | Ruwe waarde (de volledige payload is de waarde) of JSON met een JSON-pad (state, sensor.temperature, values[0]). |
| AAN-teken / UIT-teken | Binaire objecten: wat het apparaat schrijft en verwacht voor waar/onwaar (bijv. ON / OFF). |
Publiceren (uitgaande objecten)
| Veld | Omschrijving |
|---|---|
| Payload-sjabloon | Optioneel. {{value}} wordt vervangen door de waarde; laat leeg om de kale waarde te publiceren. |
| QoS | Broker-standaard, 0, 1 of 2 — de aflevergarantie voor dit commando. |
| Gepubliceerde berichten behouden (retain) | Standaard uitgeschakeld. Een retained commando wordt opnieuw uitgevoerd telkens wanneer het apparaat opnieuw verbinding maakt — behoud statussen, geen commando's. |
Abonneren (inkomende objecten)
| Veld | Omschrijving |
|---|---|
| Minimuminterval (ms) | Frequente sensormeldingen worden beperkt tot dit tempo (standaard 100 ms); de laatste waarde komt altijd door. 0 schakelt dit uit. |
| Schaal / Offset | Numerieke objecten: waarde = ruw × schaal + offset bij inkomende berichten, het omgekeerde bij publiceren. |
De velden worden opgeslagen als de gegevenstypereeks van het object (bijv. BOOL:PATH=state:ON=ON:OFF=OFF) — de structuur, de topic-browser en een uitgewerkt praktijkvoorbeeld vindt u in het MQTT-hoofdstuk hierboven.
