From e153ede45486bf80e38c13b927eb9fcb062daf99 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Mon, 16 May 2022 11:48:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B0=D1=88=D0=B8=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B9,=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=B4=D0=B0=20=D0=B8=20=D0=B2=D1=80=D0=B5?= =?UTF-8?q?=D0=BC=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- state_machine.py | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 state_machine.py diff --git a/state_machine.py b/state_machine.py new file mode 100644 index 0000000..999e9ee --- /dev/null +++ b/state_machine.py @@ -0,0 +1,95 @@ +# Модуль машины состояний (конечный автомат) + +import speaker # Для разговоров +import datetime # Для времени +from pyowm import OWM # использование OpenWeatherMap для получения данных о погоде (pip install pyowm) + +machine = None # Конечный автомат +current_state = None # Текущее состояние +weather_api_key = None # Ключ для OpenWeatherMap + +def init(assistant_name): + """Инициализирует конечный автомат""" + global machine + global current_state + global weather_api_key + + with open("weatherApiKey.txt", "r") as key: + weather_api_key = key.read() + + current_state = "Начало" + machine = { + "Начало":{ + assistant_name.lower(): switchToListen + }, + "Слушаю задание":{ + "время": switchToTime, + "погода": switchToWeather + } + + } + +def work(): + """Обрабатывает конечный автомат""" + global machine + global current_state + + speaker.speak(f"Доброго времени суток! Ассистент начинает работу") + while(True): + word = input().lower() # Пока считаем с клавиатуры предложение + # Если ассистент знает такое слово для перехода + if (word in machine[current_state].keys()): + # Выполняем действия и переход в новое состояние + current_state = machine[current_state][word]() + else: + # иначе переспросим + speaker.speak("Я не понял, пожалуйста повторите") + print("Сейчас автомат в: " + current_state) + + + +# Переход на "Слушаю задание" +def switchToListen(): + speaker.speak("Слушаю") + return "Слушаю задание" + +# Переход на "Говорю время" и возвращаюсь в "Начало" +def switchToTime(): + now = datetime.datetime.now() + speaker.speak(f"Сейчас {now.hour} часов, {now.minute} минут") + return "Начало" + +# Переход на "Вопрос локации погоды" +def switchToWeather(): + global weather_api_key + + speaker.speak("Дома?") + word = input().lower() # Пока считаем с клавиатуры предложение + if (word == "да"): + location = "Home" + else: + speaker.speak("Назовите локацию") + location = input().lower() # Пока считаем с клавиатуры предложение + + try: + open_weather_map = OWM(weather_api_key) + + # запрос данных о текущем состоянии погоды + weather_manager = open_weather_map.weather_manager() + observation = weather_manager.weather_at_place(location) + weather = observation.weather + + except: + speaker.speak("Извините. Ошибка запроса к серверу погоды") + traceback.print_exc() # Вывод трейсбека для отладки + return "Начало" + + # разбивание данных на части для удобства работы с ними + status = weather.detailed_status + temperature = weather.temperature('celsius')["temp"] + wind_speed = weather.wind()["speed"] + pressure = int(weather.pressure["press"] / 1.333) # переведено из гПА в мм рт.ст. + + speaker.speak(f"Сейчас на улице {temperature} градусов, скорость ветра {wind_speed} метров в секунду, давление {pressure} миллиметров ртутного столба") + + return "Начало" \ No newline at end of file