گزارش وضعیت

Report State یک ویژگی مهم است که به Google Home Action اجازه می‌دهد تا به جای انتظار برای یک درخواست QUERY ، آخرین وضعیت دستگاه کاربر را به صورت پیشگیرانه به Google Home Graph گزارش دهد.

Report State وضعیت دستگاه‌های کاربر را با agentUserId مشخص‌شده مرتبط با آنها (که در درخواست SYNC اصلی ارسال شده است) به گوگل گزارش می‌دهد. وقتی Google Assistant می‌خواهد اقدامی انجام دهد که نیاز به درک وضعیت فعلی یک دستگاه دارد، می‌تواند به جای ارسال یک QUERY intent به ابرهای شخص ثالث مختلف قبل از صدور EXECUTE intent، به سادگی اطلاعات وضعیت را در Home Graph جستجو کند.

بدون Report State ، با توجه به چراغ‌های چندین ارائه‌دهنده در یک اتاق نشیمن، دستور Ok Google, brighten my living room نیاز به حل چندین درخواست QUERY intent) ارسال شده به چندین cloud دارد، برخلاف جستجوی ساده مقادیر روشنایی فعلی بر اساس آنچه قبلاً گزارش شده است. برای بهترین تجربه کاربری، Assistant باید وضعیت فعلی یک دستگاه را داشته باشد، بدون اینکه نیاز به رفت و برگشت به دستگاه باشد.

پس از SYNC اولیه برای یک دستگاه، پلتفرم یک هدف QUERY ارسال می‌کند که وضعیت دستگاه را برای پر کردن Home Graph جمع‌آوری می‌کند. پس از آن نقطه، Home Graph فقط وضعیتی را که با Report State ارسال می‌شود، ذخیره می‌کند.

هنگام فراخوانی Report State ، مطمئن شوید که داده‌های وضعیت کامل را برای یک ویژگی مشخص ارائه می‌دهید. Home Graph وضعیت‌ها را بر اساس هر ویژگی به‌روزرسانی می‌کند و هنگام فراخوانی Report State ، تمام داده‌های آن ویژگی را بازنویسی می‌کند. به عنوان مثال، اگر وضعیت را برای ویژگی StartStop گزارش می‌کنید، payload باید شامل مقادیری برای isRunning و isPaused باشد.

شروع کنید

برای پیاده‌سازی Report State ، مراحل زیر را دنبال کنید:

فعال کردن API گوگل هوم‌گراف

  1. در Google Cloud Console ، به صفحه HomeGraph API بروید.

    به صفحه HomeGraph API بروید
  2. پروژه‌ای را انتخاب کنید که با شناسه پروژه smart home شما مطابقت داشته باشد.
  3. روی فعال کردن (ENABLE) کلیک کنید.

ایجاد کلید حساب سرویس

برای تولید کلید حساب سرویس از Google Cloud Console این دستورالعمل‌ها را دنبال کنید:

توجه : هنگام انجام این مراحل، مطمئن شوید که از پروژه GCP صحیح استفاده می‌کنید. این پروژه‌ای است که با شناسه پروژه smart home شما مطابقت دارد.
  1. در Google Cloud Console ، به صفحه حساب‌های سرویس بروید.

    به صفحه حساب‌های سرویس بروید .

    ممکن است لازم باشد قبل از اینکه به صفحه حساب‌های سرویس هدایت شوید، یک پروژه را انتخاب کنید.

  2. روی کلیک کنید. ایجاد حساب کاربری سرویس .

  3. در قسمت نام حساب سرویس ، یک نام وارد کنید.

  4. در قسمت شناسه حساب سرویس ، یک شناسه وارد کنید.

  5. در قسمت توضیحات حساب سرویس ، توضیحی وارد کنید.

  6. روی ایجاد کلیک کنید و ادامه دهید .

  7. از منوی کشویی نقش ، حساب‌های سرویس > حساب سرویس OpenID Connect Identity Token Creator را انتخاب کنید.

  8. روی ادامه کلیک کنید.

  9. روی انجام شد کلیک کنید.

  10. حساب سرویسی که ایجاد کرده‌اید را از فهرست حساب‌های سرویس انتخاب کنید و از منوی Actions گزینه Manage keys را انتخاب کنید.

  11. افزودن کلید > ایجاد کلید جدید را انتخاب کنید.

  12. برای نوع کلید ، گزینه JSON را انتخاب کنید.

  13. روی «ایجاد» کلیک کنید. یک فایل JSON که حاوی کلیدهای دانلود شده روی رایانه شماست.

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

فراخوانی API

از بین تب‌های زیر، گزینه‌ای را انتخاب کنید:

اچ‌تی‌پی

Home Graph یک نقطه پایانی HTTP ارائه می‌دهد

  1. از فایل JSON حساب سرویس دانلود شده برای ایجاد یک JSON Web Token (JWT) استفاده کنید. برای اطلاعات بیشتر، به بخش احراز هویت با استفاده از حساب سرویس مراجعه کنید.
  2. با استفاده از oauth2l، یک توکن دسترسی OAuth 2.0 با دامنه https://www.googleapis.com/auth/homegraph دریافت کنید:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. درخواست JSON را با agentUserId ایجاد کنید. در اینجا یک نمونه درخواست JSON برای گزارش وضعیت و اعلان آمده است:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. گزارش وضعیت و اعلان JSON و توکن موجود در درخواست HTTP POST خود را به نقطه پایانی Google Home Graph ترکیب کنید. در اینجا مثالی از نحوه ارسال درخواست در خط فرمان با استفاده از curl به عنوان تست آورده شده است:
  7. curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d @request-body.json \
      "https://homegraph.googleapis.com/v1/devices:reportStateAndNotification"
    

gRPC

Home Graph یک نقطه پایانی gRPC ارائه می‌دهد

  1. تعریف سرویس بافرهای پروتکل را برای رابط برنامه‌نویسی کاربردی Home Graph دریافت کنید.
  2. برای تولید استاب‌های کلاینت برای یکی از زبان‌های پشتیبانی‌شده، مستندات توسعه‌دهنده‌ی gRPC را دنبال کنید.
  3. متد ReportStateAndNotification را فراخوانی کنید.

نود جی اس

کلاینت Node.js مربوط به APIهای گوگل، اتصالاتی را برای Home Graph API فراهم می‌کند.

  1. سرویس google.homegraph را با استفاده از Application Default Credentials راه‌اندازی کنید.
  2. متد reportStateAndNotification با ReportStateAndNotificationRequest فراخوانی کنید. این متد یک Promise با ReportStateAndNotificationResponse برمی‌گرداند.
const homegraphClient = homegraph({
  version: 'v1',
  auth: new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/homegraph'
  })
});

const res = await homegraphClient.devices.reportStateAndNotification({
  requestBody: {
    agentUserId: 'PLACEHOLDER-USER-ID',
    requestId: 'PLACEHOLDER-REQUEST-ID',
    payload: {
      devices: {
        states: {
          "PLACEHOLDER-DEVICE-ID": {
            on: true
          }
        }
      }
    }
  }
});
    

جاوا

کتابخانه کلاینت HomeGraph API برای جاوا، اتصالاتی را برای Home Graph API فراهم می‌کند.

  1. HomeGraphApiService را با استفاده از Application Default Credentials مقداردهی اولیه کنید.
  2. متد reportStateAndNotification با ReportStateAndNotificationRequest فراخوانی کنید. این متد یک ReportStateAndNotificationResponse برمی‌گرداند.
  // Get Application Default credentials.
  GoogleCredentials credentials =
      GoogleCredentials.getApplicationDefault()
          .createScoped(List.of("https://www.googleapis.com/auth/homegraph"));

  // Create Home Graph service client.
  HomeGraphService homegraphService =
      new HomeGraphService.Builder(
              GoogleNetHttpTransport.newTrustedTransport(),
              GsonFactory.getDefaultInstance(),
              new HttpCredentialsAdapter(credentials))
          .setApplicationName("HomeGraphExample/1.0")
          .build();

  // Build device state payload.
  Map<?, ?> states = Map.of("on", true);

  // Report device state.
  ReportStateAndNotificationRequest request =
      new ReportStateAndNotificationRequest()
          .setRequestId("PLACEHOLDER-REQUEST-ID")
          .setAgentUserId("PLACEHOLDER-USER-ID")
          .setPayload(
              new StateAndNotificationPayload()
                  .setDevices(
                      new ReportStateAndNotificationDevice()
                          .setStates(Map.of("PLACEHOLDER-DEVICE-ID", states))));
  homegraphService.devices().reportStateAndNotification(request);
}
    

وضعیت گزارش آزمایش

ابزارهای پیشنهادی برای این کار

برای اینکه یکپارچه‌سازی Cloud-to-cloud شما برای صدور گواهینامه آماده شود، آزمایش Report State مهم است.

برای انجام این کار، توصیه می‌کنیم از ابزار Home Graph Viewer استفاده کنید که یک برنامه وب مستقل است و نیازی به دانلود یا استقرار ندارد.

داشبورد Report State هنوز در دسترس است، اما منسوخ شده و دیگر پشتیبانی نمی‌شود.

داشبورد گزارش وضعیت

پیش‌نیازها

قبل از اینکه بتوانید یکپارچه‌سازی Cloud-to-cloud خود را آزمایش کنید، به کلید حساب سرویس (Service Account Key) و agentUserId عامل (agentUserId) خود نیاز دارید. اگر از قبل کلید حساب سرویس و agentUserId خود را دارید، به بخش استقرار داشبورد Report State Dashboard) مراجعه کنید.

داشبورد گزارش وضعیت (Report State) را مستقر کنید

پس از دریافت کلید حساب سرویس و شناسه کاربری عامل برای پروژه خود، آخرین نسخه را از داشبورد Report State دانلود و نصب کنید. پس از دانلود آخرین نسخه، دستورالعمل‌های موجود در فایل README.MD موجود را دنبال کنید.

پس از اینکه داشبورد Report State را مستقر کردید، از طریق URL زیر به داشبورد دسترسی پیدا کنید ( your_project_id را با شناسه پروژه خود جایگزین کنید):

http://<your-project-id>.appspot.com

در داشبورد، موارد زیر را انجام دهید:

  • فایل کلید حساب خود را انتخاب کنید
  • agentUserId خود را اضافه کنید

سپس، روی فهرست کلیک کنید.

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

گزارش اختلاف وضعیت

دقت وضعیت گزارش مبتنی بر پرس‌وجو، میزان تطابق آخرین وضعیت گزارش برای یک دستگاه با وضعیت دستگاه هنگام پرس‌وجوی کاربر را اندازه‌گیری می‌کند. انتظار می‌رود این مقدار ۹۹.۵٪ باشد.

پاسخ‌های خطا

ممکن است هنگام فراخوانی تابع Report State با یکی از خطاهای زیر مواجه شوید. این خطاها به صورت کدهای وضعیت HTTP نمایش داده می‌شوند.

  • 400 Bad Request - سرور به دلیل سینتکس نامعتبر قادر به پردازش درخواست ارسال شده توسط کلاینت نبوده است. دلایل رایج شامل JSON ناقص یا استفاده از null به جای "" برای یک مقدار رشته‌ای است.
  • 404 Not Found - منبع درخواستی یافت نشد اما ممکن است در آینده در دسترس باشد. معمولاً این بدان معناست که ما نمی‌توانیم دستگاه درخواستی را پیدا کنیم. همچنین ممکن است به این معنی باشد که حساب کاربری به گوگل متصل نیست یا ما یک agentUserId نامعتبر دریافت کرده‌ایم. اطمینان حاصل کنید که agentUserId با مقدار ارائه شده در پاسخ SYNC شما مطابقت دارد و شما به درستی اهداف DISCONNECT را مدیریت می‌کنید.

گزارش وضعیت آنلاین و آفلاین

وقتی دستگاهی آفلاین است، باید گزارش دهید گزارش وضعیت ظرف پنج دقیقه از رفتار دستگاه. برعکس، وقتی دستگاه به حالت آنلاین برمی‌گردد، باید گزارش دهید ظرف پنج دقیقه از رفتار دستگاه، وضعیت را گزارش دهید . هر زمان که یک دستگاه دوباره آنلاین شود، شریک باید تمام وضعیت‌های فعلی دستگاه را با استفاده از API reportStateAndNotification گزارش دهد. این مثال نشان می‌دهد که یک نوع دستگاه light آنلاین است و تمام وضعیت‌های فعلی دستگاه را گزارش می‌دهد.
"requestId": "test-request-id",
  "agentUserId": "agent-user-1",
    "payload":{
      "devices": {
        "states": {
          "device-id-1": {
            "brightness": 65,
            "on": true,
            "online": true
          }
          "notifications": {},
        }
      }
    }