استخدِم الدليل التالي لفهم كيفية استخدام العقد المختلفة في Automation DSL لإنشاء عملية مبرمَجة.
يتم وضع كل لغة DSL للتشغيل الآلي ضمن عقدة automation
واحدة. تشكل عقدة
automation
الحدود بين سياق لغة Kotlin
الخارجي وسياق لغة DSL المضمّنة.
التسلسل
المسار التسلسلي هو النوع التلقائي لمسار التشغيل الآلي.
في ما يلي نموذج Automation DSL أساسي جدًا يستخدم تسلسلاً متّصلاً يتألّف من عنصر بدء وحالة وإجراء:
import com.google.home.automation.action
import com.google.home.automation.automation
import com.google.home.automation.condition
import com.google.home.automation.sequential
import com.google.home.automation.starter
...
automation {
sequential {
starter<_>(...)
condition {...}
action {...}
}
}
ويمكن تحسين ذلك من خلال إضافة عقد إضافية.
مبتدئ
تحدِّد العقد المبدئية الظروف الأولية التي تفعِّل عملية التشغيل الآلي. على سبيل المثال، تغيير في الحالة أو القيمة يجب أن تحتوي العملية المبرمَجة على عامل إشعال واحد على الأقل، وإلا لن تجتاز عملية التحقّق. لإضافة أكثر من خطوة بدء واحدة إلى عملية تشغيل آلي، عليك استخدام عقدة اختيار.
النموذج الأساسي المستنِد إلى سمة السمة
عند تحديد عقدة بداية تستند إلى سمة سمة، حدِّد ما يلي:
- الجهاز
- نوع الجهاز الذي تنتمي إليه السمة
- السمة
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
تكون مَعلمة نوع الجهاز مطلوبة لأنّها تتيح لك تحديد نوع
الجهاز ضمن جهاز معيّن تتعامل معه العملية المبرمَجة. على سبيل المثال، قد يكون الجهاز
مكوّنًا من
FanDevice
و
HeatingCoolingUnitDevice
،
وكلاهما يحتوي على سمة
OnOff
. من خلال تحديد نوع الجهاز، لا يكون هناك أي غموض حول الجزء الذي يؤدي إلى بدء التشغيل الآلي في
الجهاز.
بدء الإجراء استنادًا إلى الحدث
عند تحديد عقدة بداية تستند إلى حدث، حدِّد ما يلي:
- الجهاز
- نوع الجهاز الذي تنتمي إليه السمة
- الحدث
starter<_>(doorBell, GoogleDoorbellDevice, DoorbellPressed)
نموذج أساسي يستند إلى بنية وحدث، مع مَعلمات
يمكن أن تحتوي بعض الأحداث على مَعلمات، لذا يجب أيضًا تضمين هذه المَعلمات في المشغِّل.
على سبيل المثال، يستخدم هذا الإجراء المشغِّل ScheduledTimeEvent
لسمة
Time
لتفعيل الإجراء المبرمَج في الساعة 7:00 صباحًا:
val earlyMorning = starter<_>(structure, Time.ScheduledTimeEvent) {
parameter(Time.ScheduledTimeEvent.clockTime(
LocalTime.of(7, 0, 0, 0)))
}
نظام التشغيل اليدوي
إنّ أداة البدء اليدوية هي نوع خاص من أدوات البدء التي تسمح للمستخدم ب تشغيل التشغيل الآلي يدويًا.
عند تحديد عنصر بدء يدوي:
- لا تحدِّد سمة أو نوع جهاز.
- قدِّم عنصر واجهة مستخدم يستدعي
Automation.execute()
.
عند وضع إجراء تفعيل يدوي في مسار select
مع إجراء تفعيل آخر، يتم إلغاء الإجراء الآخر من خلال الإجراء اليدوي:
select {
manualStarter()
starter<_>(thermostat, TemperatureSensorDevice, TemperatureMeasurement)
}
يُرجى العِلم أنّه سيتم تقييم أيّ عقد condition
بعد بدء يدوي،
وقد يؤدي ذلك إلى حظر تنفيذ التشغيل الآلي، استنادًا إلى تعبير condition
.
من بين طرق تنظيم التشغيل الآلي لكي لا تحظر عقد condition
عملية
تشغيل آلي تم تفعيلها باستخدام مشغّل يدوي، هي وضع مشغّل العملية
الآخر في تسلسل منفصل مع condition
:
automation_graph {
sequential {
select {
sequential {
starter<_>(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
}
الإشارة إلى قيمة سمة
لاستخدام قيمة سمة في تعبير، استخدِم البنية التالية.
باستخدام stateReader
:
val time = stateReader<_>(structure, Structure, Time)
val currTime = time.currentTime
باستخدام starter
:
val starterNode = starter<_>(device1, LaundryWasherDevice, OnOff)
condition() {
expression = starterNode.onOff equals true
}
عقد الشروط والتعبيرات
تمثّل عقدة الشرط نقطة قرار تحدّد ما إذا كان سيتم مواصلة الإجراء المبرمَج أم لا. يمكن أن تتضمّن عملية التشغيل الآلي عدّة عقد condition
.
إذا تم تقييم تعبير أيّ عقدة condition
على أنّه false
، ينتهي تنفيذ
العملية المبرمَجة بالكامل.
ضمن عقدة condition
، يمكنك دمج معايير شروط متعددة باستخدام
عوامل تشغيل مختلفة، ما دام التعبير يُقيّم على أنّه قيمة
boolean واحدة. إذا كانت القيمة الناتجة هي true
، يتم استيفاء الشرط ويواصل الإجراء المبرمَج تنفيذ العقدة التالية. إذا كانت القيمة false
، سيتوقّف تنفيذ الإجراء المبرمَج في تلك المرحلة.
يتم إنشاء التعبيرات بشكل مشابه للتعبيرات في Kotlin، وقد تحتوي على قيم أساسية مثل الأرقام والأحرف والسلاسل والقيم المنطقية، بالإضافة إلى قيم Enum. يتيح لك تجميع التعبيرات الفرعية بين قوسين التحكّم في الترتيب الذي يتم تقييمها به.
في ما يلي مثال على condition
يجمع بين تعبيرات فرعية متعددة في تعبير واحد:
condition() {
val expr1 = starterNode.lockState equals DlLockState.Unlocked
val expr2 = stateReaderNode.lockState equals true
val expr3 = occupancySensingDevice.occupied notEquals 0
val expr4 = timeStateReaderNode
.currentTime
.between(
timeStateReaderNode.sunsetTime,
timeStateReaderNode.sunriseTime)
expression = (expr1 and expr2) or (expr3 and expr4)
}
يمكنك الإشارة إلى قيمة سمة يتم الوصول إليها من خلال عنصر بدء:
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
الطريقة الأخرى للإشارة إلى قيم سمات السمات في عقدة condition
هي باستخدام
عقدة stateReader
.
لإجراء ذلك، عليك أولاً تسجيل قيمة سمة السمة في عقدة stateReader
. تأخذ الدالة
stateReader
العنصر structure
والسمة كوسيطات:
import com.google.home.automation.stateReader
...
val filterMonitoringState = stateReader<_>(structure, ActivatedCarbonFilterMonitoring)
بعد ذلك، يمكنك الإشارة إلى stateReader
في عقدة condition
:
condition() {
expression =
filterMonitoringState.changeIndication
.equals(ChangeIndicationEnum.Warning)
}
باستخدام عوامل المقارنة و
عوامل التشغيل المنطقية، يمكن استخدام عدة
stateReaders
في عقدة condition
:
val armState = stateReader<_>(doorLock, DoorLockDevice, ArmDisarm )
val doorLockState = stateReader<_>(doorLock, DoorLockDevice, DoorLock)
condition() {
expression =
(armState.armState equals true)
and
(doorLockState.lockState equals true)
}
مدة الشرط
بالإضافة إلى التعبير المنطقي في أحد الشروط، يمكنك تحديد إطار زمني يجب أن يكون خلاله التعبير صحيحًا لتشغيل الإجراء المبرمَج. على سبيل المثال، يمكنك تحديد شرط لا يتم تفعيله إلا إذا كان المصباح مضاءً لمدة عشرة دقائق.
condition {
expression(lightStateReader.onOff == true)
forDuration(Duration.ofMinutes(10))
}
يمكن أن تتراوح المدة بين دقيقة واحدة و30 دقيقة.
عقد الإجراءات
عقدة الإجراء هي المكان الذي يتم فيه تنفيذ الإجراءات المبرمَجة.
في هذا المثال، يستدعي الإجراء الأمر
broadcast()
الخاص بالسمة
AssistantBroadcast
:
action(device, SpeakerDevice) {
command(AssistantBroadcast.broadcast("Intruder detected!"))
}
عبارات الاستيراد
عند تطوير عمليات التشغيل الآلي، لا يكون من الواضح دائمًا كيفية استيراد مختلف عناصر واجهات برمجة تطبيقات Home إلى الرمز البرمجي.
يتم استيراد سمات السمة من عنصر Companion
للسمة:
import com.google.home.matter.standard.OnOff.Companion.onOff
يتم استيراد هياكل البيانات التي يتم تحديدها من خلال سمة من فئة السمة التي ينتهي اسمها بـ "-Trait":
import com.google.home.matter.standard.MediaPlaybackTrait.PlaybackStateEnum
يتم استيراد أوامر السمات من عنصر Companion
للسمة:
import com.google.home.matter.standard.Thermostat.Companion.setTemperatureSetpointHold