مفاهیم DSL اندروید

این مروری بر مفاهیم اساسی Automation DSL در اندروید است.

اجزای اتوماسیون

یک اتوماسیون از اجزای اساسی زیر تشکیل شده است که معمولاً به این ترتیب ارزیابی می‌شوند:

  1. شروع‌کننده - شرایط اولیه‌ای را که اتوماسیون را فعال می‌کنند، مانند تغییر در یک ویژگی، تعریف می‌کند. یک اتوماسیون باید یک شروع‌کننده داشته باشد.
  2. شرط (Condition ) — هرگونه محدودیت اضافی که پس از فعال شدن یک اتوماسیون باید ارزیابی شود. عبارت موجود در یک شرط (Condition) باید به true ارزیابی شود تا اقدامات یک اتوماسیون ادامه یابد.
  3. اقدام (Action) — دستورات یا به‌روزرسانی‌های وضعیت که زمانی انجام می‌شوند که همه شرایط برآورده شده باشند.

برای مثال، شاید شما یک سیستم خودکار داشته باشید که وقتی تلویزیون یک اتاق بین غروب و طلوع آفتاب روشن می‌شود، نور چراغ‌های آن اتاق را کم کند. در این مثال:

  1. شروع کننده - تلویزیون روشن شد، که تغییر وضعیت در یک ویژگی تلویزیون است.
  2. وضعیت - زمان فعلی خانه‌ای که تلویزیون در آن قرار دارد ارزیابی می‌شود.
  3. اقدام - چراغ‌های همان اتاقی که تلویزیون در آن قرار دارد، کم‌نور می‌شوند.

اتوماسیون زمانی فعال می‌شود که تلویزیون اتاق روشن باشد، اما اتوماسیون فقط در صورتی اجرا می‌شود که شرط «زمان بین غروب و طلوع خورشید باشد» برقرار باشد.

علاوه بر ساختار اولیه، اتوماسیون‌ها در APIهای Home همچنین شامل فراداده‌هایی مانند نام و توضیحات هستند که می‌توانند برای شناسایی آنها برای توسعه‌دهندگان و کاربران استفاده شوند.

گره‌ها

در APIهای خانگی، ساختار منطقی یک اتوماسیون از گره‌ها تشکیل شده است. گره‌ها واحدهای انتزاعی و قابل استفاده مجدد هستند که رفتارهای موجودیت یا جریان‌های اجرایی را نشان می‌دهند. هر گره می‌تواند متغیرهای ورودی و همچنین متغیرهای خروجی داشته باشد که ممکن است توسط گره‌های دیگر مصرف شوند.

جدول: انواع گره‌های اتوماسیون
گره نوع گره پیاده‌سازی کاتلین توضیحات
استارتر رفتاری StarterNodeDsl وقتی وضعیت یک ویژگی (هر ویژگی) تغییر کند، اتوماسیون را شروع می‌کند.
استیت ریدر رفتاری StateReaderNodeDsl یک ویژگی صفت را می‌خواند و به شما امکان می‌دهد مقدار آن را برای استفاده در گره‌های شرط ثبت کنید.
اکشن رفتاری ActionNodeDsl دستورات مربوط به صفت (trait) را فراخوانی می‌کند.
متوالی جریان اجرا SequentialFlow گره‌های عملیاتی تو در تو را به ترتیب اجرا می‌کند. این رفتار پیش‌فرض اجرا است.
موازی جریان اجرا ParallelFlow گره‌های عملیاتی تو در تو را به صورت موازی اجرا می‌کند.
وضعیت جریان اجرا ConditionNodeDsl جریان اجرا را بر اساس ارزیابی عبارات منطقی به صورت شرطی تغییر دهید. شرایط ممکن است با یک شروع کننده (شرایط خاص شروع کننده) مرتبط باشند یا سراسری باشند (برای همه شروع کننده ها اعمال شوند).
انتخاب کنید جریان اجرا SelectFlow به بیش از یک استارتر اجازه می‌دهد تا یک اتوماسیون را فعال کنند.
بیان ارزش Expression می‌تواند مقدار ویژگی یک ویژگی، یک ثابت یا یک مقدار تحت‌اللفظی باشد و باید به یک لیست، عدد، مقدار بولی یا رشته ارزیابی شود.

گره‌های رفتاری

گره‌هایی مانند شروع‌کننده‌ها و اقدامات، گره‌های رفتاری هستند. شروع‌کننده‌ها بر اساس تغییرات ویژگی‌های دستگاه، اتوماسیون را فعال می‌کنند. اقدامات، دستورات دستگاه را صادر می‌کنند یا ویژگی‌ها را به‌روزرسانی می‌کنند.

گره‌های رفتاری معمولاً به ویژگی‌های دستگاه و وضعیت ویژگی خروجی برای استفاده به عنوان ورودی در گره‌های دیگر گره خورده‌اند.

گره‌های جریان اجرا

برخی گره‌ها نمایانگر جریان‌های اجرایی مانند ترتیبی و موازی هستند. هر یک از این گره‌ها شامل گره‌های رفتاری هستند که اتوماسیون را تعریف می‌کنند.

برای مثال، یک جریان ترتیبی ممکن است شامل گره‌هایی باشد که به ترتیب اجرا می‌شوند. معمولاً این گره‌ها عبارتند از شروع‌کننده، شرط و عمل.

جریان‌های اجرای متوالی
شکل ۱: جریان اتوماسیون متوالی

یک جریان موازی ممکن است چندین گره عملیاتی داشته باشد که همزمان اجرا می‌شوند، مانند روشن کردن چندین چراغ به طور همزمان. گره‌های دنبال‌کننده یک جریان موازی تا زمانی که تمام شاخه‌های جریان موازی تمام نشوند، اجرا نخواهند شد.

جریان‌های اجرای موازی
شکل ۲: جریان اتوماسیون موازی

نوع دیگری از جریان اجرا، جریان شرط است که می‌تواند جریان اجرا را بر اساس ارزیابی یک عبارت تغییر دهد.

برای مثال، شاید شما یک اتوماسیون داشته باشید که بر اساس اینکه آیا شب است یا خیر، عملی را انجام می‌دهد. یک گره شرطی زمان روز را بررسی می‌کند، سپس بر اساس آن ارزیابی، مسیر اجرای مناسب را دنبال می‌کند.

جریان شرط
شکل ۳: جریان شرط

یک جریان انتخابی زمانی مفید است که می‌خواهید بیش از یک شروع‌کننده داشته باشید که بتواند اتوماسیون شما را فعال کند. وقتی دو یا چند شروع‌کننده را در یک جریان select محصور می‌کنید، هر یک از شروع‌کننده‌ها می‌توانند اتوماسیون را فعال کنند.

برای مثال، می‌توانید یک اتوماسیون بنویسید که در هنگام غروب آفتاب، اگر دما از یک آستانه خاص بالاتر رود، یا اگر روشنایی از یک آستانه تجاوز کند، پرده‌ها را پایین بیاورد. سه شروع‌کننده جداگانه هر یک از این سناریوها را مدیریت می‌کنند و هر سه در یک جریان select قرار می‌گیرند.

جریان را انتخاب کنید
شکل ۴: انتخاب جریان

جریان‌های تو در تو

در اتوماسیون‌های پیچیده، گره‌های جریان اجرا می‌توانند تو در تو نیز باشند. برای مثال، ممکن است یک جریان ترتیبی داشته باشید که یک جریان موازی را اجرا می‌کند.

جریان‌های اجرایی تو در تو
شکل ۵: جریان‌های اجرایی تو در تو

گره‌های DSL می‌توانند به روش‌های مختلف برای برآورده کردن نیازهای خاص شما، طبق محدودیت‌های ذکر شده در جدول زیر، تودرتو و ترکیب شوند. ستون Builder به مستندات سازنده‌ی Kotlin typesafe پیوند دارد که جزئیات موارد مجاز برای استفاده در هر نوع گره را شرح می‌دهد.

جدول: نحوه ترکیب گره‌ها
گره ممکن است شامل نوع گره و داده‌های زیر باشد باید در یکی از انواع گره‌های زیر باشد
استارتر بیان انتخاب، ترتیبی
شروع کننده دستی انتخاب، ترتیبی
استیت ریدر عبارت (معمولاً شامل یک مقدار ویژگی صفت) عمل، وضعیت
اکشن دستور، موجودیت، عبارت موازی، انتخابی، متوالی
متوالی موازی، انتخابی، متوالی
موازی اکشن متوالی
وضعیت بیان موازی، متوالی
انتخاب کنید وضعیت، ترتیبی، استارتر، استارتر دستی متوالی است و باید اولین گره در جریان باشد

اتوماسیون DSL

در APIهای Home، اتوماسیون‌ها با استفاده از Automation DSL (زبان مختص دامنه) تعریف می‌شوند. Automation DSL به عنوان یک Kotlin DSL (زبان مختص دامنه) پیاده‌سازی شده است و از سازندگان نوع امن Kotlin استفاده می‌کند و به طور خاص برای تعریف قالب‌های اتوماسیون طراحی شده است.

وقتی یک اتوماسیون کامپایل می‌شود، سازندگان نوع امن کاتلین کلاس‌های داده کاتلین را تولید می‌کنند که سپس به بافر پروتکل JSON سریالی می‌شوند، که برای برقراری تماس با سرویس‌های اتوماسیون گوگل استفاده می‌شود.

Automation DSL فرآیند اتوماسیون ساختمان را ساده و روان می‌کند. این سیستم به صورت بومی از همان مدل داده‌ای ویژگی‌های استاندارد Matter و ویژگی‌های smart home که در Device API ارائه شده است، استفاده می‌کند.

Automation DSL همچنین منطق یک اتوماسیون را بر اساس انواع انتزاعی دستگاه‌ها، برخلاف نمونه‌های خاص دستگاه واقع در خانه کاربر، تعریف می‌کند. این به توسعه‌دهنده اجازه می‌دهد پارامترهای ورودی را که ممکن است در زمان اجرا برای مشخص کردن نمونه‌های واقعی دستگاه و همچنین سایر مقادیر مهم پارامتر استفاده شوند، ارائه دهد.

سینتکس DSL شبیه به کاتلین است و به همان اندازه از نظر نوع داده ایمن است، اما اتوماسیونی که در Automation DSL نوشته شده باشد، ساده‌تر و مختصرتر از همان اتوماسیونی است که به طور خالص با کاتلین نوشته شده است.

مثال

در زیر یک نمونه اتوماسیون که یک دستگاه را روشن می‌کند، با استفاده از 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 اختصاص داده می‌شود.