مفاهيم DSL في Android

هذه نظرة عامة على المفاهيم الأساسية للغة Automation DSL على Android.

مكوّنات التشغيل الآلي

تتألف عملية التشغيل الآلي من المكوّنات الأساسية التالية، التي يتم تقييمها عادةً بهذا الترتيب:

  1. إجراء التفعيل : يحدّد الشروط الأولية التي تؤدي إلى تفعيل عملية التشغيل الآلي، مثل تغيير سمة. يجب أن تتضمّن عملية التشغيل الآلي إجراء تفعيل.
  2. الشرط : أي قيود إضافية يتم تقييمها بعد تفعيل عملية التشغيل الآلي. يجب أن يكون التعبير في الشرط true لكي يتم تنفيذ إجراءات عملية التشغيل الآلي.
  3. الإجراء : الأوامر أو تعديلات الحالة التي يتم تنفيذها عند استيفاء جميع الشروط.

على سبيل المثال، قد تكون لديك عملية تشغيل آلي تخفّض إضاءة الغرفة عند تشغيل التلفزيون في تلك الغرفة بين غروب الشمس وشروقها. في هذا المثال:

  1. إجراء التفعيل : تم تشغيل التلفزيون، ما يمثّل تغييرًا في حالة سمة التلفزيون.
  2. الشرط : يتم تقييم الوقت الحالي للمنزل الذي يوجد فيه التلفزيون.
  3. الإجراء : يتم تخفيض إضاءة الغرفة نفسها التي يوجد فيها التلفزيون.

سيتم تفعيل عملية التشغيل الآلي عند تشغيل التلفزيون في الغرفة، ولكن لن يتم تنفيذها إلا إذا تم استيفاء شرط "الوقت بين غروب الشمس وشروقها".

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

العُقد

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

الجدول: أنواع عُقد التشغيل الآلي
العقدة نوع العُقدة التنفيذ بلغة Kotlin الوصف
إجراء التفعيل الأسئلة السلوكية StarterNodeDsl يبدأ عملية تشغيل آلي عند تغيير حالة سمة (أي سمة).
StateReader الأسئلة السلوكية StateReaderNodeDsl يقرأ سمة سمة ويسمح لك بتسجيل قيمتها لاستخدامها في عُقد الشروط.
الإجراء الأسئلة السلوكية ActionNodeDsl يستدعي أوامر السمات.
تسلسلي مسار التنفيذ SequentialFlow ينفّذ عُقد الإجراءات المضمّنة بالتسلسل. وهذا هو سلوك التنفيذ التلقائي.
متوازٍ مسار التنفيذ ParallelFlow ينفّذ عُقد الإجراءات المضمّنة بالتوازي.
الشرط مسار التنفيذ ConditionNodeDsl يغيّر مسار التنفيذ بشكلٍ مشروط استنادًا إلى تقييمات التعبيرات المنطقية يمكن ربط الشروط بإجراء تفعيل (شروط خاصة بإجراء التفعيل ) أو أن تكون عامة (تنطبق على جميع إجراءات التفعيل).
اختيار مسار التنفيذ SelectFlow يسمح لأكثر من إجراء تفعيل بتنشيط عملية تشغيل آلي.
IfFlow مسار التنفيذ IfFlowDsl ينفّذ إجراءً واحدًا على الأكثر (أو فرعًا) استنادًا إلى الشرط الذي يكون صحيحًا (إذا كان أي شرط صحيحًا) على غرار عبارة if-then-else.
التعبير القيمة Expression قد تكون قيمة سمة أو قيمة ثابتة أو قيمة حرفية، ويجب أن تكون قائمة أو رقمًا أو قيمة منطقية أو سلسلة.

العُقد السلوكية

العُقد، مثل إجراءات التفعيل والإجراءات، هي عُقد سلوكية. تفعِّل إجراءات التفعيل عملية تشغيل آلي استنادًا إلى تغييرات سمات الجهاز. تُصدر الإجراءات أوامر الجهاز أو تعدِّل السمات.

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

عُقد مسار التنفيذ

تمثّل بعض العُقد مسارات التنفيذ، مثل التسلسل والتوازي. تحتوي كل من هذه العُقد على العُقد السلوكية التي تحدّد عملية التشغيل الآلي.

على سبيل المثال، قد يحتوي مسار تسلسلي على عُقد يتم تنفيذها بترتيب تسلسلي. عادةً ما تكون هذه العُقد هي إجراء التفعيل والشرط والإجراء.

مسارات التنفيذ التسلسلي
الشكل 1: مسار التشغيل الآلي التسلسلي

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

مهام سير العمل المتوازية
الشكل 2: مسار التشغيل الآلي المتوازٍ

هناك نوع آخر من مسار التنفيذ وهو مسار الشرط، الذي يمكنه تغيير مسار التنفيذ استنادًا إلى تقييم تعبير.

على سبيل المثال، قد تكون لديك عملية تشغيل آلي تنفّذ إجراءً استنادًا إلى ما إذا كان الوقت ليلاً. تتحقّق عُقدة الشرط من الوقت من اليوم، ثم تتبع مسار التنفيذ المناسب استنادًا إلى هذا التقييم.

مسار الشرط
الشكل 3: مسار الشرط

يكون مسار الاختيار مفيدًا عندما تريد أن يكون لديك أكثر من إجراء تفعيل يمكنه تنشيط عملية التشغيل الآلي. عند تضمين إجراءَي تفعيل أو أكثر في مسار select، يمكن لأي من إجراءات التفعيل تنشيط عملية التشغيل الآلي.

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

اختيار مسار
الشكل 4: مسار الاختيار

يسمح مسار if-then-else (IfFlow) بتنفيذ مشروط متفرّع ضمن عملية تشغيل آلي. على عكس عُقدة condition التي توقف عملية التشغيل الآلي بأكملها إذا كان الشرط false، ينفّذ مسار if-then-else بشكلٍ مشروط إجراءات معيّنة عندما يكون الشرط صحيحًا، ويمكنه الرجوع إلى شروط بديلة أو إجراءات احتياطية، أو مواصلة العُقد اللاحقة في عملية التشغيل الآلي. لمزيد من التفاصيل، اطّلِع على التنفيذ المشروط.

المسارات المضمّنة

في عمليات التشغيل الآلي المعقّدة، يمكن أيضًا تضمين عُقد مسار التنفيذ. على سبيل المثال، قد يكون لديك مسار تسلسلي ينفّذ مسارًا متوازيًا.

تسلسلات التنفيذ المتداخلة
الشكل 5: مسارات التنفيذ المضمّنة

يمكن تضمين عُقد DSL ودمجها بطرق مختلفة لتلبية احتياجاتك المحدّدة، وفقًا للقيود الموضّحة في الجدول التالي. يرتبط عمود "المنشئ" بمستندات المنشئ الآمن من حيث النوع في Kotlin، التي توضّح ما يُسمح باستخدامه في كل نوع من أنواع العُقد.

الجدول: كيفية دمج العُقد
العقدة قد تحتوي على نوع العُقدة والبيانات التالية يجب أن تكون ضمن أحد أنواع العُقد التالية
إجراء التفعيل التعبير Select وSequential
ManualStarter Select وSequential
StateReader التعبير (يتألف عادةً من قيمة سمة) IfFlow وParallel وSequential
الإجراء الأمر والكيان والتعبير IfFlow وParallel وSelect وSequential
Sequential IfFlow وParallel وSelect وSequential
متوازٍ الإجراء IfFlow وSequential
الشرط التعبير IfFlow وParallel وSequential
اختيار Condition وSequential وStarter وManualStarter Sequential، ويجب أن تكون العُقدة الأولى في المسار
IfFlow Action وCondition وDelay وIfFlow وParallel وSequential وStateReader وSuppression Sequential

لغة Automation DSL

في واجهات برمجة تطبيقات Home، يتم تحديد عمليات التشغيل الآلي باستخدام لغة Automation DSL (لغة خاصة بالنطاق). يتم تنفيذ لغة Automation DSL كلغة Kotlin DSL (لغة خاصة بالنطاق)، باستخدام منشئات Kotlin الآمنة من حيث النوع، وهي مصمّمة خصيصًا لتحديد نماذج التشغيل الآلي.

عند تجميع عملية تشغيل آلي، تنشئ منشئات Kotlin الآمنة من حيث النوع فئات بيانات Kotlin يتم بعد ذلك نشرها على نحو متسلسِل إلى JSON لـ Protocol Buffers، الذي يُستخدم لإجراء طلبات إلى "خدمات التشغيل الآلي" من Google.

تُبسّط لغة Automation DSL عملية إنشاء عمليات التشغيل الآلي وتجعلها أكثر فعالية. تستخدم هذه اللغة بشكلٍ أساسي نموذج البيانات نفسه Matterلسمات Matter العادية وsmart homeسمات المنزل الذكي المميّزة في Device API.

تحدّد لغة Automation DSL أيضًا منطق عملية التشغيل الآلي من حيث أنواع الأجهزة المجرّدة، بدلاً من حالات الأجهزة المحدّدة الموجودة في منزل المستخدِم. تسمح هذه اللغة للمطوّر بتوفير مَعلمات الإدخال التي يمكن استخدامها في وقت التشغيل لتحديد حالات الأجهزة الفعلية، بالإضافة إلى قيم المَعلمات المهمة الأخرى.

يشبه بناء جملة DSL بناء جملة Kotlin، وهو آمن من حيث النوع بنفس القدر، ولكن عملية التشغيل الآلي المكتوبة بلغة Automation DSL تكون أبسط وأكثر إيجازًا من عملية التشغيل الآلي نفسها المكتوبة بلغة Kotlin فقط.

مثال

في ما يلي مثال على عملية تشغيل آلي تشغّل جهازًا، مكتوبة باستخدام لغة Automation 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.