====== MQTT ======
===== Model „Ústředny“ =====
Abychom pochopili, jak MQTT funguje v systému Mervis, představme si spíše **ústřednu** než přímý telefonní hovor.
V tradičních systémech si zařízení často „volají“ navzájem přímo. Pokud je jedna strana zaneprázdněná nebo offline, hovor selže. MQTT je jiné. Využívá centrální uzel (Broker), který funguje jako operátor ústředny.
* **Vydavatelé (vaše zařízení)**: Připomínají pracovníky v terénu, kteří hlásí data. Nevolají přímo manažerovi – jednoduše zanechají hlášení na ústředně.
* **Broker (Mervis Server)**: To je ona ústředna. Přijímá všechna hlášení, organizuje je do specifických „složek“ (Topics) a bezpečně je uchovává.
* **Odběratelé (Mervis interní)**: V našem systému používáme **interní odběratele** pro maximální bezpečnost a kontrolu. I když Mervis může fungovat jako odběratel, nedovolujeme externím ani neautorizovaným odběratelům přístup k vašim datovým tokům.
===== Architektury připojení =====
Existují dva způsoby připojení, ale kvůli bezpečnosti a jednoduchosti **důrazně doporučujeme Embedded Broker**.
==== 1. Vestavěný broker v Mervis (Doporučeno) ====
V tomto režimu je ústředna přímo součástí Mervis Cloudu.
* **Bezpečnost**: Uzavřený okruh. **Žádní externí odběratelé** nejsou povoleni. Přístup k datům má pouze systém Mervis, což zajišťuje vysokou úroveň kontroly a soukromí.
* **Jednoduchost**: Nemusíte spravovat externí server.
* **Provozní tok**: Zařízení odesílá data přímo na `mqtt.mervis.info`.
==== 2. Externí broker (Klientský režim) ====
V tomto režimu používáte vlastní broker třetí strany. Mervis funguje pouze jako další odběratel.
* **Riziko**: Méně bezpečné, protože Mervis nemá kontrolu nad tím, kdo další broker poslouchá.
* **Využití**: Smysluplné při integraci do již existující infrastruktury.
===== Provozní tok připojení (Embedded) =====
Pro nastavení zabezpečeného Embedded připojení postupujte takto:
- **1. Registrace v Portálu (DataNode)**:
* Přihlaste se do portálu Mervis: **[[https://portal.mervis.info/|portal.mervis.info]]**.
* Vytvořte **DataNode** pro váš projekt – digitální dvojče v cloudu.
* Vyberte typ zařízení.
* Portál vygeneruje **DeviceID**, **uživatelské jméno** a **heslo**.
- **2. Konfigurace zařízení**:
* Otevřete webovou administraci zařízení.
* **Adresa brokeru**: nastavte na ``mqtt.mervis.info``.
* **Port**: použijte zabezpečený port s TLS.
* Zadejte přihlašovací údaje z portálu.
- **3. Mervis Generator**:
* Jakmile je DataNode aktivní, navštivte **[[https://generator.mervis.info|generator.mervis.info]]**.
* Automaticky naskenuje vaše DataNodes a vygeneruje SCADA projekt, včetně propojení všech tagů bez ručního zadávání.
===== Podporované Embedded ovladače =====
Následující zařízení mají v Mervis dedikované ovladače `EmbeddedBroker`:
* **BMR PLA34 / PLA44**: Analyzátory kvality elektrické energie. ([[https://www.bmr-trading.com|Navštivte BMR]])
* **Shelly Pro 3EM**: Třífázové elektroměry. ([[https://www.shelly.com|Navštivte Shelly]])
* **Wago PFC řady**: Programovatelné automaty. ([[https://www.wago.com|Navštivte Wago]])
* **Weintek**: HMI panely a brány. ([[https://www.weintek.com|Navštivte Weintek]])
* **Kornfeil**: Průmyslové pece. ([[https://www.kornfeil.cz|Navštivte Kornfeil]])
**Specializované senzory**
* **IAQ03**: Senzory kvality vnitřního ovzduší. ([[https://www.iaq.cz|Navštivte IAQ]])
===== Datová struktura & Payloady =====
==== Analogie s vlakem ====
Představte si MQTT pakety jako vlak:
* **Protokol (koleje)**: Tím je samotný MQTT.
* **Payload (náklad)**: To jsou skutečná data uvnitř vagonů.
I když MQTT je způsob přepravy, „nákladem“ může být cokoliv. Mezi běžné typy patří:
* **JSON** (preferovaný v Mervis)
* **XML**
* **Text / String**
* **JPEG obrázky**
* **Binární data**
==== Požadavky na payload ====
* **Formát**: JSON je preferovaný standard. Pokud vaše zařízení odesílá jiný formát (např. XML nebo binární), bude nutné provést testování a úpravy.
* **Topic**: Payload nebo hlavička musí jasně určovat „Topic“ (složku, kam daný soubor patří).
* **Škálování**: Surové celočíselné hodnoty z PLC často vyžadují škálování. Např. hodnota `2305` může znamenat `230.5 Voltů` (děleno 10).
===== Řešení běžných problémů =====
^ Příznak ^ Možná příčina ^ Řešení ^
| **Žádné připojení** | Blokování firewallem | Ujistěte se, že síť umožňuje odchozí provoz na **mqtt.mervis.info**. |
| **Chyba ověření** | Nesoulad přihlašovacích údajů | Zkontrolujte, že ID, uživatelské jméno a heslo v zařízení odpovídají údajům z portálu. |
| **Offline stav** | Chybí heartbeat | Zkontrolujte, že zařízení odesílá „Keep Alive“ každých 60 sekund. |
| **Špatné hodnoty** | Chybějící škálování | Nastavte škálovací faktor (např. /10) ve značkách v Mervis. |
===== Pokročilý přehled: JSON struktury =====
Pro vývojáře, kteří ručně integrují zařízení Wago nebo Weintek, použijte následující vzorové payloady.
===== Podporované formáty =====
==== Formát kompatibilní s Wago ====
=== Registrace dostupných proměnných ===
* Informuje odběratele o dostupných proměnných
* Publikace s doručením „alespoň jednou“
* Topic: deviceId/TagConfiguration
* Kombinace ID kolekce a Tagu musí být pro každé zařízení jedinečná!
* Payload: UTF-8 JSON dokument
* /FormatId: (string), ID zprávy
* /ApiVersion (int), verze API
* /Complete (bool), nyní musí být true
* /Collections (pole kolekcí)
* /Id (int), ID kolekce
* /CollectionName (string)
* /SampleRate (int), vzorkovací rychlost v ms
* /PublishInterval (int), interval publikace v ms
* /TagData (pole proměnných)
* /Tag (string), ID proměnné
* /Unit (string), jednotka proměnné
* /ValueType (string), ST typ; podporovány jsou pouze jednoduché typy
**Příklad**
{
"FormatId": "TagConfiguration",
"ApiVersion": 1,
"Complete": true,
"Collections": [{
"Id": 1,
"CollectionName": "Building 1",
"SampleRate": 60000,
"PublishInterval": 60000,
"TagData": [{
"Tag": "Temperature1",
"Unit": "ºC",
"ValueType": "real"
},
{
"Tag": "Humidity",
"Unit": "%",
"ValueType": "word"
}]
},
{
"Id": 2,
"CollectionName": "Building 2",
"SampleRate": 120000,
"PublishInterval": 240000,
"TagData": [{
"Tag": "Water flow",
"Unit": "m3/h",
"ValueType": "byte"
},
{
"Tag": "Current phase L1",
"Unit": "A",
"ValueType": "lreal"
}]
}]
}
=== Hodnoty proměnných ===
* Publikuje hodnoty proměnných
* Publikace s doručením „alespoň jednou“
* Topic: deviceId/TagValues
* Payload: UTF-8 JSON dokument
* /FormatId: (string), ID zprávy
* /ApiVersion (int), verze API
* /CollectionId (int), ID kolekce
* /TagData (pole hodnot)
* /Time (datetime), časová známka v ISO formátu (YYYY-MM-DDTHH:MM:SSZ), ideálně v UTC
* /Values (sbírka dvojic tag-hodnota)
**Příklad**
{
"FormatId": "TagValues",
"ApiVersion": 1,
"CollectionId": 1,
"TagData": [{
"Time": "2018-03-27T17:19:23.720+02:00",
"Values": {
"Temperature1": 15.52,
"Humidity": 21
}
}]
}
==== Formát kompatibilní s Weintek ====
* Předpokládáme, že všechny hodnoty času jsou v **UTC**
* Screenshoty jsou z EasyBuilder Pro SW
=== Hodnoty proměnných ===
* Publikuje hodnoty proměnných
* Publikace s doručením „alespoň jednou“
* Topic: $deviceId/mervis/values nebo $deviceId/mervis/values/*
* Payload: UTF-8 JSON dokument
* /d: kořenový prvek
* "název_vlastnosti": hodnota - název může obsahovat metadata (nepovinné). Hodnoty vždy jako pole [...]
* formát metadata:
* "name" název
* "type" typ vlastnosti (pouze [[https://kb.mervis.info/doku.php/en:mervis-scada:80-mqtt#our_supported_types|námi podporované typy]])
* "unit" informace o jednotce
**Příklad**
{
"d" : {
"name:MyHomeTemperature, type:generic_sint64, unit:°C" : [ 0 ],
"number C" : [ 0 ],
"Bit" : [ false ],
"My array" : [ 0, 10, 20 ]
},
"ts" : "2020-08-27T07:10:24.360316"
}
{{ :en:mervis-scada:annotation_2020-08-27_120101.png?600 |}}
=== Registrace příkazů ===
* Topic: $deviceId/mervis/cmd_reg nebo $deviceId/mervis/cmd_reg/*
* Formát:
* /d: kořenový prvek
* "názevVlastnosti" musí obsahovat informace (oddělené čárkou). Hodnota je ignorována.
* "id" – ID příkazu a určuje odběrové topic ($deviceId/mervis/command/change_temperature)
* "name" – pro zobrazení zákazníkovi
* "params" – parametry příkazu (**musí obsahovat všechny parametry z odběrového topicu**)
* "name" – název parametru
* "type" – typ parametru (pouze [[https://kb.mervis.info/doku.php/en:mervis-scada:80-mqtt#our_supported_types|námi podporované typy]])
* "unit" – jednotka
* "ts" – časový údaj
{
"d" : {
"id:change_temperature, name:change temperature in house ,params:[{name: temperature, type:generic_float64, unit:°C}, {name: date, type:generic_datetime, unit:UTC}]" : false
},
"ts" : "2020-08-27T07:10:11.356013"
}
choose/create $deviceId/mervis/cmd_reg/
{{ :en:mervis-scada:annotation_2020-08-27_110112.png?400 |}}
nastavte obecnou záložku dle screenshotu
{{ :en:mervis-scada:annotation_2020-08-27_121338.png?400 |}}
přidejte příkazy
{{ :en:mervis-scada:annotation_2020-08-27_115716.png?400 |}}
===Naše podporované typy===
* "generic_bool"
* "generic_sint8"
* "generic_uint8"
* "generic_sint16"
* "generic_uint16"
* "generic_sint32"
* "generic_uint32"
* "generic_sint64"
* "generic_uint64"
* "generic_float32"
* "generic_float64"
* "generic_string"
* "generic_datetime"
===Vytvoření odběrového topicu pro spuštění příkazu===
* pro předchozí příklad příkazu
* vytvořte topic: $deviceId/mervis/command/change_temperature
* se dvěma adresami:
* temperature (32-bit float)
* date (string)
{{ :en:mervis-scada:annotation_2020-08-27_110134.png?600 |}}