Zarejestruj działania niestandardowe na urządzeniu

Twoje urządzenie może mieć specjalne umiejętności, których nie obejmuje bieżący zestaw cechy Na przykład „mrugnij światłem”. cechę urządzenia, które może migać. Ty mogą zdefiniować niestandardowe działania dla urządzenia, które określają polecenia wysyłane do aby aktywować specjalne umiejętności.

Aby zdefiniować niestandardowe działanie dotyczące urządzenia, potrzebujesz tych elementów:

  • Wzorzec dopasowywany do zapytania użytkownika
  • Niestandardowe działanie na urządzeniu kojarzone z dopasowanym zapytaniem
  • Tekst odczytywany w odpowiedzi na pytanie użytkownika, jeśli urządzenie obsługuje dane działanie
  • nazwę polecenia, która jest wysyłana z powrotem do urządzenia wraz z innymi parametrami;

Niestandardowe działanie urządzenia tworzysz, umieszczając te informacje w pliku pakietu działań. Pakiety działań określają format odpowiedzi Asystenta. W przeciwieństwie do SDK Actions, niestandardowe działania na urządzeniach są realizowane lokalnie; nie określa się do przetwarzania żądań i udzielania odpowiedzi. Niestandardowe działania na urządzeniu to nie mają charakteru konwersacyjnego.

Utwórz pakiet działań

Na podstawie poniższego przykładu utwórz plik (np. actions.json), który definiuje polecenie testowe: miganie diody LED. Skopiuj go z przykładowego kodu, pobrane w poprzednim kroku:

cd assistant-sdk-python/google-assistant-sdk/googlesamples/assistant/grpc/
cp ~/assistant-sdk-python/google-assistant-sdk/actions.json .
Przykład
{
    "manifest": {
        "displayName": "Blinky light",
        "invocationName": "Blinky light",
        "category": "PRODUCTIVITY"
    },
    "actions": [
        {
            "name": "com.example.actions.BlinkLight",
            "availability": {
                "deviceClasses": [
                    {
                        "assistantSdkDevice": {}
                    }
                ]
            },
            "intent": {
                "name": "com.example.intents.BlinkLight",
                "parameters": [
                    {
                        "name": "number",
                        "type": "SchemaOrg_Number"
                    },
                    {
                        "name": "speed",
                        "type": "Speed"
                    }
                ],
                "trigger": {
                    "queryPatterns": [
                        "blink ($Speed:speed)? $SchemaOrg_Number:number times",
                        "blink $SchemaOrg_Number:number times ($Speed:speed)?"
                    ]
                }
            },
            "fulfillment": {
                "staticFulfillment": {
                    "templatedResponse": {
                        "items": [
                            {
                                "simpleResponse": {
                                    "textToSpeech": "Blinking $number times"
                                }
                            },
                            {
                                "deviceExecution": {
                                    "command": "com.example.commands.BlinkLight",
                                    "params": {
                                        "speed": "$speed",
                                        "number": "$number"
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    ],
    "types": [
        {
            "name": "$Speed",
            "entities": [
                {
                    "key": "SLOWLY",
                    "synonyms": [
                        "slowly",
                        "slow"
                    ]
                },
                {
                    "key": "NORMALLY",
                    "synonyms": [
                        "normally",
                        "regular"
                    ]
                },
                {
                    "key": "QUICKLY",
                    "synonyms": [
                        "quickly",
                        "fast",
                        "quick"
                    ]
                }
            ]
        }
    ]
}

W poprzednim przykładzie użyto następujących informacji do zdefiniowania urządzenia niestandardowego działanie:

  • Wzorzec dopasowujący się do zapytania użytkownika (mrugnij N razy)
  • Niestandardowe działanie na urządzeniu, które ma być kojarzone z dopasowanym zapytaniem (com.example.actions.BlinkLight) do celów organizacyjnych
  • Tekst odczytywany w odpowiedzi na pytanie użytkownika, jeśli urządzenie obsługuje dane działanie (Mrugające N razy)
  • nazwę polecenia (com.example.commands.BlinkLight) zwracaną do: nazwę urządzenia i wszystkie parametry (liczbę i ewentualnie opis prędkości).

Aby zdefiniować wzorzec zapytania, pamiętaj o następujących kwestiach:

  • Możesz używać typów zdefiniowanych na podstawie schema.org we wzorcu zapytania.
  • Tablica types [...] definiuje listę typów niestandardowych (np. $Speed).
  • We wzorcu zapytań można używać typów niestandardowych. Użytkownik może wypowiedzieć dowolne z synonimy w typie niestandardowym, aby pasowały do wzorca zapytania.
  • Jeśli znajdziemy odpowiednik synonimu, wystąpienie typu (speed) zwróci zwraca znormalizowany klucz (SLOWLY). W kolumnie może być wiele elementów Świadczy o tym różne prędkości. mrugnięcie.
  • Części wzorca TTS żądania mogą być opcjonalne. Na przykład użyj wartości ($Speed:speed)? we wzorcu zapytania, aby ta część była opcjonalna.
  • $type.raw (na przykład $speed.raw) w funkcji odpowiedź TTS jest zastępowana słowami, które wypowiedział użytkownik.

Opisy wielu z tych pól znajdziesz w ActionPackage dokumentacji.

Wdróż pakiet działań

Po utworzeniu niestandardowego działania na urządzeniu w pakiecie działań możesz utworzyć Pakiet akcji dostępny dla Asystenta.

Opisane tu czynności możesz wykonać na swoim urządzeniu, ale być może łatwiej będzie Ci aby je wykonać w swoim systemie programistycznym. Te polecenia nie wymagają parametru środowiska wirtualnego.

  1. Pobierz narzędzie wiersza poleceń gactions.

  2. Usuń wszystkie istniejące dane logowania z tego samego katalogu, w którym znajduje się gactions .

    rm creds.data
  3. Zapisz pakiet Action w Google za pomocą interfejsu wiersza poleceń gactions. Zastąp project_id projektem w Konsoli Actions Identyfikator.

    ./gactions update --action_package actions.json --project project_id
  4. Przy pierwszym uruchomieniu tego polecenia otrzymasz adres URL oraz prośbę o jego wykonanie zaloguj się. Skopiuj URL i wklej go w przeglądarce (możesz to zrobić w dowolnym systemie). Na stronie pojawi się prośba o zalogowanie się na konto Google. Podpisz z kontem Google, za pomocą którego utworzono projekt krok.

  5. Gdy zatwierdzisz prośbę o uprawnienia przesłaną z interfejsu API, pojawi się kod w przeglądarce, na przykład „4/XXXX”. Skopiuj ten kod i wklej go w polu terminal:

    Enter the authorization code:

    Jeśli autoryzacja się powiodła, zobaczysz odpowiedź podobną do tej następujące:

    Your app for the Assistant for project my-devices-project was successfully
    updated with your actions.
    
  6. Wdróż pakiet akcji w trybie testowym za pomocą interfejsu wiersza poleceń gactions. Twój pakiet akcji musi być zapisany w Google co najmniej raz przed po uruchomieniu tego polecenia. Tryb testowy włącza pakiet akcji na Twoim urządzeniu tylko na koncie użytkownika.

    ./gactions test --action_package actions.json --project project_id

    Obecnie nie możesz testować projektu za pomocą Actions Simulator (Symulatora Actions).

  7. Aby zaktualizować pakiet działań, użyj polecenia gactions update.

  8. (Opcjonalnie) Możesz utworzyć zlokalizowane pakiety działań. obsługę wielu różnych języków i regionów w tym samym czasie w ramach jednego projektu.

Modyfikowanie próbki

Wykonaj czynności opisane w tej sekcji na urządzeniu.

nano pushtotalk.py

Dodaj moduł obsługi do działania niestandardowego. Zwróć uwagę, że poniższy moduł obsługi został już dodany do kodu przykładowego pakietu Action powyżej.

...

device_handler = device_helpers.DeviceRequestHandler(device_id)

@device_handler.command('com.example.commands.BlinkLight')
def blink(speed, number):
    logging.info('Blinking device %s times.' % number)
    delay = 1
    if speed == "SLOWLY":
        delay = 2
    elif speed == "QUICKLY":
        delay = 0.5
    for i in range(int(number)):
        logging.info('Device is blinking.')
        # GPIO.output(25, 1)
        time.sleep(delay)
        # GPIO.output(25, 0)
        time.sleep(1)

Uruchamianie przykładu

Uruchom kod źródłowy.

python pushtotalk.py

Spróbuj wpisać zapytanie. W przykładzie powyżej wykonaj te czynności:

Mrugnij 5 razy.

Zwróć uwagę, że zapytanie musi pasować do wzorca zapytania w pakiecie akcji.