Sofar logo
Sofar logo
Quick Startإرشادات التوصيل والأسلاكإشعارات السلامة والصيانة والقانونية
استكشاف الأخطاء وإصلاحها
الأجهزة
الإشارات الخارجية
مزود خدمة توزيع الشبكة

AxpoEnervalisImby
Mqtt
Live MQTT controlالتحكم المجدول في MQTTالخطوط الأساسيةالمحطة الكهربائية الافتراضيةتدفق الإعداد
Yuso - التحكم في البطاريةYuso - تقليل الطاقة الشمسيةأغرولاأوبينومأوتاركوإدميجإلياإنجيإيبيكس سبوت سولارالاختبارات التشخيصيةالتيار الهالوستيالسلع الأوروبيةالطاقة القادمةالطاقة المصاحبةالفقرة 14أ التكامل
المراقبة
بدء التشغيل
بليفيتجارة الطاقة الديناميكيةتحكم مرحل DNOتريفينتكاملات جديدةجرينتشويسحلول مرونة الطاقة (EFS)ديكسترزهرةشولتصندوق الصماماتطاقة BEEفرانك إنرجيفليكرو باورفي جي تي إنرجيكراّتريدمعاد التجهيزواجهة برمجة تطبيقات التخطيط المسبق
الإعداد من الألف إلى الياء
الإكسسوارات
التركيبالرخصةالشبكةالشهاداتالمتحكمالمواصفاتتطبيقزمن استجابة التحكم
مخصص للعميل
مصابيح الحالة LED
الإشارات الخارجيةMqtt
نصيحة
نصيحة

التحكم المجدول عبر MQTT مخصص للرسائل المجدولة مسبقًا. للتحكم الحي، راجع Live MQTT Control بدلاً من ذلك.

سيساعدك هذا الدليل في تكوين MQTT على Sofar الخاص بك للتحكم والمراقبة عن بُعد لتركيبات البطاريات والألواح الشمسية.

ما تحتاجه

  1. EMS
    Image 1
    مع اتصال بالإنترنت.
  2. بيانات اعتماد MQTT: يمكن طلبها من فريق الدعم لدينا عبر Support Team.
  3. بيئة تطوير بايثون (أو أي عميل MQTT آخر). يستخدم هذا الدليل مثالًا بسيطًا مكتوبًا ببايثون لتبدأ مع MQTT وإرسال الأوامر. نوصي باستخدام بايثون لسهولة الاستخدام، لكن أي عميل MQTT آخر مدعوم.

معلومات إضافية

MQTT هو بروتوكول اتصال سريع عبر الإنترنت. إنه نظام مراسلة نشر/اشتراك، يسمح باتصال مباشر بين جهازك و

Image 1
Image 1
. تُصنف أصولك إلى مجموعات طاقة شمسية، بطارية، EV، و HVAC.

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

لدي

Image 1
Sofar أرغب في إعداده للتحكم عن بُعد بواسطة MQTT.

1. تحقق من شبكتك

تأكد من أن شبكتك تسمح بحركة مرور mqtt عبر المنفذ 1883. يمكنك فعل ذلك باستخدام الأمر:

nc -zv mqtt.eniris.be 1883

عندما لا يتوفر هذا الأمر، يمكنك تنزيل وتنفيذ كود البايثون البديل:

عند وجود شك، استشر مهندس الشبكة الخاص بك أو استخدم نقطة اتصال الهاتف عبر 4G/5G مؤقتًا عند حدوث أخطاء في الاتصال.

ملاحظة
ملاحظة

إذا لم يكن المنفذ 1883 متاحًا من شبكتك، فنحن نوفر نسخة احتياطية عبر المنفذ 80. يمكن تكوين ذلك في عميل MQTT الخاص بك في خطوة لاحقة من هذا الدليل.

2. أضف أجهزتك

تسجيل الدخول إلى واجهة التشغيل الأولي وتأكد من إضافة الأجهزة إلى Sofar EMS.

3. إضافة إشارة MQTT الخارجية

Image 1
Image 1
Image 1

4. تمكين إشارة MQTT عن بُعد

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

Image 1

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).

الأخطاء الشائعة تشمل:

  • تداخل الجدول مع جداول موجودة
  • نطاق زمني غير صالح
  • نوع الجهاز غير موجود
  • معرف الجدول غير موجود
  • سياسة غير صالحة لنوع الجهاز

قواعد إدارة الجداول

  1. قواعد التداخل
    • لا يمكن تداخل الجداول لنفس نوع الجهاز
    • لا يمكن تداخل الجداول لنفس الجهاز
    • لا يمكن تداخل الجداول لنفس الجهاز ونفس نوع الجهاز
    • الجداول المتداخلة الموجودة سيتم حذفها إذا تم تعيين المتغير remove_overlap إلى True عند إنشاء جدول جديد.
  2. يجب أن يحتوي كل جدول على:
    • نوع جهاز صالح
    • وقت بداية (توقيت يونيكس)
    • وقت نهاية (توقيت يونيكس)
    • سياسة (مطابقة لسياسات نوع الجهاز المتاحة)
    • نقطة ضبط الطاقة (للسياسات التي تتطلبها)
  3. يجب أن يكون وقت البدء قبل وقت الانتهاء
  4. إذا كان وقت البدء في الماضي، يتم تغييره تلقائيًا إلى الوقت الحالي
  5. لا يمكن حذف الجداول إلا إذا لم تكن قد بدأت بعد. لا يمكن حذف الجداول النشطة.
  6. يمكن تعيين جداول لأنواع أجهزة مختلفة بشكل مستقل
  7. يطبق النظام تلقائيًا السياسة المناسبة عند تنشيط الجدول
Last updated May 4, 2026Edit this page

Live MQTT control

Previous Page

الخطوط الأساسية

Next Page

On this page

ما تحتاجهمعلومات إضافيةالتكوين لأول مرة (نقطة البداية للمستخدمين الجدد)1. تحقق من شبكتك2. أضف أجهزتك3. إضافة إشارة MQTT الخارجية4. تمكين إشارة MQTT عن بُعد5. تمت إضافة الإشارة عن بُعدنص تجريبي للبايثونتوثيق MQTT لإرسال الأوامرمواضيع MQTTأنواع رسائل MQTT1. تعيين جدول (set_schedule)2. تعيين جداول (general_error)3. الحصول على جدول (general_error)4. الحصول على الجدول النشط (general_error)5. الحصول على الجدول التالي (general_error)6. الحصول على الجداول (general_error)7. الحصول على الجداول المستقبلية (general_error)8. إزالة جدول (general_error)9. استرجاع ملاحظات الموقع (general_error)10. بنية الموقع (general_error)تنسيق رد الجدول القياسيأنواع المكونات والسياساتمعالجة الأخطاءقواعد إدارة الجداول