يمكنك استخدام الدليل التالي لفهم كيفية استخدام عُقد لغة DSL المختلفة لإنشاء عملية تشغيل آلي.
يتم وضع جميع لغات DSL الخاصة بالتشغيل الآلي ضمن عقدة automation واحدة. تشكّل عقدة automation الحدود بين سياق لغة Swift الخارجي وسياق DSL المضمّن.
التدفق المتسلسل
المسار التسلسلي هو النوع التلقائي لمسار التشغيل الآلي.
في ما يلي نموذج أساسي جدًا للغة DSL الخاصة ببرنامج التشغيل الآلي، ويستخدم هذا النموذج تسلسلاً متتابعًا يتألف من عامل تشغيل وشرط وإجراء:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
starter(...)
condition {...}
action {...}
}
ويمكن تحسين ذلك عن طريق إضافة عُقد إضافية.
مبتدئ
تحدّد عُقد إجراءات التفعيل الظروف الأولية التي تفعّل عملية التشغيل الآلي. على سبيل المثال، تغيير في الحالة أو القيمة. يجب أن تتضمّن عملية التشغيل الآلي عامل تشغيل واحدًا على الأقل، وإلا لن تجتاز عملية التحقّق من الصحة. لإضافة أكثر من عامل تشغيل واحد إلى عملية التشغيل الآلي، يجب استخدام عقدة select.
مشغّل يستند إلى سمة معيّنة
عند الإعلان عن عقدة بداية تستند إلى سمة، حدِّد ما يلي:
- الجهاز
- نوع الجهاز الذي تنتمي إليه السمة
- السمة
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
يجب إدخال مَعلمة نوع الجهاز لأنّها تتيح لك تحديد نوع الجهاز الذي تستهدفه عملية التشغيل الآلي. على سبيل المثال، قد يتكوّن الجهاز من
FanDeviceType
وHeatingCoolingUnitDeviceType،
وكلاهما يحتوي على السمة
OnOffTrait. من خلال تحديد نوع الجهاز، لن يكون هناك أي غموض بشأن الجزء الذي
يؤدي إلى تشغيل عملية التشغيل الآلي في الجهاز.
مجموعة المبتدئين حسب الفعالية
عند الإعلان عن عقدة بداية تستند إلى حدث، حدِّد ما يلي:
- الجهاز
- نوع الجهاز الذي تنتمي إليه السمة
- الحدث
starter(
doorbell,
Google.GoogleDoorbellDeviceType.self,
Google.DoorbellPressTrait.DoorbellPressedEvent
)
مُشغِّل مستند إلى بنية وحدث، مع مَعلمات
يمكن أن تحتوي بعض الأحداث على مَعلمات، لذا يجب أيضًا تضمين هذه المَعلمات في ملف البدء.
على سبيل المثال، يستخدم إجراء التفعيل هذا
ScheduledEvent في TimeTrait
لتفعيل التشغيل الآلي عند الساعة 7:00 صباحًا:
typealias TimeTrait = Google.TimeTrait
let earlyMorning = starter(
structure,
TimeTrait.ScheduledEvent.self
) {
TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}
محادثة تمهيدية استنادًا إلى الطقس
يمكنك تحديد أحوال الطقس الحالية أو المتوقّعة في عامل تفعيل باستخدام سمة "الطقس":
let weatherState = starter<_>(structure, trait = Weather)
يمكنك الاطّلاع على إغلاق الستائر إذا كان من المحتمل هطول المطر في صفحة أمثلة على عمليات التشغيل الآلي.
مُشغِّل يدوي
مُشغِّل التشغيل اليدوي هو نوع خاص من المُشغِّلات يتيح للمستخدم تشغيل التشغيل الآلي يدويًا.
عند تحديد إجراء تفعيل يدوي:
- لا تحدّد سمة أو نوع جهاز.
- قدِّم عنصرًا في واجهة المستخدم يستدعي
Automation.execute().
عند وضع مشغّل يدوي في مسار select مع مشغّل آخر، يتجاوز المشغّل اليدوي المشغّل الآخر:
select {
manualStarter()
starter(
thermostat,
Matter.TemperatureSensorDeviceType.self,
Matter.TemperatureMeasurementTrait.self
)
}
يُرجى العِلم أنّه سيتم تقييم أي عُقد condition تلي عامل تشغيل يدوي،
وقد يتم حظر تنفيذ عملية التشغيل الآلي، وذلك حسب تعبير condition.
إحدى الطرق لتنظيم عملية التشغيل الآلي بحيث لا تمنع عُقد condition عملية التشغيل الآلي التي تم تفعيلها باستخدام مشغّل يدوي هي وضع المشغّل الآخر في مسار تسلسلي منفصل مع condition:
import GoogleHomeSDK
import GoogleHomeTypes
automation (
...
) {
select {
sequential {
starter(...)
condition {...}
}
sequential {
manualStarter()
}
}
action {...}
}
الإشارة إلى قيمة سمة
لاستخدام قيمة سمة في تعبير، استخدِم البنية التالية.
باستخدام stateReader:
typealias TimeTrait = Google.TimeTrait
let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime
باستخدام starter:
typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait
let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
عُقد الشرط والتعبيرات
تمثّل عقدة الشرط نقطة قرار تحدّد ما إذا كان سيتم مواصلة التشغيل الآلي أم لا. يمكن أن يتضمّن برنامج التشغيل الآلي عدة عُقد condition.
إذا تم تقييم تعبير أي عقدة condition على أنّه false، ينتهي تنفيذ عملية التشغيل الآلي بالكامل.
ضمن عقدة condition، يمكنك دمج معايير شروط متعددة باستخدام
عوامل تشغيل مختلفة، طالما أنّ
التعبير يتم تقييمه إلى قيمة منطقية واحدة. إذا كانت القيمة الناتجة هي
true، يتم استيفاء الشرط ويواصل التشغيل الآلي تنفيذ
العقدة التالية. إذا كانت القيمة false، يتوقف تنفيذ عملية التشغيل الآلي عند هذه النقطة.
يتم تشكيل التعبيرات بشكل مشابه للتعبيرات في Swift، وقد تحتوي على قيم أولية مثل الأرقام والأحرف والسلاسل والقيم المنطقية، بالإضافة إلى قيم التعداد. يتيح لك تجميع التعبيرات الفرعية بين قوسين التحكّم في ترتيب تقييمها.
في ما يلي مثال على condition يجمع بين تعبيرات فرعية متعددة في تعبير واحد:
condition {
let exp1 = starterNode.lockState.equals(.unlocked)
let exp2 = stateReaderNode.lockState.equals(true)
let exp3 = occupancySensingDevice.occupied.notEquals(0)
(exp1.and(exp2)).or(exp3)
}
يمكنك الإشارة إلى قيمة سمة يتم الوصول إليها من خلال مشغّل:
typealias OnOffTrait = Matter.OnOffTrait
let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }
stateReader
الطريقة الأخرى للإشارة إلى قيم سمات السمات في عقدة condition هي باستخدام عقدة stateReader.
لإجراء ذلك، عليك أولاً تسجيل قيمة سمة السمة في عقدة stateReader. تأخذ الدالة stateReader السمة وstructure كوسيطات:
typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait
let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)
بعد ذلك، أشِر إلى stateReader في العقدة condition:
condition {
filterMonitoringState.changeIndication.equals(.warning)
}
باستخدام عوامل المقارنة
والعوامل المنطقية،
يمكن استخدام عدة stateReaders في عقدة condition:
typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait
let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
let exp1 = armState.armState
let exp2 = doorLockState.lockState
exp1.and(exp2)
}
مدة الشرط
بالإضافة إلى التعبير المنطقي في الشرط، يمكنك تحديد إطار زمني يجب أن يكون التعبير فيه صحيحًا لتشغيل عملية التشغيل الآلي. على سبيل المثال، يمكنك تحديد شرط يتم تفعيله فقط إذا كان المصباح مضاءً لمدة عشر دقائق.
condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}
يمكن أن تتراوح المدة بين دقيقة واحدة و30 دقيقة.
عُقد الإجراءات
عقدة الإجراء هي المكان الذي يتم فيه تنفيذ عمل التشغيل الآلي.
في هذا المثال، يستدعي الإجراء الأمر broadcast() في AssistantBroadcastTrait:
action(speaker, SpeakerDeviceType.self) {
Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}