Čo je MQTT a prečo nie HTTP
MQTT (Message Queuing Telemetry Transport) je odľahčený protokol publish/subscribe navrhnutý pre zariadenia s obmedzeným výkonom a nestabilným pripojením. Vznikol v IBM v roku 1999 pre monitorovanie ropovodu cez satelitné spojenie — teda pre scenáre, kde každý bajt a každé prerušenie spojenia nieslo cenu.
Prečo nie HTTP? ESP32 zvládne HTTP requesty, ale:
- HTTP je request/response — zariadenie musí čakať na odpoveď pred ďalším meraním
- MQTT je async a event-driven — zariadenie publikuje, broker distribuuje, PHP subscriber reaguje
- MQTT spotreba batérie je 10× nižšia než HTTP pri rovnakej frekvencii správ
- MQTT automaticky zvládne výpadky siete cez QoS vrstvy (0, 1, 2)
Architektúra celého riešenia
senzor DHT22 → publish → Mosquitto
MQTT Broker → subscribe → PHP Worker
phpMQTT
sensor_data ← API → Laravel API ← fetch → Dashboard
Krok 1: ESP32 s Arduino kódom
Použijeme ESP32-WROOM-32 (asi 5 EUR) a senzor DHT22 (teplota + vlhkosť, 3 EUR). V Arduino IDE nainštalujte knižnice:
- PubSubClient (Nick O'Leary) — MQTT klient pre Arduino
- DHT sensor library (Adafruit)
- ArduinoJson — serializácia dát do JSON
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ArduinoJson.h>
const char* WIFI_SSID = "VasaWifi";
const char* WIFI_PASSWORD = "HesloKWifi";
const char* MQTT_SERVER = "mqtt.gear.sk"; // vaša VPS
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC = "sensors/warehouse/temp";
const char* DEVICE_ID = "esp32-warehouse-01";
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
WiFiClient wifi;
PubSubClient mqtt(wifi);
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
mqtt.setServer(MQTT_SERVER, MQTT_PORT);
}
void loop() {
if (!mqtt.connected()) reconnect();
mqtt.loop();
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temp) && !isnan(humidity)) {
StaticJsonDocument<128> doc;
doc["device"] = DEVICE_ID;
doc["temp"] = temp;
doc["humidity"] = humidity;
doc["timestamp"] = millis();
char payload[128];
serializeJson(doc, payload);
mqtt.publish(MQTT_TOPIC, payload, true); // retain=true
}
delay(30000); // meranie každých 30 sekúnd
}
void reconnect() {
while (!mqtt.connected()) {
if (mqtt.connect(DEVICE_ID)) {
Serial.println("MQTT connected");
} else {
delay(5000);
}
}
}
Krok 2: Mosquitto MQTT Broker na VPS
Mosquitto je najpopulárnejší open-source MQTT broker. Inštalácia na Ubuntu/Debian VPS:
# Inštalácia
apt install mosquitto mosquitto-clients -y
# Základná konfigurácia
cat > /etc/mosquitto/conf.d/default.conf <<EOF
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
EOF
# Vytvorenie používateľa pre ESP32 a PHP
mosquitto_passwd -c /etc/mosquitto/passwd esp32
mosquitto_passwd /etc/mosquitto/passwd php-subscriber
# Reštart
systemctl restart mosquitto
systemctl enable mosquitto
# Test (na serveri)
mosquitto_pub -h localhost -u php-subscriber -P heslo -t "test" -m "hello"
mosquitto_sub -h localhost -u php-subscriber -P heslo -t "test"
cafile, certfile a keyfile a zmeňte port na 8883.
Krok 3: PHP subscriber — ukladanie dát do MySQL
PHP bežne nepodporuje dlhobežiace procesy, ale pre MQTT subscriber to potrebujeme. Použijeme knižnicu phpMQTT (Bluerhinos) spustenú ako daemon:
composer require bluerhinos/phpmqtt
<?php
// mqtt-subscriber.php — bežiaci ako systemd service
require 'vendor/autoload.php';
use PDO;
$mqtt = new \Bluerhinos\phpMQTT('mqtt.gear.sk', 1883, 'php-sub-' . getmypid());
$pdo = new PDO('mysql:host=localhost;dbname=iot_data', 'user', 'pass');
$insert = $pdo->prepare('INSERT INTO sensor_readings (device_id, temperature, humidity, recorded_at) VALUES (?, ?, ?, NOW())');
if (!$mqtt->connect(true, null, 'php-subscriber', 'heslo')) {
exit('Nepodarilo sa pripojiť k brokeru');
}
$mqtt->subscribe([
'sensors/+/temp' => [
'qos' => 1,
'function' => function (string $topic, string $payload) use ($insert) {
$data = json_decode($payload, true);
if (!$data || !isset($data['device'], $data['temp'], $data['humidity'])) {
return;
}
$insert->execute([$data['device'], $data['temp'], $data['humidity']]);
echo "[" . date('H:i:s') . "] {$data['device']}: {$data['temp']}°C, {$data['humidity']}%\n";
}
]
], 0);
while ($mqtt->proc()) {
// event loop
}
# systemd service pre automatický štart
cat > /etc/systemd/system/mqtt-subscriber.service <<EOF
[Unit]
Description=MQTT PHP Subscriber
After=mosquitto.service mysql.service
[Service]
ExecStart=/usr/bin/php /var/www/iot/mqtt-subscriber.php
Restart=always
RestartSec=5
User=www-data
[Install]
WantedBy=multi-user.target
EOF
systemctl enable mqtt-subscriber
systemctl start mqtt-subscriber
Krok 4: Laravel API pre dashboard
Dáta sú v databáze, teraz ich sprístupníme cez REST API:
// database/migrations/create_sensor_readings_table.php
Schema::create('sensor_readings', function (Blueprint $table) {
$table->id();
$table->string('device_id', 64)->index();
$table->decimal('temperature', 5, 2);
$table->decimal('humidity', 5, 2);
$table->timestamp('recorded_at')->useCurrent()->index();
});
// routes/api.php
Route::prefix('v1/sensors')->group(function () {
Route::get('/', [SensorController::class, 'devices']);
Route::get('/{deviceId}/latest', [SensorController::class, 'latest']);
Route::get('/{deviceId}/history', [SensorController::class, 'history']);
});
// app/Http/Controllers/SensorController.php
public function latest(string $deviceId): JsonResponse {
$reading = SensorReading::where('device_id', $deviceId)
->latest('recorded_at')
->first();
return response()->json(['data' => $reading]);
}
public function history(Request $request, string $deviceId): JsonResponse {
$hours = $request->integer('hours', 24);
$readings = SensorReading::where('device_id', $deviceId)
->where('recorded_at', '>=', now()->subHours($hours))
->orderBy('recorded_at')
->get(['temperature', 'humidity', 'recorded_at']);
return response()->json(['data' => $readings]);
}
Krok 5: Home Assistant integrácia (bonus)
Ak používate Home Assistant, MQTT integrácia je zabudovaná. Stačí pridať do configuration.yaml:
mqtt:
sensor:
- name: "Sklad – teplota"
state_topic: "sensors/warehouse/temp"
value_template: "{{ value_json.temp }}"
unit_of_measurement: "°C"
device_class: temperature
- name: "Sklad – vlhkosť"
state_topic: "sensors/warehouse/temp"
value_template: "{{ value_json.humidity }}"
unit_of_measurement: "%"
device_class: humidity
Po reštarte Home Assistant uvidíte senzory priamo v dashboarde — bez jediného riadku Pythonu alebo Node.js.
Čo všetko takto dá robiť
Rovnaký vzor (ESP32 → MQTT → PHP → MySQL → API) funguje pre desiatky use cases:
- Priemyselný monitoring: teplota, tlak, vibrácie strojov — alerting pri prekročení prahov
- Energetický monitoring: PZEM-004T merač spotreby + ESP32 → denné/mesačné reporty spotreby
- Kontrola vstupu: RFID čítačka + ESP32 → log dochádzky v databáze
- Skleníkový systém: senzory pôdy, svetla, vlhkosti + automatické zavlažovanie
- Poštový box monitoring: magnetický senzor + push notifikácia cez Telegram API
Záver
Prepojenie fyzického sveta s webovým backendom cez MQTT nie je raketová veda. ESP32 za 5 EUR, Mosquitto na vašom VPS a pár riadkov PHP — to je všetko čo potrebujete na reálny IoT systém, ktorý beží v produkcii. Táto architektúra škáluje od jedného senzora po stovky zariadení bez zásadných zmien.
Ak riešite IoT projekt pre firmu — monitoring výroby, dochádzku, energetiku alebo akúkoľvek inú aplikáciu — rád pomôžem s návrhom aj implementáciou celého stacku.