كيفية زيادة سرعة الراسبيري باي؟

فى هذا الدرس سنتعلم كيفية زيادة السرعة Overclocking للراسبيري باي مع الأخذ فى الإعتبار أن درجة الحرارة لن تزيد عن 50 أو 60 درجة مئوية.

raspberry_pi_overclock_1

المكونات المطلوبة

DSC00009

راسبيرى باى

raspberry-pi-overclock-2

مشتت حرارى

الكود البرمجى

في البداية يجب أن تلاحظ أن كسر السرعة فى الراسبيري باي كان يؤدى إلى فقد الضمان قبل عام 2012 حيث أن مؤسسة راسبري فاونديشن لم تكن تدعم كسر السرعة وذلك لخطورته على حرق اللوحة بسبب زيادة درجة الحرارة عليها بشكل كبير، ولكنها بعد ذلك قامت بدعم كسر السرعة في نظام راسبيان بما يحافظ على اللوحات ولا يعرضها للخطر وذلك فى كل الإصدارات من راسبري باي 1 و B+ و 2 ماعدا راسبري باي 3 حيث أن تعطى أداء يقارب أقصى إمكانيات ممكنة فى اللوحة فلا داعي لكسر السرعة.

بإمكانك بسهولة تغير تفعيل كسر السرعة من قائمة خصائص الراسبيري باي Raspi-config كالتالي فبإمكانك الإختيار من مجموعة من الإعدادات المعدة مسبقاً التي بإمكانها أن تصل الراسبيري باي حتى تردد 1000 ميجاهرتز.

raspberry_pi_overclock_3

 

raspberry_pi_overclock_4

أو من خلال سطر أوامر لينكس وذلك بالتعديل على ملف txt كالتالى فنقوم بكتابة الأمر التالي في سطر أوامر النظام Terminal.

sudo nano /boot/config.txt

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

Frequency Overclocking
arm_freq – تردد البروسيسور والقيمة الأولية لها هي 700
gpu_freq – تردد كارت الشاشة الخاص باللوحة والقيمة الأولية لها هي 250
sdram_freq – تردد الرامات والقيمة الأولية لها هي 500
core_freq – تردد ال core الخاص بكارت الشاشة وهو له تأثير على أداء البروسيسور حيث أنه يتم التحكم به من خلال الـ L2 cache
h264_freq – تردد دائرة فك تشفير الفيديو
isp_freq – تردد دائرة التحكم فى الكاميرا
v3d_freq – تردد عرض الفيديو  3D
Voltage Overclocking
over_voltage – مقدار فرق الجهد الذي سيصل له البروسيسور وكذلك كارت الشاشة وأقل قيمة له هي (-16) و أقصى قيمة له هي (8) والقيمة الأولية له هي (0)

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

arm_freq=900
gpu_freq=300
core_freq=250
h264_freq=250
isp_freq=250
v3d_freq=250
sdram_freq=450
over_voltage=6

 




زر إغلاق الراسبري باي

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

IMAG3682

المكونات المطلوبة

DSC00009

راسبرى باى

IMAG3664

سلك توصيل female \ female

IMAG3671

زر ذو طرفين press button

IMAG3665

مكواة لحام

DSC00096

قصدير لحام

توصيل الدائرة

نقوم بقص سلك التوصيل لنصفين متساويين فى الطول ثم نقوم بقطع جزء من الغلاف البلاستيكي الحامي للسلك حتى يظهر جزء مناسب من السلك فنستطيع لحامه فى زر الضغط.

IMAG3672

نقوم بلحام طرفيى السلكين فى طرفى رز الضغط كالتالي.

IMAG3677

إذا كان زر الضغط من ذوى الأربعة أطراف فعليك ملاحظة الصورة التالية وأن تقوم بلحام طرفى الأسلاك فى النقطتين A,B أو C,D.

Pi Shutdown Button

كل ما عليك فعله الآن هو إختيار أحد أرجل التوصيل GPIO المناسبة والتى ستختلف طبقاً لنوع الراسبرى باى المستخدمة، في حالتي هذه أستخدم راسبرى باى موديل B+ فقمت بإختيار أقرب رجل توصيل لأحد رجول الأرضي GND وكانت هى الرجل GPIO7نا للا وبإمكانك إختيار ما تريد.

gpio-pinout-bplus

نقوم بتوصيل الزر السابق الإعداد فى الطرفين رقم 26 و رقم 25 من أرجل التوصيل GPIO كالتالي

IMAG3682

الكود البرمجى

فى البداية نقوم بفتح ال Terminal الخاص ب الراسبري باي وكتابة الأوامر التالية أو نقوم بفتح نافذه الـ SSH الخاصة بها من جهاز آخر مربوط معها على نفس الشبكة كما تم شرحة فى الدرس الخامس.
نقوم بكتابة الأمر التالي الذى يقوم بفتح محرر النصوص الشهير Nano ويقوم بإنشاء ملف اسمه off_button_pi.py لكتابة الكود بداخلة بلغة البايثون python.

nano off_button_pi.py

نقوم بكتابة الكود التالي بداخل الملف السابق

2

ثم نقوم بالضغط على Ctrl+O ثم enter ثم ctrl+X وذلك لحفظ الملف السابق.

وكما نلاحظ الكود بسيط جداً يعتمد على إستدعاء مكتبتين رئيسيتين وهما GPIO وهى للتعامل مع أرجل التوصيل وجعل الرجل الموصلة على زر الضغط تعمل كطرف إدخال، وكذلك لتشغيل الـ Pull Up Resistor الداخلية فى الراسبرى باى فيمكننا بذلك جعل رجل التوصيل موصلة دائماً على فولت  Highوعند الضغط فقط على الزر تصبح موصلة بـ Low
ومكتبة os وهى الأهم هنا حيث تمكننا من التعامل مع نظام التشغيل وارسال أوامر له عن طريق كود البايثون فنستخدمها داخل أمر try الذى يتنظر أن يتم الضغط على الزرعن طريق أمر  GPIO.wait_for_edge ليقوم بعد ذلك بإرسال الأمر sudo shutdown -h now ليغلق الراسبرى باى بطريقة سليمة.

إذا كنت تريد تغيير رجل التوصيل GPIO كل ماعليك هو تغيّر رقمها فى الملف السابق gpio_pin_number لتصبح تساوى رقم الـ GPIO الأخرى التى تريد إستخدامها.

يبقى لنا خطوة واحده وهى أن نجعل هذا البرنامج يعمل تلقائياً عند فتح الراسبرى باى وذلك بفتح الملف rc.local بمحرر النصوص Nano مع كتابة sudo قبل الأمر وذلك ليعطى للمستخدم صلاحيات الـ  super user فيمكنك تعديل هذا الملف.

sudo nano /etc/rc.local

نقوم بإضافة مسار الملف الذى قمنا بإنشائه فى آخر rc.local قبل exit 0 مع كتابة اسم اللغة المستخدمة فى كتابة البرنامج قبل المسار وهى python كالتالى.

4

ثم نقوم بالضغط على Ctrl+O ثم enter ثم Ctrl+X وذلك لحفظ الملف السابق.

كل ما تبقى عليك هو عمل reboot  للراسبرى باى هكذا.

sudo reboot

تستطيع الآن الضغط على زر الإغلاق وهو سيقوم بطريقة سليمة وصحيحة بإغلاق الراسبرى باى.




مشاريع 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 وإضافة عنصر البيانات.

context.data = context.data || {};
switch (msg.topic) {
    case "task1":
        context.data.task1 = msg.payload;
        msg = null;
        break;
    case "task2":
        context.data.task2 = msg.payload;
        msg = null;
        break;
    default:
        msg = null;
        break;
}

if(context.data.task1 != null && context.data.task2 != null){
    var ratio = context.data.task1 / context.data.task2;
    context.data=null;
    return {payload:ratio};
}else return msg;

شرح الكود:

السطر الأول، لتهيئة كائن السياق. ثم يتم استخدام 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 .

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

<!DOCTYPE html>
<html lang=”en”>
 <head>
 </head>
 <body>
 <h1>My Micro Blog</h1>
 <form action=”posts” method=”post”>
 <label for=”title”>Title</label>
 <input type=”text” class=”form-control” name=”title” placeholder=”Title…” />
 <label for=”post”>Post Content</label>
 <input type=”text” class=”form-control” name=”post” placeholder=”Say something…” />
 <button type=”submit” class=”btn btn-default”>Submit</button>
 </form>
 <div>
 {{#payload}}
 <div class=”post”>
 <h3>{{title}}</h3>
 <p>{{post}}</p>
 </div>
 {{/payload}}
 </div>
 </body>
</html>

هذا الكود، يستخدم 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 :

msg.limit = 5;
msg.skip = 0;
return msg;

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

intermediate-flows-part2

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

intermediate-flows-part2

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

msg.headers = {
    "Location" : "https://{your username}.fred.sensetecnic.com/api/public/posts"
};
msg.statusCode = 302;
return msg;

لاحظ في السطر 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 المطلوب من مؤشرات الأسهم :

[{
    “index”:”S&P”,
    “value”:2096.92
 },{
    “index”:”Dow”,
    “value”:17511.34
 },{
    “index”:”Nasdaq”,
    “value”:5059.35
 }]

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

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

var prices = msg.payload;
var newPayload = [];
var priceIndex = ['S&P','Dow','Nasdaq'];

for (var i=0; i<prices.length; i++) {
  newPayload.push({
    index:priceIndex[i],
    value:Number(prices[i].replace(/,/g,''))
  });
}

msg.payload = newPayload;
return msg;

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

intermediate-flows

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

intermediate-flows

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

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

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

var outputMsgs = [];
var wordMap = {};

var sentence = msg.payload.replace(/[.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"");
sentence = sentence.replace(/\s{2,}/g," ");

var words = sentence.split(" ");
for (var i = 0; i < words.length; i++) {
  var lowerCaseWord = words[i].toLowerCase();
  if (!wordMap[lowerCaseWord]) {
    wordMap[lowerCaseWord] = 1;
  } else {
    wordMap[lowerCaseWord] = wordMap[lowerCaseWord] + 1;
  }
}
for (var prop in wordMap) {
  if( wordMap.hasOwnProperty( prop ) ) {
    outputMsgs.push({payload:{word:prop,count:wordMap[prop]}});
  }
}
return [outputMsgs];

في الكود أعلاه، يتم تعريف قائمة رسائل الاخراج و كائن للاحتفاظ بعدد الكلمات (كما هو موضح بالسطر 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 ثوان بين الرسائل المستلمة.

var currentTime = new Date().getTime();

if (!context.lastTime) {
    context.lastTime = currentTime;
    context.sum = msg.payload.value;
    context.count = 1;
}

if (currentTime-context.lastTime > 5000) {
    // calculate average for previous messages
    msg.payload.average = context.sum/context.count;
    // start tracking average again
    context.sum = msg.payload.value;
    context.count = 1;
    context.lastTime = currentTime;
} else {
    context.sum += msg.payload.value;
    context.count +=1;
}
return msg;

عند النظر إلى الكود، سوف تحصل أولا على الوقت الحالي (السطر 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) لتوليد تسلسل القيم بإستخدام السياق .

if (!context.value) {
  context.value = 0;
}
msg.payload = {
  value:context.value
}
context.value +=1;
if (context.value > 9) {
  context.value = 0;
}
return msg;
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 ، و اضافة الكود الموضح أدناه :

 var currentMsg = null, outMessage = null;
 var iState = msg.iState;

  if (!iState) {
     // we received an initial message
     // if the message is not an array, make it one
     if( Object.prototype.toString.call(msg.payload) !== '[object Array]' ) {
           msg.payload = [msg.payload];
     }
     iState = {};
     iState.index = 0;
     iState.inArray = msg.payload;
     iState.outArray = [];
     msg.iState = iState
   } else {
    // save results from the last iteration
     iState.outArray.push(msg.payload)
 }
  //If there are still objects left to iterate goto the next one in the original array
  if (iState.index < iState.inArray.length) {
    currentMsg = msg;
    msg.payload = iState.inArray[iState.index];
  } else {
    currentMsg = null;
    outMessage = msg;
    msg.payload = iState.outArray;
    delete msg.iState;
}

iState.index ++;

return [currentMsg, outMessage];

شرح الكود :

في السطرين 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 .

msg.payload = [1,2,3,4,5];
return msg;

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

intermediate-flows

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

msg.payload = msg.payload * 5;
return msg;

قم بإسقاط عقدة 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 و إضافة الكود الموضح أدناه :

if (!context.value) {
context.value = 0;
}
context.value +=1;
msg.count = context.value;
return msg;

إنشاء تدفق فرعي كما شرح بالسابق، ثم قم بربط المدخلات و المخرجات على عقدة 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  .
قم بنسخ ولصق الكود أدناه، وظيفية الكود هي تحليل استعلام يستند إلى نص:

var query = msg.payload.split(",");
if (query.length == 2){
 msg.location={
 city:query[0],
 country:query[1]
 }
 return [msg, null];
} else {
 msg.payload="invalid search";
 return [null,msg] 
}
create-reusable-sub-flows

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

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

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

create-reusable-sub-flows

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

var newMsg = msg;
newMsg.payload="The city you asked was "+
msg.location.city+", "+msg.location.country+", "+ 
"the weather is "+msg.payload.weather+" with "+ 
msg.payload.detail+". "+ 
"The temperature is "+msg.payload.tempc+"C right now.";
return newMsg;

وأخيرا، سوف تحتاج إلى إضافة عقدة 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 ، لا يتم تمرير رسالة إلى العقد التالية في التدفق و التدفق ينتهي هنا. لإنشاء العقدة التي تمرر الرسالة “كما هي” ، يمكنك إرجاع الرسالة نفسها . وهذا الكود يكون في العقدة افتراضيا، كما هو موضح أدناه :

return msg;

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

the-node-red-programming-model

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

msg.payload += "world";
return msg;

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

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

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

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

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

var newMsg = { payload: "new payload" };
return newMsg;

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

the-node-red-programming-model

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

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

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

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

the-node-red-programming-model

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

if (msg.payload == "high") {
return [ msg, null, null ];
} else if (msg.payload == "med") {
return [ null, msg, null ];
} else {
return [null, null, msg];
}

السطر الأول يقوم بالتحقق من الحمولة القادمة إذا تم تعيينها على أنها “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 .

var msgList = [];
for (var i=0; i<10; i++) {
msgList.push({payload:i});
}
return [msgList];

عقد 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 ليرسل رسالة بعد فترة محددة من الوقت .

// send message after 10 second delay
setTimeout(function() {
node.send(msg);
}, 10000);
return null;

وتشمل وحدات أخرى متوفرة  لعقد 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 التي تضيف خاصية العد إلى كل رسالة تقوم بمعالجتها، كما هو موضح بالكود ادناه .

if (!context.value) {
context.value = 0;
}
context.value +=1;
msg.count = context.value;
return msg;

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

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 لحفظ وقت بدء التدفق في خاصية السياق العالمي أدناه :

context.global.startTime = new Date().getTime();
return msg;

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

var currentTime = new Date().getTime();
var timeElapsed = (currentTime - context.global.startTime)/1000;
msg.payload = "Time elapsed is: "+timeElapsed+"s";
return msg;

إضافة و إعداد عقدة التأخير (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 watch Box هو نسخة من 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 العقد المتقدمة التالية :

اسم العقدة الوصف
ping pings هي آلة ترجع وقت الرحلة في ميلي ثانية . ويرجع 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  تتجاهل الرسائل الفارغة.

if (msg.payload.weather === "Clear") {
msg.payload = "Clear skies ahead today!"
return msg;
}
return null;

يمكنك الأن أن تفعل عدة تطبيقات على هذا التدفق مثلا توصيل هذة الرسالة إلى عقدة البريد الإلكتروني أو عقدة 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 كما هو موضح بالصورة أدناه :

[{"id":"3b4275ef.c4bd8a","type":"openweathermap in","name":"","lon":"","lat":"","city":"","country":"","x":141.0994415283203,"y":284.0909118652344,"z":"d0851e69.2f7ae","wires":[["b766183d.4899e8"]]},{"id":"b766183d.4899e8","type":"function","name":"","func":"if (msg.payload.weather === \"Clear\") {\n msg.payload = \"Clear skies ahead today!\"\n return msg;\n}\nreturn null;","outputs":1,"noerr":0,"x":268.0994567871094,"y":344.0909118652344,"z":"d0851e69.2f7ae","wires":[["c221838c.3dde8"]]},{"id":"c221838c.3dde8","type":"twitter out","name":"Tweet","x":393.0994415283203,"y":391.0909118652344,"z":"d0851e69.2f7ae","wires":[]}]

building-your-first-flows

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

building-your-first-flows

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




مقدمة موجزة للـ Node-RED

Node-RED

node-RED  هي أدارة قوية لبناء تطبيقات انترنت الأشياء مع التركيز على تبسيط  توصيل الأسلاك معا بين blocks التعليمات البرمجية  لتنفيذ المهام. حيث يستخدم نهج البرمجية المرئية التي تسمح للمطورين لربط blocks  التعليمات البرمجية المحددة مسبقا، و المعروفة بإسم العقد “nodes” ، معا لأداء المهمة. العقد “Nodes” المتصلة ، عادة ما تكون مزيجا من عقد الادخال(input nodes)  ، عقد المعالجة  (processing nodes) ، و عقد الاخراج(output nodes) ، يتم توصيلهم معا لتشكيل التدفقات “Flows”  .

في الأصل تم تطويرها كمشروع مفتوح المصدر من قبل  IBM، لتلبية حاجتهم للاتصال السريع بين الأجهزة و خادمات الويب web services)) و البرامج الأخرى، وسرعان ما تطورت لتكون الغرض العام لأداة برمجة IOT . وعلى الرغم من أن Node-REDمصممة أصلا للعمل مع انترنت الأشياء،  أي الأجهزة التي تتفاعل و تتحكم بمحيطها، كما تطورت و أصبحت مفيدة لمجموعة واسعة من التطبيقات.

node-red-introduction

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

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

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

في أول مثال للتدفق في هذا الدرس ، سيتم استقبال رسالة من التويتر تحتوي على علامة hashtag  للتحكم في تشغيل و ايقاف الـ LED عند وصول تغرييدة جديدة.  على سبيل المثال دعونا نفترض أن Node-RED  يعمل على Raspberry pi  .

المثال الأول: استخدام التويتر للتحكم بالراسبيري باي

يتم انشاء تدفق الـ Node-RED  للتحقق من التويتر و لمعرفة ما اذا تم الكشف عن hashtag #led، و التحكم بالـ LED الموصل على الراسبيري باي كما هو موضح بالشكل أدناه . كما تلاحظ ، يتكون التدفق من ثلاث عقد متصلة معا – عقدة التويتر على اليسار ، و عقدة trigger   في الوسط ، و عقدة الراسبيري باي (gpionode) على اليمين. كل العقد ممثلة بمستطيلات وعادة ما تحتوي على رمز لتمثيل نوعها ، على سبيل المثال عقدة التويتر تحتوي على رمز التويتر (الطائر) و مع اسم النص الذي يمكن تعيينها من قبل المبرمج.

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

node-red-introduction

عقدة التويتر هي عقدة مضمنة في Node-RED  و تخفي كل من تعقيدات استخدام تويتر API . يمكن تكوينها / تهيئتها باستخدام بيانات اعتماد حساب المستخدم و مجموعة متنوعة من سلاسل البحث، في حالتنا تبحث عن العلامة hashtag “#led”. عندما تكتشف عقدة التويتر هذة العلامة في حساب تويتر المستخدم، فإنها تنشئ رسالة جديدة تحتوي على تفاصيل التغريدة، و التي يتم تدفقها إلى العقدة التالية في التدفق. في مثالنا ، عقدة trigger تستقبل الرسالة مع تفاصيل التغريدة.

node-red-introduction

عقدة Trigger هي ايضا عقدة مضمنة في Node-RED  و السلوك الافتراضي الخاص بها هو انتظار اي رسالة على مدخلاتها. عندما تتلقى الرسالة، فإنها تطلق اشارة ، و ترسل رسالة على تبويب الاخراج لديها مع قيمة “1”  كنص للرسالة. ومن ثم ينتظر لمدة ثانية و يرسل رسالة ثانية مع قيمة 0 في نص الرسالة.

و نظرا لربط عقدة الـ trigger  إلى عقدة الـ gpionode، التي تسيطر على المداخل و المخارج على الراسبيري باي ، و التي تتلقى هذه الرسائل الاثنين على مدخلاتها.

مرة أخرى، gpionode  هي عقدة مضمنة في Node-RED  و التي تخفي تفاصيل اعدادات منافذ الادخال و الإخراج على الراسبيري باي. فعندما تستقبل رسالة مع قيمة “1” في نص الرسالة ، فإنها تعطي المنفذ قيمة high، و عندما تتلقى رسالة مع نص بقيمة “0” فإنها تعطي قيمة LOW للمنفذ. في هذا المثال ، يتم تكوين عقدة gpionode للتحكم على نفذ رقم 12 .

node-red-introduction

اذا كان لديك راسبيري باي مع LED  موصل على المنفذ رقم 12 ، عقدة gpionode  ستقوم بإخراج قيمة HIGH  لمدة ثانية واحدة ثم قيمة LOW ، و سوف يسبب وميض على الـ LED لمدة ثانية واحدة.

اذا كنت تفكر في ما يحدث هنا، في الوقع هذا مثال قوي من Node-RED  و انترنت الاشياء. فهو يكون ربط “Twitterverse” الى الراسبيري باي و LED ، وهو لا يتطلب اي برمجة- يتم تنفيذ جميع المهام من قبل العقد التي تم انشاءها في Node-RED  و التي تحتاج فقط للتهيئة/الاعدادات.

استخدام  Node-RED لتنبيهك عند عدم انتهائك من اداء برنامج التمارين الرياضية

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

node-red-introduction

التدفق هنا اكثر تعقيدا، وذلك بإستخدام 6 عقد (انظر الشكل أدناه ) ، فعن طريق استخدام العقد المدمجة يمكنك إنجاز المهام المعقد مع برمجة قليلة أو معدومة.

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

node-red-introduction

عقدة التبديل (Switch Node) تنفذ اختبار بسيط، فهي تقوم بالتحقق من قيمة الرسالة المدخلة اليها ثم تقوم بإرسال مع قيمة “1” اذا كان الاختبار صحيح .في حالتنا تم تكوينه لاختبار قيمة درجة الحرارة (tempc) لمعرفة ما اذا كانت 15 درجة مئوية أو أعلى.

عندما تتحقق عقدة التبديل (Switch Node) ويكون الاختبار صحيح، فإنها ترسل رسالة إلى عقدة fitbit و التي تمثل العقدة الثالثة في التدفق. عقدة fitbit يمكنك تكوينها / تهيئتها للحصول على إحصاءات على الجهاز الخاص بك من البوابة fitbit.com . تقوم عقدة fitbit  بحزم الإحصاءات لجهازك في رسالة و توجيهها إلى العقدة التالية في التدفق .

العقدة التالية هي عقدة تبديل (switch Node ) ايضا . تم تكوينها لمعرفة ما اذا كان عدد الخطوات التي قمت بمشيها اليوم هو أقل من 1000 .  وذلك من خلال اختبار لمعرفة ما اذا كان حق البيانات fitbit ،  summary.steps ، هو أقل من 1000. تذكر ، انه تم الحصول على هذة الإحصاءات في رسالة من عقدة fitbit و التي بدورها حصلت عليها عن طريق إجراء استدعاء للـ fitbit API  على fibit.com  .

اذا كنت قد مشيت اقل من 1000 خطوات في اليوم، فإن عقدة التبديل (switch Node) تولد رسالة التي يتم تمريرها خلال التدفق إلى عقدة function  .

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

حالما يتم إنشاء هذه الرسالة في العقدة function ، يتم إرسالها من خلال التدفق إلى العقدة الأخيرة و هي عقدة البريد الإلكتروني (Email Node) . هذة العقدة تأخذ محتوى اي رسالة واردة و تقوم بإرسالها إلى البريد الالكتروني الذي تم تحديده/اعداده  عندما يتم تهيئة العقدة.

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

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

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

بناء خدمة ويب بسيطة باستخدام عقد HTTP المدمجة في Node-RED

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

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

node-red-introduction

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

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

<!doctype html>

<head>

<title>A Node RED Example</title>

<link rel=”stylesheet” href=”//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css”>

<script src=”//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js”></script>

<script src=”//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js”></script>

<script src=”//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js”></script>

</head>

<html>

<div id=”chart-example” style=”height: 250px;”></div>

<script>

Morris.Donut({

element: ‘chart-example’,

data: [

{label: “Activity Calories”, value: {{payload.summary.activityCalories}} },

{label: “Calories BMR”, value: {{payload.summary.caloriesBMR}} },

{label: “Calories Out”, value: {{payload.summary.caloriesOut}} }

]

});

</script>

</html>

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

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

node-red-introduction

تاريخ الـ Node-RED :

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

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

عندما أنشألت مجموعة IBM  الـ Node-RED ، فإنها كانت تركز في الغالب على انترنت الأشياء، أي بمعنى توصل الأجهزة للمعالجات او العكس.  كأداة لتطويرالتطبيقات السريعة لإنترنت الأشياء ، الـ Node-RED على حد سواء قوية و مرنة. وقوتها تأتي من مزيج من اثنين من العوامل :

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

هذان العاملان جعلو من Node-RED  أداة قوية لتطوير تطبيقات انترنت الأشياء .