RisalDash RisalDash

دليل · MQTT · IoT

MQTT على ESP32: من الصفر إلى Home Assistant

حين يحتاج حسّاس واحد أن يصل ثلاثة تطبيقات دفعةً واحدة، يتداعى ربط كل زوج يدويًّا بسرعة. يقلب MQTT ذلك: ينشر الجهاز إلى موضوع، ويشترك فيه كلّ من يهتمّ — بوسيط في المنتصف. إليك لماذا يناسب إنترنت الأشياء، والكلمات الثلاث التي تحتاجها فعلًا (موضوع، QoS، احتفاظ)، وكود ESP32 للتحدّث مع Home Assistant.

MQTTHome AssistantPubSubClientESP32IoT
نشر/اشتراك MQTT: ESP32 ينشر home/temp إلى وسيط Mosquitto؛ ويشترك Home Assistant وتطبيق هاتف ومسجّل
انشر مرّة إلى موضوع، فيتلقّاه كلّ مشترك يهتمّ — بلا استطلاع وبلا ربط كل زوج.

لماذا يتفوّق MQTT على استطلاع HTTP

مع HTTP العادي، تسأل اللوحة الجهاز «هل من جديد؟» على مؤقّت — تبذير وتأخّر، ولا يتوسّع لأكثر من عميلين. يقلب MQTT التدفّق: يدفع الجهاز القيمة لحظة تغيّرها، ويوزّعها الوسيط على كل المشتركين. إنه مبنيّ لـرسائل صغيرة كثيرة عبر وصلات متقطّعة منخفضة الطاقة — أي إنترنت الأشياء تمامًا. إن كنت تختار ناقلًا أصلًا، انظر أولًا Wi-Fi مقابل غيره؛ وMQTT هنا يركب فوق Wi-Fi.

الموضوع وQoS والاحتفاظ — بكلمات بسيطة

الموضوع مجرّد مسار مثل home/livingroom/temp؛ يلتقي عليه الناشرون والمشتركون (الاشتراك بأحرف بدل: home/+/temp). وQoS ضمان التسليم، والاحتفاظ يطلب من الوسيط الاحتفاظ بآخر قيمة كي يحصل عليها المشترك الجديد فورًا بدل انتظار التحديث التالي.

المفهوممعناهاستعمله لـ
QoS 0مرّة واحدة على الأكثر (بلا ضمان)قراءات حسّاس متكرّرة
QoS 1مرّة على الأقل (قد يتكرّر)أوامر، تغيّر حالة
QoS 2مرّة بالضبط (الأبطأ)نادرًا — حرِج، لمرّة
الاحتفاظيحفظ الوسيط آخر رسالةالحالة الحالية عند الاتصال
الوصية الأخيرةينشرها الوسيط إن سقطتكشف «غير متصل»

وسيط في خمس دقائق

يحتاج MQTT وسيطًا في المنتصف — مكتب البريد. الافتراضي Mosquitto: ثبّته على Raspberry Pi أو NAS أو الجهاز نفسه الذي يشغّل Home Assistant (الذي يقدّمه إضافةً بنقرة واحدة)، وانتهيت. يعمل وسيط مُستضاف (HiveMQ، EMQX Cloud) أيضًا إن لم ترد شيئًا محليًّا. وجّه كل جهاز إلى IP الوسيط والمنفذ 1883 فيجد بعضها بعضًا.

جانب ESP32: PubSubClient

على الجهاز، الخيار الكلاسيكي مكتبة PubSubClient. الشكل ثابت دومًا: تتّصل، وتشترك بما تتحكّم فيه، وتنشر ما تستشعره، وتعيد الاتصال حين يومض Wi-Fi:

connect:    client.connect("esp32-kitchen")        // to the broker
subscribe:  client.subscribe("home/relay/set")     // broker pushes commands here
publish:    client.publish("home/temp", "24.1")    // fire it; subscribers get it
callback:   on message  →  switch the relay        // react without polling

أبقِ حلقة إعادة اتصال صغيرة في loop() ليشفى الرابط المنقطع وحده، وانشر قيم الحسّاس فقط حين تتغيّر فعلًا كي تبقى الحركة (والطاقة) منخفضة — الانضباط نفسه كـالنوم العميق على البطارية.

Home Assistant دون ضبط يدويّ

الحيلة السحرية اكتشاف MQTT: تنشر JSON صغيرًا إلى موضوع خاصّ homeassistant/…/config (محتفَظًا به)، فيُنشئ Home Assistant الكيان بنفسه — بلا تحرير YAML، يظهر الحسّاس أو المفتاح ببساطة. تنشر قراءاتك إلى موضوع الحالة، ويعود التحكّم على موضوع الأوامر. من هناك لوحات وأتمتة وصوت، مجّانًا. تريد بلا كود إطلاقًا؟ ESPHome يفعل MQTT/الاكتشاف من YAML.

تريد أن يقدّم الجهاز واجهته أيضًا؟ لوحة كاملة من أسطر C++ قليلة.