# Установите таймер - Виртуальное IoT-устройство и Raspberry Pi В этой части урока вы вызовете свой серверless-код для распознавания речи и установите таймер на вашем виртуальном IoT-устройстве или Raspberry Pi на основе полученных результатов. ## Установите таймер Текст, возвращаемый из вызова преобразования речи в текст, необходимо отправить в ваш серверless-код для обработки с помощью LUIS, чтобы получить количество секунд для таймера. Это количество секунд можно использовать для установки таймера. Таймеры можно устанавливать с помощью класса Python `threading.Timer`. Этот класс принимает время задержки и функцию, которая будет выполнена после истечения времени задержки. ### Задача - отправить текст в серверless-функцию 1. Откройте проект `smart-timer` в VS Code и убедитесь, что виртуальная среда загружена в терминале, если вы используете виртуальное IoT-устройство. 1. Над функцией `process_text` объявите функцию `get_timer_time` для вызова REST-эндпоинта, который вы создали: ```python def get_timer_time(text): ``` 1. Добавьте следующий код в эту функцию, чтобы определить URL для вызова: ```python url = '' ``` Замените `` на URL вашего REST-эндпоинта, который вы создали на прошлом уроке, либо на вашем компьютере, либо в облаке. 1. Добавьте следующий код, чтобы установить текст как свойство, передаваемое в формате JSON при вызове: ```python body = { 'text': text } response = requests.post(url, json=body) ``` 1. Ниже этого извлеките `seconds` из полезной нагрузки ответа, возвращая 0, если вызов не удался: ```python if response.status_code != 200: return 0 payload = response.json() return payload['seconds'] ``` Успешные HTTP-вызовы возвращают статус-код в диапазоне 200, а ваш серверless-код возвращает 200, если текст был обработан и распознан как намерение установки таймера. ### Задача - установить таймер в фоновом потоке 1. Добавьте следующий оператор импорта в начало файла, чтобы импортировать библиотеку Python `threading`: ```python import threading ``` 1. Над функцией `process_text` добавьте функцию для озвучивания ответа. Пока она будет просто выводить текст в консоль, но позже в этом уроке она будет озвучивать текст. ```python def say(text): print(text) ``` 1. Ниже добавьте функцию, которая будет вызвана таймером для объявления о завершении таймера: ```python def announce_timer(minutes, seconds): announcement = 'Times up on your ' if minutes > 0: announcement += f'{minutes} minute ' if seconds > 0: announcement += f'{seconds} second ' announcement += 'timer.' say(announcement) ``` Эта функция принимает количество минут и секунд для таймера и формирует предложение, чтобы сообщить, что таймер завершен. Она проверяет количество минут и секунд и включает только те единицы времени, которые имеют значение. Например, если количество минут равно 0, то в сообщении будут указаны только секунды. Это предложение затем отправляется в функцию `say`. 1. Ниже добавьте следующую функцию `create_timer` для создания таймера: ```python def create_timer(total_seconds): minutes, seconds = divmod(total_seconds, 60) threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start() ``` Эта функция принимает общее количество секунд для таймера, которое будет передано в команде, и преобразует это значение в минуты и секунды. Затем она создает и запускает объект таймера, используя общее количество секунд, передавая в него функцию `announce_timer` и список, содержащий минуты и секунды. Когда таймер истекает, он вызывает функцию `announce_timer` и передает содержимое этого списка в качестве параметров - таким образом, первый элемент списка передается как параметр `minutes`, а второй элемент как параметр `seconds`. 1. В конец функции `create_timer` добавьте код для формирования сообщения, которое будет озвучено пользователю, чтобы объявить о начале таймера: ```python announcement = '' if minutes > 0: announcement += f'{minutes} minute ' if seconds > 0: announcement += f'{seconds} second ' announcement += 'timer started.' say(announcement) ``` Опять же, сообщение включает только те единицы времени, которые имеют значение. Это предложение затем отправляется в функцию `say`. 1. Добавьте следующее в конец функции `process_text`, чтобы получить время для таймера из текста, а затем создать таймер: ```python seconds = get_timer_time(text) if seconds > 0: create_timer(seconds) ``` Таймер создается только если количество секунд больше 0. 1. Запустите приложение и убедитесь, что функция приложения также запущена. Установите несколько таймеров, и вывод покажет, что таймер установлен, а затем покажет, когда он истекает: ```output pi@raspberrypi:~/smart-timer $ python3 app.py Set a two minute 27 second timer. 2 minute 27 second timer started. Times up on your 2 minute 27 second timer. ``` > 💁 Вы можете найти этот код в папке [code-timer/pi](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/pi) или [code-timer/virtual-iot-device](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/virtual-iot-device). 😀 Ваше приложение таймера успешно работает! --- **Отказ от ответственности**: Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия по обеспечению точности, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.