مفاهيم DSL في Android

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

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

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

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

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

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

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

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

العُقد

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

لغة Automation DSL

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

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

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

تحدّد لغة 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.