ভাষার মৌলিক বিষয়

YAML বুঝুন

YAML হলো সফটওয়্যার কনফিগারেশন নির্দিষ্ট করার জন্য ব্যবহৃত একটি জনপ্রিয় ভাষা। এটি কাঠামোগত তথ্য উপস্থাপনের জন্য একটি সুস্পষ্ট ও সহজে পাঠযোগ্য উপায় প্রদান করে। আপনার প্রথম স্ক্রিপ্টেড অটোমেশন তৈরি করার আগে YAML সম্পর্কে কয়েকটি প্রাথমিক বিষয় জেনে নেওয়া প্রয়োজন। সাধারণভাবে YAML সম্পর্কে আরও জানতে, সংস্করণ ১.১ স্পেসিফিকেশনটি দেখুন।

কী-ভ্যালু জোড়া

YAML ডকুমেন্ট মূলত কী-ভ্যালু জোড়ের একটি সংগ্রহ। নিচের উদাহরণে, কী হলো name এবং ভ্যালু হলো TV on lights off । কী এবং ভ্যালু একটি কোলন ও তার পরে একটি স্পেস দ্বারা পৃথক করা হয়। একটি সুগঠিত YAML-এর জন্য এই দুটি অক্ষরই আবশ্যক।

name: TV on lights off

মূল্যবোধ

একটি কী-এর সাথে যুক্ত মান একটি স্ট্রিং, একটি সংখ্যা বা একটি তারিখের মতো সাধারণ হতে পারে, অথবা কী-ভ্যালু জোড়ের অন্য কোনো সংগ্রহের মতো জটিলও হতে পারে।

স্ট্রিং

যদি কোনো স্ট্রিং ভ্যালু নিম্নলিখিত অক্ষরগুলির কোনো একটি দিয়ে শুরু হয়: [ , { , " , ' বা # , অথবা স্ট্রিংটিতে : (একটি কোলনের পরে কয়েকটি স্পেস) থাকে, তাহলে সেটিকে অবশ্যই কোটেশনের মধ্যে রাখতে হবে।

একক এবং দ্বৈত উদ্ধৃতি চিহ্ন উভয়ই গ্রহণযোগ্য, তবে শেষের উদ্ধৃতি চিহ্নটি শুরুর উদ্ধৃতি চিহ্নের সাথে অবশ্যই মিলতে হবে।

সঠিক উদ্ধৃতি :

name: 'TV on lights off'

name: "TV on lights off"

ভুল উদ্ধৃতি (অসামঞ্জস্যপূর্ণ উদ্ধৃতি):

name: 'TV on lights off"

অন্য সব ধরনের স্ট্রিংয়ের ক্ষেত্রে উদ্ধৃতি চিহ্ন ঐচ্ছিক।

আপনার যদি একাধিক লাইনের স্ট্রিং প্রয়োজন হয়, তাহলে YAML স্পেসিফিকেশনের মাল্টি-লাইন স্কেলার সম্পর্কিত অংশটি দেখুন।

name: "[1] TV"
name: '{1} TV'
name: '#TV'
name: '"1" TV'
name: "'1' TV"
name: "\"1\" TV"
name: "TV: bedroom"

নেস্টেড কী-ভ্যালু পেয়ার

এখানে ` metadata কী-এর ভ্যালু হলো দুটি কী-ভ্যালু পেয়ারের ( name এবং description ) একটি তালিকা:

metadata:
  name: TV on lights off
  description: Turn off lights when TV turns on

খাঁজ

YAML কাঠামো বোঝাতে ইন্ডেন্টেশন ব্যবহার করে। পূর্ববর্তী উদাহরণে, name এবং description দুটি স্পেস দিয়ে ইন্ডেন্ট করা হয়েছে এটা বোঝাতে যে, এগুলো metadata কী-টির চাইল্ড।

YAML-এ ইন্ডেন্টেশন অত্যন্ত কঠোর। একটি চাইল্ড স্ট্রাকচারের ইন্ডেন্টেশন তার প্যারেন্টের চেয়ে গভীর হতে হবে এবং একই লেভেলের কী-ভ্যালু পেয়ারগুলোর ইন্ডেন্টেশন একই হতে হবে।

metadata:
  name:
    en: TV on lights off
  description:
    en: Turn off lights when TV turns on

একাধিক মান

যদি কোনো নির্দিষ্ট কী-এর একাধিক ভ্যালু থাকে, তাহলে প্রতিটি ভ্যালু একটি নতুন লাইনে তালিকাভুক্ত করা হয় এবং প্রতিটি লাইন একটি ড্যাশ ও একটি স্পেস দিয়ে শুরু হয়। নিম্নলিখিত উদাহরণে, দুটি লিস্ট রয়েছে:

  1. একটি অটোমেশনে একাধিক starters থাকতে পারে এবং সেই কারণে প্রথম স্টার্টারটি একটি ড্যাশ ও একটি স্পেস দিয়ে শুরু হয়।
  2. weekday একাধিক মান থাকতে পারে, তাই প্রতিটি মানকে আরও ইনডেন্ট করা হয় এবং এটি একটি ড্যাশ ও একটি স্পেস দিয়ে শুরু হয়।
starters:
- type: time.schedule
  at: SUNSET
  weekday:
  - MONDAY
  - THURSDAY
  state: on

মন্তব্য

# চিহ্নের পরে থাকা যেকোনো লেখাকে মন্তব্য হিসেবে গণ্য করা হয় এবং অটোমেশন ইঞ্জিন তা উপেক্ষা করে।

# চিহ্ন দিয়ে শুরু হওয়া লাইন একটি মন্তব্য।

স্ক্রিপ্ট কন্টেন্টের সাথে একই লাইনে কমেন্ট থাকতে পারে, কিন্তু # চিহ্নের আগে অবশ্যই একটি স্পেস দিতে হবে

# This is a comment. It will be ignored.
name: chromecast #This is a TV.

অটোমেশন স্ক্রিপ্ট

অটোমেশন স্ক্রিপ্ট সিনট্যাক্সের স্পেসিফিকেশনকে স্কিমা বলা হয়।

অটোমেশন স্কিমাটি কয়েকটি ডেটা স্ট্রাকচার সংজ্ঞায়িত করে:

  • একটি একক কী-ভ্যালু পেয়ারকে ফিল্ড বলা হয়।
  • স্কিমা দ্বারা সংজ্ঞায়িত ফিল্ডসমূহের সমষ্টিকে স্ট্রাক্ট বলা হয়।

কাঠামো

অটোমেশন স্ক্রিপ্টিং ল্যাঙ্গুয়েজ কয়েকটি স্ট্যান্ডার্ড 'ব্লক' বা ডেটা স্ট্রাকচার সংজ্ঞায়িত করে, যেগুলোকে স্ট্রাক্ট (Structs ) বলা হয়।

automation স্ট্রাক্টটি দেখুন, যা চারটি ফিল্ড সংজ্ঞায়িত করে:

চাবি প্রকার বর্ণনা

name

স্ট্রিং

ঐচ্ছিক।

অটোমেশনটির নাম।

এটি ব্যবহারকারীদের দেখানো হয় না, এটি শুধুমাত্র ডেভেলপারদের তথ্যের জন্য।

starters

[ প্রারম্ভিক ]

প্রয়োজনীয়।

প্রারম্ভিক খাবারের একটি তালিকা।

condition

অবস্থা

ঐচ্ছিক।

অবস্থা।

actions

[ পদক্ষেপ ]

প্রয়োজনীয়।

করণীয় কাজগুলোর একটি তালিকা।

দ্য রেফারেন্স এই বিভাগে সকল উপলব্ধ Struct-এর স্কিমা সংজ্ঞা প্রদান করা হয়েছে।

একটি নির্দিষ্ট Struct-এর মধ্যে কী-এর নামগুলো অনন্য এবং কেস-সেনসিটিভ হয়।

সম্ভাব্য মানের প্রকারগুলি হলো:

  • প্রিমিটিভ টাইপ: বুল, সংখ্যা, স্ট্রিং, সময়, ইত্যাদি।
  • Struct টাইপ: ফিল্ডসমূহের একটি সংগ্রহ।
  • অ্যারে হলো একটি ডেটা টাইপের অ্যারে। অ্যারে-কে [] দ্বারা প্রকাশ করা হয়। উদাহরণস্বরূপ, [string] হলো স্ট্রিং-এর একটি অ্যারে, এবং [Starter] হলো স্টার্টার স্ট্রাক্ট-এর একটি অ্যারে।
  • অন্যান্য বিশেষ প্রকার: এনটিটি, ফিল্ডপাথ।

প্রতিটি ক্ষেত্রের বিবরণে নিম্নলিখিত গুরুত্বপূর্ণ তথ্য অন্তর্ভুক্ত রয়েছে:

  • আবশ্যক বনাম ঐচ্ছিক, যা নির্দেশ করে যে ফিল্ডটি বাধ্যতামূলক নাকি এটি এড়িয়ে যাওয়া যাবে।
  • ফিল্ড নির্ভরশীলতা। শুধুমাত্র ঐচ্ছিক ফিল্ডগুলোরই নির্ভরশীলতা থাকে। এটি এই ফিল্ডটি ব্যবহার করার সময়কার অতিরিক্ত যাচাই প্রক্রিয়া বর্ণনা করে, যেমন— শুধুমাত্র ফিল্ড A সেট করা থাকলেই ফিল্ড B ব্যবহার করুন , অথবা যখন ফিল্ড A ব্যবহৃত হবে, তখন ফিল্ড B বা ফিল্ড C সেট করবেন না
  • সম্ভাব্য মানসমূহ। উদাহরণস্বরূপ, স্ট্রিং টাইপের একটি Enum Field-এর সীমিত মান সেট, অথবা নম্বর টাইপের একটি Field-এ ব্যবহৃত হতে পারে এমন সংখ্যার একটি পরিসর।

টাইপড স্ট্রাকচার

কিছু স্ট্রাক্ট একটি সময়সূচী বা ডিভাইসের অবস্থার পরিবর্তনের উপর ভিত্তি করে স্টার্টারকে উপস্থাপন করতে পারে। প্রত্যেক ধরনের starter অবশ্যই একটি স্বতন্ত্র ফিল্ড সেট প্রদান করতে হবে।

# A time schedule starter.
starter:
  type: time.schedule
  at: 10:00

# A device state change starter.
starter:
  type: device.state.OnOff
  device: TV - Living Room
  state: on
  is: true

starter হলো একটি টাইপড স্ট্রাক্ট, যা বিভিন্ন ফাংশন প্রদানের জন্য ফিল্ড type অন্যান্য চাইল্ড স্ট্রাক্ট, যেমন time.schedule বা device.state.OnOff , দ্বারা এক্সটেন্ড করা হয়। condition এবং action স্ট্রাক্টগুলোও টাইপড হয়ে থাকে।

Struct-এর অতিরিক্ত ফিল্ডগুলিকে অবশ্যই চাইল্ড Struct-এর ( type ) স্পেসিফিকেশন অনুসরণ করতে হবে। উদাহরণস্বরূপ, type হিসাবে device.state.OnOff ব্যবহার করার সময়, শুধুমাত্রসেই ধরণের জন্য নির্দিষ্ট ক্ষেত্রগুলিstarter স্ট্রাকচারে বৈধ।

অ্যারে

YAML-এ, ভ্যালুর একটি অ্যারে - (একটি ড্যাশের পরে একটি স্পেস) দিয়ে শুরু হয়। অ্যারেটিতে একাধিক Struct ভ্যালু বা একাধিক Primitive ভ্যালু থাকতে পারে। কিন্তু অ্যারের ভ্যালুগুলো অবশ্যই একই টাইপের হতে হবে।

অ্যারেতে যখন একটিমাত্র আইটেম থাকে, তখন আপনি ড্যাশ এবং স্পেস বাদ দিতে পারেন:

# The starters field accepts an array of Starter Structs.
# This is the standard format.
starters:
- type: time.schedule
  at: sunset
- type: time.schedule
  at: sunrise

# The dash can be omitted if the array only has one item.
# This is also valid.
starters:
  type: time.schedule
  at: sunset

বহুমাত্রিক অ্যারে , যেমন [[1, 2], [3, 4]] , অটোমেশন স্ক্রিপ্টিং-এ সমর্থিত নয়। ল্যাঙ্গুয়েজ পার্সার স্বয়ংক্রিয়ভাবে একটি বহুমাত্রিক অ্যারে-কে এক-মাত্রিক অ্যারে-তে রূপান্তরিত করবে, এক্ষেত্রে, [1, 2, 3, 4]

# INVALID: multi-dimensional array
- - 1
  - 2
- - 3
  - 4

আদিম

অটোমেশন স্ক্রিপ্ট স্কিমা নিম্নলিখিত প্রিমিটিভ ডেটা টাইপগুলো সমর্থন করে:

বুল

  • true
  • false

সংখ্যা

পূর্ণসংখ্যা বা দশমিক সংখ্যা

স্ট্রিং

সাধারণ লেখা

নির্দিষ্ট কিছু ক্ষেত্র ছাড়া স্ট্রিং-কে কোটেশনের মধ্যে রাখার প্রয়োজন নেই।

তারিখ

মাস ও দিন। ফরম্যাটটি হলো MM-DD বা MM/DD।

  • 09/01
  • 09-01

সময়

দিনের সময়। এটি ঘড়ির সময় বা সৌর সময় হতে পারে। ঘড়ির সময়ের জন্য, এটি AM/PM ফরম্যাট বা 24H ফরম্যাট ব্যবহার করতে পারে। সেকেন্ড ঐচ্ছিক। সৌর সময়ের জন্য, sunrise এবং sunset হলো মূল শব্দ, এবং এর পরে একটি অফসেট (সময়কালের হিসাবে) থাকতে পারে।

  • 12:30 am
  • 13:00:01
  • sunrise / sunset
  • sunset+30min / sunset-1hour

তারিখ ও সময়

বছর, মাস, দিন এবং দিনের সময়। তারিখ এবং সময়ের অংশের মধ্যে একটি স্পেস (ফাঁক) দিতে হবে। তারিখের ফরম্যাট হলো YYYY-MM-DD অথবা YYYY/MM/DD। সময়ের ফরম্যাট [Time](#time)-এর মতোই। টাইম জোন সমর্থিত নয়।

  • 2022/01/01 14:00
  • 2022-12-31 sunrise+30min

সপ্তাহের দিন

  • MONDAY (বা MON )
  • TUESDAY (বা TUE )
  • WEDNESDAY (বা WED )
  • THURSDAY (বা THU )
  • FRIDAY (বা FRI )
  • SATURDAY (বা SAT )
  • SUNDAY (বা SUN )

সময়কাল

একটি নির্দিষ্ট সময়কাল।

  • 30min
  • 1hour
  • 20sec
  • 1hour10min20sec

কালারহেক্স

একটি ছয়-অঙ্কের হেক্সাডেসিমাল কোড যা একটি রঙকে নির্দেশ করে।

শুরুতে কোনো # নেই।

  • FFFFFF
  • B5D2A1
  • DFA100

তাপমাত্রা

সাধারণ তাপমাত্রার তথ্য। তাপমাত্রা পরিমাপ বোঝাতে মানের সাথে সর্বদা 'C' বা 'F' যোগ করুন।

  • 20.5C
  • 90F

রঙতাপমাত্রা

কেলভিন এককে রঙের তাপমাত্রা।

  • 5000K

ব্যবহারকারী

একজন ব্যবহারকারীর ইমেইল ঠিকানা।

রঙ

তিনটি উপায়ের যেকোনো একটি ব্যবহার করে রং নির্দিষ্ট করা যেতে পারে - ColorHex বা ColorTemperature প্রিমিটিভ টাইপ, অথবা SpectrumHSV কম্পাউন্ড টাইপ ব্যবহার করে।

স্পেকট্রামএইচএসভি

SpectrumHSV টাইপটি তিনটি সাংখ্যিক ক্ষেত্র ব্যবহার করে একটি রঙ নির্দিষ্ট করে:

  • বর্ণচ্ছটা হলো রঙের তরঙ্গদৈর্ঘ্য।
  • স্যাচুরেশন রঙের তীব্রতা নির্দেশ করে।
  • মান কোনো রঙের আপেক্ষিক উজ্জ্বলতা বা গাঢ়ত্ব নির্দেশ করে।

গতিশীল

কখনও কখনও, কোনো কী-এর ডেটা টাইপ নির্দিষ্ট থাকে না। এটি অন্যান্য ফিল্ডের মানের উপর ভিত্তি করে প্রিমিটিভ টাইপগুলোর মধ্যে একটি হতে পারে।

ডাইনামিক ডেটা টাইপ ফিল্ডের একটি উদাহরণ হলো is । এর প্রকৃত টাইপ ` type এবং state উভয় ফিল্ডের মান দ্বারা নির্ধারিত হয়।

# The 'is' field accepts a number type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1
# The 'is' field accepts a boolean type.
type: device.state.OnOff
device: My TV - Living Room
state: on
is: false

সত্তা

ব্যবহারকারীর মালিকানাধীন কোনো সত্তা—যেমন ডিভাইস বা রুম—কে অনন্যভাবে শনাক্ত করার জন্য একটি বিশেষ স্ট্রিং ফরম্যাট।

অটোমেশনে ডিভাইস হলো সবচেয়ে বেশি ব্যবহৃত এনটিটি। এনটিটিটির স্ট্রিং ফরম্যাট হলো device name - room name

# The device field accepts a Device Entity type.
type: device.state.Volume
device: My TV - Living Room
state: currentVolume
is: 1

ফিল্ডপাথ

ডেটা পেলোডের মধ্যে কোনো ডেটা খুঁজে বের করতে ব্যবহৃত একটি বিশেষ স্ট্রিং ফরম্যাট। নিচের উদাহরণে, currentVolume হলো state ফিল্ডের FieldPath।

# The state field accepts a FieldPath type.
starters:
  type: device.state.Volume
  device: My TV - Living Room
  state: currentVolume
  is: 5

অন্যান্য ফিল্ডপাথে প্রয়োজনীয় আইটেমে পৌঁছানোর জন্য একাধিক স্তরের প্রয়োজন হতে পারে এবং স্টার্টার ও অ্যাকশনের মধ্যে ফরম্যাট ভিন্ন হয়।

স্টার্টারগুলিতে ডট নোটেশন ব্যবহার করা হয়, যেখানে সম্পূর্ণ পাথটি একই ফিল্ডে থাকে। স্টার্টার লজিকে মূলত তুলনার উদ্দেশ্যে এটি করা হয়। উদাহরণস্বরূপ, কালার টেম্পারেচারকে স্টার্টার হিসেবে ব্যবহার করতে হলে, স্টেটের জন্য color.colorTemperature ব্যবহার করতে হবে:

starters:
- type: device.state.ColorSetting
  device: My Device - Room Name
  state: color.colorTemperature
  is: 2000K

তবে, অ্যাকশনগুলোতে নেস্টেড ফিল্ড ব্যবহৃত হয়। একটি বাল্বের রঙ নীল করতে, color.name এবং is: blue এর পরিবর্তে, আপনাকে যা করতে হবে তা হলো:

actions:
- type: device.command.ColorAbsolute
  devices: My Device - Room Name
  color:
    name: blue