समस्या का हल

नमूना ऐप

यदि होम एपीआई का उपयोग करते समय आपको कोई समस्या आती है, तो आप आगे की डिबगिंग के लिए लॉग एकत्र कर सकते हैं. मोबाइल डिवाइस से लॉग इकट्ठा करने के लिए Android डीबग ब्रिज (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 को डेवलप करने की प्रोसेस आसान हो जाती है.

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

ज़्यादा जानने और टूल पाने के लिए, 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

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

  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 फ़ंक्शन, अपवादों को थ्रो करता है

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

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

  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.