Preskočiť na obsah
IoT Automatizácia 9. jún 2026 · 10 min čítania

MQTT a ESP32: ako pripojiť fyzický svet k webu cez PHP backend

IoT nie je len pre veľké korporácie. S ESP32 za 5 EUR, Mosquitto brokerom na VPS a pár riadkami PHP môžete mať reálny senzor teploty, vlhkosti alebo spotreby energie v databáze — a zobraziť ho v dashboarde. Tento článok vás prevedie celým procesom od hardvéru po webovú aplikáciu.

DC

Dušan Chlpek

PHP vývojár, GEAR s.r.o. · 25+ rokov praxe · IoT integrácie

Č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:

Architektúra celého riešenia

ESP32
senzor DHT22
→ publish → Mosquitto
MQTT Broker
→ subscribe → PHP Worker
phpMQTT
PHP Worker → INSERT → MySQL
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:

#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"
Pre produkciu: Nakonfigurujte TLS — Mosquitto podporuje Let's Encrypt certifikáty. Pridajte do config súboru 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:

Hardware tip: Pre battery-powered zariadenia použite ESP32-S3 s deep sleep — pri meraní každých 5 minút vydrží 18650 batéria (3000 mAh) 6–12 mesiacov. Deep sleep spotreba je 10–20 µA vs. 240 mA pri aktívnom Wi-Fi.

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.

Riešite IoT alebo automatizáciu vo firme?

Navrhneme hardvérové aj softwarové riešenie — od výberu senzorov po webový dashboard a alerting.

Ďalšie články

Zavolať E-mail Dopyt

Ochrana súkromia

Táto stránka využíva cookies pre nevyhnutné fungovanie. Rešpektujeme vaše súkromie a legislatívu GDPR.