في ما يلي نظرة عامة على المفاهيم الأساسية للغة DSL الخاصة ببرنامج التشغيل الآلي على Android.
مكوّنات التشغيل الآلي
تتألف عملية التشغيل الآلي من المكوّنات الأساسية التالية، والتي يتم تقييمها عادةً بهذا الترتيب:
- إجراء التفعيل: يحدّد الشروط الأولية التي تفعّل عملية التشغيل الآلي، مثل تغيير في سمة معيّنة. يجب أن تتضمّن عملية التشغيل الآلي إجراء تفعيل.
- الشرط: أي قيود إضافية يتم تقييمها بعد تفعيل عملية التشغيل الآلي. يجب أن يتم تقييم التعبير في الشرط على أنّه
trueلكي تتم متابعة إجراءات التشغيل الآلي. - الإجراء: الأوامر أو تعديلات الحالة التي يتم تنفيذها عند استيفاء جميع الشروط
على سبيل المثال، قد يكون لديك عملية تشغيل آلي تخفّض الإضاءة في غرفة عند تشغيل التلفزيون في تلك الغرفة بين غروب الشمس وشروقها. في هذا المثال:
- المشغِّل: تم تشغيل التلفزيون، وهو تغيير في الحالة في سمة التلفزيون.
- الشرط: يتم تقييم الوقت الحالي للمنزل الذي يتوفّر فيه التلفزيون.
- الإجراء: يتم تعتيم الأضواء في الغرفة نفسها التي يوجد فيها التلفزيون.
سيتم تفعيل عملية التشغيل الآلي عند تشغيل التلفزيون في الغرفة، ولكن لن يتم تنفيذها إلا إذا تم استيفاء شرط "الوقت بين غروب الشمس وشروقها".
بالإضافة إلى البنية الأساسية، تحتوي عمليات التشغيل الآلي في Home APIs أيضًا على بيانات وصفية، مثل الاسم والوصف، والتي يمكن استخدامها لتحديدها للمطوّرين والمستخدمين.
العُقد
في Home APIs، تتكوّن البنية المنطقية لعملية التشغيل الآلي من عُقد. العُقد هي وحدات مجرّدة قابلة لإعادة الاستخدام تمثّل سلوكيات الكيانات أو مسارات التنفيذ. يمكن أن تحتوي كل عُقدة على متغيّرات إدخال، بالإضافة إلى متغيّرات إخراج قد تستخدمها عُقد أخرى.
| العقدة | نوع العُقدة | تنفيذ Kotlin | الوصف |
|---|---|---|---|
| Starter | السلوك |
StarterNodeDsl
|
يبدأ عملية التشغيل الآلي عندما تتغيّر حالة سمة (أي سمة). |
| StateReader | السلوك |
StateReaderNodeDsl
|
يقرأ سمة السمة ويتيح لك تسجيل قيمتها لاستخدامها في عُقد الشرط. |
| الإجراء | السلوك |
ActionNodeDsl
|
يتم استدعاء أوامر السمات. |
| تسلسلي | سير التنفيذ |
SequentialFlow
|
يتم تنفيذ عُقد الإجراءات المتداخلة بالتسلسل. هذا هو سلوك التنفيذ التلقائي. |
| Parallel | سير التنفيذ |
ParallelFlow
|
يتم تنفيذ عُقد الإجراءات المُدمجة بالتوازي. |
| الشرط | سير التنفيذ |
ConditionNodeDsl
|
تغيير مسار التنفيذ بشكل مشروط استنادًا إلى تقييمات التعبيرات المنطقية قد تكون الشروط مرتبطة بمشغّل (شروط خاصة بالمشغّل) أو تكون عامة (تنطبق على جميع المشغّلات). |
| اختيار | سير التنفيذ |
SelectFlow
|
يتيح هذا الخيار استخدام أكثر من إجراء تفعيل واحد لتشغيل عملية آليًا. |
| IfFlow | سير التنفيذ |
IfFlowDsl
|
يتم تنفيذ إجراء واحد (أو فرع واحد) على الأكثر استنادًا إلى الشرط (إن وُجد) الذي يتم تقييمه على أنّه صحيح (على غرار عبارة if-then-else). |
| Expression | القيمة |
Expression
|
قد تكون قيمة سمة أو قيمة ثابتة أو قيمة حرفية، ويجب أن يتم تقييمها إلى قائمة أو رقم أو قيمة منطقية أو سلسلة. |
العُقد السلوكية
العُقد مثل إجراءات التفعيل والإجراءات هي عُقد سلوكية. تؤدي إجراءات التفعيل إلى تفعيل عملية التشغيل الآلي استنادًا إلى التغييرات في سمات الجهاز. تُصدر الإجراءات أوامر للجهاز أو تعدّل السمات.
ترتبط العُقد السلوكية عادةً بسمات الجهاز وحالة سمات الإخراج لاستخدامها كإدخال في عُقد أخرى.
عُقَد سير التنفيذ
تمثّل بعض العُقد مسارات التنفيذ، مثل المسارات المتسلسلة والمتوازية. تحتوي كل عقدة من هذه العُقد على عُقد سلوكية تحدّد عملية التشغيل الآلي.
على سبيل المثال، قد يحتوي المسار التسلسلي على عُقد يتم تنفيذها بترتيب تسلسلي. وعادةً ما تكون هذه العناصر هي إجراء التفعيل والشرط والإجراء.
قد يتضمّن المسار المتوازي عُقد إجراءات متعددة يتم تنفيذها في الوقت نفسه، مثل تشغيل عدة مصابيح في الوقت نفسه. لن يتم تنفيذ العُقَد التي تلي مسارًا موازيًا إلا بعد انتهاء جميع فروع المسار الموازي.
هناك نوع آخر من تدفق التنفيذ وهو تدفق الشرط، والذي يمكنه تغيير تدفق التنفيذ بناءً على تقييم التعبير.
على سبيل المثال، قد يكون لديك عملية تشغيل آلي تنفّذ إجراءً استنادًا إلى ما إذا كان الوقت ليلاً. تتحقّق عقدة الشرط من الوقت، ثم تتبع مسار التنفيذ المناسب استنادًا إلى هذا التقييم.
يكون سير العمل المحدَّد مفيدًا عندما تريد استخدام أكثر من
عامل تشغيل واحد لتفعيل عملية التشغيل الآلي. عند تضمين إجراءَي تفعيل أو أكثر في مسار select، يمكن لأي من إجراءات التفعيل أن يفعّل التشغيل الآلي.
على سبيل المثال، يمكنك كتابة عملية تشغيل آلي تخفض الستائر عند غروب الشمس، أو إذا
ارتفعت درجة الحرارة فوق حد معين، أو إذا تجاوز السطوع
حدًا معينًا. تتعامل ثلاثة مشغّلات منفصلة مع كل من هذه السيناريوهات، وسيتم تضمين المشغّلات الثلاثة في مسار select.
يتيح سير العمل "إذا-ثم-وإلا" (IfFlow) تنفيذًا شرطيًا متفرعًا
ضمن عملية التشغيل الآلي. على عكس عقدة condition التي توقف عملية التشغيل الآلي بالكامل إذا كان الشرط false، فإنّ مسار "if-then-else" ينفّذ إجراءات محدّدة بشكل مشروط عندما يكون الشرط صحيحًا، ويمكنه الرجوع إلى شروط بديلة أو إجراءات احتياطية، أو المتابعة إلى العُقَد اللاحقة في عملية التشغيل الآلي. لمزيد من التفاصيل، يُرجى الاطّلاع على التنفيذ الشرطي.
المسارات المدمجة
في عمليات التشغيل الآلي المعقّدة، يمكن أيضًا دمج عُقد مسار التنفيذ. على سبيل المثال، قد يكون لديك تدفق تسلسلي ينفذ تدفقًا متوازيًا.
يمكن دمج عُقد DSL وتداخلها بطرق مختلفة لتلبية احتياجاتك المحدّدة، وفقًا للقيود الموضّحة في الجدول التالي. يؤدي عمود "أداة الإنشاء" إلى مستندات أداة إنشاء Kotlin الآمنة من حيث النوع، والتي توضّح بالتفصيل ما يُسمح باستخدامه في كل نوع من العُقد.
| العقدة | قد يحتوي على نوع العقدة والبيانات التالية | يجب أن يكون ضمن أحد أنواع العُقد التالية |
|---|---|---|
| Starter | التعبير | اختيار، تسلسلي |
| ManualStarter | اختيار، تسلسلي | |
| StateReader | تعبير (يتألف عادةً من قيمة سمة) | IfFlow, Parallel, Sequential |
| الإجراء | الأمر، الكيان، التعبير | IfFlow وParallel وSelect وSequential |
| تسلسلي | IfFlow, Parallel, Select, Sequential | |
| Parallel | الإجراء | IfFlow، تسلسلي |
| الشرط | التعبير | IfFlow, Parallel, Sequential |
| اختيار | Condition, Sequential, Starter, ManualStarter | متسلسلة، ويجب أن تكون العقدة الأولى في المسار |
| IfFlow | Action, Condition, Delay, IfFlow, Parallel, Sequential, StateReader, Suppression | تسلسلية |
لغة DSL للأتمتة
في Home APIs، يتم تحديد عمليات التشغيل الآلي باستخدام لغة DSL (لغة خاصة بالنطاق) الخاصة بالتشغيل الآلي. يتم تنفيذ لغة DSL الخاصة ببرنامج التشغيل الآلي على شكل لغة Kotlin DSL (لغة خاصة بالنطاق)، باستخدام أدوات إنشاء Kotlin التي تمنع أخطاء الكتابة، وهي مصمَّمة خصيصًا لتحديد نماذج التشغيل الآلي.
عند تجميع التشغيل الآلي، تنشئ أدوات الإنشاء التي تمنع أخطاء الكتابة في Kotlin فئات بيانات Kotlin التي يتم بعد ذلك نشرها على نحو متسلسِل إلى JSON الخاص بـ Protocol Buffers، والذي يُستخدم لإجراء طلبات إلى خدمات التشغيل الآلي من Google.
تسهّل لغة DSL الخاصة بالأتمتة عملية إنشاء عمليات التشغيل الآلي وتبسّطها. يستخدم هذا التطبيق تلقائيًا نموذج البيانات نفسه لسمات Matter العادية وسمات smart home المضمّنة في Device API.
تحدّد لغة DSL الخاصة ببرنامج التشغيل الآلي أيضًا منطق التشغيل الآلي من حيث أنواع الأجهزة المجرّدة، بدلاً من حالات الأجهزة المحدّدة الموجودة في منزل المستخدم. ويسمح للمطوّر بتقديم مَعلمات إدخال يمكن استخدامها في وقت التشغيل لتحديد مثيلات الأجهزة الفعلية، بالإضافة إلى قيم المَعلمات المهمة الأخرى.
تشبه بنية DSL بنية Kotlin، وهي آمنة من حيث النوع، ولكنّ عملية التشغيل الآلي المكتوبة بلغة Automation DSL تكون أبسط وأكثر إيجازًا من عملية التشغيل الآلي نفسها المكتوبة بلغة Kotlin الخالصة.
مثال
في ما يلي مثال على عملية تشغيل آلي لتشغيل جهاز، مكتوبة باستخدام لغة DSL الخاصة بالتشغيل الآلي:
val automation = automation {
name = "MyFirstAutomation"
description = "If light1 is on, turn on light2."
isActive = true
sequential {
val onOffTrait = starter<_>(device1, OnOffLightDevice, OnOff)
condition() { expression = onOffTrait.onOff equals true }
action(device2, OnOffLightDevice) { command(OnOff.on()) }
}
}
هذه عملية تشغيل آلي أساسية جدًا: عندما يتم تشغيل device1، وهو مصباح (تتغيّر سمة onOff إلى true)، يتم إرسال الأمر on() لتشغيل device2.
تستخدم عملية التشغيل الآلي عقدة sequential، ما يشير إلى أنّ عُقدها ستعمل
بترتيب تسلسلي.
ضمن العقدة sequential، توجد عقد سلوكية مثل starter وcondition وaction. يتم تعيين ناتج العقدة starter إلى
متغير لاستخدامه في العقدة condition.