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