Как исправить ошибку «Возникла проблема с ответом на запрошенный навык»? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь следовать этому основному c уроку о том, как заставить Алексу включить светодиод, подключенный к Raspberry Pi, но я так и не смог успешно запустить умение. Я всегда получаю сообщение «Возникла проблема с ответом на запрошенный навык». Я проверил журнал устройства, и InvocationResponse всегда имеет значение null.

Я выполнил все шаги в этом учебнике, за исключением части, в которой мне нужно скопировать и вставить код в поле Intent Schema. Я полагаю, что эта часть уже автоматически обрабатывается в последней консоли разработчика, верно? Я проверил вкладку JSON Editor, и большая часть кода схемы намерений, приведенного в руководстве, уже была написана. Я попытался отредактировать редактор JSON, но это не сработало - ошибка ответа все еще отображается.

Я посмотрел другие форумы, и они сказали, что скрипт python, который я запускаю локально на Pi может быть проблема. Скрипт является точной копией этого кода , как предлагается в руководстве. Ngrok, кажется, работает, так как он дает 200 OK на терминале.

Я действительно понятия не имею, как начать отладку этой проблемы. Надеюсь, кто-нибудь сможет мне помочь! Спасибо!


Это скрипт python, который я запускаю на Pi:

from flask import Flask
from flask_ask import Ask, statement, convert_errors
import RPi.GPIO as GPIO
import logging

GPIO.setmode(GPIO.BCM)

app = Flask(__name__)
ask = Ask(app, '/')

logging.getLogger("flask_ask").setLevel(logging.DEBUG)

@ask.intent('GPIOControlIntent', mapping={'status': 'status'})
def gpio_status(status):

if status in ['on','high' ]:
  GPIO.setup(21, GPIO.IN)
  state = GPIO.input(21)
  if (state == True):
    GPIO.setup(21, GPIO.OUT)
    GPIO.output(21,GPIO.HIGH)
    return statement('Lights are already on')
  else:
    GPIO.setup(21, GPIO.OUT)
    GPIO.output(21,GPIO.HIGH)
    return statement('Turning lights {}'.format(status))

if status in ['off','low' ]:
  GPIO.setup(21, GPIO.IN)
  state = GPIO.input(21)
  print('status of light',state)
  if (state == False):
    GPIO.setup(21, GPIO.OUT)
    GPIO.output(21,GPIO.LOW)
    return statement('Lights are already off')
  else:
    GPIO.setup(21, GPIO.OUT)
    GPIO.output(21,GPIO.LOW)
    return statement('Turning lights {}'.format(status))

if __name__ == '__main__':
port = 5000 #the custom port you want
    app.run(host='0.0.0.0', port=port)

Это то, что есть в редакторе JSON в AWS Консоль разработчика

{
"interactionModel": {
    "languageModel": {
        "invocationName": "raspberry pi",
        "intents": [
            {
                "name": "AMAZON.FallbackIntent",
                "samples": []
            },
            {
                "name": "AMAZON.CancelIntent",
                "samples": []
            },
            {
                "name": "AMAZON.HelpIntent",
                "samples": []
            },
            {
                "name": "AMAZON.StopIntent",
                "samples": []
            },
            {
                "name": "AMAZON.NavigateHomeIntent",
                "samples": []
            },
            {
                "name": "GPIOControlIntent",
                "slots": [
                    {
                        "name": "status",
                        "type": "GPIO_Control"
                    }
                ],
                "samples": [
                    "turn the light {status}",
                    "turn {status} the light"
                ]
            }
        ],
        "types": [
            {
                "name": "GPIO_Control",
                "values": [
                    {
                        "name": {
                            "value": "off"
                        }
                    },
                    {
                        "name": {
                            "value": "on"
                        }
                    }
                ]
            }
        ]
    }
}
}
...