التحكم بالروبوت عبر صفحة الويب

في هذا المشروع، سنتعلم كيفية التحكم بالراسبيري باي من خلال واجهة الويب. وهذا سوف يسمح لك للتحكم بالمحركات والإضاءة وغيرها من القطع الإلكترونية عبر شبكة الإنترنت. سنقوم خلال هذا المشروع بالتحكم والسيطرة على الروبوت عن طريق الويب.

web-controlled-robot

بث فيديو مباشر عبر شبكة الإنترنت

خلال هذا المشروع، سنتعلم كيفية  بث فيديو مباشر على صفحة الويب بإستخدام الراسبيري باي. يمكن دمج هذا المشروع مع العديد من المشاريع كمشروع الروبوت لمشاهدة كل ما يشاهده الروبوت عبر شبكة الإنترنت أو مع أنظمة المراقبة أو مع أي تطبيق آخر يحتاج إلى كاميرا.

raspberry-pi-webcam-server

القطع المطلوبة :

raspberry-pi-iot-intruder-alert-system

 كاميرا للراسبري باي (raspberry pi camera module) أو USB webcam

8Gb Microsd 

 راسبيري باي (Raspberry Pi 3 Model B)

كيفية إعداد خادم كاميرا الويب :

أولا، سوف تحتاج إلى تثبيت نظام الراسبيان على الراسبيري باي. إذا لم تكن قد فعلت ذلك قم بالإطلاع على درس تهيئة بطاقة الذاكرة.

في هذا المشروع سنقوم باستخدام حزمة الحركة (Motion) .

للبدء، سنقوم بإستخدام الـ Termial  لتحديث الراسبيري باي إلى أحدث إصدار.

إعتمادا على إصدار الـ Raspbian الذي تستخدمه سوف تحتاج إلى القيام ببعض الخطوات المختلفة.

إصدار  Raspbian Jessie :

نبدأ بإزالة المكتبات التي قد تتعارض مع الحزم الأحدث. قد تكون موجودة أو غير موجودة على نسختك من الراسبيان.

قم بتنزيل وتثبيت الحزم التالية عن طريق إدخال الأوامر التالية  على الـ Terminal

الآن نحن بحاجة إلى تثبيت الحزم التالية :

بعد تثبيت تلك الحزم، يمكننا الآن الحصول على أحدث نسخة من برنامج Motion وتثبيته. للقيام بذلك قم بتشغيل الأوامر التالية:

إصدار Raspbian Stretch :

أولا قم بتثبيت الحزم التالية. الأمر التالي يعمل على الإصدارين من Raspbian Stretch .

بعد ذلك، قم بتنزيل ملف motion deb من GitHub وتثبيته بإستخدام dpkg.

هذا كل ماعليك القيام به للإنتقال إلى إعداد motion بحيث يتم تشغيلها على الراسبيري باي الخاص بك.

إعداد Motion :

الآن نحن بحاجة إلى إجراء بعض التعديلات على ملف motion.conf ، قم بفتح الملف عبر الأمر التالي :

قم بالبحث عن الأسطر التالية، ثم قم بتغييرها إلى ما يلي :

الآن نحن بحاجة إلى إعداد الـ daemon، أولا نحن بحاجة إلى تحرير ملف الـ Motion.

ابحث عن السطر التالي وقم بتغييره إلى ما يلي :

بمجرد الإنتهاء من ذلك، قم بحفظ الملف والخروج منه عن طريق الضعط على ctrl+x ثم Y

تأكد الآن من توصيل الكاميرا، وتشغيلها عبر الأمر التالي:

إذا كنت بحاجة إلى إيقاف البث، ببساطة قم بتشغيل الأمر التالي:

الآن يمكنك مشاهدة البث المباشر عبر صفحة الويب بإستخدام عنوان الـ IP Address الخاص بالراسبيري باي. قم بفتح المتصفح واستخدام IP address للراسبيري باي كما يلي :

إذا لم يتم تحميل صفحة الويب حاول إعادة تشغيل الخدمة عبر الأمر التالي :

 

raspberry-pi-webcam-server

إذا كنت تستخدم كاميرا الراسبيري باي، ستحتاج إلى القياب ببعض الخطوات الإضافية المذكورة بالقسم القادم.

خطوات إضافية لمستخدمي كاميرا الراسبيري باي

إذا كنت ترغب في استخدام وحدة كاميرا الراسبيري باي سوف تحتاج إلى القيام ببعض الخطوات الإضافية لإعدادها.

تثبيت الجهاز :

أولا قم بتوصيل الكاميرا إلى لوحة الراسبيري باي بالطريقة الصحيحة كما هو موضح بالصورة التالية :

raspberry-pi-webcam-server

إعداد البرنامج :

لجعل كاميرا الراسبيري باي تعمل، ستحتاج للقيام ببعض الخطوات الإضافية.

تأكد من تفعيل كاميرا الراسبيري باي. بعد توصيل الكاميرا إلى لوحة الراسبيري باي ، من قائمة البدء ثم preferences قم بفتح Raspberry Pi Configuration Tool

raspberry-pi-webcam-server

تأكد من أن الكاميرا مفعلة كما هو موضح بالصوة أدناه :

raspberry-pi-webcam-server

إذا لم تكن مفعلة قم بتفعيلها عن طريق اختيار (Enable) ،   ثم قم بإعادة تشغيل نظام الراسبيري باي.

الآن قم بفتح ملف modules عن طريق إدخال الأمر التالي عبر الـ Terminal.

قم بإدخال السطر التالي في الجزء السفلي من الملف إذا لم يكن موجودا بالفعل، وبمجرد الإنتهاء قم بحفظ والخروج من الملف عبر الضغط على ctrl+x ثم y .

الآن قم بإعادة تشغيل الراسبيري باي. بعد ذلك، يجب أن تكون قادر على الوصول إلى صفحة الويب التي تعرض البث المباشر عبر عنوان IP الخاص بالراسبيري باي

 

raspberry-pi-webcam-server

 

هنا خادم كاميرا الراسبيري باي يمكن الوصول إليها داخل الشبكة المحلية. إذا كنت ترغب في السماح بالوصول الخارجي إليها قم بتباع التعليمات الموجودة في القسم التالي .

الإعدادات للوصول من خارج الشبكة  للبث :

من أجل تمكين الوصول الخارجي إلى خادم الراسبيري باي، سوف تحتاج إلى تغيير بعض الإعدادات في جهاز الـ Router . ومع ذلك تم تصميم أجهزة الـ routers بشكل مختلف لذلك قد تحتاج إلى البحث عن التعليمات الخاصة بجهاز الـ router الخاص بك.

ملاحظة: فتح منفذ (Port) على شبكة الإنترنت يمكن أن يتسبب في مخاطر أمنية .

 – أولا ، انتقل إلى صفحة router adimn (بالعادة يكون العنوان 192.168.1.1 أو 192.168.1.254)

raspberry-pi-webcam-server

 – بعد ذلك، قم بإدخال اسم المستخدم وكلمة المرور. الإفتراضي تكون admin , adimn.

– ثم قم بالذهاب إلى Advanced ، ثم Nat ، ثم قم بالضغط على Port Mapping .

– هنا قم بإدخال التالي :

Protocol : TCP/UDP ■
External start port: 8081 ■
External end port: 8081 ■
(Internal host: (Address of your Pi ■
Internal port: 8081 ■
Enable: Enable ■

raspberry-pi-webcam-server

يجب أن تكون الآن قادر على الإتصال ببث الـ webcam على الراسبيري باي من خارج الشبكة. قد تحتاج إلى إعادة تشغيل الـ Router لتصبح التغييرات مفعلة.

إذا لم تتمكن من الإتصال من خارج الشبكة المحلية، يمكنك تجربة ما يلي :

– تحقق من إعدادات جهاز router الخاص بك وتأكد من صحتها.
– تحقق من عنوان الـ IP انه لم يتغير . يمكنك إعداد Dynamic dns لمواجهة هذا.
– إعادة تشغيل الـ router .

Dashboards وواجهات المستخدم في Node-Red

في هذا الدرس سوف نستعرض بعض التقنيات التي تسمح لنا بعمل عرض تصوّري للبيانات (visualize data) التي تمر خلال التدفقات. سوف نركز على ثلاث أساليب:

  • استخدام الطرف الثالث من أداة Dashboard وهي FreeBoard (الجزء الأول)
  • استخدام العقد الافتراضية لواجهة المستخدم (Dashboard) المقدمة بشكل افتراضي في Node-RED
    (الجزء الثاني)
  • استخدام أداة الرسم التخطيطي للجافا سكريبت القياسية  (الجزء 3).
dashboards-and-ui-nodes

بنهاية هذا الدرس ستكون لديك معرفة كافية لتحديد الطريقة المناسبة لتحقيق احتياجاتك في الحصول على عرض تصويري للبيانات على صفحة ويب.

استخدام خدمة لوحة التحكم FreeBoard :

تعد هذه الطريقة مثالا بسيطا لقراءة وعرض البيانات تصويريا باستخدام عقدة FreeBoard  من عقد الـNode-Red  . سوف نستخدم خدمة FRED القائمة على السحابه كمحرك للـNode-Red  ونستعرض البيانات تصويريا من خلال خدمة الطقس على الانترنت يمكن تقسيم هذا المثال إلى جزئين:

الأول: إنشاء عقدة  الطقس openweathermap في FRED الموجودة ضمن العقد المدمجة. كما قمنا به في درس بناء التدفقات:تنبيهات الطقس

الثاني: عرض البيانات من عقدة openweathermap  باستخدام عقدة FreeBoard

أولا لإنشاء عقدة الطقس قم  بإنشاء حساب أو تسجيل الدخول إلى http://openweathermap.org/appid للحصول على مفتاح API الخاص بك.

dashboards-and-ui-nodes

قم بسحب عقدة الطقس openwethermap إلى مساحة العمل والنقر عليها مرتين لإدخال البيانات: مقتاح API وإحداثيات مدينتك.

نقوم بعد ذلك بربطها بعقدة الإخراج debug  والضغط على نشر Deploy

dashboards-and-ui-nodes

نجد أن البيانات التي تظهر في لوحة الإخراج debug  هيكل JSON مما يعني أنه يمكننا استخدام أي من هذه القيم ببساطة.

سنقوم بإنشاء صفحة تحكم لعرض البيانات مرئيًا باستخدام عقدة FreeBoard .

نقوم بسحب عقدة FreeBoard  إلى ساحة العمل والنقر عليا مرتين لتسميتها

dashboards-and-ui-nodes

بالنقر على نشر Deploy ستحصل عقدة الطقس على البيانات وتقوم بإرسالها إلى كلا من عقدة الإخراج depug  وعقدة freeboard.

عقدة FreeBoard ذكية جدًا فهي تقوم باستقبال البيانات وتحليلها ومعرفة كيفية جعلها متاحة باستخدام واجهة المستخدم FreeBoard

للحصول على مزيد من المعلومات عن هذه العقدة قم بالنقر على علامة التبويبinfo  في لوحة الإخراج

dashboards-and-ui-nodes

قم بالضغط على الرابط في لوحة المعلومات أو الرابط التالي:

https://{username}.fred.sensetecnic.com/api/freeboard/

ستفتح لك نافذة تبويب جديدة

dashboards-and-ui-nodes

هذا التبويب يسمح لك بعمل عرض تصويري للبيانات في FreeBoard وحفظها وتحميلها.

سنقوم الآن بعمل عرض تصويري لبيانات الطقس لدينا، نحتاج أولا إلى إضافة مصدر للبيانات في freeboard  . انقر على “ِADD ” تحت عنوان “DATASOURCES”

وتحت عنوان “TYPE” حدد اسم العقدة “FreeBoard”. في حالتنا أطلقنا عليها اسم “freeboard” مما  سيسمح لنا بالوصول إلى أي بيانات تتصل بعقدة “freeboard” في Node-Red.

dashboards-and-ui-nodes

سنقوم الآن بإضافة pane  انقر على “ADD PANE” سوف يظهر لنا جزء جديد فارغ. ولإضافة “Widget” قم بالنقر على علامة ( + )   في الجزء الجديد واختر “”Gauge

تحت “DATASOURCE” قم باختيار عقدة “Freeboard”.  كما تشاهد فإن حقول البيانات المختلفة في عقدة الطقس openwethermap هيكل JSON متاحة لتصويرها مرئيًا.

إذا لم تظهر لك الحقول في القائمة المنسدلة قم بالرجوع إلى صفحة Node-Red  وانقر على نشر deploy  مرة أخرى ليتمكن freeboard  من استقبال البيانات وتخزينها

في هذا المثال قمنا باختيار “tempC”

dashboards-and-ui-nodes

FreeBoard يأخذ البيانات بشكل أساسي هيكل JSON لينتج الحقول الأخرى

العرض التصويري لبياناتك ينبغي أن يظهر بهذا الشكل:

dashboards-and-ui-nodes

 

 

 

 

مقدمة لعقد واجهة المستخدم من Node-RED-dashboar :

في هذا المثال سنستخدم العقد المضمنة في Node-Red. إذا كنت تستخدم FRED فتحقق من إضافة هذه العقدة من خلال زر إضافة/إزالة العقد في لوحة الإدارة وأنك لا تستخدم واجهة المستخدم القديمة للعقد.

في البداية سنقوم ببناء تدفق بسيط يرسل أرقامًا عشوائية بين 0 و 99 إلى رسم بياني بسيط. سنحتاج إلى:

  • عقدة إدخال لتكرار إطلاق البيانات مرارا كل بضعة ثوان
  • عقدة معالجة function لتوليد أرقام عشوائية
  • وواحدة من عقد  node-red-dashboard وفي هذه المرة سنختار عقدة الرسم البياني Chart node

 

dashboards-and-ui-nodes

قبل أن ننظر في كيفية عمل عقدة الرسم البياني، سنقوم بتكوين عقدة إدخال تقوم بإرسال طابع زمني كل 5 ثوان عن طريق وضع الحمولة على الطابع الزمني ونختار الفترة 5 ثوان في حقل التكرار.

dashboards-and-ui-nodes

سيمثل هذا جزء الإدخال في التدفق الذي نريد بناءه

لإعداد عقدة المعالجة function لتوليد الأرقام العشوائية سنفوم بكتابة دالة رياضية بسيطة بواسطة جافا سكربت

لمحة عن الكود :

msg المتغير الذي يحتوي على نص الرسالة. استخدمنا الدالة ()Math.round للحصول على أعداد مقربة إلى أقرب عدد صحيح

والدالة Math.random()*100 لتوليد أرقام عشوائية بين 0 و99

ستولد عقدة المعالجة رقم عشوائي بين 0 – 99 وتمررها إلى عقدة الرسم البياني

بالنقر مرتين على عقدة الرسم البياني ستظهر لنا خيارات إعدادها

dashboards-and-ui-nodes

اذا قمت بالنقر على زر حقل Group، سيطلب منك إعداد علامات التبويب  لواجهة المستخدم

dashboards-and-ui-nodes

يسمح خيار التبويب بتحديد علامات التبويب التي تريدها في صفحة واجهة المستخدم وسترى عنصر واجهة المستخدم  (في مثالنا هذا الرسم البياني ). علامة التبويب الافتراضية هي الصفحة الرئيسية Home  التي نستخدمها هنا. إذا قمت بالنقر على زر تعديل edit في يمين حقل التبويب ستتمكن من إنشاء تبويب جديد واختياره.

الآن سنستخدم الافتراضي Home

حقل الاسم هو الاسم الأساسي لعقدة Node-Red – الافتراضي هنا هو الرسم البياني ويمكنك تسميته كما شئت

حقل المجموعة Group يسمح لك بتجميع عناصر واجهة المستخدم – سيأتي فيما بعد كيفية عمله عند إضافة عنصر واجهة مستخدم آخر –

يمكنك تسميته بأي نص الآن سنستخدم الافتراضي  Home

حقل محور × : يتيح لك تحديد مقدار البيانات التي تريد من الرسم البياني تخزينها وعرضها. كلما زادت القيمة في حقل last  يعني أن بيانات أكثر سيتم تخزينها وعرضها على الرسم

سنختار مدى قصير وهو 5 دقائق أي أن الرسم سيتضمن البيانات الواردة خلال 5 دقائق.

وأخيرا حقل Interpolate سيحدد كيف سيقوم الرسم البياني بإدراج القيم الفعلية التي يستقبلها في الرسم ، سنستخدم الافتراضي الخطي linear

قم بتوصيل العقد واضغط على زر النشر Deploy

تأكد أن لوحة الإخراج depug  تُظهر أرقاما عشوائية

ثم توجه إلى تبويب dashboard الافتراضية الخاصة بك لرؤية النتيجة عند العمل في FRED ستجد واجهة الاستخدام الخاصة بك كالتالي:

dashboards-and-ui-nodes

 

أو بزيارة الرابط التالي

https://{your username}.fred.sensetecnic.com/api/ui/

يمكن الحصول بهذه الطريقة على رسوم بيانية رائعة وفقًا لمدى البيانات التي تختارها (محور Y) مع الزمن (محور x)

ويظهر اسم الرسم Default  كما تم اختياره خلال تهيئة عقدة الرسم البياني

إذا كنت قد أنشأت علامات تبويب خاصة بك فستجد بالنظر إلى الزاوية العلوية اليسرى لصفحة الويب علامة التبويب الرئيسية Home وبالنقر عليها ستظهر لك قائمة منسدلة لعلامات التبويب التي أنشأتها.

سنقوم الآن بإضافة عناصر واجهة المستخدم أخرى إلى Dashboard. قم بإضافة عقدة  Gauge إلى مساحة العمل وربطها بعقدة function. وبالنقر عليها مرتين لفتح الإعدادات الخاصة بها.

dashboards-and-ui-nodes

سوف نستخدم هنا نفس التبويب السابق Home ونفس المجموعة [Default [Home

حقلي Min و Max يسمحان لنا بتحديد الحد الأدنى والأقصى في المقياس الذي سيظهر. تأكد من تعيين الحد الأقصى 100 ليعطى أعلى قيمة من الأعداد العشوائية التي ستولدها عقدة function

في حقل التدرج اللوني يمكنك تغيير الألوان التي تظهر في المقياس

قم بالضغط على نشر deploy وتوجه إلى الصفحة الخاصة بك Dashboard لمشاهدة النتيجة

سيُظهر الرسم القيم العشوائية التي تم توليدها في الخمس دقائق الأخيرة وسيمثل المقياس القيمة الأخيرة

dashboards-and-ui-nodes

كمثال أخير سنستخدم عقدتين أخرى من عقد واجهة المستخدم وهما عقدة Slider وعقدة النص text لإظهار نفس البيانات على شريط تمرير وكسلسلة نصية.  قم بسحبهما إلى مساحة العمل وربطهما بعقدة function

dashboards-and-ui-nodes

 

 

سنضع هاتين العقدتين تحت نفس التبويب Home لكن سنختار اسم مجموعة آخر وليكن “anthorWidget”

ستحتاج إلى النقر على إضافة مجموعة واجهة استخدام جديدة (add new_ui group) من القائمة المنسدلة لحقل Group

ستحتاج إيضا لتعديل الحد الأدنى والأقصى للقيم  (max: 100) في عقدة slider لإظهار الموقع الصحيح في شريط التمرير

dashboards-and-ui-nodes

قم بالضغط على نشر deploy ومشاهدة النتيجة في  صفحتك  Dashboard

dashboards-and-ui-nodes

في علامة تبويب dashboard في FRED يمكنك إعادة ترتيب العناصر في الصفحة.

إذا لم يكن تبويب dashboard ظاهرا لك فانقر على زر القائمة في أعلى الزاوية اليمنى من الصفحة واختر view < dashboard

dashboards-and-ui-nodes

لديك الآن الأساسيات اللازمة لبناء صفحتك الخاصة dashboard باستخدام بيانات العالم الحقيقي وربطها بعقد أخرى.

استخدام مكتبة الرسم البياني للجافا سكريبت لبناء dashboard مخصصة :

سنستخدم في هذا المثال من درس بناء Dashboards وواجهات المستخدم خدمة الويب التي تتمثل في عقدة HTTP حيث تسمح لنا باستضافة صفحات ويب عبر قبول طلبات HTTP

لقد استخدمنا بالفعل هذا النهج في مثالنا الأول دون شرح التفاصيل من خلال عقدة الطقس openweathermap

حيث كانت تولد البيانات في هيكل JSON ثم عرضها تصويريا باستخدام مكتبة  Morris.JS للرسوم البيانية.

تدعم المكتبة 4 أنواع رئيسية من الرسوم: الرسم الخطي والمساحة والأعمدة bar chart والحلقيchart  donut

سنستخدم في هذا المثال الرسم الحلقي لكن الطريقة ستكون نفسها بالنسبة لكل أنواع الرسوم البيانية.

سنبني تدفقًا يتكون من 4 عقد. العقدة الأولى والأخيرة هي عقدة HTTP كمدخل ومخرج تعملان معا بحيث تستقبل طلبات HTTP وترسل ردود HTTP

يمثل التدفق مثالا بسيطا لخادم ويب لرسم بيانات الطقس

dashboards-and-ui-nodes

يستقبل هذا التدفق طلبات HTTP من أي مصدر وليكن المتصفح، عند وصول الطلب يتم الاستعلام عن الطقس عبر عقدة openweathermap ثم يستخدم عقدة القالب template لبناء صفحة HTTP باستخدام بيانات الطقس ثم يمرر ذلك إلى عقدة الاخراج HTTP التي ترسل صفحة ويب للمتصفح.

بالنقر مرتين على عقدة الإدخال HTTP وتهيئتها مع موقعك في هذا المثال سيكون:

/public/weather

وللوصول إليها فيما بعد نستخدم الرابط التالي

https://{user name}.fred.sensetecnic.com/api/public/weather

عند وصول طلب إلى عقدة الإدخال HTTP تتكون رسالة لتحريك العقدة التالية في التدفق وهي عقدة الطقس

تحصل عقدة الطقس على البيانات وفق إحداثيات الموقع الذي تم إعدادها بالنسبة له وتقوم بإرسالها كهيكل JSON إلى عقدة القالبtemplate .

عقدة HTML template  هي عقدة أخرى مبنية في Node-RED ، و التي تشبه عقدة function ، حيث تسمح لك ببناء تعليمات برمجية . فبدلا من استخدام الجافا سكريبت (javaScript)   مثل عقدة function ، فإن عقدة template  تعمل مع نص مثل HTML .

dashboards-and-ui-nodes

قم بكاتبة كود html المستخدم في عقدة template، كما هو موضح أدناه :

يبدأ الكود بهيكل <head>

لتعريف المكتبات الخارجية التي سيتم استخدامها وهنا قمنا بتعريف مكتبات  Morris.JS

لاحظ بأننا قمنا بجمع جميع عناصر صفحة الويب في عقدة واحدة قد لا يكون هذا مناسبا في مشاريع أخرى.

في السطر العاشر <div>  يتم تعريف الاسم والارتفاع

وفي السطر 11 يبدأ الكود المتعلق بالرسم البياني وفقا لمكتبة  Morris.JS  وتحديدا الرسم البياني الحلقي donut chart

في السطر 15 و16 و17   يتم تعريف عناصر الرسم البياني

وهنا تم اختيار 3 عناصر : درجة الحرارة والرطوبة وسرعة الرياح

القيم من عقدة الطقس هيكل JSON يمكن استخدامها بصورة مباشرة عبر تحميلها على الرسالة المتدفقة أي payload.tempC و   payload.humidity و  payload.windspeed

وبمجرد أن تولد عقدة template ملف HTTP تمرر الرسالة إلى العقدة الأخيرة عقدة الإخراج HTTP

وهي عقدة استجابة HTTP. هذه العقدة تحزم HTML كرد HTTP و التي ترسل إلى المتصفح .

الآن قم بالضغط على نشر deploy  ثم توجه في المتصفح إلى الرابط الذي تم تكوينه في عقدة الإدخال HTTP

https://{user name}.fred.sensetecnic.com/api/public/weather

ستظهر النتيجة رسم بياني حلقي بسيط يظهر لك درجة الحرارة والرطوبة وسرعة الرياح بمجرد تمرير المؤشر عليه

dashboards-and-ui-nodes

مشاريع Node-RED متوسطة التدفق (الجزء الثاني)

المقدمة

في هذا الدرس، سوف نبني على الأفكار التي تم عرضها في المحاضرة السابقة و التركيز على الأمثلة التي تكشف بعض المفاهيم الأساسية من الدرس السابق. و يشمل هذا الدرس مزيد من الأفكار مثل ارسال رسائل متعددة على مخرج واحد أو انشاء موقع مدونة خاص بك.

 

الحصول على بيانات الزلازل من API الخارجية و إعادته كرسائل متعددة:

يوضح هذا المثال كيفية الحصول على بيانات من API الخارجية وكيفية فصل تلك البيانات باستخدام عقدة function. سوف نستخدم البيانات من API الخارجية والتي توفر الوصول إلى بيانات الزلزال التي يتم توفيرها من قبل المسح الجيولوجي الأمريكي (USGS) .

(http://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php)

أولا، دعونا نقوم بإنشاء التدفق كما هو بالشكل التالي:

intermediate-flows-part2

قم بالتعديل على عقدة http request للحصول على البيانات من عنوان URL التالي كما هو موضح بالصورة أدناه:

http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.geojson

تحتوي هذه البيانات على الزلازل من الشهر الماضي. بعد طلب البيانات، عقدة JSON  سوف تسمح لك بتحليل محتوى الاستجابة إلى كائن قابل للاستخدام بواسطة عقدة Function التالية .

intermediate-flows-part2

الآن قم بالتعديل على عقدة function وإضافة التعليمات البرمجية كما هو مبين أدناه :

intermediate-flows-part2

شرح الكود :

سيؤدي هذا الكود إلى إنشاء مصفوفة (outputMsgs) تحتوي على مصفوفة من الرسائل التي تم إنشاؤها من بياناتك. تمر حلقة التكرار (For loop) من خلال استجابة JSON وتقوم بإنشاء رسالة جديدة تحتوي على حمولة تحتوي على خط العرض (lat) ، وخط الطول (lng) ، القيمة (value) ، الطابع الزمني (timestamp). ثم سيتم تدفع كائن الرسالة الجديدة إلى مصفوفة outputMsgs  .

فإنه سيتم إنشاء متغير جديد يدعى  (msg2) مع كائن رسالة جديدة تحتوي على عنصر الحمولة مع سلسلة “Second Output”.

وأخيرا، ستقوم الدالة (function) بإرجاع مصفوفة تحتوي على عنصرين. العنصر الأول هو مصفوفة من الرسائل  (outputMsgs); و العنصر الثاني هو رسالة واحدة (msg2). لذلك سنقوم بإعداد عقدة function ليكون لديها مخرجين . لتتناسب مع مجموعة العناصر التي يتم إرجاعها.

عند النقر فوق الزر الموجود على عقدة inject، يمكنك أن ترى الإخراج العلوي يحتوي على مصفوفة من الرسائل التي تم تحليلها من البيانات. هذا يتوافق مع مصفوفة outputMsgs .

intermediate-flows-part2

والمخرج الثاني يحتوي على رسالة واحدة (msg2) :

intermediate-flows-part2

مدخلات متعددة على عقدة function :

تم تصميم عقد function في Node-RED لمعالجة الرسائل ككيانات واحدة. ومع ذلك، قد تعتمك وظائفك في بعض الحالات على مصدرين منفصلين للبيانات. هناك العديد من الطرق للتعامل مع هذه الحالات في Node-RED . يستخدم النهج التالي كائن السياق (context) في Node-RED و الموضوعات للسماح لدالة الانتظار (function wait) لعدة رسائل للوصول من أجل العودة.  لقد تم عرض كيفية إعداد و استخدام بيانات السياق في الدروس السابقة .

سنبدأ من خلال ربط عقدتين inject، و عقدة Function ، وعقدة تصحيح كما هو موضح بالشكل التالي :

intermediate-flows-part2

سنقوم بتعديل عقدة Function وإضافة التعليمات البرمجية كما هو موضح أدناه. سيستخدم هذا الكود كائن السياق في Node-RED وإضافة عنصر البيانات.

شرح الكود:

السطر الأول، لتهيئة كائن السياق. ثم يتم استخدام switch statement  في السطر 2 ليتم البحث عن حقل الموضوع في الرسالة. يستخدم هذا لتعيين حقل task1 أو task2  للكائن context.data  .  وبالتالي يتم تجاهل أي موضوع رسالة أخرى. ثم يتحقق الشطر 16 لمعرفة ما إذا كانت الدالة قد تلقت رسائل من كلا النوعين من المواضيع (task1 and task2). إذا لم يكن الأمر كذلك، ترجع الدالة رسالة خالية (null) وتعود إلى انتظار رسالة أخرى. وإلا فإن السطر 17 يحسب النسبة وينتجها كرسالة.

قم بكتابة الكود اعلاه على عقدة Function كما هو موضح بالشكل التالي :

intermediate-flows-part2

قم بإعداد عقدة inject الأولى لإرجاع حمولة تحتوي على سلسلة من “3” ، مع موضوع “task1” .

intermediate-flows-part2

يجب عليك ايضا إعداد عقدة inject الثانية لإرجاع سلسلة الحمولة من “6” ، مع موضوع“task2” .

يمكنك بعد ذلك نشر التدفق (deploy) . قم بالنقر على الزر الأيسر لعقدة inject الأولى (task1: 3) . ستلاحظ ظهور رسالة تشير أن السلسلة تم ضخها عبر التدفق بنجاح، ولكن لن ترى أي شي على لوحة الإخراج عند تبويب debug . ثم قم بالنقر على الزر الأيسر لعقدة inject الثانية (task2: 6) . ستظهر رسالة تشير بنجاح ضح الرسالة، كما سيظهر على لوحة الإخراج النسبة كما هو موضح بالشكل التالي :

intermediate-flows-part2

السماح لعقدة function بإرسال رسائل متعددة على مخرج واحد :

في الدرس يوضح كيفية إعداد وإرسال الرسائل على عقد إخراج متعددة. يوضح هذا المثال كيفية إرسال رسالة متعددة، ولكن على نفس المخرج، من عقدة function واحدة.

ويستند المثال التالي على تدفق من قبل  Node-RED contributor dceejay  . يمكنك الحصول على التدفق الأصلي في http://flows.nodered.org/flow/5c4c0f5a08d4e91ea14d

أولا، قم بربط عقدة inject و function و delay و debug كما هو موضح :

intermediate-flows-part2

قم بالتعديل على عقدة function و إضافة الكود كما هو مبين بالصورة أدناه. هذا الكود هو بسيط جدا. فهو يحتوي على حلقة التكرار التي تستدعي  “node.send” خمس مرات . تم استخدام node.send في الدرس . فهي تسمح لعقدة function لإخراج الرسائل المنتجة على مخارجها بشكل مستقل عن قيمة الإرجاع. لاحظ فإن الدالة تقوم بترجيع Null . والانتاج المتوقع لهذه الدالة هي سلسلة من الرسائل مع الحمولات :0،1،2،3 و 4 .

intermediate-flows-part2

ولجعل المثال يعيد تجميع عداد أكثر دقة، يمكنك تعديل عقدة التأخير و تهيئته لتقييد معدل الرسائل( limit the rate) إلى 1 في الثانية، كما هو مبين بالشكل التالي:

intermediate-flows-part2

قم الآن بنشر التدفق، ثم الضغط على الزر الأيسر لعقدة inject وفحص لوجة الإخراج عند تبويب debug ، ستلاحظ وصول الرسائل كل ثانية، انظر الشكل التالي :

intermediate-flows-part2

إنشاء موقع مدونة باستخدام Node-RED :

من خلال هذا المثال، سوف يظهر لك كيفية بناء خدمة المدونات الصغيرة مع عدد قليل من العقد في Node-RED  . سنقوم بإستخدام عقد  MongoDB  كتخزين للمشاركات، وعقد http  لتوفير نقاط النهاية للخدمة وعقدة html  لتنسيق صفحة ويب للمدونة.

سنقوم بإستخدام خدمة السحابة المجانية التي تدعى “mongolab” . حيث انها تسمح لك لإنشاء قواعد البيانات “sandbox” التي يمكن استخدامها لنموذج التطبيقات الخاصة بك. قم بفتح الموقع https://mlab.com، ثم قم بالتسجيل للحصول على حساب. ستتمكن بعد ذلك من إنشاء قاعدة البيانات. قم بالنقر على إنشاء جديد “Create New” في لوحة التحكم الرئيسية.

intermediate-flows-part2

قم بملأ النموذج لإنشاء نشر جديد من MongoDB  . قم بتحديد أمازون (Amazon)، ثم قم بإختيار Single-node وحدد الحجم المجاني وهو 500MB .

intermediate-flows-part2

ثم قم بتسمية قاعدة البيانات. سنقوم بتسميتها في هذا المثال “mycontent” . الآن قم بالنقر على إنشاء نشر MongoDB جديد :

intermediate-flows-part2

يسمح لك MongoDB  لإنشاء مجموعات “collections” لكل قاعدة بيانات. وهي مماثلة للجداول في قواعد البيانات العلائقية، كل مجموعة “collection” تحمل الوثائق “documents” التناظرية إلى السجلات “records”  في قواعد البيانات العلائقية. من أجل البدء في استخدام قاعدة البيانات الخاصة بك تحتاج إلى إنشاء مجموعة جديدة. حدد قاعدة البيانات التي تم إنشاؤها حديثا في لوحة التحكم وأضف مجموعة جديدة وسوف نقوم بتسميتها بـ “posts” .

intermediate-flows-part2

وأخيرا، سوف تحتاج مستخدم للإتصال بقاعدة البيانات تلك. قم بإضافة مستخدم قاعدة بيانات جديدة. وسوف نقوم بتسميتها “freduser” .

intermediate-flows-part2

وأخيرا، لاحظ كيف ستوفر لك هذه الصفحة معلومات هامة حول كيفية الاتصال بقاعدة البيانات الخاصة بك. سنحتاج إلى عنوان URI (في حالتنا ds143900.mlab.com)، والمنفذ (في حالتنا  43900) والمستخدم وكلمة المرور الذي تم إنشاؤهما حديثا.

intermediate-flows-part2

الآن، على Node-RED  قم بربط العقد لكل من http-in  وmongodb-in  و template  و http-out   كما هو مبين بالشكل التالي:

intermediate-flows-part2

قم بالتعديل على عقدة http-in لقبول طلب GET  على عنوان URL “/public/posts” كما هو موضح بالصورة التالية :

intermediate-flows-part2

سنقوم الآن بإعداد عقدة mongodb  . انقر نقرا مذدوجا فوق العقدة وقم بإنشاء استصال خاد جديد. هنا هو المكان الذي سوف تستخدم المعلومات من  mongolab  الخاص بك :

intermediate-flows-part2

انقر على إنشاء/تحديث وإعداد العقدة لاستخدام مجموعة  “posts” التي أنشأتها. وإعداده للقيام بعملية العثور، والتي ثوف تجد جميع الوثائث في تلك المجموعة. سنطلق عليه اسم find posts) ) .

intermediate-flows-part2

بمجرد إعداد عقد http و  mongodb ، قم بتكوين عقدة html template  للتعامل مع البيانات التي تم إرجاعها من قبل عقدة  mongodb .

قم بإضافة التعليمات البرمجية التالية :

هذا الكود، يستخدم Bootstrap لتصميم موقع الويب الخاص بك (http://getbootstrap.com/) وتوفير تخطيط استجابة. إذا قمت الآن بزيارة http://{your user name}.fred.senstecnic.com/api/public/posts ستكون قادر على رؤية الموقع الجديد الخاص بك .

intermediate-flows-part2

إذا تم ظهور خطأ (“MongoError: limit requires an integer“)على لوحة الإخراج عند تبويب debug ، قم بإضافة عقدة function قبل عقدة mongodb وقت بكتابة الكود أدناه على عقدة function :

حتى الآن، قمت بإنشاء التدفق الازم لعرض المشاركات.الآن تحتاج إلى إنشاء الجانب الأخر لخدمة blog، التدفق لإنشاء المشاركات وحفظها إلى مجموعة MongoDB  الخاص بك. قم بتوصيل عقد http-in  و mongodb-out  و http-out كما هو موضح بالشكل التالي :

intermediate-flows-part2

قم بالتعديل على عقدة http-in لقبول طلبات PUT في /public/posts .

intermediate-flows-part2

الآن سنقوم بتحرير عقدة function وإضافة التعليمات المبينه أدناه. حيث يبني http msg.header  .

لاحظ في السطر 2 تقوم بتعيين العنوان ليكون نقطة النهاية لخدمتك. سيستخدم هذا اسم المستخدم بدلا من ‘guides’ .

وأخيرا،سوف تحتاج إلى تحرير عقدة mongodb-out وحدد الخادم الذي تم تكوينه مسبقا. قم بتهيئة لاستخدام مجموعة “posts” و عملية إدراج “insert” . تأكد من فحص كائن msg.payload للتخزين فقط only store msg.payload object) ، وبهذا سوف نتأكد من أننا فقط لتخزين البيانات في حمولة الرسالة وليس كائن الرسالة بأكملها .

intermediate-flows-part2

الآن يمكنك الانتقال إلى عنوان  url الخاص بك واستخدام موقع المدونة (blog) حيث سيظهر لك شكل ممثال للصورة أدناه :

intermediate-flows-part2

مشاريع Node-RED متوسطة التدفق

في هذا الدرس، سوف نبني على الأفكار التي تم عرضها في المحاضرة السابقة و التركيز على الأمثلة التي تكشف بعض المفاهيم الأساسية من الدرس السابق. و يشمل هذا الدرس مزيد من الأفكار حول السياق (Context) و الرسائل (Messages) و التدفقات الفرعية (sub-folws) . الأمثلة في هذا الدرس أكثر تعقيدا قليلا من الأمثلة السابقة-  بمعنى أن عقد Function أكثر تعقيدا – ولكن لا تزال بسيطة قدر الإمكان.

intermediate-flows

استرداد البيانات من صفحة ويب :

سنقوم بكتابة التدفق الذي يوفر معلومات حول مؤشرات البورصة من ياهو (Yahoo) في http://finance.yahoo.com/market-overview/ حيث يتم تنسيقه باستخدام عقدة function . إذا قمت بفحص الصفحة المعروضة في الشكل أدناه باستخدام “Inspect Element”  في متصفح كروم ، فستجد أن المؤشرات التلاثة لها نفس فئة CSS تسمى ‘l84’ (وهذا الحرف حرف “L” في المظهر الصغير) . يمكن استخدام هذه الفئة لاسترداد جميع المؤشرات الثلاثة من عقدة html . سوف نقوم بإعداد عقدة inject لتشغيل طلب http للحصول على الصفحة، ثم عقدة html للحصول على العناصر مع فئة ‘l84‘ .

intermediate-flows

يتم تهيئة عقد HTML و http كما هو موضح بالصورة التالية :

intermediate-flows

يتم تهيئة هذه العقد اعلاه لاسترداد مؤشرات البورصة . ثم قم بربط العقد معا كما هو موضح بالصورة أدناه ، مع عقدة debug لإظهار المخرج .

intermediate-flows

يجب أن يحتوي على أحدث قيم الفهرس . عند الضغط على التشغيل على عقدة inject  . سيظهر لك ما يلي في جزء لوحة الاخراج عند تبويب debug  :

intermediate-flows

كان ذلك سهلا ، ولكن ما ترديه حقا هو مصفوفة من JSON وهي ازواج من الاسم:القيم التي تستخدم الاسم لوصف القيم و القيم كأرقام. في الكود أدناه يوضح ناتج JSON المطلوب من مؤشرات الأسهم :

سنقوم بالكتابة على عقدة funcrion لتنسيق هذا بالطريقة التي تريدها . قم بالنظر إلى الكود أدناه فهو يقوم بإخذ اسعار الأسهم الواردة ويخزنهم في  pices (كما هو موضح بالسطر الأول) ، ثم يتم إنشاء مصفوفتين جديدة، واحدة لإحتواء رسائل الإخراج و الثانية لإحتواء الاسم النصي للمؤشرات الثلاثة المختلفة.

في السطور من 5-8 عبارة عن حلقة تكرارمن خلال مؤشرات الأسهم الواردة وكل واحد يدفع زوج من (الاسم:القيمة) إلى مصفوفة رسالة الإخراج.  في السطر 8، يستخدم وظيفة replace بالجافا سكريب لإزالة كل الفواصل من قيم المؤشر قبل تحليلها كأرقام.

الآن قم بإضافة عقدة function ثم قم بكتابة الكود أعلاه :

intermediate-flows

بعد نشر و إختبار التدفق، يجب أن تقوم وحدة التحكم في debug بإخراج شيء مشابة للشكل أدناه . البيانات الآن تبدو جيدة ويمكنك استخدام هذا الشكل لعقد في التدفق الخاص بك .

intermediate-flows

عد الكلمات في السلسلة :

بعد ذلك، دعونا نكتب عقدة Function أكثر تعقيدا والتي تتلقى بعض النصوص في حمولة الرسالة (message payload) ، ثم إخراج رسائل متعددة تحتوي على كل الكلمات الفردية وعدد مرات استخدام كل كلمة .

الكود الموضح أدناه لعدد الكلمات :

في الكود أعلاه، يتم تعريف قائمة رسائل الاخراج و كائن للاحتفاظ بعدد الكلمات (كما هو موضح بالسطر 1 و 2) . في السطر 4 و 5 يتم إزالة علامات الترقيم و المسافات الإضافية من الحمولة (payload) بإستخدام التعابير القياسية (regular expressions) . التعابير القياسية أو المنتظمة (regular expressions) هي أداه مفيدة جدا لمعالجة النصوص ، يمكنك معرفة المزيد عن هذه التعبيرات من خلال الإطلاع على صفحة مطوري برامج Mozilla للجافا سكريبت هنـا . في السطر 7، يتم تقسيم النص إلى كلمات متعددة، ثم يكرر هذا من خلال الكلمات، حيث يتم إنشاء مصفوفة من الكلمات ذو الأحرف الصغيرة إلى عدد الكلمات الذي يدعى wordMap كما هو موضح بالسطور من 8 -15 . في السطور من 16 إلى 18 يتم تقسيم wordMap إلى رسائل متعددة في مصفوفة outputMsgs . وأخيرا، في السطر 21 ، يتم إرجاع المصفوفة التي تحتوي مجموعة الرسائل، و إرسالها جميعا إلى منفذ الإخراج الأول في وقت واحد.

دعونا ننشئ التدفق لنرى كيف يمكن أن تعمل مع بعض النص . أولا، قم بإنشاء عقدة function ، و نسخ التعليمات البرمجية أعلاه. ثم قم بإضافة عقدة inject :

intermediate-flows

قم بتهيئة عقدة inject و إضافة النص التالي كما هو موضح بالصورة :

intermediate-flows

قم بإضافة عقدة debug وربطها مع التدفق كما هو موضح بالشكل التالي :

intermediate-flows

عند النقر فوق عقدة inject ، يجب أن تشاهد قائمة و عدد الكلمات على لوحة الإخراج عند تبويب debug ، انظر الشكل أدناه:

intermediate-flows

استخدام السياق (Context) لتوليد متوسطات التداخل :

وحدة خاصة تسمى السياق (Context) ، وتستخدم لتخزين البيانات بين استدعاءات الـ function، وهو متاح في عقد الـ Function . يمكن أن يكون هذا مفيدا عندما تحتاج الدالة (function) للاحتفاظ بالحالة للقيام بمعالجتها. على سبيل المثال، قد يكون من الضروري حساب قيمة متوسط قراءات بيانات جهاز الاستشعار على مدى فترة من الزمن .

في الكود الموضح أدناه يتم احتساب متوسط التداخل للقيم المتلقاة خلال الـخمس ثواني الأخيرة، يتم اضافة حقل ‘average’ إلى الحمولة (payload) ، عند انقضاء أكثر من 5 ثوان بين الرسائل المستلمة.

عند النظر إلى الكود، سوف تحصل أولا على الوقت الحالي (السطر 1) . إذا لم يكن هناك آخر وقت (lastTime) مخزن في السياق (Context) ، ستقوم بحفظ الوقت الحالي (currentTime) ، و إعادة تعيين مجموع (sum) و عدد (count) متغيرات السياق (كما هو مبين بالأسطر من 3 إلى 7 ).

إذا كان الوقت الحالي currentTime)5)  ثواني ( 5000 ميلي ثانية) أكبر من آخر وقت (السطر 9)، فإنك  تحسب متوسط القيم الأخيرة المستلمة و تدرج ذلك مع الحمولة للرسالة (في الاسطر من 11 إلى 13 ) . ثم يمكنك إعادة تعيين مجموع sum و عدد count و تعيين آخر وقت lastTime و الوقت الحالي currentTime  لبدء العد مرة أخرى.

إذا لم يتم انقضاء 5 ثواني منذ استلام الرسالة الأخيرة، ، يجب تحديث counts و sums (كما هو مبين بالأسطر من 16-19) . ثم تقوم بإخراج الرسالة التي تتضمن أحدث قيمة و متوسط اذا تم حسابها للفترة الزمنية (السطر 20 (.

قم بإضافة عقدة Function  وكتابة الكود أعلاه .

لاختبار هذا، سنقوم بكتابة عقدة Function أخرى، التي تسمى ramp ويستخدم أيضا السياق (context) لتوليد القيم من 0 إلى 9 في التسلسل ، كما هو موضح بالكود ادناه ، دالة (function) لتوليد تسلسل القيم بإستخدام السياق .

intermediate-flows

سنقوم إضافة و ربط عقدة inject إلى التدفق ، ثم قم بإعدادها لإرسال البيانات في كل ثانية، كما هو مبين بالشكل التالي :

intermediate-flows

عقدة inject لضخ حمولة فارغة كل ثانية .

ثم قم بربط التدفق كما هو مبين بالشكل التالي :

intermediate-flows

يجب أن يبدو الناتج كما هو موضح بالشكل التالي :

intermediate-flows

استخدام عنصر السياق لمشاركة الدالة وجعلها في متناول جميع الدوال (Functions) في اللوحة :

في هذا المثال، نوضح كيفية استخدام عنصر السياق (Context) و عنصره العالمي (global) لمشاركة الباينات عبر عقد الـ function . استخدم المثال السابق لتخزين قيمة عددية. ومع ذلك، واحدة من الأشياء العظيمة للجافا سكريبت هو أنه يمكنك تعيين (functions) للكائنات.  هذا يسمح لك لتبادل الأساليب عبر اللوحات الخاصة بك دون الحاجة إلى إعادة تعريفها في كل عقدة function تستخدم على التوالي .

أولا، قم بتوصيل عقدة inject ، وعقدتين Function و عقدتين debug كما هو مبين أدناه :

intermediate-flows

سنقوم بتحرير عقدة function الأولى و إضافة هذا الكود. قم بتعيين عنصر العام (global) من عنصر السياق ليكون عنصر جديد، “hello” ، وهي دالة التي تقوم بترجيع السلسلة  “Hello There” . ثم قم بتعيين الحمولة (payload) للرسالة لهذه الدالة لإرجاع قيم لهذه الدالة العامة (global function) . هذا سيطبع “Hello There”.

في الشكل أدناه يوضح كيفية إعداد عقدة Function الأولى :

intermediate-flows

الآن قم بتحرير عقدة الدالة الثانية من خلال إعداد حمولة الرسالة من الدالة الثانية لتوصيل الإخراج من عنصر ‘hello’ في العنصر العام من كائن السياق مع كلمة “World”.

في الشكل أدناه يوضح كيفية إعداد عقدة Function الأخرى :

intermediate-flows

قم بنشر التدفق، ثم الضغط على زر الموجود على عقدة inject سيظهر لك إخراج كل من عقد الـ Function كما يلي :

intermediate-flows

على الرغم من كونه بسيطا جدا، فإن هذا المثال يوضح مدى سهولة استخدام عنصر السياق لتعيين المتغيرات التي تحتوي على البيانات فقط ، ولكن أيضا الدوال (Functions) التي يمكن مشاركتها و الوصول إليها بواسطة عدة دوال(Functions) في اللوحة الخاصة بك .

هناك جانبان مهمان يجب مراعاتهما هما : أولا، يجب أن تأتي الـ Function التي تحدد العنصر العام (global) في عنصر السياق قبل اي دالة (function) أخرى ترغب في استخدام هذا المتغير أو الدالة في التدفق. ثانيا، في الاصدار (1.11.0) للـ Node-red ، يبقى كائن السياق في الذاكرة بعد إعادة النشر و حتى يتم إعادة تشغيل Node-RED .لذلك حتى بعد حذف عقد الـ Function التي تقوم بتعيين عناصر في العنصر العام (global) ، ستظل هذه العناصر في المتناول حتى يتم تعيينها إلى قيمة خالية “null” .

تعريف و استخدام التدفق الفرعي للتكرار :

كما ذكرنا سابقا، يمكن استخدام التدفقات الفرعية لحزم الدوال (functions) في لوحة العقد الخاصة بك. في هذا المثال، سنقوم بإنشاء تدفق فرعي يعالج مصفوفة من القيم في حمولة الرسالة و ينتج مصفوفة جديدة تمت معالجتها. سنقوم عقدة upstream بتزويد الرسالة مع الحمولة تحتوي على مصفوفة من القيم التي سيتم معالجتها. المخرج الأول لعقدة التكرار (iterate)  سوف نتنتج كل رسالة من رسائل الحمولة مصفوفة رسال إدخال ، الواردة في حمولة الرسالة بالترتيب . المخرج الثاني سوف ينتج رسالة تحتوي على حمولة مع مصفوفة جديدة تحتوي على قيم تم معالجتها.

ابدأ بإنشاء علامة التويب لتدفق فرعي (sub-flow) جديد . قم بسحب عقدة function ، و اضافة الكود الموضح أدناه :

شرح الكود :

في السطرين 1 و 2 ، يتم تعريف عدة متغيرات. currentMessage، لإحتواء رسالة الإدخال الحالية ، outMessage لإحتواء رسالة الإخراج النهائية التي تحتوي على مصفوفة الحمولة التي تم معالجتها، ويستعمل  iState لتسهيل الوصول إلى الحالة الحالية من التكرار من الخاصية msg.iState . في حين يمكن استخدام السياق لإدارة حالة الدالة (function) ، فانه من السهل احتواء الحالة في الرسالة، حيث قد تتلقى مصفوفات جديدة كإدخال قبل إكمال التكرار في مصفوفة أخرى.

في السطر4، يمكنك التحقق لمعرفة ما إذا كانت iState موجودة . إذا لم تكن كذلك، افترض أن الرسالة هي رسالة إدخال جديدة. تحقق من أن الحمولة هي مصفوفة، وإذا لم تكن كذلك، سيتم جعلها واحدة (كما هو مبين بالأسطر من 7 إلى 9). ثم يتم إنشاء كائن حالة التكرار الذي يتضمن الفهرس الحالي، و مصفوفة الإدخال ، ومصفوفة الإخراج، و إضافته إلى msg (كما هو مبين بالاسطر من 10-14) .

إذا كانت iState  موجودة (الاسطر 16-18) ، وانت على علم أن رسالة التكرار تم إنشاؤها بواسطى عقدة function و تم معالجتها في حلقات متكررة . سنقوم بدفعها إلى مصفوفة الإخراج لإرسالها عند الانتهاء.

بعد ذلك سيتم مراجعة ما إذا كنت قد انتهيت أم لا. إذا كنت بحاجة إلى تكرار مرة أخرى (إذا كان الفهرس هو أقل من طول مصفوفة الإدخال ) ، نقوم بتعيين currentMessage إلى الرسالة و تعيين الحمولة  payload إلى الفهر الحالي (كما هو مبين بالاسطر من 20 إلى 22) . عند الإنتهاء من التكرار ، يتم تعيين الرسالة الحالية (currentMessage) إلى null ، و حولة الرسالة إلى مصفوفة الإخراج (outputArray)  وحذف خاصية iState التي لم تعد هناك الحاجة لها.

ثم قم بزيادة المؤشر و إخراج الرسائل إلى نقاط الإخراج. أثناء التكرار، يتم فحص الرسالة الحالية (currentMessage) للتاكد من أنها تحمل قيمة، وإلا (عندما تكون فارغة -null ) تنتهي حلقة التكرار  . و في النهاية ، الرسالة المخرجة (outMessage) لن تكون فارغة و سيتم إرسالها إلى المخرج الثاني.

الآن دعونا نقوم بربط المدخلات و المخرجات إلى التدفق الفرعي (sub-flow) كما هو مبين بالصورة التالية ، سنقوم بتسمية هذا التدفق بإسم ‘Iterate’ .

intermediate-flows

لاختبار التدفق، قم بإنشاء مصفوفة من 1 إلى 5 كما هو موضح بالكود أدناه، ومضاعفة كل عنصر بهذه المصفوفة بمقدار 5 .

 للقيام بذلك، قم بإنشاء عقدة Function جديدة تسمى  [1,2,3,4,5] ثم قم بنسخ الكود أعلاه، حيث يتم بربطها بالتدفق كما هو موضح بالصورة التالي :

intermediate-flows

قم بكتابة الدالة (function) الثانية والتي يتم استخدامها في كل تكرار، كما هو موضح أدناه، حيث تقوم العقدة بمضاعفة الحمولة بمقدار 5  :

قم بإسقاط عقدة function  تم تسمتيها بـ times 5 ، قم قم بربط مدخل العقدة إلى المخرج 1 لعقدة التدفق الفرعي و مخرج العقدة إلى مدخل عقد التدفق الفرعي، كما هو موضح بالشكل التالي :

intermediate-flows

وأخيرا لتشغيل التدفق، استخدم عقدة inject، و إضافة عقدة debug . كما هو موضح بالصورة التالية :

intermediate-flows

قم بالنقر على عقدة inject، يجب أن تعرض لك نافذة الإخراج [5,10,15,20,25]عند تبويب    debug .

الآن بعد إنشاء عقدة لوظيفة التكرار في التدفق الفرعي يمكنك استخدامها في أي من التدفقات الخاصة بك. فسيتم التكرار على اي مصفوفة تحتوي على قيم صحيحة وتطبيق الدالة المحددة.

إنشاء التدفقات الفرعية (Sub-Flows)

تستخدم التدفقات الفرعية (sub-flows)  لإنشاء جزء قابل لإعادة الاستخدام من التدفق، عن طريق تحويل جزء من التدفق إلى عقدة. يمكن للتدفقات الفرعية توفر وسيلة لإعادة استخدام جزء من التدفق في التدفقات الأخرى. التدفقات الفرعية يمكن أيضا ضم التدفقات المعقدة في عقدة للسماح للتدفق ليظهر أكثر بساطة .

create-reusable-sub-flows

خلال هذا الدرس سيتم التعرف على التدفقات الفرعية (sub-flows) و كيفية إنشاءها لإستخدامها في تدفقات أخرى .كما سيتم الاستعلام عن الطقس من خلال Slack .

التدفقات الفرعية (Sub-Flows) :

التدفق الفرعي هو مجموعة من العقد المتصلة التي يمكن إعادة استخدامها بسهولة في تدفق اكبر . التدفقات الفرعية (Sub-flows) هي لإعادة استخدام أجزاء التدفق في الـ Node-RED  كعقد كاملة في لوحة العقد التي يمكنك سحبها إلى التدفقات الخاصة بك. في حين أنه من الممكن حفظ تدفق الأجزاء بإستخدام مكتبة التدفق (كما هو موضح بنهاية الدرس 2) ، وجود أجزاء التدفقات في لوحة العقدة يوفر مستوى من التغليف و المعلومات المخفية. التغليف يعني تنظيمه في عنصر واحد (عقدة) يمكن ان تشير إلى استخدام اسم واحد. إخفاء المعلومات يعني أن الأعمال الداخلية للتدفق شبه مخفية .

يمكن إنشاءه بطريقيتين : إما عن طريق تحديد أجزاء التدفق الخاص بك وإنشاء تدفق فرعي ، أو إنشاء التدفق الفرعي من الصفر . لإنشاء تدفق فرعي عن طريق التحديد، قم بتحديد العقد ، ثم الضغط على menu > Subflows> Selection to Subflows. وهذا سينشئ عقدة تحتوي على التدفق تحت فئة “sub-flows” على لوحة العقد.

create-reusable-sub-flows

يمكنك أيضا إنشاء تدفق فرعية من الصفر عن طريق النقر على menu > Subflows > Create Subflow . بعد إنشاء التدفق الفرعي الجديد ، أو التعديل على تدفق موجود مسبقا بواسطة النقر المزدوج على العقدة في لوحة العقد، سوف تظهر علامة تبويب التدفق الفرعي في الجزء الرئيسي.

على عكس التويب العادي، هذا التبويب يحتوي على أربع أزرار في أعلى اليسار : “edit properties” ، “+ input”, “+ output” and “delete subflow”. في هذا الجزء، يمكنك تعديل التدفق الفرعي، كإضافة العقد عن طريق السحب و الإسقاط لهم إلى منطقة عمل التدفق الفرعي وربطهم بالاسلاك حسب الحاجة . لربط التدفق الفرعي مع التدفقات الأخرى ، قم بإضافة عقدة إدخال واحدة و أي عدد من عقد الإخراج، وذلك باستخدام ازرار + input و +output .

create-reusable-sub-flows

إنشاء التدفق الفرعي :

دعونا ننشئ تدفق فرعي الذي يستخدم التبديل للمخرجات اعتمادا على الـ sentiment  للرسائل الواردة. حيث يمكنك استخدم هذا التدفق لتحليل الرسائل القادمة من مصادر مختلفة، بما في ذلك التويتر . أولا ، قم بإنشاء تدفق فرعي باستخدام :Menu>Create Subflow.  قم بسحب عقدة تحليل Sentiment (Sentiment analysis node) إلى لوحة عمل التدفق، ثم قم بسحب عقدة التبديل (switch) ، قم بإعداد عقدة التبديل (switch) كما هو موضح بالصورة .

create-reusable-sub-flows

هذا سوف يظهر الرسالة إلى المخرج 1 ، اذا كانت النتيجة سالبة، و لمخرج 2 ، اذا كان محايدا، ولمخرج 3 ، إذا كان إيجابيا. الآن، قم بإضافة عقدة ادخال و ثلاث عقد إخراج . ثم قم بربط العقد معا كما هو موضح بالصورة أدناه :

create-reusable-sub-flows

لتعديل اسم التدفق الفرعي، انقر على ‘edit properties’في لوحة عمل التدفق قم بتسميتها شيء مثل Sentiment Switch . سترى العقدة الجديدة تم إدراجها أعلى لوحة العقدفي قسم التدفقات الفرعية ( sub-flows).

create-reusable-sub-flows

دعونا نستخدم هذا لإخراج الرسائل الايجابية فقط عن لعبة الـ Hocky القادمة من التويتر. قم بإضافة علامة تبويب جديدة لعمل تدفق، ثم قم بسحب عقدة التويتر،و عقدة التدفق الفرعي Sentiment Switch الذي قمت بإنشائها، وعقدة التصحيح ،كما هو مبين بالشكل أعلاه. قم بتوصيل عقدة التويتر إلى مدخل عقدة Sentiment Switch و عقدة debug إلى ثالث مخرج لعقدة Sentiment Switch. قم بتهيئة عقدة التويتر عن طريق اعتماد الحساب و إعدادها كما هو موضح أدناه :

create-reusable-sub-flows

قم بنشر deploy ، بعد دقيقة أو نحو ذلك، نأمل أن شخص قام بالتغريدة حول شيءا إجابيا عن الـهوكي ، وسترى بعض النتائج في لوحة الإخراج على تبويب debug .

تغليف عقد  Function باستخدام التدفقات الفرعية :

التدفقات الفرعية هي أيضا وسيلة لحزم عقد الـ Function بحث تظهر في لوحة العرض الخاصة بك و يمكن سحبها إلى التدفقات الخاصة بك لتسهيل إعادة الاستخدام. ولتوضيح ذلك سنقوم بعمل حزمة لوظيفة العد داخل التدفق الفرعي. للبدء ، قم بإنشاء علامة تبويب لتدفق فرعي جديد. ثم قم بإسقاط عقدة function و إضافة الكود الموضح أدناه :

إنشاء تدفق فرعي كما شرح بالسابق، ثم قم بربط المدخلات و المخرجات على عقدة function لإنشاء التدفق الفرعي كما هو موضح بالصورة أدناه ، قم بتسمية التدفق الفرعي بـ ‘Counter’ .

create-reusable-sub-flows

لإختبار التدفق ، قم بإضافة تبويب تدفق جديد ، ثم قم بإضافة عقدة inject و عقدة debug ، كما هو مبين بالشكل أدناه . قم بالتأكد بإختيار  ‘complete msg object’ على عقدة debug لرؤية خاصية عدد الرسائل التي تم إضافتها .

create-reusable-sub-flows

الآن لديك التدفق الفرعي ‘Counter’   يمكنك استخدامه في اي وقت تشاء في مواقع متعددة في التدفق .

إنشاء Slack Bot للاستعلام عن البيانات :

دعونا نختم هذا الدرس مع مثال أكثر تعقيدا يستخدم أحد العقد ضمن المجموعة الموسعة التي تقدمها FRED -عقدة slack bot و الاستفسارات عن البيانات من منصة Openweathermap  .

Openweathermap هي المنصة التي توفر بيانات توقعات الطقس في جميع أنحاء العالم. بإستخدام APIs من الموقع، أنت قادر على الاستعلام عن اي موقع في Slack  . سوف تحتاج إلى اعداد حساب مطور على Openweathermap  من أجل استخدام عقدة openweathermap في FRED  .

 في هذا المثال، سوف تتعلم كيفية بناء Slack التي تسمح لمستخدم Slack للإستعلام من منصة openweathermap  و إرجاع بيانات الطقس على أساس ما تم الاستعلام عنه.

في هذا المثال سوف تحتاج إلى إنشاء عضوية Slack Bot (يمكنك الاطلاع على مزيد من المعلومات من هنـا) الذي من شأنه أن تكون بمثابة المستخدم الواقعي في تطبيق Slack الخاص بك .لذلك قم بإنشاء Bot جديد من خلال الرابط هنـا ، انظر إلى الصورة ادناه.  إذا لم يكن لديك حساب Slack ، سيتم إرشادك من خلال إنشاء حساب قبل أن تتمكن من العودة إلى خدمة bot .

create-reusable-sub-flows

بعد إنشاء Slack Bot الخاص بك سوف تحصل على رمز (API Token) ، كما هو موضح بالصورة التالية :

create-reusable-sub-flows

بعد ذلك، سوف تحتاج إلى أن يكون لديك عقدة openweathermap  المثبتة في FRED . ببساطة يتم تثبيت عقدة openweathermap من خلال “Add or Remove Nodes” من الشريط الجانبي .

للقيام بذلك، يجب عليك تسجيل الدخول إلى حساب FRED ، وإعداد لوحة جديدة للتدفق. قم بسحب و اسقاط عقدة Slack Bot إلى لوحة عمل التدفق. قم بالضغط مرتين على العقدة ليتم إضافة Slack Bot API  الخاص بك ، كما هو مبين بالشكل أدناه. يمكنك الاستماع إلى قناه محددة عن طريق تعيينها في حقل Channel .

create-reusable-sub-flows

الآن قم بربط عقدة function و انقر مرتيين عليها ليتم تهيئتها. سوف تحتاج إلى إعداد مخرجين إلى عقدة function  .
قم بنسخ ولصق الكود أدناه، وظيفية الكود هي تحليل استعلام يستند إلى نص:

create-reusable-sub-flows

وظيفة عقدة Function هو تحليل الرسائل الواردة من قبلBot الخاص بنا . إذا كانت الرسائل تحتوي على كلمتين ويتم فصل الكلمات بواسطة “,” ، سيتم قطع(فصل) أجزاء السلسلة و إنشاء معلمة استعلام في راسلة الإخراج. وهذا الذي سيكون في متناول اليد في الخطوة التالية .

بعد ذلك، يتم ربط عقدة openweathermap إلى عقدة Function ولا تنسى إضافة API في علامة التبويب التهيئة في الحقل المخصص .

بعد ذلك، يتم ربط عقدة Function بعد عقدة  openweathermap لتحليل استجابة الانتاج.

create-reusable-sub-flows

ثم قم بإضافة التعليمات البرمجية التالية داخل عقدة Function المضافه:

وأخيرا، سوف تحتاج إلى إضافة عقدة Slack bot للإخراج و تهيئتها مع Bot API Token و القناه. و تصميم التدفق النهائي لهذا الدرس موضح بالصورة أدناه :

create-reusable-sub-flows

الآن، لإختبار عمل التدفق، عد إلى صفحة الرئيسية Slack الخاصة بك ، ثم قم بإضافة الـ Botاالذي قمت بإنشاءه على قناه #general كما هو موضح بالصورة أدناه :

create-reusable-sub-flows

عند نشر التدفق و عد إلى الصفحة الرئيسية للـ Slack الخاصة بك وقم بكتابة Jeddah, SA ، سوف يقوم التدفق  بالاستعلام عن الطقس منopenweathermap  وتحليل بيانات توقعات الطقس إلى Slack bot ، سوف يظهر لك على Bot الخاص بك بيانات الطقس كما هو موضح بالصورة أدناه :

create-reusable-sub-flows

نموذج البرمجة Node-RED

كما وضح في الدروس السابقة، يستخدم Node-RED التدفق المرئي القائم على نموذج البرمجة. هذه ليست صفة فريدة لـ Node-RED  . فقد استخدم نهج مماثل في العديد من المجالات الأخرى مثل الموسيقى و الوسائط المتعددة (Max MSP) ، ولعب الأطفال (Lego Mindstorms) ،  والأتمة الصناعية (LabVIEW) .  مثل هذه الأدوات ،Node-RED يجعل من السهل التنقل بين التصميم و التطوير لمهام الاندماج السريع ، النماذج و التنمية . وقد تم الإطلاع على كيفية إنشاء تدفقات و ربط العقد معا، وبعض أساسيات البرمجة في Node-RED  .

في هذا الدرس، سوف نلقي نظرة أكثر تفصيلا على نموذج البرمجة لـ Node-RED   و بعض المفاهيم الأساسية، وإكتشاف تفاصيل نموذج تدفق الرسالة الذي يكمن وراء Node-RED  . ثم التعمق في كيفية برمجة عقد function  باستخدام الجافاسكريبت (JavaScript)و إنشاء التدفقات الفرعية التي يمكن إعادة إستخدامها لإضافة المهام الخاصة بك إلى مجموعة من العقد المتوفرة مع Node-RED  .

the-node-red-programming-model

نحن نستخدم نسخة استضافة سحابة من Node-RED عن طريق FRED . قم بالتسجيل للحصول على حساب مجاني في FRED . للإطلاع على المزيد حول FRED من هنـا.

عقد الـ Function :

عقد الـ Function من العقد التي يمكنك استخدامها عندما لا يكون هناك عقدة موجودة مخصصة لمهمتك في متناول اليد. باستخدام عقدة Function، يمكن ان تكتب بنفسك كود جافا سكريبت (javaScript) الذي يعمل على الرسائل التي مرت و إرجاع الرسائل إلى العقدة التالية للمعالجة. لكتابة عقدة function ، يمكنك كتابة دالة جافا سكريبت (javaScript) باستخدام محرر الكود المدمج كما هو مبين بالصورة أدناه :

the-node-red-programming-model

الكتابة على عقدة Function :

دعونا نبدأ كتابة عقد Function . سوف نقوم بإنشاء تدفق بسيط من عقدة inject و عقدة debug كما هو موضح بالصورة

the-node-red-programming-model

أبسط عقدة Function هي التي ترجع Null . عندما يتم ترجيع null ، لا يتم تمرير رسالة إلى العقد التالية في التدفق و التدفق ينتهي هنا. لإنشاء العقدة التي تمرر الرسالة “كما هي” ، يمكنك إرجاع الرسالة نفسها . وهذا الكود يكون في العقدة افتراضيا، كما هو موضح أدناه :

دعونا نضيف بعض المحتوى إلى الحمولة، في هذا المثال، و المجموعة التالية من الأمثلة التي ستستكشف كتابة كود جافا سكريبت (JavaScript) لعقدة function ، سوف تستخدم نفس التدفق في الصورة أعلاه وعن طريق تعديل عقدة function لتغيير كود الجافا سكريبت باستخدام محرر عقدة function، كما هو موضح بالصورة ادناه :

the-node-red-programming-model

كود عقدة Function يعمل على إضافة نص للحمولة :

في هذا الكود، سيتم إضافة سلسلة “world” إلى حمولة الرسالة الواردة (السطر الأول ). ثم يتم إرسال هذه الحمولة المحدثة. وذلك باستخدام الإرجاع (return) ، كرسالة مخرجة (السطر 2)إلى العقدة التالية في التدفق

عند كتابة الكود أعلاه في محرر عقدة function ، عند نشرة و اختبار التدفق سترى في لوحة الإخراج عند تبويب debug الطابع الزمني لعقدة inject و النص “world” ملحق به.

إذا قمت بتعديل عقدة inject  لضح سلسلة (string) بدلا من الطابع الزمني (timestamp) ، وتعيين السلسله لـ “hello” ، سوف بتظهر لك الرسالة “hello worls ” في لوحة الإخراج عند تبويب debug عند نشر واختبار التدفق .

إنشاء و إرجاع رسالة جديدة في عقدة Function :

في الكود أدناه يبين كيفية إنشاء رسالة جديدة عن طريق تعريف رسالة جديدة newMsg ، وتعيين سلسلة “new payload” إلى خاصية الحمولة (payload) (في السطر 1), ومن ثم إرجاع الرسالة الجديدة في السطر 2.

قم بالتعديل على محرر عقدة function  في التدفق لكتابة الكود كما هو موضح بالصورة التالية :

the-node-red-programming-model

 فعند نشر التدفق و الضغط على زر عقدة inject ، سيتم إخراج الرسالة الجديدة التي تم إنشائها لتصل إلى عقدة debug  .

إنشاء و ارجاع رسائل متعددة في عقدة Function :

عقدة Function تسمح ايضا لإعدادها مع نواتج متعددة. وبمجرد إعداد نواتج متعددة، يمكنك إرسال رسائل متعددة، واحدة لكل مخرج، وذلك باستخدام مجموعة (array).

أولا، دعونا تعديل عقدة function ليصبح للعقدة ثلاثة نواتج، وذلك باستخدام إعداد العقدة كما في الصورة ادناه :

the-node-red-programming-model

الكود ادناه يوضح كيفية إرسال رسالة إلى واحد من ثلاثة نواتج مختلفة على أساس قيمة الحمولة “high”,”med”,”low”

السطر الأول يقوم بالتحقق من الحمولة القادمة إذا تم تعيينها على أنها “high” ، اذا تحقق الشرط يتم تمرير الرساله على المخرج الأول و رسالة null على المخارج الأخرى ، من خلال return [ msg, null, null ]. و “med ” يمرر الرسالة على المخرج الثاني و اي شي آخر يتم إرجاعة على المخرج 3 .

لتجربة ذلك ، قم بإيصال ثلاث عقد inject  و ثلاث عقد إخراج كما هو مبين بالشكل أدناه .

the-node-red-programming-model

قم بالتعديل على كود عقدة الـ function كما هو موضح أدناه :

the-node-red-programming-model

قم بإعداد عقدة inject لتعيين سلسلة نصية إما low ، med ، high ، قم بنشر و اختبار التدفق .

the-node-red-programming-model

حيث انه من الممكن إرسال رسائل متعددة من عقدة function في التسلسل. للقيام بذلك ، للقيام بذلك، قم بالاطلاع على الكود ادناه ، يوضح كيفية كتابة دالة تقوم بإرجاع 10 رسائل جديدة تحتوي على حمولة عدد من 0 إلى 9 . في السطر الأول يتم إنشاء المجموعة array  الجديدة باسم msgList لعقد الرسائل. في السطر 2 و 3 عبارة عن loop حلقة 10 مرات لإضافة عنصر جديد إلى مجموعة msgList . و أخيرا ، السطر 5 يقوم بإرجاع المصفوفة array ، والتي تحتوي على عنصر و الذي هو بحد ذاته مجموعة من 10 عناصر .  كما رأيتم في المثال السابق، من خلال ارجاع المصفوفة array من عنصر واحد ، فبالتالي يتم ارسال الرسالة غلى المخرج 1 من العقدة. وبما ان العنصر يحتوي على 10 عناصر ،فإن Node-red يرسل كل عنصر على شكل سلسلة من الرسائل المتتابعة على المخرج 1 .

عقد Functions :

كود عقدة function الخاصه بك لديها امكانية للوصول إلى عدد قليل من الوظائف المضمنة في وحدة العقدة . وهذه تسمح لك لتسجيل النص إلى وحدة الإخراج أو التصحيح debug و ارسال الرسائل عن طريق استدعاء الـ function  بدلا من إرجاعهم من عقدة function  نفسها .

node.log() – تسجيل الرسائل إلى وحدة التحكم
node.warn() – تسجيل الرسائل إلى وحدة التحكم ورسالة التحزير في لوحة الإخراج عند تبويب debug  .
node.error() – تسجيل إلى وحدة التحكم و الخطأ في لوحة الإخراج التصحيح debug  .

في FRED ،يمكن عرض  وحدة التحكم (console) لـ Node-RED  من خلال الذهاب إلى الصفحة المقصودة، ثم النقر على قائمة  Console. حيث أنه يمكن أن يكون التنقل بطيء بين محرر NR ووحدة التحكم، بعد عرض وحدة التحكم ، قم بالضغط على زر تحديث لمعرفة التحديثات إلى وحدة التحكم (console) . كما ان الوظائف node.warn  و node.error ايضا هم مخرجات على لوحة الإخراج في تبويب debug ، فإنه من المفيد في بعض الأحيان الاستفادة من هذه الوظائف لتصحيح الأخطاء عندما تكون وحدة التحكم غير متوفرة.

the-node-red-programming-model

وبالإضافة إلى وظائف التسجيل logging و تصيحي الأخطاء debugging ، وظيفة node.send() يمكن استخدامها لإرسال رسائل إلى العقدة في التدفق باستخدام وظيفية الاستدعاء، بدلا من إرجاع الرسائل . الكود أدناه يوضح كيفية استخدام node.send() في عقدة function ليرسل رسالة بعد فترة محددة من الوقت .

وتشمل وحدات أخرى متوفرة  لعقد function ، حيث تشمل ما يلي :

console – في حين تتوفر وحدة التحكم (consol ) Node.js ، إلا أن node.log() هو الأسلوب المفضل للتسجيل.
util – وحدة Node.js util . يقدم هذه الوحدة خدمات مفيدة مثل وظائف سلسلة الشكل وتوليد تمثيل سلسلة من الكائنات.
Buffer – وحدة Node.js Buffer هي للتعامل مع البيانات الثنائية من TCP streams او من الملفات .

السياق (Context) :

كما تعلمت أن الرسائل هي الطريقة الوحيدة للحصول على بيانات الدخول و الخروج من العقد . في حين أن هذا غير صحيح عموما، هناك استثناء واحد لهذه القاعدة وهي متاحة لعقدة Function . عقد funcrion  لها قدرة على الوصول إلى كائن خاص يسمى السياق (context) و الذي يتم استخدامه لحفظ البيانات في الذاكرة التي تستمر من رسالة إلى وصول الأخرى. وهذا أمر مهم للعقد التي تحتاج إلى الحفاظ على مؤشر أو العقد أو مجموع البيانات في الرسائل. وبالإضافة إلى هذا السياق المحلي، يوجد السياق العالمي context.global وهو متاح لتبادل البيانات بين كل من عقد function من التدفق.  وسيتم تغطية استخدام السياق عند مناقشة عقدة function في مزيد من التفاصيل .

استخدام السياق (Context) في عقدة function :

وحدة خاصة تسمى السياق (Context) ، تستخدم لتخزين البيانات بين استدعاء الـ function ، ويتوفر على عقدة function . وهي مفيدة عندما تحتاج وظيفية للإحتفاظ بالـ state للقيام بالمعالجة . على سبيل المثال، دعونا نستخدم السياق (context) لحساب عدد الرسائل التي تمت معالجتها في عقدة function عندما تم نشرها. دعونا ننشئ عقدة function التي تضيف خاصية العد إلى كل رسالة تقوم بمعالجتها، كما هو موضح بالكود ادناه .

ويمكن التوصيلها، عادة يتم بناء التدفق كما هو موضح بالصورة أدناه :

the-node-red-programming-model

تأكد من تغيير عقدة debug لعرض  ‘complete msg object’ حتى تتمكن من رؤية خاصية العد.

the-node-red-programming-model

قم بنشر (Deploy) و اختبار التدفق

the-node-red-programming-model

ستلاحظ ان السياق يتم إعادة تعيينه كل مرة يتم نشر عقدة Function  . إذا كنت بحاجة لحفظ الـ state بين عمليات النشر ، وسوف تحتاج إلى استخدام بعض وحدات التخزين الخارجية مثل ملف أو قاعدة تخزين .

استخدام السياق العالمي (Global Context) :

بالإضافة إلى سياق عقدة Function الفردية ، وحدة السياق العالمية هي متاحة لمشاركة السياق بين عقد Function . دعونا نستخدم هذه الوحدة لمعرفة مدى دقة عقدة التاخير (delay) ، كما هو مبين بالشكل التالي :

the-node-red-programming-model

يظهر الكود لعقدة Function لحفظ وقت بدء التدفق في خاصية السياق العالمي أدناه :

وفي عقدة الـFunction الأخرى ، يتم احساب الوقت المنقضي، حيث نقوم بإنشاء رسالة تحتوي على الوقت الذي انقضى منذ مرور الرسالة من خلال عقدة Function لحفظ وقت البدء ، كما هو مبين بالكود أدناه :

إضافة و إعداد عقدة التأخير (delay) لتأخير الرسالة لمدة 2 ثانية ، ثم انقر على عقدة inject ، والانتظار حوالي 2 ثانية . إذا سارت الأمور بشكل جيد، فإن إخراج عقد debug  يجب أن تشير إلى الوقت المنقضي وهو على مقربه من 2 ثانية .

وميزة هذا النهج هي أننا لا نحتاج رسالة لتحمل وقت البدء. و العيب هو أنه وصلت رسالة أخرى في حفظ وقت البدء قبل الوقت المنقضي ، سيتم الاستبدال و الكتابه على المتغير context.global.startTime .

حفظ كود Function الخاص بك في مكتبة :

بمجرد أنك انشأت بعض التعليمات البرمجية للاستخدام في عقدة function ، غالبا ما يكون مفيد حفظ هذا الكود لإعادة استخدامه في وقت لاحق. وثمة طريقة للقيام بذلك وهو قص و لصق الكود إلى function جديدة، ولكن لتوفير الوقت، يمكنك استخدام مكتبة عقدة function التي تم إنشاؤها في Node-RED .

لحفظ الكود الخاص بك في مكتبة الـ Function ، انقر على ايقونة الكتاب في حوار إعدادات عقدة function على الجانب الأيمين لمربع تحرير اسم النص (Name) ، ثم اختر “Save to Library” حفظ إلى المكتبة .

the-node-red-programming-model

يمكنك بعد ذلك توفير اسم المجلد و اسم الملف لحفظ الكود كما هو مبين بالشكل أدناه :

the-node-red-programming-model

للاستفادة من التعليمات البرمجية الخاصة بك يمكنك إنشاء عقدة function جديدة، ثم النقر على أيقونه الكتاب ، ثم الضغط على  “Open Library…” مكتبة مفتوحة ثم إختيار مكتبة الكود المحفوظة.

the-node-red-programming-model

سيتم تحميل التعليمات البرمجية في مربع الحوار. إذا كان هذا هو الكود الذي تريده. انقر فوق موافق (OK) ، وسوف تضاف إلى عقدة Function الخاص بك. يمكن بعد ذلك تعديلها حسب الحاجة .

جولة حول العقد الأساسية (الجزء الثالث)

العقد الأخرى :

العقد التالية متوفرة في FRED  ولا تكون مع الفئات الأساسية التي توفرها vanilla Node-RED  .  وهذه تشمل العقد للوصول و السيطرة على خدمات google ، وعقد الشركة مثل الوصول إلى Salesforce ، و العقد للوصول إلى  API النقل (مثل النقل إلى لندن) و العقد المتنوعة الأخرى للوصول إلى خدمات الطقس، … الخ.

a-tour-of-the-core-nodes-3

عقد Google :

FRED يدعم العديد من عقد Google  للتفاعل مع مجموعة واسعة من خدمات Google .

اسم العقدةالوصف
Google plusيتفاعل مع Google + API  للحصول على معلومات عن الأشخاص والأنشطة و التعليقات .
الأشخاص (People) – يسمح لك بالتفاعل مع الملفات الشخصية في Google+  . يمكنك الحصول على ملف شخصي معين ، و البحث عن ملف شخصي ، أو جمع قائمة الأشخاص التي إعادة مشاركة النشاط .
الأنشطة (Activities) – يسمح لك بالتفاعل مع الأنشطة في Google+  . ويمكنك الحصول على نشاط معين ، و البحث عن نشاط ، أو جمع قائمة الأنشطة التابعة لشخص.
التعليقات (Comments) – يسمح لك بالتفاعل مع التعليقات في Google+  . ويمكنك الحصول على تعليق معين ، أو جمع قائمة من التعليقات التابعة لنشاط معين.
googleplacesللعقدة درجة عالية من المرونة التي تستخدم API لأماكن Google  من اجل إيجاد و معرفة المزيد عن المؤسسات المحلية. البحث يمكن أن اعتمادا حسب الترتيب،  السعر ، الكلمات الرئيسية أو اللغة … الخ.
Google calendar inعقدة لمراقبة التقويم و إرجاع رسالة قبل أو عند أو بعد وقوع الحدث في التقويم. يتم تهيئتها لوضع متى يتم بالضبط إنشاء الرسالة .
Google calendar outإنشاء إدخال في تقويم Google على أساس :
الحمولة (payload) – إما سلسلة لوصف الحدث باستخدام صيغة الإضافة السريعة أو كائن يمثل نص طلب لإدراج الطلب.
التقويم (calendar) – التقويم الذي يتم إضافة الحدث
إرسال الإشعارات (sendNotifications) – قيمة منطقية لتحديد ما إذا كان ينبغي إرسال إشعارات للحاضرين (اختياري، افتراضيا تكون false).

عقد Fitness :

عقد fitness   في FRED  تغطي عدد من أجهزة اللياقة البدنية .

اسم العقدةالوصف
stravaالحصول على نشاطك الأخير على Strava  .
هذة العقدة ترجع النشاط الأخير في حساب المستخدم الذي تم توثيقه كلما يتلقى رسالة. يتم إرجاع النشاط، و المكان و الزمان عندما تكون متوفرة.
Fitbit inاستطلاعات Fitbit  للبيانات الجديدة على فترات منتظمة. يتم توليد الرسائل التي تمت انشاؤها بواسطة خاصية  NodeType ( الأهداف goals ، وضع السكون sleep او badges )
Fitbit activitiesاسترداد بيانات المستخدم من Fitbit  و إرجاع msg.payload تحدده خصائص nodetype .
يمكن تعيين الخاصية msg.data إلى ISO 8601 تنسيق التاريخ (على سبيل المثال، 2014/9/25) لاسترداد بيانات السجل للأنشطة . إذا لم يتم توفير التاريخ، فيتم استرداد البيانات لهذا اليوم .
jawboneهذه العقدة يتم استخدامها لاسترداد التدريبات التي أنجزت منذ ذلك الوقت المقدم (المقدم كـ  Epoch) .هذه المرة يمكن تمريرها في إعدادات العقدة أو قسم msg.startime من مدخلات الرسالة . القيمة المعينة على العقدة تأخذ حق الأولوية على محتويات الرسالة الواردة .

عقد الطقس (Weather nodes) :

FRED يضيف مجموعة من العقد لمنح حق الوصول إلى مجموعة متنوعة من الخدمات الجوية .

اسم العقدةالوصف
openweathermapالعقدة للاستعلام من الموقع openweathermap.com للحصول على معلومات الطقس للمدينة/البلد أو من خلال خطوط الطول/ العرض . يوجد عقدتين : واحدة يتم تهيئتها من واجهة المستخدم ، وواحدة يمكن أن تقبل معلومات الإعداد كرسالة إدخال .
forecastioعقدة للاستعلام من موقع forecastio.com للحصول على معلومات الطقس لمكان معين عن طريق زوج من خطوط الطول/ العرض . توجد عقدتين: واحدة تهيئتها من خلال واجهة المستخدم، وواحدة يمكن أن تقبل معلومات الإعداد كرسالة إدخال .
wundergroundالعقدة لاستفسارات (Weather Underground API) لبيانات الطقس الحالية بشكل دوري ، و إرجاع البيانات عندما يتم الكشف عن تغير في الطقس . توجد عقدتين : واحدة يتم تهيئتها من خلال واجهة المستخدم، وواحدة يمكن أن تقبل معلومات الإعداد كرسالة إدخال .

عقد النقل (Transport nodes) :

اسم العقدةالوصف
TfL busهذه العقدة تمكن المستخدم من الحصول على الحافة أو الباص النهري اعتمادا على المعلومات عن الخطوط المحددة لمكان وصوله على المحطة المختارة. العقدة ترجع اول سيارة/سفينة من أجل التوصيل إلى موقف معين. يتم توفير البيانات عن طريق النقل في لندن .
يتم توفير البيانات عن طريق النقل في لندن .
fTfL undergroundعقدة للحصول على حالة الخط تحت الأرض للميترو و انفاق لندن . تقوم بإرجاع مجموعة متنوعة من المعلومات عن حالة الخط المحدد بما في ذلك الوضع العام ، ومعلومات التعطل … الخ .

عقدة Salesforce :

تتوفر مجموعة من عقد  SalesForce التجريبة مع FRED .

اسم العقدةالوصف
salesforceهناك مجموعة من 5 عقد التي تتفاعل مع خدمة salesforce.com  . يمكن للعقد أن تولد الاستفسارات SOSL ، و بيانات DML ، و الاشتراك في تدفق API salesforce أو تحليل كائنات الرسالة الصادرة .

عقد Formatting :

اسم العقدةالوصف
momentعقدة المنسق للوقت /التاريخ تأخد كمدخل إما   (JS) كائن التاريخ و الوقت أو سلسلة (String ).
إذا كان المدخل null (لاوجود لها أو كانت السلسلة فارغة ) ، سيتم استخدام الوقت والتاريخ الحالي . وهذا يمكن أن تستخدم لإضافة الطابع الزمني timestamp  الحالي إلى تدفق من أي نوع .
الإخراج يكون سلسلة منسقة أو كائن تاريخ على msg.payload ، يتم التغيير عن طريق تعيين حقل الإخراج output .

جولة حول العقد الأساسية (الجزء الثاني)

مجموعة عقدFRED :

تضيف خدمة FRED  عدد من العقد إلى المجموعة الإفتراضية القياسية . وهذه العقد الجديدة ، إما أن تكون كتبت لـ FRED أو تم تجميعها من العامة، كما أنها توفر وظائف مفيدة والتي توسع قدرات مجموعة عقد vanilla.

ملاحظة : تتوفر هذه العقد في FRED عن طريق تثبيتها باستخدام لوحة تركيب FRED  . لمعرفة كيفية تثبيت العقدة الإطلاع على هذا الدرس.

كما ستلاحظ، الغالبية العظمى من هذه العقد الإضافية تركز على الخدمات و القدرات التي تتناسب مع طبيعة FRED ، أي الخدمات التي تعتمد على السحابه. في كثير من الحالات  تركز على استخدام Node-RED  للدمج مع شبكة الإنترنت أو للوصول إلى الخدمات على مستوى المشاريع .

the-extended-fred-node-set
the-extended-fred-node-set

المجموعة الموسعة من عقد وسائل الاعلام الاجتماعية  :

كما تلاحظ، يضيف خدمة FRED  عدد كبير من عقد وسائل الاعلام الاجتماعية التي تتراوح بين Pushbullet إلى Slackbot إلى الانستجرام (Instagram) .

اسم العقدةالوصف
 pushbullet inيتصل بخدمة Pushbullet  ويتلقى عناصر البيانات Pushbullet  من جميع الأجهزة المتصلة . تدعم البيانات، و الملفات ، و الروابط.
pushbullet outيسمح لك بإرسال رسائل Pushbuttet  لجميع الأجهزة التي تحتوي على تطبيق Pushbullet  .
 XMPP inيتلقى رسائل من خادم الرسائل الفورية XMPP  . ويشير حقل الأصدقاء (buddy)إلى الأصدقاء أو الغرفة الذي يتلقون منها. يتم تسليم معلومات التواجد على خط الإنتاج الثاني.
XMPP outيرسل رسائل إلى خدمة الرسائل الفورية XMPP  . يستخدم الموضوعات لإرسالها إلى الغرف (القنوات) ويدعم مشاركة التنبيهات.
slackعقدة توفر طريقة بسيطة للإضافة على قناة slack  المحددة بواسطة webhook URL الخاص بها. يمكن تهيئة إسم المستخدم و الرمز التعبيري و دعم المرفقات .
slackbot inالعقدة لإستخدام bot التي قمت بإنشائها على Slack   ويوفر مستمع في أي قناة يكون بها Slack bot عضوا. إخراج msg.payload مثل الرسالة الواردة . و إخراج msg.SlackObj  مع تفاصيل رسالة Slack كاملة .
slackbot outالعقدة لإستخدام bot  التي قمت بإنشائها على Slack  ويرسل msg.payload إلى Slack إعتمادا على أساس الرمز المميز Bot API  . يمكنك تجاوز القناة المقصودة إذا لزم الأمر – سواء في محرر الحوار (edit dialogue) أو بواسطة msg.channel  .
deliciousالقعدة لحفظ المواقع المفضلة لحساب Delicious  الخاص بك . الحمولة payload يجب أن تحتوي على URL  للحفظ، و msg.title  يحتوي على اسم الإشارة المرجعية للموقع المفضل.ويمكنك وضع وصفا في حقل الوصف الإختياري.
pinboardالقعدة لحفظ المواقع المفضلة لحساب Pinboard   الخاص بك . الحمولة payload يجب أن تحتوي على URL  للحفظ، و msg.title  يحتوي على اسم الإشارة المرجعية للموقع المفضل.ويمكنك وضع وصفا في حقل الوصف الإختياري.
flickrيحفظ الصور إلى حساب Flickr الذي تم إعداده. msg.payload   تتطلب buffer مع الصورة ، ويمكن وضع عنوان و وصف و علامة للخصائص.
foursquareيستعلم حساب Foursquare  الخاص بك للحصول على الأماكن الموصى بها اعتمادا على موقعك . يتم ترجيع النتيجة كرسالة أو مجموعة من الرسائل .
swarm inالعقدة للإستطلاع كل 15 دقيقة لـ Foursquare storm check-ins . ويتم إرجاع النتيجة ككائن JSON .
swarm outعقدة استعلام Swarm التي يمكن استخدامها للبحث عن كافة Swarm check-ins من قبل المستخدم .
instagram inيستعلم من حساب الانستجرام الذي تم إعداده كل 15 دقيقة عن الصور الجديدة التي يتم تسليمها واحدة لكل رسالة ، إما كـ كائن Buffer أو URLs .
instagramنفس عقدة Instagram in ، إلا أنها يتم تشغيلها بواسطة الرسالة الواردة .

المجموعة الموسعة من عقد التخزين (storage nodes) :

 

اسم العقدةالوصف
 amazonS3 watchعقدة Amazon S3 watch ،  تعمل على مراقبة ملف الأحداث . افتراضيا، يتم الإبلاغ عن جميع ملف الأحداث، ولكن نمط اسم الملف يمكن توفيره للحد من الاحداث على الملفات التي لها أسماء كاملة والتي تتطابق مع نمط glob. تتكون رسائل الحدث من اسم الملف الكامل في خصائص msg.payload ، واسم الملف msg.file ، ونوع الحدث في msg.event  .
amazonS3 inعقدة الإدخال Amazon S3 ، تحميل المحتوى من Amazon  S3 bucket  . يمكن تحديد اسم  bucket  في خصائص عقدة bucket  أو من خلال msg.bucket . و اسم الملف الذي سيتم تحميله يتم أخذه من خصائص عقدة filename  او من msg.filename  .  المحتوى الذي تم تحميله يتم ارساله كـ msg.payload .  إذا فشلت عملية التحميل ، فإن msg.payload   سوف تحتوي على error  .
amazonS3 outعقدة الإخراج Amazon S3 . لرفع المحتوى إلى Amazon S3 bucket  . يمكن تحديد اسم  bucket في خصائص عقدة  bucket أو من خلال msg.bucket  . واسم الملف يتم أخذه من خصائص عقدةfilename    او من msg.filename   . يؤخذ المحتوى من خصائص عقدة localFilename أو من خاصية msg.localFilename أو من msg.payload .
box watchBox هو نسخة من Dropbox  . هذة العقدة تراقب أحداث الملف على Box  . افتراضيا يتم الإبلاغ عن جميع أحداث الملف . ولكن نمط الملف يمكن توفره للحد من أحداث على الملفات التي تتطابق اسمائها الكاملة مع نمط glob  وتتكون أحداث الرسائل من اسم الملف كامل في خاصية  msg.payload  ،  اسم الملف في msg.file ، و نوع الحدث في msg.event  ودخول الأحداث كاملة من خلال حدث API في msg.data  .
box inعقدة الإدخال Box  . لتحميل المحتوى من Box  . اسم الملف على Box  يتم أخذه من خاصية عقدة filename  أو من خاصية msg.filename  . يتم ارسال المحتوى كـ msg.payload .
box outعقدة الإخراج Box  . لرفع المحتوى إلى Box  . اسم الملف على Box   يتم أخذه من خاصية عقدة filename  أو من خاصية msg.filename  . يتم أخذ المحتوى من خاصية عقدة  localFilename ، أو من msg.localFilename   أو من خاصية msg.payload   .
dropbox watchلمراقبة أحداث الملف على Dropbox  .
إفتراضيا يتم الإبلاغ عن جميع أحداث الملف، ولكن نمط اسم الملف يمكن توفيره للحد من الأحداث على الملفات التي تتطابق اسمائها الكاملة مع نمط glob .
تتكون رسائل الحدث من اسم الملف كامل في خاصية msg.payload ،  واسم الملف في msg.file ، و نوع الحدث في msg.event وكائن  dropbox.js API PulledChange  في msg.data .
dropbox inعقدة الإدخال Dropbox  . لتحميل المحتوى من Dropbox  . اسم الملف على Dropbox  يتم أخذه من خاصية عقدة filename أو من خاصية msg.filename  . يتم ارسال المحتوى الذي تم تحميله كـ msg.payload  . إذا فشل التحميل ، فإن msg.error سوف تحتوي على الخطأ .
dropbox outعقدة الإخراج Dropbox  . لرفع المحتوى إلى Dropbox .
يتم اخذ اسم الملف من خصائص عقدة filename أو من خاصية msg.filename   . يمكنك تمرير المحتوى إما بواسطة حقل localFilename  أو خاصية msg.localFilename ، أو يمكنك تمرير المحتوى مباشرة بإستخدام msg.payload  .
سيتم رفع الملف إلى دليل على Dropbox تدعى Apps/{appname}/{appfolder} ، حيث يتم تعيين {appname} ، {appfolder} عندما تقوم بإعداد مفتاح التطبيق Dropbox و token  .
MongoDB inاستدعاء أسلوب التجميع MongoDB  بناء على العامل المحدد.
البحث عن استفسارات التجميع بإستخدام msg.payload  كما أن عبارة الإستعلام حسب.find() function .
Count  تقوم بإرجاع عدد أعداد الوثائق في التجميع أو التي تتطابق مع الاستعلام باستخدام msg.payload كعبارة استعلام.
Aggregate يوفر الوصول إلى خط أنابيب التجميع باستخدام msg.payload كمجموعة أنابيب.
يمكنك أيضا تعيين أسلوب التجميع في عقدة config أو msg.collection .
MongoDB outعقدة الإخراج MongoDB . يمكن حفظ، إدراج ، وتحديث و إزالة الكائنات من المجموعة المحددة.
Save  تقوم بتحديث الكائن الموجود أو إدراج كائن جديد ، إذا لم يمكن الكائن موجود مسبقا.
Insert ستقوم بإدراج كائن جديد .
Update  ستقوم بتعديل على كائن أو الكائنات الموجودة .
Remove ستزيل الكائنات التي تطابق الاستعلام في msg.payload . الاستعلام الفارغ سيزيل كافة الكائنات في المجموعة .
mysqlيسمح بالوصول الأساسي لقاعدة البيانات MySQL .
تستخدم هذه العقدة عملية الاستعلام على قاعدة البيانات المهيئة. وهذا يسمح لك لإدراج (INSERTS) و حذف (DELETES) . msg.topic يجب أن تحمل الاستعلام عن قاعدة البيانات ، ويتم ارجاع النتيجة في msg.payload .
و الحمولة التي تم ارجاعها عادة تكون مجموعة من صفوف للنتيجة . إذا لم يتم إجاد شيء للحصول على المفتاح، يتم ارجاع قيمة خالية (null) .
postgresعقدة PostgreSql I/O .
ينفذ الاستعلام المحدد في msg.payload  مع معلمات (Parameters) الاستعلام الإختيارية في msg.queryParameters . يجب تحديد queryParameters  في استعلام $propertyname .
عند تلقي البيانات من الاستعلام، msg.payload على المخرج سوف تكون مجموعة JSON من السجلات التي يتم ارجاعها.

عقد IOT :

يضيف FRED  عدد من العقد للوصول إلى منصات  IOT .

اسم العقدةالوصف
wotkit inعقدة الإدخال لمستشعر WoTKit  التي تقوم بإسترداد البيانات الجديدة من مستشعر WoTKit . تولد العقدة رسالة في كل وقت يتم فيه استلام بيانات جديدة من المستشعر داخل منصة WoTKit IOT . تحتوي message.payload  على أسماء حقول الاستشعار لاستشعار القيم. تم إعداد العقدة عن طريق اعتماد المستخدم.يجب أن يكون اسم جهاز الاستشعار على شكل {username}.{sensorname} ، أو يمكن استخدام معرف رقمي (ID)  للمستشعر .
wotkit outعقدة الإخراج WoTKit  لإرسال البيانات إلى جهاز الإستشعار الذي تم تسجيله. هذه العقدة تستخدم message.payload لإنشاء كائن البيانات.
message.payload  يجب أن تحتوي على زوج من الكائن key-value مطابقة لمجالات المستشعر . يتم تهيئه العقدة عن طريق إعتماد المستخدم . اسم المستشعر يجب أن يكون في شكل  {username}.{sensorname} ، أو يمكن استخدام معرف رقمي (ID) لجهاز الاستشعار .
wotkit dataعقدة البيانات التاريخية WoTKit  التي تقوم باسترداد البيانات التاريخية من جهاز استشعار WoTkit إما عن طريق عدد من العناصر أو وقت نسبي قبل الطلب. تحتوي message.payload على أسماء حقول الاستشعار لاستشعار القيم. يجب أن يكون اسم جهاز الاستشعار على شكل {username}.{sensorname} ، أو يمكن استخدام معرف رقمي (ID) للمستشعر .
wotkit control outتقدم عقدة سيطرة النتائج WoTKit  القدرة على إرسال الأحداث إلى قناة السيطرة على مستشعر/محرك WoTKit الذي تم تسجيله . هذة العقدة تستخدم كائن message.payload لإنشاء حدث السيطرة. message.payload  يجب أن تحتوي على زوج من الكائن key-value مطابقة لمجالات المستشعر . اسم المستشعر يجب أن يكون في شكل  {username}.{sensorname} ، أو يمكن استخدام معرف رقمي (ID) لجهاز الاستشعار .
wotkit control inputتوفر عقدة سيطرة النتائج WoTKit الوصول إلى قناة السيطرة على مستشعر/محرك WoTKit الذي تم تسجيله . عند تلقي حدث السيطرة بواسطة جهاز الاستشعار WoTKit هذه العقدة سوف تنشئ كائن message.payload التي تحتوي على الحدث. اسم المستشعر يجب أن يكون في شكل  {username}.{sensorname} ، أو يمكن استخدام معرف رقمي (ID) لجهاز الاستشعار .
dweetio inيستمع للرسائل من Dweet.io
يجب أن يكون المعرف الرقمي (ID) فريد من نوعه على مستوى العالم. من المستحسن استخدام GUID . يتم تعيين المعرف الرقمي (ID)  في msg.dweet ، و الطابع الزمني (TimeStamp)  في msg.created .
dweetio outيرسل msg.payload إلى dweet.io .
اختياريا، يمكن استخدام msg.thing لتعيين المعرف الرقمي(ID) للأشياء ، اذا م يكن بالفعل تم تعيينه في الخصائص .
أنت بحاجة للتأكد من المعرف الرقمي (ID) انه فريد من عونه – وينصح استخدام GUID .

عقد التحليل (Analysis Nodes) :

منصة FRED تضيف عدد محدد من عقد التحليل .

اسم العقدةالوصف
smoothهي عقدة بسيطة ولكنها مرنة لتوفير وظائف مختلفة في العديد من القيم السابقة، بما في ذلك الحد الأقصى max ، والحد الأدنى min ، المتوسط mean ، و مرشحات التردد المنخفضة و العالية (high\low pass filters). يعمل فقط على الأرقام وستفشل إذا لم تستطيع تحويل المدخلات إلى رقم .
wordposتحليل msg.payload  وتصنيف جزء من الكلام من كل كلمة ، و إرجاع msg.pos  كمجموعة من الأسماء(nouns) ،و الأفعال (verbs)، و الأحوال (adverbs) .

العقد المتقدمة (advanced nodes):

يضيف FRED العقد المتقدمة التالية :

اسم العقدةالوصف
pingpings هي آلة ترجع وقت الرحلة في ميلي ثانية . ويرجع false ،إذا لم تحدث استجابة واردة في غصون 5 ثوان، أو اذا كان المضيف unresolveable .
افتراضي ping كل 20 ثانية ، ولكن يمكن إعداده .
sunriseيستخدم وحدة suncalc لتوليد النتائج عند شروق الشمس و غروبها على أساس المكان المحدد. تتوفر العديد من الخيارات لتعريف شروق الشمس و غروبها .
الإخراج الأول تنبعث msg.payload من 1 أو 0 في كل دقيقة ، وهذا يتوقف إذا كان بين أوقات محددة أم لا . الإخراج الثاني تنبعث فقط عند الانتقال بين night إلى day (->1) أو day إلى night (->0)
كما يحدد msg.topic إلى أشعة الشمس و msg.moon إلى جزء من القمر بين 0 و 1 .

جولة حول العقد الأساسية

مقدمة :

في هذا الدرس سوف نلقي نظرة على مجموعة أساسية من العقد الموجودة افتراضيا في  Node-REDثم  عرض مجموعة موسعة من العقد التي يدعمها FRED .

لكل عقدة، سترى لمحة موجزة عن وظائفها، و إشارة منها إلى مثال في سلسلة الدروس ، بحيث يمكنك النظر بمزيد من التفاصيل في كيفية التعامل مع العقدة، هذا الدرس هو قسم مرجعي. ومع ذلك، يجب أن يكون لديك فكرة عن الوظائف الأساسية المتاحة لك خلال استخدام العقد عندما تبدأ في صياغة التدفقات الخاصة بك .

عقد الـ Node-RED الإفتراضية :

عندما يتم تثبيت Node-RED  على جهازك مثل الراسبيري باي و Beagleboard ، ستظهر لك المجموعة الافتراضية من العقد. هناك ثمانية فئات رئيسية من العقد في التثبيت الافتراضي : المدخلات(input) ، المخرجات  (output) ، functions ، والاجتماعي (social)  و التخزين (storage)و تحليل (analysis) ، المتقدمة ( advanced) و الراسبيري باي ، قم بإلقاء نظرة على الشكل التالي :

basic-nodes-and-flows

عقد الإدخال (Input Node) :

هناك 7 عقد المدخلات الأساسية المثبتة بشكل افتراضي . أنها تغطي اليات الاتصال الأساسية التي يتم استخدامها في تطبيقات انترنت الأشياء . بدأ من البروتوكولات منخفضة المستوى مثل UDP و TCP  من خلال البروتوكول عالي المستوى HTTP  و النشر/والاشتراك MQTT .

اسم العقدةالوصفأمثلة على العقد
 injectلتوليد الطابع الزمني أو نص تم تكوينه من قبل المستخدم في رسالة . يمكن تكوينها يدوينا بإستخدام زر الضخ على الجانب الأيسر للعقدة أو في أوقات محددة باستخدام (Cron) . بناء التدفق الأول (Hello World)
 catch تقوم بإلتقاط الأخطاء التي ألقاها العقد الأخرى على نفس التبويب. إذا ألقت عقدة خطأ أثناء التعامل مع الرسالة، فإن التدفق في العادة يتوقف. هذة العقدة يمكن استخدامها لالتقاط تلك الأخطاء و إرجاع الرسالة مع تفصيل الخطأ و عقدة المصدر و النوع.
 mqttللإشتراك إلى MQTT broker  و الاستماع على موضوع معين، فتعيد أي بيانات منشورة حول هذا الموضوع كرسالة جديدة . ويدعم مستويات الخدمة و الاحتفاظ بالبيانات الأخيرة .  تلقي JSON عبر رسالة MQTT
 httpيتلقى طلبات HTTP، مما يسمح للـ Node-RED  لتكون بمثابة خادم الويب الأساسي.  يتم تسليم هيكل HTTP كرسالة مخرجة كرد. يمكن أن تحتوي الرسالة على URL – البيانات المشفرة أو JSON .بناء خدمة ويب بسيطة باستخدام عقد HTTP
websocketيوفر نقطة النهاية للمتصفح لتأسيس اتصال websocket  مع Node-RED . يقدم اتصال duplex  لمجموعات المتصفح/الخادم .استخدام Websockets مع Node-RED
 tcpتستخدم لقبول طلبات TCP  الواردة على منفذ محدد أو للاتصال إلى منفذ TCP البعيد . تنتج رسائل تحتوي على بيانات TCP
حيث تولد رسائل تحتوي على بيانات TCP إما منفردة أو سلسلة من buffer أو string أو base64 encode .
udpتستخدم لقبول حزم(مجموعة الرسائل)UDP  الواردة على منفذ معين. يولد الرسائل التي تحتوي على بيانات UDP كـ BUFFER , String أو base64 string .
 serial inيقرأ من المنفذ التسلسلي على الجهاز المحلي. يمكن إعدادها لقراءة buffers أو لفترة زمزمنية محدودة أو عند الأنتهاء من السطر.

عقد الإخراج (Output Nodes) :

عقد الإخراج(output Nodes) هي صورة طبق الأصل من المجموعة الأساسية لعقد الإدخال (input Nodes)  و توفر وسيلة لإرسال البيانات على نفس مجموعة البروتوكولات mqtt,http,UDP  .

اسم العقدةالوصفأمثلة على العقد
debugيوفر وسيلة بسيطة لعرض الرسائل على لوحة الإخراج (تبويب debug) . يمكن تهيئتها لعرض msg.payload فقط او msg object كامل .بناء التدفق الأول (Hello World)
تنبيهات الطقس
تلقي JSON عبر رسالة MQTT
استخدام عقدة الإخراج MQTT لإختبار التدفق
mqttللإشتراك في MQTT broker و مشاركة اي بيانات (msg.payload)  التي تتلقاها في الرسائل الواردة إلى الموضوع. وهو يعدم جودة مستويات الخدمة و الاحتفاظ في البيانات الأخيرة.استخدام عقدة الإخراج MQTT لإختبار التدفق
httpترسل إجابات إلى طلبات HTTP الواردة من عقدة إدخال HTTP . ويتم تحديد محتوى الرسالة من خلال msg.payload ، و يمكن أن تحتوي على رأس وتعريف رمز الحالة . بناء خدمة ويب بسيطة باستخدام عقد  HTTP
websocketيرسل msg.payload  على websocket  . إذا تم تعريب msg_session ، فإنه يرسل إلى العميل الأصلي، وإلا يتم بثه إلى جميع العملاء.
tcpالردود على منفذ TCP الذي تم إعداده. ويمكن أيضا أن تستخدم للإرسال إلى منفذ معين.إرسال طلبات TCP
 udpيرسل رسالة UDP  إلى المضيف (host – ip address) الذي تم تكوينه و المنفذ .يدعم البث (broadcast) . مثل معظم العقد، يتم تهيئتها من خلال واجهة المستخدم أو خصائص الرسالة
serial outيرسل إلى المنفذ التسلسلي المحدد. يمكن تهيئتها لإرسال سطر جديد اختياري بعد أي حمولة رسالة .

عقد Function :

: تتضمن فئة عقد function  مجموعة متنوعة من العقد التي تنفذ وظائف معالجة محددة. هذة المجموعة تمتد من عقد Delay و التبديل(Switch) إلى عقدfunction  الخاصة بالبرمجة .

اسم العقدةالوصفأمثلة على العقد
functionعقدة function  للبرمجة. يتم استخدام الجافا سكريبت (JavaScript) ، العقدة يمكن أن تكون مصممة لتنفيذ معالجة معقدة على الرسائل الواردة وتوليد رسالة او اكثر كمخرج. بناء التدفق الأول (Hello World)تنبيهات الطقس
إرسال طلبات TCP
templateعقدة القالب بشكل عام هي واجهة للمستخدم ، هذة العقدة تأخذ الرسالة المدخلة التي تحتوي على زوج من (الاسم:القيمة ) و يتم درجهم في قالب. مفيدة لبناء الرسائل، HTML ، وتكوين الملفات .
delayالعقدة بشكل عام هي التي تؤخر الرسائل إلى وقت محدد أو عشوائي. ويمكن أيضا أن يتم تهيئتها للتحكم في تدفق الرسائل ( 10 رسائل كل ثانية ( .
triggerتنشئ رسالتين كمخرج مفصولتين بفترة زمنية معينة كلما تلقت رسالة مدخلة . كما يمكن استخدامها كمؤقت الحراسة (watchdog timer) .استخدام التويتر للتحكم بالراسبيري باي
commentعقدة التعليق يتم تهيئتها لتحتوي على عنوان و نص . وهي مفيدة جدا عند عمل تدفقات معقدة . بناء التدفق الأول (Hello World)
http requestيسمح لك لإنشاء و إرسال طلب HTTP  إلى عنوان URL معين . بطريقة (PUT , GET) تحتوي على رأس و حمولة payload  ويتم تهيئتها من خلال واجهة المستخدم أو برمجيا.
tcp requestهي عقدة طلب TCP بسيطة. ترسل msg.payload إلى خادم منفذ tcp  وتتوقع الاستجابه. يمكن تهيئتها لانتظار البيانات، او حرف معين ، او العودة مباشرة.إرسال طلبات TCP
switchهذه العقدة تعمل على توجية الرسائل بناءا على خصائصهم. يتم  تهيئة الخصائص باستخدام واجهة المستخدم ، حيث يمكنك استخدام المنطق (<،>،=< ….) على خصائص الرسالة.استخدام عقدة التبديل لتوجية الرسالة
changeعقدة التغيير يمكن استخدامها لتعيين أو تغيير أو حذف خصائص الرسائل الواردة. وهناك مجموعة متنوعة من قواعد التهيئة التي تسمح بعمل تغيرات معقدة بما في ذلك البحث و الاستبدال في msg.payload .التلاعب في محتوى الرسائل بإستخدام عقدة التغيير
rangeعقدة Scaling  من شأنها تعيين المدخلات الرقمية إلى مخرجات جديدة . وهي مفيدة لتحويل أو إحاطة نطاقات قيم المدخلات، مثل درجة الحرارة.

 

اسم العقدةالوصفأمثلة على العقد
csvهذه العقدة تقوم بتوزييع msg.payload  و تحاول تحويل من/إلى CSV  . إذا تلقت سلسلة، فإنها تخرج كائن جافا سكريبت ، واذا استقبلت كائن جافا سكريبت (JavaScript) ، فإنها تقوم بإخراج سلسلة CSV .
htmlاستخراج العناصر من وثيقة HTML  في msg.payload  باستخدام محدد شكلي ( CSS ) . بالأساس يسمح لك لتحليل خروج HTML  و إرجاع مجموعة من العناصر التي تتطابق.
jsonهذه العقدة تقوم بالتحويل من/إلى كائنJSON  . إذا تمت استقبال كائن جافا سكريبت (JavaScript) ، فتقوم بإخراج النواتج JSON  . أما إذا تلقت JSON ، فتقوم بإخراج كائن جافا سكريبت (JavaScript) .  تلقي JSON عبر رسالة MQTT
xmlهذه العقدة تقوم بالتحويل من/إلى صيغة XML  . إذا تلقت كائن جافا سكريبت (JavaScript) ، فتقوم بإخراج سلسلة XML، أما إذا استقبلت سلسلة XML ، فتقوم بإخراج كائن جافا سكريبت (JavaScript) .
rbeتقوم بتوليد الرسالة فقط إذا طرأ تغيير مختلف على المدخلات السابقة (سلسلة أو رقم )، أو إذا تغيرت المدخلات بمقدار معين (في حال وضع deadband) – فقط للأرقام .استخدام عقدة RBE

 عقد Social :

عقد وسائل الاعلام الاجتماعية الأساسية تدعم التفاعل مع البريد الإلكتروني و التويتر. فإنها تتيح للتدفقات لإرسال أو استقبال رسائل البريد الإلكتروني ، أو إرسال أو تلقي تويت.

اسم العقدةالوصفأمثلة على العقد
email inيمكن تهيئتها لقراءة عدة مرات من خادم IMAP  وإرجاع بريد إلكتروني جديد . وضع msg.topic  إلى موضوع  البريد الإلكتروني و إما وضع msg.payload  إلى محتوى نص البريد الإلكتروني أو msg.html إذا كان البريد الإلكتروني هو HTML .
twitter inيقوم بإرجاع تغريدة (tweets) كرسائل . يمكن استخدامها للبحث في العام أو على حساب المستخدم عن تغريدات تحتوي على مصطلح البحث الذي تم تهيئته بواسطة المستخدم أو رسائل المباشرة الواردة من قبل المستخدم.استخدام التويتر للتحكم بالراسبيري باي
email outيرسل رسالة واردة كرسالة بريد إلكترونيعبر خادم IMAP الذي تم إعداده. وسيتم تحويل البيانات الثنائية (binary data) إلى المرفق. تنبيهات البريد الالكتروني
twitter outيقوم بتغريد msg.payload  على الحساب الذي يتم إعداده. يمكن ارسال الرسائل المباشرة و سيتم ارسال البيانات الثنائية كصورة . تنبيهات الطقس

عقد التخزين :

العقدة الإفتراضية المحددة للتخزين، لأنها تستهدف أجهزة مثل الراسبيري باي  المحدودة للغاية ، و تركز على تخزين الملف .

basic-nodes-and-flows

ملاحظة : FRED  لأنه عبارة عن خدمة سحابية ، فإنه لا يدعم عقد الملفات الأساسية. وبدلا من ذلك يستبدل هذه مع مجموعة متنوعة من عقد التخزين تتراوح بين Mongo إلى Dropbox  . ومع ذلك ، للتاكد و تغطية هذة العقد الإفتراضية قم بثبيت Node-RED على جهازك .

اسم العقدةالوصف
tailتضيف ذيل إلى الملف الذي تم إعداده. تعمل على انظمة (Linux/Mac) فقط . هذه العقدة لا تعمل على ملف انظمة ويندوز، كما أنه يعتمد على الامر tail –F.
file inيقرأ الملف المحدد و يرسل المحتوى كـ msg.payload ، واسم الملف كـ msg.filename .
يمكن تهيئة اسم الملف في العقدة. إذا ترك فارغا، فإنه يجب تعيين على msg.filename في الرسالة الواردة .
fileتقوم بكتابة msg.payload إلى الملف المحدد . يمكن تهيئة اسم الملف في العقدة. إذا ترك فرغا، فإنه يجب تعيينه على msg.filename في الرسالة الواردة . السلوك الافتراضي لها هي الإلحاق إلى الملف. ويمكن تغيير ذلك إلى الكتابة فوق الملف كل مرة . على سبيل المثال ، إذا كنت ترغب في إخراج صفحة ويب ثابته أو تقرير .

عقد التحليل (Analysis nodes):

عقد التحليل تنفذ التحاليل القياسية على الرسائل الواردة. العقدة الوحيدة الت قدمت هي عقدة sentiment ،والتي يمكن استخدامها في المحاولة و لتحديد الـ sentiment للرسالة الواردة على أساس الكلمات المستخدمة في الرسالة .على سبيل المثال ، البريد الإلكتروني أو التويتر .

اسم العقدةالوصفأمثلة على العقد
sentimentعقدة sentiment  تقوم بتحليل msg.payload  و تسجل نتيجة مشاعر الرسالة على أساس تحليل الكلمة. وتضيف كائن msg.sentiment  الذي يحتوي على الناتج AFINN-111 كـ msg.sentiment.score  . و النتيجة عادة تتراوح من 5- إلى 5 .

العقد المتقدمة (Advanced nodes) :

وهناك مجموعة من العقد المتنوعة التي تقدم أنواع مختلفة من الوظائف.

اسم العقدةالوصف
watchتراقب دليل أو ملف لإجراء التغييرات. يمكن إدخال قائمة من الدلائل مفصولة بفواصل أو الملفات. وسوف تحتاج إلى وضع علامات اقتباس “…..” حول أي مسافات. على نظام الويندوز، يجب عليك استخدام خطوط مائلة مزدوجة // في جميع اسماء الدليل.
يتم وضع إسم الملف كاملا للملف الذي تغير فعلا في msg.payload ، في حين يتم استرجاع نسخة stringfied من قائمة المراقبة في msg.topic  .
يحتوي الـ msg.file  على اسم قصير للملف الذي تغير. msg.type يحتوي على نوع التغير، عادة اما ملف او دليل، في حين msg.size  بحمل حجم الملف بالبايت (bytes) .
feedparseهذه العقدة تراقب RSS/atom feed  للمدخلات الجديدة و توفر إدخالات جديدة كالرسائل . ويمكن تهيئتها للاستعلام عن التغذية في فترة زمنية محددة .
execيستدعي أمر النظام ويوفر ثلاث مخرجات : stdout, stderr, return code . افتراضيا يستخدم exec()، الذي يستدعي الأمر ، وينتظر الانتهاء ، ومن ثم إرجاع النتيجة كاملة دفعة واحدة ، جنبا إلى جنب مع أي أخطاء.

عقد الراسبيري باي (Raspberry Pi nodes) :

اسم العقدةالوصفأمثلة على العقد
rpi_gpio inعقدة الراسبيري باي الخاصة بالادخال. تولد msg.payload إما 0 أو 1 ، وهذا يتوقف على حالة إدخال الدبوس (pin) . يمكنك ايضا تفعيل المدخل pullup resistor أو pulldown resistor.
تم تعيين msg.topic إلى pi/{رقم Pin}
يتطلب مكتبة RPi.GPIO بايثون نسخة 0.5.8 (أو الأحدث) من أجل العمل .
ملاحظة : نحن نستخدم أرقام الـ pin  الفعلية على موصل P1 كما انها أسهل لتحديد الموقع.
rpi_gpio outعقدة الراسبيري باي الخاصة بالإخراج. تتوقع msg.payload  مع إما 0 أو 1 (true أو false) . وسوف يتم تعيين الدبوس إما HIGH أو LOW  اعتمادا على القيمة التي يتم تمريرها . ويمكن أيضا تعيين القيمة الأولية للدبوس وقت نشر التدفق إما 0 أو 1 . عند إستخدام PWM ، فهي تتوقع قيمة المدخلات بين 0-100 .
يتطلب مكتبة RPi.GPIO بايثون نسخة 0.5.8 (أو الأحدث) من أجل العمل .
rpi_mouseعقدة راسبيري باي زر الماوس. يولد msg.payload مع إما 1 أو 0 عندما يتم الضغط على زر الماوس المحدد ثم تحريره. يحدد أيضا msg.button إلى قيمة الرمز ، 1=اليسار، 2=اليمين ، 4= الوسط حتى تتمكن من العمل خارج أي زر او مجموعة تم الضغط عليها.

بناء التدفقات عبر البروتوكولات

في هذا الدرس سوف نتطلع لرؤية المزيد من العقد الأكثر شيوعا و بناء مشاريع بإستخدام بعض العقد التي تم شرحها في الدروس السابقة . سوف نبدأ بسلسلة من الأمثلة القائمة حول بروتوكول  MQTT و التي تبين كيفية ربط  مجموعة من عقد معالج الرسالة .  ثم سيتم النظر لطرق أخرى للحصول على الرسائل من و إلى التدفقات باستخدام بروتوكولات مثل TCP و UDP و  مآخذ الويب  websockets .

في نهاية هذة المحاضرة سيكون لديك فهم أفضل لبعض العقد الأساسية المستخدمة في تدفق Node-RED . وسيكون لديك القدرة على بناء التدفقات المعالجة المتطورة التي تأخذ الأحداث في العالم الحقيقي و معالجتها و توليد استجابات لإيصال النتائج خارج تدفق خاص بك .

السلسلة التالية من الأمثلة تبنى على عقدة mqtt ، الذي يوفر وسيلة ملائمة لإتخاذ المدخلات من وسيط MQTT . MQTT هو مثال على نظام نشر / اشتراك والذي يتيح لأجهزة الاستشعار بنشر التحديثات التي تسلمها إلى العميل المشترك  في ذلك المستشعر  . يستخدم MQTT  نموذج الموضوع للسماح للناشرين (مثل اجهزة الاستشعار) لإنشاء الموضوعات و نشر البيانات للمواضيع ويمكن للأخرين الاشتراك في هذا الموضوع  للحصل على اشعارات غير متزامنة من البيانات المرسلة لهذا الموضوع .

أنظمة pub/Sub  هي طريقة رائعة لربط النظم الموزعة المتباعدة وهم خريطة جيدة لنموذج أنماط IOT حيث الأجهزة أو الأشياء تولد الأحداث التي ترغب في مشاركتها. بروتوكول MQTT ، فضلا عن كونها غير متزامنة هو أيضا خفيفة الوزن .

تلقي JSON عبر رسالة MQTT

لإستخدام عقدة MQTT ، تحتاج الوصول إلى الوسيط broker. هناك عدد من الخوادم تشغيلMQTT  مجانية ، على سبيل المثال http://test.mosquitto.org/ ، او تلك التي سيتم استخدامها في هذا الدرس www.hivemq.com .

باستخدام عنوان الوسيط و الموضوع، يمكنك تكوين/إعداد عقدة المدخلات mqtt  للإشتراك في هذا الموضوع . الأمر الذي ادى إلى إنشاء رسالة جديدة هو نشر البيانات الجديدة حول هذا الموضوع . و تحتوي الرسالة على معلومات عن البيانات المنشورة، وتتضمن البيانات نفسها في msg.payload   و موضوع  وسيط MQTT  في msg.topic .

للبدء من عقدة mqtt ، عليك استخدام وسيط mqtt المجاني (hivemq) وهو متاح عبر (http://www.hivemq.com/showcase/public-mqtt-broker/) . بالطبع يمكنك استخدام أي وسيط MQTT .

أولا، قم بسحب و إسقاط عقدة المدخلات mqtt إعدادها للوسيط. لا تنسى تكوين/إعداد الموضوع  ليكون فريد من نوعه (unique)في هذا المثال نحن نستخدم  noderedlecture/sensor ولكن عليك استخدام الموضوع الفريد الخاص بك  ، مثال : <your name>/sensor .

basic-nodes-and-flows

هناك العديد من الطرق التي تمكنك من ارسال  رسائل mqtt  إلى  hivemq . و يمكنك استخدام  مآخذها الويب websockets  للعميل (http://www.hivemq.com/demos/websocket-client/) ،
و لوحة الإعدادات لـ (http://www.mqtt-dashboard.com/dashboard) mqtt  ( mqtt dashboard) أو مكتبتك الخاصة .

عليك استخدام مآخذها الويب للعميل websocket client في هذا المثال ، لذلك انتقل إلى تلك الصفحة و قم بالاتصال إلى الوسيط . سوف تقوم بنشر سلسلة Json  المرتبطة بالموضوع الذي قمت بتكوينه/إعداده ولرؤية ذلك قم بإستخدام عقدة qmtt  وعقدة json .

basic-nodes-and-flows

بمجرد أن تقوم بإرسال سلسلة JSON ، سوف تحتاج إلى تحليل الرسالة التي تولدها عقدة mqtt عندما تتلقى رسالة MQTT  . للقيام بذلك، سوف تحتاج إلى سحب و إسقاط عقدة json  و توصيلها مع نقطة الإخراج في عقدة mqtt  .

عقدة json  هي نوع من convenience function ، حيث انه يوزع الرسالة الواردة و يحاول تحويلها من/إلى JSON .لذلك اذا قمت بإرسال سلسلة JSON  سيقوم بتحويلها إلى جافاسكريبت JavaScript و العكس .

قم بتوصيل عقدة debug إلى عقدة json ثم قم بعملية النشر deploy ، استخدم لوحة إعداد HiveMQ  لإرسال سلسلة JSON
{“analyze”:false, “value”:10}  كما هو موضح بالشكل أدناه :

pic3.3

قم بالنظر عن كثب في المخرجات . يمكنك أن ترى msg.payload   تحتوي على object  و الذي يحتوي على حقلين حقل التحليل (analyze )و حقل القيمة (value)  كما رأينا في الدرس السابق يمكنك الوصول إلى هذة الحقول عبر msg.payload.analyze و msg.payload.value . دعونا نلقي نظرة على العقدة وما يمكنها أن تفعل .

 استخدام عقدة التبديل لتوجية الرسالة اعتمادا على خصائص معينة :

أحد المميزات الموجودة لدى JSON object  أنها تتيح لك العمل بسهوله على خصائصها. سيتم استخدام عقدة التبديل (switch node)  و التي تعمل كمفتاح أو توجيه للرسائل إلى اتجاه مخرج معين اعتمادا على خصائص الرسالة الواردة . على سبيل المثال، يمكنك تفحص خصائص الحقلmsg.payload.analyze    و بالإعتماد على قيمتها (صحيحة / خاطئة ) ، تقرر توجيه الرسالة إلى أحد مخرجات عقدة التبديل (switch Node) .

قم بسحب عقدة التبديل (switch node)  ، ثم انقر نقرا مزدوجا عليها . قم بإعدادها للتحقق من قيمة الحقل msg.payload.analyze  ، إذا كانت صحيحة سنقوم بإخراج الرسالة إلى المخرج الأول لعقدة التبديل ; و إذا كانت خاطئة سنقوم بإخراج الرسالة إلى المخرج الثاني لعقدة التبديل .  قم بإعداد عقدة التبديل كما هو موضح بالصورة ادناه :

basic-nodes-and-flows

الآن  يمكنك توصيل عقدتين إخراج debug  كما هو موضح بالصورة التالية ، عند إعداد عدة مخارج للعقدة ، يتم ترقيم المخارج من أعلى ، لذلك المخرج 1 هو المخرج الأعلى و المخرج 2 هو المخرج السفلي في الشكل التالي.

basic-nodes-and-flows

قم بالرجوع إلى صفحة إدخال  HiveMQ و إرسال رسالة {MQTT  {“analyze”:true, “value”:6 ، سوف تلاحظ أنه تم تفعيل المخرج الأول على عقدة التبديل و تم توجيه الرسالة الواردة على مخرج 1  ، إذا قمت بإرسال الرسالة التي تم استخدامها مسبقا {“analyze”:false, “value”:10} ، ستقوم عقدة التبديل (switch node) بتفعيل المخرج 2 و على عقدة الإخراج (debug)  المربوطة على هذا المخرج  ستظهر الرسالة. ستلاحظ  على لوحة الاخراج عند تبويب debug  على يمين النافذة طباعة الرسالة كما هو موضح بالصورة :

basic-nodes-and-flows

 كما لاحظت، يوفر لك Node-RED  عقد تسمح لك بسرعة تحديد محتويات الرسائل الواردة و توجيه الرسالة إلى أجزاء مختلفة من التدفق إعتمادا على محتوى معين للمدخلات.

التلاعب في محتوى الرسائل بإستخدام عقدة التغيير :

عقدة أخرى مفيدة وهي عقدة التغيير (change node ) ، و التي تسمح لك لتغيير محتوى الرسالة أو إضافة خصائص جديدة عليها . فيمكنك استخدام هذه العقدة للتأثير على الخصائص في الرسالة إما عن طريق تغيير خصائص موجودة ، أو حذف أو إضافة خصائص جديدة.

في هذا المثال ، سيتم إضافة حقل جديدة للرسالة وهو  msg.payload.note . أولا، قم بسحب و إسقاط عقدة التغيير (change node ) و توصيلها إلى المخرج الثاني من عقدة التبديل كما في الشكل أدناه ، كما تذكرون، ان محتوى حقل msg.payload.analyze  الرسالة هو false  فيتم اخراجها على المخرج رقم 2.

basic-nodes-and-flows

الان قم بإعداد العقدة لتعيين msg.payload.note  لتحتوي على “this is not being analyzed” كما مبين لك بالصورة التالية :

basic-nodes-and-flows

عند استقبال الرسالة التي ترسلها عقدة التبديل (switch node) إلى المخرج 2 ، سوف يتم تعديلها لتحتوي على عنصر “note”  مع جملة “this is not being analyzed” .  اذا قمت بنشر (deploy) و اختبار التدفق بواسطة ارسال رسالة MQTT  من HiveMQ ، سوف يظهر لك المخرج كما هو موضح بالصورة التالية:

basic-nodes-and-flows

استخدام عقدة RBE :

في هذا المثال، سيتم إضافة عقدة  (report by exception -RBE) و التي تقوم بتمرير البيانات فقط اذا طرأ عليها تغيير . يمكنك تعيينها لفحص حمولة الرسالة (massage payload) و إما عن طريق تجاهلها حتى يطرأ أي تغيير على الرسالة (في حالة RBE ) أو عندما تتغير الرسالة بنسبة معينة (في حالة  deadband ) .

في حالة استخدامRBE ،  تعمل على الأرقام و الجمل . وفي حالة استخدام deadband  فهي تعمل على أرقام فقط و يستخدم في إعداد الـ deadband  نطاق + أو – ، بحث تكون القيمة الواردة يمكن أن تتقلب داخل نطاق معين  قبل أن تنطلق .

سنقوم بإضافة عقدة تغيير (change node ) والتي سيتم توصيلها على مخرج 1 لعقدة التبديل (switch node) . ثم سنقوم بتوصيل عقدة rbe  إلى عقدة التغيير كما هو موضح بالصورة أدناه . تذكر بأن الناتج يتوافق مع  “analyze “ ، وقد تم إضافة عقدة تعليق (comment node) و كتب عليها “analyze=true”  ، لأنها مفيدة عند عمل تدفقات معقدة .

basic-nodes-and-flows

قم بفتح محرر عقدة التغيير (change node)  لتعيين msg.payload إلى msg.payload.value  . وهكذا يحدد المخرج من هذه العقدة إلى القيمة الموجودة في العنصر msg.payload.value من المدخلات الواردة كما في الشكل أدناه .

basic-nodes-and-flows

سنقوم بتوجية الرسالة إذا تم تغيير القيمة بنسبة 20% أو أكثر من ذلك ، فسوف تحتاج إلى النقر نقرا مزدوجا فوق عقدة RBE  و لتجاهل الرسالة مالم تتغير القيمة بأكثر من 20 % .

basic-nodes-and-flows

لإختبار التدفق، قم بنشر deploy  هذا التدفق ومن ثم العودة إلى صفحة HiveMQ  و إرسال سلسلة من الرسائل. أولا ، سوف تحتاج إلى عيين قيمة analayze إلى true  و بالتالي تقوم عقدة التبديل بإرسال الرسالة عبر المخرج الأول. إذا كنت تستخدم الرسالة التي تم تعينها سابقة فإن القيمة (value)  من 6 ، ستفشل في عبور عقدة RBE  . ثم قم بإرسال رسالة ثانية من قيمة 10 ، فإن العقدة RBE  تقييم الفرق ما بين 6 و 10  ، ويرها اكبر من 20 % ، فيقوم بإرسال رسالة إلى عقدة debug  النهائية والتي ستطبع على لوحة الإخراج debug  كما هو موضح بالصورة التالية :

basic-nodes-and-flows

استخدام عقدة الإخراج MQTT  لإختبار التدفق :

كبديل لاستخدام صفحة الاختبار HiveMQ  لنشر موضوع MQTT ، سنقوم بإعداد و تكوين عقدة اخراج mqtt  . وهي تسمح لك لإعداد/تكوين خدمة MQTT   و الموضوع الذي تريد نشره عليه. ويمكنك بعد ذلك إرسال عقدة الرسائل  كـسلسلة JSON  كما كانت ترسل عبر صفحة الاختبار HiveMQ .

للعمل على ذلك، قم بسحب و إسقاط ثلاث عقد inject و عقدة اخراج MQTT  كما هو موضح بالشكل التالي:

basic-nodes-and-flows

يمكنك الأن اختبار التدفق الذي قمت بإنشائه لتحليل رسالة MQTT مباشرة من مساحة العمل عن طريق النقر على زر الضح على الجانب الأيسر لعقد inject  الثلاثة.

websockets

مآخذ الويب (Websockets)  هي وسيلة أخرى مفيدة للقدرة على التواصل وهي مبينة ضمن عقد Node-RED  عبر عقدة websocket  . توفر مآخذ الويب (websocket ) اتصال duplex TCP وقد صممت للسامح لمتصفحات الويب و الخوادم للحفاظ على “backchannel ”   والتي يمكن استخدامها لزيادة تفاعلات HTTP التقليدية ، مما يسمح للخوادم لتحديث صفحات الويب دون طلب العميل .

وعقدة websocket  اما تكون للإدخال أو الإخراج ، مما يتيح لك الاستماع للبيانات الواردة (المدخلات) أو إرسال (الإخراج) على websocket  . تم تصميم عقدة الإخراج للتحقق ولمعرفة ما اذا نشأت حمولة الانتاج على websocket في العقدة ، وفي هذة الحالة فإنه يستجيب إلى المرسل الأصلي . وإلا فإنه سوف يقوم ببث الحموله لجميع مآخذ الويب .

وبالإضافة إلى ذلك، يمكن إعداد كل من المدخلات و المخرجات لعقدة websocket إما أن تكون خادم أو عميل – في وضع الخادم سيقوم بالإستماع إلى عنوان URL ، وفي وضع العميل سوف يتصل إلى عنوان IP معين .

لمعرفة كيفية عمل عقدة websocket ، عليك استخدام مآخذ  الويب العامة التي تعمل على الموقع التالي: (https://www.websocket.org/echo.html).

قم بسحب عقدة inject و عقدة إدخال و عقدة إخراج websocket  و عقدة التصحيح debug ، ثم قم بتوصيل العقد كما هو موضح بالصورة التالية :

basic-nodes-and-flows

قم بإعداد عقدة inject  لإرسال جملة payload  تحتوي على “Hello There” كما في الصورة التالية :

basic-nodes-and-flows

قم بإعداد عقد websocket للإتصال إلى لإرسال wss://echo.websocket.org كما هو موضح بالصورة :

basic-nodes-and-flows

قم بنشر deploy  التدفق ، عندما يتم الضغط على زر ضح عقدة inject  سترى طباعتها كما هو موضح بالصورة :

basic-nodes-and-flows

إرسال طلبات TCP :

يوضح لك هذا المثال كيفية إرسال طلبات TCP  باستخدام عقدة tcp  . في هذه الحالة سوف تقوم بعمل طلب HTTP  إتباعا للمواصفات في (http://tools.ietf.org/html/rfc2616#section-5.1.2).

يوضح هذا المثال استخدام عقدة tcp  .حيث يمكن تكوين عقدة UDP أو HTTP  لطريقة مماثلة . للبدء، دعونا نقوم بتوصيل عقد الـ inject و function و tcp و debug كما هو موضح بالصورة أدناه :

basic-nodes-and-flows

قم بتعديل على عقدة function  للإضافة دالة و التي تضح جملة “GET / HTTP/1.1\r\n\r\nHost: www.google.com” كحمولة (payload) كما هو موضح بالصورة أدناه.

هذة سلسلة الجملة عبارة عن طلب HTTP ، مشيرا إلى انه طلب GET ، و البروتوكول هو HTTP 1.1  و المضيف (host) هو www.google.com  . و  \r\n\r\n  هو زوج من إرجاع/ السطر الجديد (return/newline) و الذي يكون مطلوب في بروتوكول HTTP .

basic-nodes-and-flows

قم بإعداد عقدة طلب tcp  للاتصال بالخادم www.google.com ، على المنفذ 80. و الإعداد لإغلاق الاتصال بعد 1 ثانية (1000 مللي ثانية ) كما هو موضح بالصورة التالية :

basic-nodes-and-flows

إذا قمت بنشر deploy  التدفق و الضغط على زر الضح في عقدة inject ، فسوف تقوم بعمل طلب إلى google  و سوف تحصل على استجابة TCP . عقدة التصحيح debug  ستقوم بطباعة الإستجابة كجملة كما هو موضح بالصورة التالية :

basic-nodes-and-flows

إذا قمت بنشر deploy  التدفق و الضغط على زر الضح في عقدة inject ، فسوف تقوم بعمل طلب إلى google  و سوف تحصل على استجابة TCP . عقدة التصحيح debug  ستقوم بطباعة الإستجابة كجملة كما هو موضح بالصورة التالية :

basic-nodes-and-flows

بناء التدفقات

هذا الدرس سيتم عرض واجهة node-RED  و نبدأ في بناء التدفق الأول. عليك أن تتعلم كيفية إنشاء تدفقات بسيطة، و استخدام عقد debug  لتعقب الرسائل خلال التدفقات و كيفية استخدام عقدة function  لكتابة كود جافا سكريبت JavaScript بسيط لتقوم العقدة بتلبية احتياجاتك المحددة .

building-your-first-flows

في نهاية هذا الدرس ستكون قادر على انشاء تدفقات بسيطة خاصة بك، عليك أن تتعرف على واجهة المستخدم للـ node-RED  و عليك أن تكون على دراية ببعض العقد المضمنة في Node-RED .

للبدأ، عليك استخدام cloude service   التي توفر لك Node-RED  ومجموعة واسعة من العقد المبنية.

FRED

FRED  هو خدمة  Cloude  التي  تم انشاءها لتسمح لك للتسجيل و استخدام Node-RED  من دون تنزيله و تثبيته على جهازك مثل الراسبيري باي. وكما انها تشمل مجموعة من العقد الإضافية التي ساهمت في اضافتها  فئات من المجتمع و التي يمكنك إضافتها إلى المجموعة الأساسيى الموجودة في Node-RED . ومع ذلك، FRED  هو مجرد غلاف لـ Node-RED ، وبالتالي فإن أي شيء تكتبه في FRED سيعمل على الـ Node-RED  بشكل مشابه للعمل على جهاز اخر كالراسبيري باي.

لبدء مثالنا تأكد من أنك قمت بإنشاء Node-RED  الخاص بك على Cloud بواسطت انشاء حساب مجاني في http://fred.sensetecnic.com

بعد التسجيل، تأكد من تفعيل الحساب الخاص بك عبر البريد الإلكتروني الخاص بك. فلن تكون قادر على تسجيل الدخول حتى يتم التحقق من صحة الحساب.

واجهة المستخدم للـ Node-RED

بمجرد دخولك إلى حساب FRED، سترى واجهة المستخدم للـ Node-RED التي تتكون من ثلاثة أجزاء رئيسية ، كما هو مبين بالشكل أدناه .

building-your-first-flows

الجزء الرئيسي هو مساحة العمل  لإنشاء التدفق في الوسط. هذا هو المكان الذي يتم سحب و إسقاط العقد و ربطها بالاسلاك عليه. على طول الجزء العلوي من جزء مساحة العمل يوجد مجموعة من علامات التويب . كل تبويب يفتح مساحة العمل التي تم إنشاؤها مسبقا و يظهر التدفقات التي تم إنشاؤها باستخدام مساحة العمل تلك.

 على اليسار هو لوحة العقد و التي تحتوي على كافة العقد المدمجة. في المثال المبين في الشكل  ، ترى مجموعة عقدة FRED  و التي تحتوي على المجموعة التي تم إضافتها إلى المجموعة الأساسية التي تأتي مع Node-RED . في الدروس القادمة سوف تتعلم المزيد عن هذة العقدة و استخدامها لتطوير تدفقات جديدة. كما ترون يتم تجميع العقد إلى فئات . يتم فتح كل فئة لتحصل على العقد .

على الجانب الأيمن هو لوحة الإخراج/الانتاج ، يوجد علامتين تبويب للوحة الإخراج هما info و debug  .عندما يتم اختيار info ، يتم عرض الوثائق الخاصة للعقدة المحددة . و عندما يتم اختيار debug، فإنه سيتم عرض المخرجات لعقد الـ debug ، و الأخطاء و التحذيرات.

وفوق هذة الأجزاء الثلاثة الرئيسية هي الأدوات المعتادة،و على الجانب الأيمن ثلاث ازرار، زر النشر (deploy button)، و رمز معلومات المستخدم ، وقائمة منسدلة للإشراف و التحكم. سوف نتطلع على المزيد من التفاصيل في القائمة المنسدلة في وقت لاحق من هذا الدرس. رمز معلومات المستخدم يسمح لك بالعودة إلى صفحة FRED ، و معلومات حسابك ، و غيرها من المعلومات و كذلك لتسجيل الخروج من الخدمة FRED .

يستخدم زر النشر (deploy button) عندما يتم بناء التدفق فهو يسبب نشر للتدفق على نظام Node-RED  وتنفيذها. سيتم الدخول لتفاصيل ما يحدث في الواقع في الدروس الاحقة ، الأن زر النشر يمثل طريقة للحصول على التدفق .

جولة سريعة حول عقد الـ Node-RED و تدفق الرسائل

كما عرض عليك بالسابق، الـ Node-RED  تتيح لك ربط العقد ببعضها البعض لإنشاء تدفقات ليتم تنفيذ المهام. الرسائل تمر بين العقد، فتتحرك من عقدة الإدخال مرورا بعقدة المعالجة إلى عقدة الإخراج.

يوجد هناك ثلاثة انواع من العقد الرئيسية:
1- عقد الإدخال (مثل : inject ).
2- عقد الإخراج (مثل : debug ).
3- عقد المعالجة (مثل :  function ) .

building-your-first-flows

عقد الإدخال تسمح لك بإدخال البيانات إلى تطبيق الـ Node-RED  او التدفق “flow” . ويوجد لديهم على الأقل نقطة إخراج واحدة  يتم تمثيلها بمربع صغير رمادي على الجانب الأيمن للعقدة. ستقوم بإستخدام عقد الإدخال لجلب البيانات من خدمات أخرى مثل عقد التويتر ، google ، serial  و tcp. أو ادخال البيانات يدويا إلى التدفق بإستخدام عقدة inject .

عقد الإخراج تتيح لك لإخراج البيانات خارج تدفق الـ Node-RED . فهم يحتوا على نقطة ادخال منفردة على الجانب الأيسر للعقدة. يمكنك استخدام عقد الإخراج لإرسال البيانات إلى خدمات أخرى ، مثل عقد twitter ، tcp ، و عقد الايميل ، أو يمكن استخدام عقدة debug  لإخراج المخراج على لوحة الاخراج الـ debug .

عقد المعالجة تسمح لك بمعالجة البيانات. ولديهم نقطة ادخال و واحد أو أكثر من نقاط الإخراج. حيث انها تتيح لك نقل البيانات مثل عقد (json, csv, xml)، و استخدام البيانات لتحريك الرسائل مثل عقد (trigger, delay) ، ولكتابة التعليمات البرمجية المخصصة لإستخدام البيانات الواردة مثل عقد (function ) .

لاحظ أن بعض العقد، مثل inject و debug ، تحتوي على زر يسمح لك بتفعيل العقدة (inject) أو لتمكين و تعطيل العقدة (debug) .

بناء التدفق الأول (Hello World):

سنقوم في البدء لبناء التدفق الأول الخاص بك بحيث يمكنك أن ترى كم هو بسيط استخدام واجهة مستخدم الـ Node-RED  لبناء و نشر التدفق.

 دعونا نبدأ من أسهل تدفق محتمل ، سيتم استخدام عقدة لضخ المعلومات في التدفق تدعى (inject node)  ، يتم توصيل هذة العقدة إلى عقدة debug  لرؤية الناتج من التدفق كرسالة .

building-your-first-flows

بعد وضع عقدة التعليق (comment Node )على مساحة العمل ، نلقي نظرة على لوحة الخراج عند تويب (info)المعلومات في الجانب الأيمن ( قم بالتحويل إلى تبويب info  اذا كانت علامة التويب debug ) . سترى القليل من المعلومات حول العقدة ، بما في ذلك اسم/ نوع العقدة ، و unique ID  ، و حقل الخصائص مع وصفا للعقدة. بالنسبه لعقدة التعليق ليس لديها الكثير ليتم وصفه.

انقر نقرا مزدوجا فوق عقدة التعليق، وسيظهر لك نافذة الإعداد كما في الشكل التالي ، يمكنك إعطاء عقدة التعليق اسم و إضافة نص منفصل إذا أردت.

building-your-first-flows

الآن سنقوم بإضافة العقدة الأولى عقدة inject  . عقدة inject   يتم استخدامها لتوليد الدخل في التدفق وهي العقدة الأولى من العقد في لوحة العقد تحت قسم الإدخال (input) .  قم بسحب و إسقاط عقدة inject  على مساحة عمل التدفق ، ثم قم بالنظر إلى علامة التبويب معلومات (info) ، سترى معلومات ووصف للعقدة inject .  لاحظ ان اسم العقدة يتغير عند وضعها على مساحة العمل من inject  إلى timestamp .

building-your-first-flows

ستلاحظ أيضا أن عقدة inject  التي تسمى الأن (timestamp)  لديها نقطة زرقاء أعلى اليمين ومربع رمادي في وسط الجانب الأيمن . تشير النقطة الزرقاء أن العقدة لم يتم نشرها لأنه طرأ تغيير عليها. و المربع الرمادي هو نقطة إنتاج/إخراج العقدة. ومن هذا المربع يتم ربط عقدة inject   ليتم تدفق الرسالة المنتجة إلى العقدة التالية بالتدفق .

دعونا نضيف عقدة debug سنقوم بربط هذة العقدة مع العقدة السابقة ، وبعد ذلك نقوم بنشر التدفق و اختباره.
قم بسحب عقدة debug من لوحة العقد تحت قسم المخراجات (output)  إلى ساحة العمل . مرة أخرى يمكنك الإطلاع على معلومات العقدة في الجزأ الأيمن للواجهة.
ثم قم بربط عقدة debug  مع العقدة السابقة معا. للقيام بذلك، انقر على نقطة الإنتاج الرمادية لعقدة inject ، ثم قم بسحب السلك لعقدة debug  .

building-your-first-flows

هذا هو ابسط تدفق ممكن، سوف يتم ارسال الزمن الحالي إلى عقدة debug  لعرضه على لوحة debug  . قم بالضغط على زر النشر deploy في نافذة Node-RED  أعلى اليمين ، ستظهر لك نافذة   تخبرك أنه تم نشر التدفق بنجاح (The Flow has been successfully deployed) كما هو موضح بالصورة ادناه . و ستلاحظ أن النقطة الزرقاء  أعلى يمين العقد لم تعد تظهر.

building-your-first-flows

قبل أن يتم اختبار التدفق ، تأكد من اختيار علامة التبويب debug  على يمين النافذة . ثم قم بنقر زر التبويب على الجزأ الأيسر لعقدة inject  ثم لاحظ ماذا سيظهر على لوحة debug  يمن النافذة.

building-your-first-flows

كما ترون، عقدة inject ، عند النقر عليها تولد الطابع الزمني (timestamp) ( عدد المللي ثانية ) ،  والتي يتم تحويلها إلى رسالة و ارسالها على طول سلك الإخراج، ثم يتم تسليمها إلى عقدة debug كرسالة مدخلة. السلوك الإفتراضي لعقدة debug  هي إظهار أي رسالة تتلقاها.

الآن سنقوم بإظهار رسالة نصية من خلال هذا التدفق. أولا ، سنقوم بالتعديل على عقدة inject  لتقوم بتسليم رسالة نصية بدلا من الطابع الزمني. للقيام بذلك، حدد عقدة inject  في التدفق و انقر نقرا مزدوجا عليها . سوف تظهر لك نافذة كما هو موضح لك بالصورة التالية.

building-your-first-flows

في مربع نص payload ، قم بتحديد string  بدلا من الطابع الزمني (timestamp) ثم قم بكتابة اي جملة تريد داخل الحقل الفارغ  حقل payload  . لنبدأ مع جملة  “Hello World – from my first NR flow!”

بمجرد قيامك بهذا التغيير، انقر فوق موافق (Done) لحفظ التغييرات . لنلقي نظرة على التدفق، سترى ظهور النقطة الزرقاء على عقدة inject  للإشارة إلى حدوث تغييرات في التدفق لم يتم نشرها. قم بالنقر على زر deploy  للنشر ثم قم بالنقر فوق علامة التبويب على عقدة inject  على يسار العقدة. إذا قمت بالنظر على لوحة الإخراج debug  سترى بدلا من الطابع الزمني سيتم عرض الرسالة النصية.

building-your-first-flows

كما ترون، فإنه من السهل جدا ربط العقد معا و تمرير البيانات من خلال التدفق الخاص بك كرسائل. جميع الرسائل في Node-RED  لها ثلاث خصائص افتراضية: payload  وهو كما تم عرضها سابقا ، topic  وهو موضوع الرسالة لوصف الرسالة المتدفقه ، والمعرف الداخلي. يمكنك أن ترى هذة المعلومات إذا قمت بالتعديل على عقدة debug ، كما هو موضح بالصورة أدناه .

building-your-first-flows

حدد عقدة debug   ثم قم بالنقر مرتيين وقم بتغير حقل output إلى ” Complete msg object ”  ثم قم بحفظ التغير، قم بنشر التغير عبر زر deploy  ثم قم بالضغط على عقدة inject  ، سترى في لوحة الإخراج debug  هيكل JSON  و الذي يحتوي على ثلاث مجالات : “topic”  وهو فارغ حاليا ، و payload  و التي تحتوي على جملة الرسالة التي وضعتها في عقدة inject و  “ID _msgid” . عموما لا يستخدم ID  داخل الرسالة.

التدفق الثاني : تنبيهات الطقس

في هذا المثال ، سيتم مراقبة الطقس لمدينتك و إرسال لنفسك تغريدة في حال يبدو الطقس جيد. عليك استخدام عقدة الطقس  (openweathermap) والتي تسترد الطقس من openweathermap.org  حول الموقع الذي تم تحديده من قبلك. و سوف يتم استخدام عقدة function للتحقق من الطقس ما اذا كان جيد و عقدة التويتر سيتم استخدامها لإرسال لنفسك تغريدة في حال كان الطقس جيد.

أولا، سوف تحتاج إلى الحصول على مفتاح API  في OperWeatherMap . تقدم penWeatherMap  معلومات تفصيلية حول الطقس لمواقع في جميع أنحاء العالم . قم بزيارة  http://openweathermap.org/appid  واتبع المعلومات ادناه .

building-your-first-flows

سوف تحتاج إلى الاشتراك للحصول على حساب OpenWeather كما هو موضح ادناه :

building-your-first-flows

بعد الإشتراك سيتم توجيهك إلى الصفحة الرئيسية الخاصة بك حيث أنك ستكون قادرا على الوصول أو إعادة توليد مفتاح API  خاص بك .

building-your-first-flows

الآن ، دعونا نستخدم مفتاح API  لبناء تدفق تنبيهات الطقس. قم بسحب و اسقاط عقدة الطقس من الجزء الأيمن على مساحة العمل ، كما هو مبين بالشكل ادناه :

building-your-first-flows

اذا قمت بتحديد لوحة info  لظهور المعلومات على الجانب الايمن ، يمكنك أن ترى وصفا لعقدة openweathermap  مع معلومات مفصلة حول كيفية إعدادها و استخدامها. ستلاحظ بعض الأمور المهم :

1- أن لديها بنية JSON  كما ان لها msg.payload ، تحتوي على الكثير من التفاصيل حول الطقس على سبيل المثال : سرعة الرياح و درجة الحرارة tempc.

2- العقدة تعرف ثلاث خصائص  للرسالة الجديدة : msg.time ، msg.location و msg.data. وكما ذكر أعلاه، انت لك الحريه في إضافة خصائص الرسائل ، openweathermap  اضافت هذة الخصائص الجديدة لتحمل معلومات إضافية مرتبطة مع الرسالة .

 سنقوم بإعداد العقدة و النظر في بنية البيانات الفعلية التي يتم توليدها بعد أن تسأل عن الطقس المحلي الخاص بك . قم بالنقر المزدوج على العقدة وملء النموذج حسب موقعك. اكتب المدينة و الدولة في الحقول المخصصة او وضع احداثيات مدينتك. قم بإضافة API  الذي تم الحصول عليه من  http://openweathermap.org/appid ثم انقر موافق كما هو مبين بالشكل التالي:

building-your-first-flows

في الصورة ادناه تم تحديد موقع مدينة جدة في المملكة العربية السعودية.

building-your-first-flows

 ثم قم بسحب و إسقاط عقدة debug  و قم بتوصيل العقد معا عن طريق السلك  قم بالضغط على زر Deploy  لرؤية رسالة payload من عقدة openweathermap في لوحة debug  .

building-your-first-flows

كما ترون في الصورة اعلاه على لوحة الاخراج،  العقدة توفر الكثير من المعلومات حول الطقس المحلي الخاص بك، بالعادة تتوفر المعلومات كأزواج من اللإسم: القيمة . على سبيل المثال ،  استخدام حقل الطقس “weather” لاختبار ما اذا كان الطقس جيد “Clear ” . في حال كان جيد عليك ارسال تغريدة.

لبرمجة هذا المنطق، عليك استخدام عقدة function .  تم عرضها في الدرس الأول ولكن دون ذكر التفاصيل. دعونا نرى كيف يتم استخدامها عن طريق سحب واحدة على مساحة عمل التدفق و النقر المزدوج لفتح محرر العقدة .

building-your-first-flows

الان انقر نقرا مزدوجا فوق عقدة function وقم بكتابة الشرط التالي:

building-your-first-flows

في الشرط تم التحقق ما اذا كان الطقس جيد “Clear”  أو لا . اذا تحقق الشرط ، فإنه سيتم إعادة كتابة رسالة payload  لتصبح “Clear skies ahead today!” (في السطر 2) . و اذا لم يتحقق سيعيد رسالة فارغة . السطر الأخير مهم لأن الـ Node-RED  تتجاهل الرسائل الفارغة.

يمكنك الأن أن تفعل عدة تطبيقات على هذا التدفق مثلا توصيل هذة الرسالة إلى عقدة البريد الإلكتروني أو عقدة pushbullet .  لهذا الدرس سيتم استخدام عقدة التويتر. قم بسحب عقدة التويتر على مساحة العمل ، انقر نقرا مزدوجا فوق العقدة و قم بملء اعتماد حساب التويتر الخاص بك كما هو موضح بالصورة ادناه :

building-your-first-flows

وبمجرد الانتهاء من إعداد هذة الوثائق، تقوم Node-RED  بتخزين هذة الوثائق التي يمكنك استخدامها في التدفقات المستقبلية. و أخيرا قم بالضغط على زر النشر Deploy  و راقب حساب التويتر الخاص بك لرؤية التغريدة الجديدة في كل مرة يتم التحقق أن حالة الطقس جيدة .

building-your-first-flows

ميزات الواجهة

واحدة من أكثر السمات فائدة في واجهة المستخدم Node-RED  هو القدرة على نسخ و لصق العقد و حتى التدفقات كاملة باستخدام الحافظة clipboard. تدفقات الـ Node-RED  يتم تمثيلها بكود  JSON  و التي يمكنك تصديرها من مساحة العمل ، و إستيرادها إلى مساحة العمل بإستخدام القائمة المنسدلة في Node-RED  على الجانب العلوي الأيمن من نافذة Node-RED .

بدلا من بناء التدفقات في هذا المثال، أو في الواقع في أي سلسلة من الدروس ، يمكنك ببساطة نسخها من موقعنا مباشرة و لصقها في مساحة العمل. بعد ذلك كل ما عليك هو تكوين الإعدادات بشكل صحيح.

دعونا  ننظر كيفية القيام بذلك.

قم بنسخ الكود التالي أدناه و عن طريق القائمة المنسدلة في أعلى اليمين في نافذة Node-RED  اختر import ثم Clipboard كما هو موضح بالصورة أدناه :

building-your-first-flows

سوف يظهر لك صفحة حقل منبثق قم بلصق الكود في نافذة الإدخال ثم اضغط على موافق OK .

building-your-first-flows

سيظهر تدفق جديد في مساحة عمل جديدة أو حالية حسب إختيارك. ويمكنك تهيئته كما لو أنك قمت بإنشائه بنفسك ثم قم بنشره .