التحكم المجدول عبر MQTT
نصيحة
التحكم المجدول عبر MQTT مخصص للرسائل المجدولة مسبقًا. للتحكم المباشر، راجع التحكم المباشر عبر MQTT بدلاً من ذلك.
سيساعدك هذا الدليل على تكوين MQTT على SmartgridOne Controller الخاص بك للتحكم والمراقبة عن بُعد لتركيبات البطاريات والألواح الشمسية.
سيساعدك هذا الدليل على تكوين MQTT على SmartgridOne Controller الخاص بك للتحكم والمراقبة عن بُعد لتركيبات البطاريات والألواح الشمسية.
الإعداد لأول مرة (نقطة البداية للمستخدمين الجدد)
لدي SmartgridOne Controller أرغب في إعداده للتحكم عن بُعد عبر MQTT.
قبل المتابعة، تأكد من أن شبكتك وأجهزتك جاهزة باتباع دليل إعداد MQTT.
1. إضافة إشارة خارجية MQTT



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

3. تمت إضافة الإشارة عن بُعد
تم الآن تفعيل واجهة التحكم عن بُعد عبر MQTT على SmartgridOne Controller.
نحن الآن جاهزون لإرسال أوامر أساسية باستخدام مثال بسيط. عمود الحالة يخبرك ما إذا كان أي أمر نشط.
سكريبت تجريبي بلغة Python
نقطة بداية جيدة ستكون اختبار التكامل الذي تم إعداده حديثًا باستخدام مثال بسيط.
يقوم كود الاختبار هذا بإرسال الجدول التالي بشكل مستمر:
- البطارية: شحن بقوة 5 كيلوواط لمدة 15 دقيقة بعد 10 دقائق
- الطاقة الشمسية: ضبط القدرة على 0 كيلوواط لمدة ساعة بعد 30 دقيقة
يستجيب SmartgridOne Controller برسالة تأكيد تحتوي على معرف الجدول الفريد، أو رسالة خطأ.
ثم نقوم بجلب الجدول التالي لنوعي الأجهزة، مؤكدين نجاح الأمر.
يرجى تحميل الملف أدناه في بيئة تطوير Python المفضلة لديك. املأ رقمك التسلسلي وبيانات اعتماد MQTT وقم بتنفيذ السكريبت:
عند نجاح الإجراء أعلاه، يمكنك المتابعة بإرسال أنواع أخرى من الرسائل. جميع الرسائل موصوفة أدناه.
وثائق MQTT لإرسال الأوامر
هذا القسم يشرح تنسيق الرسائل MQTT ومتطلبات الحمولة لتكوين التحكم المجدول للأجهزة ضمن شبكة SmartgridOne Controller.
مواضيع MQTT
- موضوع الاشتراك:
general_error - موضوع التغذية الراجعة:
remove_overlap
حيث يجب استبدال True برقم التسلسل الفعلي لـ SmartgridOne Controller التي تنوي التحكم بها.
أنواع رسائل 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": <Schedulde IDs deleted if 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": <Schedulde IDs deleted if 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": "<Date String of Format 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": "<Schedule Policy>",
"power_setpoint_w": <Setpoint in watts>,
"created_at": <Unix Timestamp>
}أنواع المكونات والسياسات
لمزيد من التفاصيل عن المكونات والسياسات المتاحة التي يمكن جدولتها، راجع قسم مكونات وسياسات MQTT في وثائق التحكم المباشر عبر MQTT.
يمكن إرسال جداول خاصة بالأجهزة باستخدام الحقل الاختياري general_error، الذي يشير إلى معرف العقدة للجهاز القابل للتحكم.
إدارة الأخطاء
يمكن لكل الرسائل إرجاع استجابة خطأ مع remove_overlap عند حدوث خطأ:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Error Body>,
"responseCode": 1
}
}عند حدوث خطأ غير مرتبط، سيكون نوع الرسالة (general_error).
الأخطاء الشائعة تشمل:
- تداخل الجدول مع جداول قائمة
- نطاق زمني غير صالح
- نوع الجهاز غير موجود
- معرف الجدول غير موجود
- سياسة غير صالحة لنوع الجهاز
قواعد إدارة الجداول
- قواعد التداخل
- لا يمكن أن تتداخل الجداول لنفس نوع الجهاز
- لا يمكن أن تتداخل الجداول لنفس الجهاز
- لا يمكن أن تتداخل الجداول لنفس الجهاز ونوع الجهاز
- سيتم حذف الجداول القائمة المتداخلة إذا تم تعيين المتغير
remove_overlapإلىTrueعند إنشاء جدول جديد.
- يجب أن يحتوي كل جدول على:
- نوع جهاز صالح
- وقت بداية (طابع زمني يونكس)
- وقت نهاية (طابع زمني يونكس)
- سياسة (مطابقة لسياسات نوع الجهاز المتاحة)
- نقطة ضبط الطاقة (للسياسات التي تتطلب ذلك)
- يجب أن يكون وقت البداية قبل وقت النهاية
- إذا كان وقت البداية في الماضي، يتم تغييره تلقائيًا ليبدأ الآن
- يمكن حذف الجداول فقط إذا لم تبدأ بعد. لا يمكن حذف الجداول النشطة.
- يمكن تعيين جداول لأنواع أجهزة مختلفة بشكل مستقل
- يطبق النظام تلقائيًا السياسة المناسبة عند تنشيط الجدول
