समस्या का हल

सैंपल ऐप्लिकेशन

अगर आपको Home API इस्तेमाल करते समय कोई समस्या आती है, तो डीबग करने के लिए लॉग इकट्ठा किए जा सकते हैं. मोबाइल डिवाइस से लॉग इकट्ठा करने के लिए, Android Debug Bridge (adb) की ज़रूरत होती है. अगर आपको Google से मदद चाहिए, तो Android डिवाइसों और हब, दोनों से लॉग इकट्ठा करें. इसके बाद, समस्या ट्रैकर में टिकट खोलें. इसमें समस्या से जुड़ी ज़रूरी जानकारी और लॉग शामिल करें.

Android के लॉग इकट्ठा करना

adb से जुड़े सभी चरणों के लिए, आपका मोबाइल डिवाइस आपकी लोकल मशीन से कनेक्ट होना चाहिए.

adb इंस्टॉल करना

अगर आपने पहले से ऐसा नहीं किया है, तो अपने कंप्यूटर पर Android Debug Bridge सेट अप करें:

  1. अपने कंप्यूटर पर "adb" इंस्टॉल करें.
  2. अपने Android फ़ोन पर, डेवलपर के लिए सेटिंग और टूल और यूएसबी डीबग करने की सुविधा चालू करें.

Android Studio के लिए Google Home प्लग इन

Google Home Plugin for Android Studio, लॉग इकट्ठा करने और उनका विश्लेषण करने के लिए एक मददगार टूल है. इसे खास तौर पर Google Home platform डेवलपर के लिए बनाया गया है. यह प्लगिन, आपको Google Assistant Simulator, Cloud Logging, और अन्य टूल का ऐक्सेस देता है. इससे smart home को डेवलप करने की प्रोसेस आसान हो जाती है.

Matter डिवाइस के लॉग का बेहतर तरीके से विश्लेषण करने के लिए, इस टूल का इस्तेमाल adb के साथ करें.

ज़्यादा जानने और टूल पाने के लिए, Google Home Plugin for Android Studio पर जाएं.

वर्शन की जानकारी

हमारा सुझाव है कि जब भी आपको लॉग इकट्ठा करने हों, तब अपने सेटअप से जुड़ी सभी वर्शन की जानकारी इकट्ठा करें. अगर आपको Google के साथ समस्याएं शेयर करनी हैं, तो यह ज़रूरी है.

  1. अपने फ़ोन या टैबलेट का आईडी पाने के लिए:
    adb devices
    List of devices attached
    device-id    device
  2. इस वैल्यू को phoneid नाम के वैरिएबल में सेव करें:
    phoneid=device-id
  3. डिवाइस की अलग-अलग जानकारी को वैरिएबल में सेव करें:
    containerinfo=$(adb -s $phoneid shell dumpsys package com.google.android.gms | grep "versionName" || true);
    homemoduleinfo=$(adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.home " || true);
    optionalhomemoduleinfo=$(adb -s $phoneid  shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.optional_home " || true);
    policyhomemoduleinfo=$(adb -s $phoneid  shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.policy_home" || true);
    threadinfo=$(adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "com.google.android.gms.threadnetwork" || true);
    ghainfo=$(adb -s $phoneid shell dumpsys package com.google.android.apps.chromecast.app | grep versionName || true);
    enabledfeatures=$((adb -s $phoneid shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider | grep "Enabled features" | grep -i "home") || true);
    androidversion=$(adb -s $phoneid shell getprop ro.build.version.release || true);
    androidapiversion=$(adb -s $phoneid shell getprop ro.build.version.sdk || true)
  4. सभी वैरिएबल को _versions.txt नाम की फ़ाइल में सेव करें:

    वैरिएबल को किसी फ़ाइल में सेव करने के लिए, कमांड दिखाने के लिए इसे बड़ा करें

    पूरे ब्लॉक को एक साथ कॉपी करके टर्मिनल में चिपकाया जा सकता है.

    versionfile=$logtimestamp"_versions.txt"
    echo "Saving version info to $versionfile"
    
    echo "Container version:" >> $versionfile
    echo $containerinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Home Module version:" >> $versionfile
    echo $homemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Optional Home Module version:" >> $versionfile
    echo $optionalhomemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Policy Home Module version:" >> $versionfile
    echo $policyhomemoduleinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Thread Module version:" >> $versionfile
    echo $threadinfo >> $versionfile
    echo "" >> $versionfile
    
    echo "GHA version:" >> $versionfile
    echo $ghainfo >> $versionfile
    echo "" >> $versionfile
    
    echo "Android version: " >> $versionfile
    echo $androidversion >> $versionfile
    echo "" >> $versionfile
    
    echo "Android API version: " >> $versionfile
    echo $androidapiversion >> $versionfile
    echo "" >> $versionfile
    
    echo "Found enabled features (blank if missing):" >> $versionfile
    echo $enabledfeatures >> $versionfile
    echo "" >> $versionfile
  5. _versions.txt के कॉन्टेंट की पुष्टि करें:
    cat _versions.txt

    सैंपल फ़ाइल का आउटपुट देखने के लिए इसे बड़ा करें

    Container version:
    versionName=23.19.12 (190400-530524295) versionName=22.46.17 (190408-491726958)
    
    Home Module version:
    com.google.android.gms.home [v230508900]
    
    Optional Home Module version:
    
    
    Policy Home Module version:
    com.google.android.gms.policy_home [230508900] [230508900065.505615668.505615668] [Download:000003be/dl-Home.integ_230508900100400.apk] [download:/Home.integ/230508900100400:Home.integ:230508900100400]
    
    Thread Module version:
    com.google.android.gms.threadnetwork [v231912000]
    
    GHA version:
    versionName=3.2.32.1
    
    Android version:
    13
    
    Android API version:
    33
    
    Found enabled features (blank if missing):
    अब इस फ़ाइल को Google को दिया जा सकता है, ताकि समस्या को हल किया जा सके.

लॉग इकट्ठा करना

लॉग इकट्ठा करने के लिए, मोबाइल डिवाइस पर चल रहे सभी ऐप्लिकेशन बंद करें. इसके बाद:

  1. टर्मिनल विंडो खोलें और डिवाइस के मौजूदा लॉग मिटाएं:
    adb logcat -b all -c
  2. लॉग इकट्ठा करने की प्रोसेस शुरू करें:
    adb logcat >> _logs.txt
    इस टर्मिनल को खुला रखें. जब तक प्रोसेस चालू रहेगी, तब तक यह आपके डिवाइस से लॉग इकट्ठा करेगा.
  3. सेंपल ऐप्लिकेशन चलाएं और यूज़र इंटरफ़ेस की सभी कार्रवाइयों को कैप्चर करें. जब यह प्रोसेस पूरी हो जाए, तो टर्मिनल पर चल रही logcat प्रोसेस को रोकने के लिए, Ctrl+C (या Mac पर Cmd+C) दबाएं.
  4. इस सेशन के लॉग, _logs.txt नाम की फ़ाइल में सेव किए जाते हैं.

इस फ़ाइल में मौजूद जानकारी का विश्लेषण कई तरीकों से किया जा सकता है. जैसे, error, exception या crash जैसे कीवर्ड खोजना.

स्क्रिप्ट लॉग करना

आपकी सुविधा के लिए, सैंपल ऐप्लिकेशन में काम के लॉग पाने और उन्हें टेक्स्ट फ़ाइल में कंपाइल करने के लिए स्क्रिप्ट दी गई हैं. डीबग करने का सबसे बेहतर अनुभव देने के लिए, इन लॉग को रिपोर्ट किए गए किसी भी बग से अटैच किया जाना चाहिए. इससे Google को समस्या की वजह का विश्लेषण करने में मदद मिलती है.

ये लॉग, सैंपल ऐप्लिकेशन के सोर्स ट्री में मौजूद scripts डायरेक्ट्री में होते हैं. प्रोजेक्ट की रूट डायरेक्ट्री से, यह तरीका अपनाएं:

  1. अपने फ़ोन या टैबलेट का आईडी पाने के लिए:
    adb devices -l
    List of devices attached
    device-id device
  2. get_logs.sh स्क्रिप्ट चलाएं:
     ./scripts/get_logs.sh device-id
    Cleared previous logs from device.
    Saving version information to home_api_sample_logs_20240605233243.txt...
    Saving logs to home_api_sample_logs_20240605233243.txt...
    (Press CTRL+C to stop the script)
  3. समस्या को दोहराएं.
  4. स्क्रिप्ट को रोकने के लिए, CTRL+C दबाएं.

यह स्क्रिप्ट, टाइमस्टैंप वाली एक लॉग फ़ाइल जनरेट करेगी. इसमें सभी ज़रूरी जानकारी शामिल होगी. आपको मिली गड़बड़ियों की रिपोर्ट में इन्हें अटैच करें.

कास्ट हब डिवाइस के लॉग

इस तरीके का इस्तेमाल करके, Google Nest Hub के डिवाइस लॉग देखे जा सकते हैं. यह तरीका इन मॉडल के लिए काम करता है:

  • Google Home
  • Google Nest Audio
  • Google Nest Hub
  • Google Nest Mini

स्थानीय लॉग वापस पाने के लिए, कास्ट हब चालू करने के लिए:

  1. Android डीबग ब्रिज सेट अप करें.
  2. अपने हब का आईपी पता पाएं:

    • अगर हब में स्क्रीन है, तो हब से:
      1. स्क्रीन पर सबसे ऊपर से नीचे की ओर स्वाइप करें
      2. सेटिंग आइकॉन पर टैप करें
      3. डिवाइस का आईपी पता ढूंढें: Nest Hub (2nd gen) पर, डिवाइस की जानकारी > तकनीकी जानकारी > आईपी पता पर जाएं
    • अपने फ़ोन पर GHA में जाकर:
      1. डिवाइस की ज़्यादा जानकारी वाला पेज खोलने के लिए, डिवाइस पर टैप करें
      2. सेटिंग पेज खोलने के लिए, सेटिंग आइकॉन पर टैप करें
      3. डिवाइस का आईपी पता ढूंढें: डिवाइस की जानकारी > तकनीकी जानकारी > आईपी पता पर जाएं
  3. डिवाइस और कंप्यूटर, दोनों एक ही वाई-फ़ाई नेटवर्क से कनेक्ट होने चाहिए:

      adb connect ip-address
      adb logcat
    

  4. किसी व्यक्ति को लॉग देने के लिए, वह कार्रवाई करें जो पूरी नहीं हो रही है. इसके बाद, आउटपुट को टेक्स्ट फ़ाइल में पाइप करें:

      adb logcat -d > platform-logs.txt
    

ऑटोमेशन

किनारों का पता लगाना

Google Home के ईकोसिस्टम में मौजूद ऑटोमेशन की सुविधा में एज डिटेक्शन की सुविधा होती है. यह एक ऐसा लॉजिक है जो यह पुष्टि करता है कि स्टार्टर सिर्फ़ तब चालू होता है, जब डिवाइस की स्थिति में कोई बदलाव होता है. यह डिवाइस की स्थिति को अपडेट करने के बजाय, डिवाइस की पिछली स्थिति को दोहराता है.

उदाहरण के लिए, अगर किसी लाइट को चालू करना स्टार्टर है, तो एज डिटेक्शन यह पुष्टि करता है कि स्टार्टर सिर्फ़ तब चालू होता है, जब लाइट डिवाइस बंद से चालू हो जाता है. ऐसा तब नहीं होता, जब लाइट डिवाइस चालू से चालू हो जाता है (कोई बदलाव नहीं).

ऑटोमेशन की सुविधा उम्मीद के मुताबिक काम नहीं कर रही है

किनारे का पता लगाने की सुविधा को ध्यान में रखने के बाद, अगर कोई ऑटोमेशन आपकी उम्मीद के मुताबिक काम नहीं करता है, तो:

  1. हर डिवाइस की जांच करें, ताकि यह पक्का किया जा सके कि वह ऑटोमेशन से अलग, सही तरीके से काम कर रहा है.

  2. अपने ऑटोमेशन के लिए ऑटोमेशन ग्राफ़ देखें. इसकी तुलना अपने ऑटोमेशन डीएसएल से करें, ताकि आपको अपनी किसी संभावित गलत धारणा के बारे में पता चल सके.

  3. ऑटोमेशन के चालू होने के दौरान, Google Home ऐप्लिकेशन में डिवाइस की स्थिति देखें.

  4. देखें कि ऑटोमेशन में शामिल किए गए सभी डिवाइस, उस स्ट्रक्चर में मौजूद हों जहां आपको उन्हें रखना है. ऑटोमेशन के लिए इस्तेमाल किए जा रहे किसी डिवाइस को मिटाने से, अनचाहे नतीजे मिल सकते हैं. डिवाइस मिटाने का ऑटोमेशन पर असर देखें.

ऑटोमेशन के ग़लत समय पर चालू होने की समस्या

अगर आपका ऑटोमेशन तब चलता है, जब उसे नहीं चलना चाहिए, तो ऑटोमेशन शुरू होने की शर्तों की जांच करें. यह पक्का करने के लिए कि स्थिति में बदलाव सिर्फ़ एक बार कैप्चर हो और ऑटोमेशन सिर्फ़ एक बार ट्रिगर हो, आपको अतिरिक्त लॉजिक जोड़ने की ज़रूरत पड़ सकती है.

ऑटोमेशन कंपाइल नहीं होता

पक्का करें कि आपके ऐप्लिकेशन में सभी ज़रूरी इंपोर्ट शामिल हों. इनमें अलग-अलग नोड टाइप के साथ-साथ, आपके रेफ़र किए जा रहे एट्रिब्यूट से जुड़ी हर क्लास शामिल है.

ऑटोमेशन बनाने के दौरान पुष्टि नहीं हो सकी

अगर ऑटोमेशन बनाने की प्रोसेस में पुष्टि नहीं हो पाती है, तो चेतावनी या गड़बड़ी का मैसेज दिखता है. इससे समस्या के बारे में जानकारी मिलती है. ज़्यादा जानकारी के लिए, ValidationIssueType रेफ़रंस देखें.

List फ़ंक्शन अपवाद दिखाता है

ऑटोमेशन एपीआई के List फ़ंक्शन को कॉल करते समय, एपीआई की सुविधाओं के मौजूद न होने की वजह से, रीड हैंडलर अपवाद दे सकते हैं. इस समस्या को ठीक करने के लिए, उस ऑटोमेशन को मिटाएं जिस पर इसका असर पड़ा है.

ऐसा करने के लिए:

  1. पक्का करें कि adb इंस्टॉल हो. adb इंस्टॉल करना लेख पढ़ें.
  2. Android के लॉग से, ऑटोमेशन का आईडी वापस पाने के लिए, यह तरीका अपनाएं:

    adb logcat -s GhpNative

    लॉग के उदाहरण:

    adb logcat -s GhpNative level:debug | grep -A 10 -B 10 AutomationManagerTrait\.ListResponse
    
    INTERACTION RESPONSE -> SendCommandsResponse:
    1 {
    1: "automation@global"
    3 {
      1: "home.internal.traits.automation.AutomationManagerTrait.ListResponse"
      2:
      5 {
        1: "type.googleapis.com/home.internal.traits.automation.AutomationManagerTrait.ListResponse"
        1 {
            1: "1111-2222-3333-44444-55555" // Automation ID to delete
            2: "structure@2222-3333-4444-5555-6666"
    ...

    अगर आपको कई ऑटोमेशन आईडी मिटाने हैं, तो आउटपुट को कंट्रोल करने के लिए, अपने टर्मिनल पेजर का इस्तेमाल करें:

    adb logcat -s GhpNative level:debug | less
  3. ऑटोमेशन के आईडी का इस्तेमाल करके, ऑटोमेशन मिटाएं:

    structure.deleteAutomation(new object : HasId(id = "1111-2222-3333-44444-55555"))
    

Discovery API, किसी ट्रेट के रजिस्टर न होने पर चेतावनी लॉग करता है

अगर Discovery API, Trait not found के लिए चेतावनी लॉग करता है, तो इसका मतलब है कि एपीआई, डिस्कवरी के लिए उपलब्ध कैंडिडेट के लिए इस ट्रेट का इस्तेमाल करने की कोशिश कर रहा है. हालांकि, ऐसा नहीं हो पाएगा, क्योंकि इस ट्रेट को शुरू करने के दौरान रजिस्टर नहीं किया गया था. उदाहरण के लिए:

09-03 17:45:20.578 10646 10646 W AutomationSdk: trait_id: "home.matter.6006.clusters.fc43" and Exception occurred com.google.home.HomeException: 18: Trait not found: home.matter.6006.clusters.fc43
09-03 17:45:20.578 10646 10646 W AutomationSdk: While converting candidate: # com.google.home.platform.traits.AutomationCandidateNode@76f0b582

इस ट्रेट का आइडेंटिफ़ायर home.matter.6006.clusters.fc43 है, जो RelativeHumidityControl से मेल खाता है. किसी आईडी से ट्रेट का नाम पता करने के लिए, ट्रेट इंडेक्स देखें.

इस उदाहरण से पता चलता है कि ऐप्लिकेशन शुरू करते समय, RelativeHumidityControl को रजिस्टर करना ज़रूरी है. रजिस्ट्री में अपनी विशेषता जोड़ने के लिए, विशेषताएं रजिस्टर करना लेख पढ़ें.

OAuth

अगर आपके पास पहले से कोई OAuth क्लाइंट है

अगर आपके पास पब्लिश किए गए ऐप्लिकेशन के लिए, पहले से ही पुष्टि किया गया OAuth क्लाइंट है, तो Home API को टेस्ट करने के लिए, अपने मौजूदा OAuth क्लाइंट का इस्तेमाल किया जा सकता है.

Home API को टेस्ट करने और उनका इस्तेमाल करने के लिए, Google Home Developer Console रजिस्टर करने की ज़रूरत नहीं है. हालांकि, आपको अपना ऐप्लिकेशन पब्लिश करने के लिए, Developer Console का मंज़ूरी पा चुका रजिस्ट्रेशन अब भी चाहिए होगा. भले ही, आपके पास किसी दूसरे इंटिग्रेशन से पुष्टि किया गया OAuth क्लाइंट हो.

इन बातों का ध्यान रखें:

  • मौजूदा OAuth क्लाइंट का इस्तेमाल करने पर, ज़्यादा से ज़्यादा 100 उपयोगकर्ता हो सकते हैं. टेस्ट उपयोगकर्ता जोड़ने के बारे में जानकारी के लिए,OAuth के लिए सहमति देने की स्क्रीन सेट अप करें. OAuth की पुष्टि से अलग, Home APIs ने उन उपयोगकर्ताओं की संख्या पर सीमा तय की है जो आपके ऐप्लिकेशन को अनुमतियां दे सकते हैं. यह सीमा 100 उपयोगकर्ताओं की है. Developer Console के लिए रजिस्टर करने के बाद, यह पाबंदी हटा दी जाती है.

  • Developer Console रजिस्ट्रेशन को मंज़ूरी के लिए तब भेजा जाना चाहिए, जब आपको Home API के साथ अपने ऐप्लिकेशन को अपडेट करने की तैयारी के दौरान, OAuth के ज़रिए डिवाइस टाइप के लिए अनुमतियां देने पर पाबंदी लगानी हो.

जिन Google Cloud ऐप्लिकेशन के लिए OAuth की पुष्टि अब भी बाकी है उनमें उपयोगकर्ता, पुष्टि पूरी होने तक OAuth फ़्लो पूरा नहीं कर सकते. अनुमतियां देने की कोशिश करने पर, यह गड़बड़ी दिखेगी:

Access blocked: <Project Name> has not completed the Google verification process.