نصيحة
التحكم المجدول عبر MQTT مخصص للرسائل المجدولة مسبقًا. للتحكم الحي، راجع Live MQTT Control بدلاً من ذلك.
سيساعدك هذا الدليل في تكوين MQTT على Sofar الخاص بك للتحكم والمراقبة عن بُعد لتركيبات البطاريات والألواح الشمسية.
ما تحتاجه
- EMS مع اتصال بالإنترنت.

- بيانات اعتماد MQTT: يمكن طلبها من فريق الدعم لدينا عبر Support Team.
- بيئة تطوير بايثون (أو أي عميل MQTT آخر). يستخدم هذا الدليل مثالًا بسيطًا مكتوبًا ببايثون لتبدأ مع MQTT وإرسال الأوامر. نوصي باستخدام بايثون لسهولة الاستخدام، لكن أي عميل MQTT آخر مدعوم.
معلومات إضافية
MQTT هو بروتوكول اتصال سريع عبر الإنترنت. إنه نظام مراسلة نشر/اشتراك، يسمح باتصال مباشر بين جهازك و


التكوين لأول مرة (نقطة البداية للمستخدمين الجدد)
لدي

1. تحقق من شبكتك
تأكد من أن شبكتك تسمح بحركة مرور mqtt عبر المنفذ 1883. يمكنك فعل ذلك باستخدام الأمر:
nc -zv mqtt.eniris.be 1883عندما لا يتوفر هذا الأمر، يمكنك تنزيل وتنفيذ كود البايثون البديل:
عند وجود شك، استشر مهندس الشبكة الخاص بك أو استخدم نقطة اتصال الهاتف عبر 4G/5G مؤقتًا عند حدوث أخطاء في الاتصال.
ملاحظة
إذا لم يكن المنفذ 1883 متاحًا من شبكتك، فنحن نوفر نسخة احتياطية عبر المنفذ 80. يمكن تكوين ذلك في عميل MQTT الخاص بك في خطوة لاحقة من هذا الدليل.
2. أضف أجهزتك
تسجيل الدخول إلى واجهة التشغيل الأولي وتأكد من إضافة الأجهزة إلى Sofar EMS.
3. إضافة إشارة MQTT الخارجية



4. تمكين إشارة MQTT عن بُعد
حدد جميع الأجهزة التي ترغب في تضمينها في التحكم عن بُعد بواسطة MQTT.

5. تمت إضافة الإشارة عن بُعد
تم الآن تفعيل واجهة التحكم عن بُعد بـ MQTT على Sofar EMS.
نحن الآن جاهزون لإرسال بعض الأوامر الأساسية باستخدام مثال بسيط. يخبرك عمود الحالة إذا كان هناك أي أمر نشط.
نص تجريبي للبايثون
نقطة بداية جيدة لاختبار تكامل MQTT الجديد هي تجربة مثال بسيط.
يقوم هذا الكود الاختباري بإرسال الجدول التالي باستمرار:
- البطارية: شحن 5 كيلوواط لمدة 15 دقيقة بعد 10 دقائق
- الطاقة الشمسية: تعيين الطاقة إلى 0 كيلوواط لمدة ساعة بعد 30 دقيقة
يرد Sofar EMS برسالة تأكيد تحتوي على معرف الجدول الفريد، أو رسالة خطأ.
بعد ذلك، نسترجع الجدول التالي لكلا نوعي الجهاز، مؤكدين نجاح الأمر.
يرجى تنزيل الملف أدناه في بيئة تطوير بايثون المفضلة لديك. املأ الرقم التسلسلي وبيانات اعتماد MQTT ونفذ السكريبت:
عند نجاح ما سبق، يمكنك المتابعة بإرسال أنواع رسائل أخرى. جميع الرسائل موصوفة أدناه.
توثيق MQTT لإرسال الأوامر
تفصل هذه القسم تنسيق ورسائل MQTT ومتطلبات الحمولة لتكوين التحكم المجدول بالأجهزة داخل شبكة Sofar EMS.
مواضيع MQTT
- موضوع الاشتراك:
general_error - موضوع الملاحظات:
remove_overlap
حيث يجب استبدال True بالرقم التسلسلي الفعلي لجهاز Sofar EMS الذي ترغب في التحكم به.
أنواع رسائل MQTT
1. تعيين جدول (set_schedule)
ينشئ جدولًا جديدًا لنوع الجهاز.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (اختياري) (الافتراضي=False),
"tag": <Tag String> (اختياري) (الافتراضي=None),
}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <جدول المُحذوف إذا remove_overlap=True>
"tag": <Tag String> (الافتراضي=None),
},
"responseCode": 0
}
}2. تعيين جداول (general_error)
ينشئ عدة جداول جديدة.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": "{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (اختياري) (الافتراضي=False),
}",
"1": "{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (اختياري) (الافتراضي=False),
}",
...
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <جدول المُحذوف إذا remove_overlap=True>
},
"responseCode": 0
}
}3. الحصول على جدول (general_error)
يسترجع جدولًا محددًا بواسطة المعرف.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}الرد:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}4. الحصول على الجدول النشط (general_error)
يحصل على الجدول النشط حاليًا لنوع الجهاز.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}5. الحصول على الجدول التالي (general_error)
يحصل على الجدول القادم لنوع الجهاز.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}6. الحصول على الجداول (general_error)
يحصل على كل الجداول ليوم معين.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<تاريخ بصيغة dd/mm/yyyy>"
}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}7. الحصول على الجداول المستقبلية (general_error)
يحصل على كل الجداول المستقبلية.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Schedule>, ...]
},
"responseCode": 0
}
}8. إزالة جدول (general_error)
يزيل جدول معين بحسب المعرف.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "تمت إزالة الجدول <Schedule ID> بنجاح",
"responseCode": 0
}
}9. استرجاع ملاحظات الموقع (general_error)
يحصل على ملاحظات مفصلة عن حالة النظام.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <مستوى الجهاز (العقدة)>
}
}الرد (نجاح):
10. بنية الموقع (general_error)
يحصل على بنية الموقع.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}الرد (نجاح):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"isControllable": <boolean>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>,
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}تنسيق رد الجدول القياسي
{
"id": <Schedule ID>,
"device_type": "<Device Type>",
"node_id": "<Node ID>" (اختياري),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<سياسة الجدول>",
"power_setpoint_w": <النقطة المضبوطة بالواط>,
"created_at": <Unix Timestamp>
}أنواع المكونات والسياسات
للتفاصيل حول المكونات والسياسات المتاحة للجدولة، راجع قسم MQTT Components and Policies في وثائق Live MQTT Control.
يمكن إرسال جداول محددة للجهاز باستخدام الحقل الاختياري general_error، الذي يشير إلى معرف العقدة للجهاز القابل للتحكم.
معالجة الأخطاء
يمكن لجميع الرسائل إرجاع استجابة خطأ مع remove_overlap عند حدوث خطأ:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <نص الخطأ>,
"responseCode": 1
}
}عند حدوث خطأ غير مرتبط، ستكون رسالة الرد (general_error).
الأخطاء الشائعة تشمل:
- تداخل الجدول مع جداول موجودة
- نطاق زمني غير صالح
- نوع الجهاز غير موجود
- معرف الجدول غير موجود
- سياسة غير صالحة لنوع الجهاز
قواعد إدارة الجداول
- قواعد التداخل
- لا يمكن تداخل الجداول لنفس نوع الجهاز
- لا يمكن تداخل الجداول لنفس الجهاز
- لا يمكن تداخل الجداول لنفس الجهاز ونفس نوع الجهاز
- الجداول المتداخلة الموجودة سيتم حذفها إذا تم تعيين المتغير
remove_overlapإلىTrueعند إنشاء جدول جديد.
- يجب أن يحتوي كل جدول على:
- نوع جهاز صالح
- وقت بداية (توقيت يونيكس)
- وقت نهاية (توقيت يونيكس)
- سياسة (مطابقة لسياسات نوع الجهاز المتاحة)
- نقطة ضبط الطاقة (للسياسات التي تتطلبها)
- يجب أن يكون وقت البدء قبل وقت الانتهاء
- إذا كان وقت البدء في الماضي، يتم تغييره تلقائيًا إلى الوقت الحالي
- لا يمكن حذف الجداول إلا إذا لم تكن قد بدأت بعد. لا يمكن حذف الجداول النشطة.
- يمكن تعيين جداول لأنواع أجهزة مختلفة بشكل مستقل
- يطبق النظام تلقائيًا السياسة المناسبة عند تنشيط الجدول
