1. לפני שמתחילים
בתור מפתחי האינטרנט של הדברים (IoT), אתם יכולים ליצור פעולות בבית חכם שיאפשרו למשתמשים לשלוט במכשירים שלהם באמצעות מקשי מגע באפליקציית Google Home ופקודות קוליות עם Assistant.
פעולות לבית חכם מסתמכות על Home Graph כדי לספק נתונים הקשריים לגבי הבית והמכשירים שבו, ויוצרים מפה לוגית של הבית. ההקשר הזה מאפשר ל-Assistant להבין בצורה טבעית יותר את הבקשות של המשתמש ביחס למיקום שלו בבית. לדוגמה, Home Graph יכול לאחסן מושג של סלון שמכיל כמה סוגים של מכשירים מיצרנים שונים, כמו תרמוסטט, מנורה, מאוורר ושואב אבק.
דרישות מוקדמות
- יצירת פעולה של בית חכם מדריך למפתחים
מה תפַתחו
ב-Codelab הזה צריך לפרסם שירות ענן שמנהל מכונת כביסה וירטואלית חכמה, ואז ליצור פעולה לבית חכם ולחבר אותה ל-Assistant.
מה תלמדו
- איך פורסים שירות ענן לבית חכם
- איך לחבר את השירות ל-Assistant
- איך לפרסם ב-Google שינויים במצב המכשיר
למה תזדקק?
- דפדפן אינטרנט, כמו Google Chrome
- מכשיר iOS או Android שמותקנת בו אפליקציית Google Home
- Node.js גרסה 10.16 ואילך
- חשבון לחיוב ב-Google Cloud
2. תחילת העבודה
הפעלה של בקרת הפעילות בחשבון
כדי להשתמש ב-Google Assistant, עליכם לשתף עם Google נתוני פעילות מסוימים. הנתונים האלה נדרשים ל-Google Assistant כדי לפעול באופן תקין. עם זאת, הדרישה לשתף נתונים אינה ספציפית ל-SDK. כדי לשתף את הנתונים האלה, צריך ליצור חשבון Google אם עדיין אין לכם חשבון כזה. ניתן להשתמש בכל חשבון Google — הוא לא חייב להיות חשבון הפיתוח שלך.
פותחים את הדף 'בקרת הפעילות בחשבון' של חשבון Google שבו רוצים להשתמש עם Assistant.
צריך לוודא שמתגי המתג הבאים מופעלים:
- אינטרנט פעילות באפליקציות - בנוסף, הקפידו לסמן את תיבת הסימון הכללה של ההיסטוריה והפעילות של Chrome מאתרים, מאפליקציות וממכשירים המשתמשים בשירותי Google .
- פרטי מכשיר
- קול ו- פעילות אודיו
יצירת פרויקט פעולות
- עוברים אל Actions on Google Developer Console.
- לוחצים על פרויקט חדש, נותנים שם לפרויקט ולוחצים על יצירת פרויקט.
בחירת אפליקציית הבית החכם
במסך הסקירה הכללית ב-Actions Console, בוחרים באפשרות Smart Home (בית חכם).
בוחרים את כרטיס חוויית המשתמש בית חכם ולוחצים על התחלת הבנייה. לאחר מכן תועברו למסוף הפרויקט.
התקנת ה-CLI של Firebase
ממשק שורת הפקודה של Firebase (CLI) יאפשר לכם להציג את אפליקציות האינטרנט שלכם באופן מקומי ולפרוס את אפליקציית האינטרנט באירוח ב-Firebase.
כדי להתקין את ה-CLI, מריצים את פקודת ה-npm הבאה מהטרמינל:
npm install -g firebase-tools
כדי לוודא שה-CLI הותקן כראוי, מריצים את:
firebase --version
כדי לאשר את ה-CLI של Firebase דרך חשבון Google, מריצים את:
firebase login
3. הפעלת האפליקציה לתחילת פעולה
אחרי שמגדירים את סביבת הפיתוח, אפשר לפרוס את הפרויקט לתחילת העבודה כדי לוודא שהכול מוגדר כמו שצריך.
קבלת קוד המקור
לוחצים על הקישור הבא כדי להוריד את הדוגמה של Codelab זו למכונת הפיתוח שלך:
...אפשר גם לשכפל את המאגר של GitHub משורת הפקודה:
git clone https://github.com/google-home/smarthome-washer.git
מידע על הפרויקט
הפרויקט לתחילת העבודה מכיל את ספריות המשנה הבאות:
public:
ממשק משתמש קדמי שמאפשר לשלוט בקלות במצב של מכונת הכביסה החכמה ולנטר את מצבה.functions:
שירות ענן שמוטמע בצורה מלאה ומנהל את מכונת הכביסה החכמה באמצעות Cloud Functions for Firebase ו-Firebase Database Database.
התחברות ל-Firebase
עוברים לספרייה washer-start
ומגדירים את ה-CLI של Firebase בפרויקט Actions:
cd washer-start firebase use <project-id>
הגדרת פרויקט Firebase
מפעילים פרויקט Firebase.
firebase init
בוחרים את תכונות ה-CLI, מסד נתונים בזמן אמת, פונקציות ואת התכונה אירוח שכוללת אירוח ב-Firebase.
? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. ❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance ◯ Firestore: Configure security rules and indexes files for Firestore ◉ Functions: Configure a Cloud Functions directory and its files ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys ◯ Hosting: Set up GitHub Action deploys ◯ Storage: Configure a security rules file for Cloud Storage ◯ Emulators: Set up local emulators for Firebase products ◯ Remote Config: Configure a template file for Remote Config ◯ Extensions: Set up an empty Extensions manifest
הפעולה הזו תפעיל את התכונות וממשקי ה-API הנדרשים לפרויקט.
כשמוצגת הנחיה, מאתחלים את מסד הנתונים 'זמן אמת'. אפשר להשתמש במיקום ברירת המחדל של מכונת מסד הנתונים.
? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up? Yes ? Please choose the location for your default Realtime Database instance: us-central1
מאחר שנעשה שימוש בקוד הפרויקט לתחילת הפעולה, צריך לבחור את קובץ ברירת המחדל לכללי האבטחה ולא להחליף את קובץ הכללים הקיים של מסד הנתונים.
? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console? No
אם אתם מאתחלים מחדש את הפרויקט, בוחרים באפשרות החלפה כשמוצגת השאלה אם אתם רוצים לאתחל או להחליף קוד בסיס.
? Would you like to initialize a new codebase, or overwrite an existing one? Overwrite
כשמגדירים את הפונקציות, יש להשתמש בקובצי ברירת המחדל ולהקפיד לא להחליף את הקבצים הקיימים מסוג index.js ו-package.json בדוגמת הפרויקט.
? What language would you like to use to write Cloud Functions? JavaScript ? Do you want to use ESLint to catch probable bugs and enforce style? No ? File functions/package.json already exists. Overwrite? No ? File functions/index.js already exists. Overwrite? No
אם רוצים לאתחל מחדש את הפרויקט, צריך לבחור באפשרות לא כשתישאל אם רוצים לאתחל או להחליף פונקציות/.gitignore.
? File functions/.gitignore already exists. Overwrite? No
? Do you want to install dependencies with npm now? Yes
לסיום, עליך להגדיר את האירוח שלך כך שתשתמש בספרייה public
בקוד הפרויקט, ולהשתמש בקובץ index.html הקיים. כשמתבקשים להשתמש ב-ESLint, בוחרים באפשרות לא.
? What do you want to use as your public directory? public ? Configure as a single-page app (rewrite all urls to /index.html)? Yes ? Set up automatic builds and deploys with GitHub? No ? File public/index.html already exists. Overwrite? No
אם ESLint הופעל בטעות, יש שתי שיטות זמינות להשבית אותו:
- באמצעות ממשק GUI, נכנסים לתיקייה
../functions
בפרויקט, בוחרים את הקובץ המוסתר.eslintrc.js
ומוחקים אותו. אין טעות להשתמש בשם הזה כמו.eslintrc.json
. - באמצעות שורת הפקודה:
cd functions rm .eslintrc.js
כדי לוודא שההגדרות של Firebase נכונות ומלאות, מעתיקים את הקובץ firebase.json
מהספרייה washer-done
לספרייה washer-start
ומחליפים את ההגדרה הקיימת ב-washer-start
.
בספרייה washer-start
:
cp -vp ../washer-done/firebase.json .
פריסה ב-Firebase
עכשיו, אחרי שהתקנתם את יחסי התלות והגדרתם את הפרויקט, אתם מוכנים להפעיל את האפליקציה בפעם הראשונה.
firebase deploy
זה הפלט של המסוף שאמור להופיע:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<project-id>/overview Hosting URL: https://<project-id>.web.app
הפקודה הזו פורסת אפליקציית אינטרנט יחד עם כמה Cloud Functions for Firebase.
פותחים את כתובת ה-URL לאירוח בדפדפן (https://<project-id>.web.app
) כדי להציג את אפליקציית האינטרנט. תראו את הממשק הבא:
ממשק המשתמש באינטרנט הזה מייצג פלטפורמה של צד שלישי להצגה או לשינוי של מצבי מכשיר. כדי להתחיל לאכלס את מסד הנתונים בפרטי המכשיר, לוחצים על עדכון. לא יוצגו שינויים בדף, אבל המצב הנוכחי של מכונת הכביסה יאוחסן במסד הנתונים.
זה הזמן לחבר את שירות הענן שפרסתם ל-Google Assistant באמצעות Actions Console.
הגדרת פרויקט במסוף Actions
בקטע סקירה כללית > יוצרים את הפעולה הרצויה, בוחרים באפשרות הוספת פעולות. מזינים את כתובת ה-URL של הפונקציה ב-Cloud Functions שמספקת מילוי הזמנות של הכוונות לבית החכם, ולוחצים על שמירה.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
בפיתוח > הפעלת הכרטיסייה, מוסיפים שם תצוגה לפעולה, ולוחצים על שמירה. השם הזה יופיע באפליקציית Google Home.
כדי להפעיל קישור חשבונות, לוחצים על פיתוח > קישור החשבונות בתפריט הניווט הימני. השתמשו בהגדרות הבאות של קישור חשבונות:
Client-ID |
|
סוד לקוח |
|
כתובת אתר להרשאה |
|
כתובת ה-URL של האסימון |
|
לוחצים על Save כדי לשמור את הגדרת קישור החשבונות, ואז לוחצים על Test כדי להפעיל את הבדיקה בפרויקט.
המערכת תפנה אתכם אל הסימולטור. אם האפשרות הבדיקה מופעלת לא מוצגת, לוחצים על איפוס הבדיקה כדי לוודא שהבדיקה מופעלת.
עכשיו אפשר להתחיל להטמיע את ה-webhooks שנדרשים כדי לחבר את מצב המכשיר אל Assistant.
4. יצירת מכונת כביסה
אחרי שהגדרת את הפעולה, אפשר להוסיף מכשירים ולשלוח נתונים. שירות הענן שלכם צריך לטפל בכוונות הבאות:
- הכוונה מסוג
SYNC
מתרחשת כש-Assistant רוצה לדעת לאילו מכשירים המשתמש חיבר. הכתובת הזאת נשלחת לשירות שלכם כשמשתמש מקשר חשבון. צריך להגיב עם מטען ייעודי (payload) של JSON של כל המכשירים של המשתמש והיכולות שלהם. - הכוונה מסוג
QUERY
מתרחשת כש-Assistant רוצה לדעת את המצב או הסטטוס הנוכחיים של המכשיר. צריך להשיב עם מטען ייעודי (payload) של JSON עם המצב של כל מכשיר מבוקש. - Intent מסוג
EXECUTE
קורה כש-Assistant רוצה לשלוט במכשיר בשמו של המשתמש. צריך להשיב באמצעות מטען ייעודי (payload) של JSON עם סטטוס הביצוע של כל מכשיר מבוקש. - Intent מסוג
DISCONNECT
מתרחשת כשהמשתמש מבטל את הקישור של החשבון שלו ל-Assistant. צריך להפסיק לשלוח ל-Assistant אירועים מהמכשירים של המשתמש הזה.
בקטעים הבאים, מעדכנים את הפונקציות שפרסתם בעבר כדי לטפל בכוונות האלה.
עדכון תגובת הסנכרון
פותחים את functions/index.js
, שמכיל את הקוד להגיב לבקשות מ-Assistant.
יהיה עליכם לטפל בIntent מסוג SYNC
על ידי החזרת המטא-נתונים והיכולות של המכשיר. מעדכנים את ה-JSON במערך onSync
כך שיכלול את פרטי המכשיר והתכונות המומלצות למכונת כביסה.
index.js
app.onSync((body) => {
return {
requestId: body.requestId,
payload: {
agentUserId: USER_ID,
devices: [{
id: 'washer',
type: 'action.devices.types.WASHER',
traits: [
'action.devices.traits.OnOff',
'action.devices.traits.StartStop',
'action.devices.traits.RunCycle',
],
name: {
defaultNames: ['My Washer'],
name: 'Washer',
nicknames: ['Washer'],
},
deviceInfo: {
manufacturer: 'Acme Co',
model: 'acme-washer',
hwVersion: '1.0',
swVersion: '1.0.1',
},
willReportState: true,
attributes: {
pausable: true,
},
}],
},
};
});
פריסה ב-Firebase
פורסים את מילוי ההזמנות המעודכן בענן באמצעות ה-CLI של Firebase:
firebase deploy --only functions
קישור ל-Google Assistant
כדי לבדוק את הפעולה של הבית החכם, צריך לקשר את הפרויקט לחשבון Google. כך ניתן לבצע בדיקות בפלטפורמות של Google Assistant ובאפליקציית Google Home שמחוברת לאותו חשבון.
- בטלפון, פותחים את ההגדרות של Google Assistant. לתשומת ליבכם: עליכם להיות מחוברים לאותו חשבון שמחובר במסוף.
- עוברים אל Google Assistant > הגדרות > בית חכם (בקטע Assistant).
- לוחצים על סמל החיפוש בפינה השמאלית העליונה.
- מחפשים את אפליקציית הבדיקה בעזרת התחילית [test] כדי למצוא את אפליקציית הבדיקה הספציפית.
- בוחרים בפריט הזה. לאחר מכן, Google Assistant תבצע אימות מול השירות שלך ותשלח בקשת
SYNC
, כדי לבקש מהשירות לספק רשימה של מכשירים למשתמש.
פותחים את אפליקציית Google Home ומוודאים שאתם רואים את מכונת הכביסה.
5. טיפול בפקודות ובשאילתות
עכשיו, כששירות הענן מדווח ל-Google על מכשיר הכביסה כמו שצריך, צריך להוסיף את האפשרות לבקש את מצב המכשיר ולשלוח פקודות.
התייחסות ל-Intent של QUERY
אובייקט Intent QUERY
כולל קבוצה של מכשירים. המצב הנוכחי של כל מכשיר צריך להופיע.
ב-functions/index.js
, צריך לערוך את ה-handler של QUERY
כדי לעבד את רשימת מכשירי היעד שנכללים בבקשת ה-Intent.
index.js
app.onQuery(async (body) => {
const {requestId} = body;
const payload = {
devices: {},
};
const queryPromises = [];
const intent = body.inputs[0];
for (const device of intent.payload.devices) {
const deviceId = device.id;
queryPromises.push(queryDevice(deviceId)
.then((data) => {
// Add response to device payload
payload.devices[deviceId] = data;
}
));
}
// Wait for all promises to resolve
await Promise.all(queryPromises);
return {
requestId: requestId,
payload: payload,
};
});
לכל מכשיר שנכלל בבקשה, מחזירים את המצב הנוכחי המאוחסן במסד הנתונים בזמן אמת. צריך לעדכן את הפונקציות queryFirebase
ו-queryDevice
כדי להחזיר את נתוני מצב מכונת הכביסה.
index.js
const queryFirebase = async (deviceId) => {
const snapshot = await firebaseRef.child(deviceId).once('value');
const snapshotVal = snapshot.val();
return {
on: snapshotVal.OnOff.on,
isPaused: snapshotVal.StartStop.isPaused,
isRunning: snapshotVal.StartStop.isRunning,
};
};
const queryDevice = async (deviceId) => {
const data = await queryFirebase(deviceId);
return {
on: data.on,
isPaused: data.isPaused,
isRunning: data.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
};
};
התייחסות לכוונת ההסרה
ה-Intent EXECUTE
מטפל בפקודות לעדכון מצב המכשיר. התגובה תחזיר את הסטטוס של כל אחת מהפקודות, לדוגמה SUCCESS
, ERROR
או PENDING
, ואת המצב החדש של המכשיר.
ב-functions/index.js
, עורכים את ה-handler של EXECUTE
כדי לעבד את רשימת התכונות שצריך לעדכן ואת קבוצת מכשירי היעד לכל פקודה:
index.js
app.onExecute(async (body) => {
const {requestId} = body;
// Execution results are grouped by status
const result = {
ids: [],
status: 'SUCCESS',
states: {
online: true,
},
};
const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
result.ids.push(device.id);
Object.assign(result.states, data);
})
.catch(() => functions.logger.error('EXECUTE', device.id)));
}
}
}
await Promise.all(executePromises);
return {
requestId: requestId,
payload: {
commands: [result],
},
};
});
בכל פקודה ומכשיר יעד, מעדכנים את הערכים במסד הנתונים בזמן אמת שתואמים לתכונה המבוקשת. צריך לשנות את הפונקציה updateDevice
כדי לעדכן את קובץ העזר המתאים של Firebase ולהחזיר את מצב המכשיר המעודכן.
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
case 'action.devices.commands.OnOff':
state = {on: params.on};
ref = firebaseRef.child(deviceId).child('OnOff');
break;
case 'action.devices.commands.StartStop':
state = params.start
? {isRunning: true, isPaused: false}
: {isRunning: false, isPaused: false};
ref = firebaseRef.child(deviceId).child('StartStop');
break;
case 'action.devices.commands.PauseUnpause':
const data = await queryDevice(deviceId);
state = (data.isPaused === false && data.isRunning === false)
? {isRunning: false, isPaused: false}
: {isRunning: !params.pause, isPaused: params.pause};
ref = firebaseRef.child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
6. בדיקת הפעולה
אחרי שמטמיעים את כל שלושת הכוונות, אפשר לבדוק שהפעולה שולטת במכונת הכביסה.
פריסה ב-Firebase
פורסים את מילוי ההזמנות המעודכן בענן באמצעות ה-CLI של Firebase:
firebase deploy --only functions
בדיקה של מכונת הכביסה
עכשיו אפשר לראות את השינוי כשתנסו לבצע אחת מהפקודות הקוליות הבאות דרך הטלפון:
"Ok Google, turn on my worker".
"Ok Google, Pause my ללחוץ על 'מכונת הכביסה'.
"Ok Google, stop my worker"
אפשר גם לשאול שאלות כדי לבדוק מה המצב הנוכחי של מכונת הכביסה.
"Ok Google, is my הייתה מכונת כביסה?"
"Ok Google, האם מכונת הכביסה פועלת?"
"Ok Google, whatcycle is my הייתה מכונת כביסה?"
אפשר לראות את השאילתות והפקודות האלה ביומנים שמופיעים מתחת לפונקציה שלכם בקטע פונקציות במסוף Firebase. מידע נוסף על יומני Firebase זמין במאמר כתיבה והצגה של יומנים.
תוכלו למצוא את השאילתות והפקודות האלה גם במסוף Google Cloud בקטע Logging > Logs Explorer. מידע נוסף על התחברות ל-Google Cloud במאמר גישה ליומני אירועים באמצעות Cloud Logging.
7. דיווח ל-Google על עדכונים
שילבתם באופן מלא את שירות הענן שלכם עם הכוונות לבית חכם. כך המשתמשים יכולים לשלוט במצב הנוכחי של המכשירים שלהם ולשלוח שאילתות לגביו. עם זאת, בהטמעה עדיין אין לשירות שלכם אפשרות לשלוח ל-Assistant פרטי אירועים, כמו שינויים בנוכחות או במצב של המכשיר.
באמצעות בקשת סנכרון, אתם יכולים לשלוח בקשת סנכרון חדשה כשמשתמשים מוסיפים או מסירים מכשירים, או כשיכולות המכשיר שלהם משתנות. באמצעות מצב דיווח, שירות הענן יכול לשלוח באופן יזום את מצב המכשיר ל-Home Graph כשמשתמשים משנים מצב מכשיר פיזית – לדוגמה, הפעלת מתג תאורה – או שינוי המצב באמצעות שירות אחר.
בקטע הזה יתווסף קוד להפעלת השיטות האלה מאפליקציית האינטרנט של הקצה הקדמי.
הפעלת Home Graph API
Home Graph API מאפשר אחסון של מכשירים והמצבים שלהם ב-Home Graph של המשתמש, ולשליחת שאילתות לגבי המכשירים. כדי להשתמש ב-API הזה, קודם צריך לפתוח את מסוף Google Cloud ולהפעיל את HomeGraph API.
במסוף Google Cloud, בוחרים את הפרויקט שתואם לפעולות <project-id>.
. לאחר מכן, במסך של ספריית ה-API של Home Graph API, לוחצים על Enable (הפעלה).
הפעלת מצב הדוח
כתיבה למסד נתונים בזמן אמת טריגר לפונקציה reportstate
בפרויקט לתחילת הפעולה. צריך לעדכן את הפונקציה reportstate
ב-functions/index.js
כדי לתעד את הנתונים שנכתבו במסד הנתונים ולפרסם אותם ב-Home Graph דרך מצב הדוח.
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
functions.logger.info('Firebase write event triggered Report State');
const snapshot = change.after.val();
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
},
},
},
},
};
const res = await homegraph.devices.reportStateAndNotification({
requestBody,
});
functions.logger.info('Report state response:', res.status, res.data);
});
הפעלת סנכרון בקשות
רענון הסמל בממשק המשתמש באינטרנט של הקצה הקדמי יפעיל את הפונקציה requestsync
בפרויקט לתחילת העבודה. צריך להטמיע את הפונקציה requestsync
ב-functions/index.js
כדי לשלוח קריאה ל-Home Graph API.
index.js
exports.requestsync = functions.https.onRequest(async (request, response) => {
response.set('Access-Control-Allow-Origin', '*');
functions.logger.info(`Request SYNC for user ${USER_ID}`);
try {
const res = await homegraph.devices.requestSync({
requestBody: {
agentUserId: USER_ID,
},
});
functions.logger.info('Request sync response:', res.status, res.data);
response.json(res.data);
} catch (err) {
functions.logger.error(err);
response.status(500).send(`Error requesting sync: ${err}`);
}
});
פריסה ב-Firebase
פורסים את הקוד המעודכן באמצעות ה-CLI של Firebase:
firebase deploy --only functions
מבצעים בדיקות של ההטמעה.
לוחצים על הלחצן רענון בממשק המשתמש באינטרנט ומוודאים שמופיעה בקשה לסנכרון ביומן של מסוף Firebase.
בשלב הבא, משנים את המאפיינים של מכונת הכביסה בממשק המשתמש באינטרנט של הקצה הקדמי ולוחצים על עדכון. מוודאים ששינוי המצב מדווח ל-Google ביומנים של מסוף Firebase.
8. מזל טוב
מעולה! שילבת בהצלחה את Assistant עם שירות ענן למכשיר באמצעות פעולות לבית חכם.
מידע נוסף
הנה כמה רעיונות שאפשר ליישם כדי להתעמק בנושא:
- מוסיפים מצבים ומחליפים למכשיר.
- מוסיפים עוד תכונות נתמכות למכשיר.
- ביצוע מקומי לבית חכם.
- כדאי לעיין בדוגמה שלנו מ-GitHub כדי לקבל מידע נוסף.
אפשר גם לקרוא מידע נוסף על בדיקה ושליחה של פעולה לבדיקה, כולל תהליך האישור לפרסום הפעולה למשתמשים.