diff --git a/state_machine.py b/state_machine.py index 96f0e9d..6e91577 100644 --- a/state_machine.py +++ b/state_machine.py @@ -54,7 +54,6 @@ def init(assistant_name): def work(): """Обрабатывает конечный автомат""" - global machine global current_state while(True): @@ -82,25 +81,28 @@ def switchToTime(): speaker.speak(f"Сейчас {now.hour} часов, {now.minute} минут") return "Начало" +def _precipitation_today_message(precipitations:list): + # Собираем время для проверки что осадки в будущем сегодня + today = datetime.datetime.now().replace(hour = 23, minute = 59, second = 59) # Зададим конец дня + for precipitation in precipitations: + # Время осадков + precipitation_time = datetime.datetime.fromisoformat(precipitation.reference_time('iso')).replace(tzinfo=None) # во избежания ошибок сравнения относительного и абсолютного времени + # Если осадки в будущем сегодня + if datetime.datetime.now() <= precipitation_time <= today: + return f'Обещают {precipitation.detailed_status} в {precipitation_time.hour} часов' # Достаточно сказать об одних осадках + return '' # Если осадков подходящих не нашлось - пустая строка + # Переход на "Вопрос локации погоды" def switchToWeather(): - global weather_api_key - # speaker.speak("Дома?") - # word = input().lower() # Пока считаем с клавиатуры предложение - # if (word == "да"): - # location = "Home" - # else: - # speaker.speak("Назовите локацию") - # location = input().lower() # Пока считаем с клавиатуры предложение location = "Murino,RU" try: open_weather_map = OWM(weather_api_key) + open_weather_map.config['language'] = 'ru' # Язык результатов # запрос данных о текущем состоянии погоды - weather_manager = open_weather_map.weather_manager() - observation = weather_manager.weather_at_place(location) - weather = observation.weather + now = open_weather_map.weather_manager().weather_at_place(location) + forecast = open_weather_map.weather_manager().forecast_at_place(location, '3h') # 3h вернет недельный, так как daily не работает except: speaker.speak("Извините. Ошибка запроса к серверу погоды") @@ -108,16 +110,20 @@ def switchToWeather(): return "Начало" # разбивание данных на части для удобства работы с ними - status = weather.detailed_status - temperature = int(weather.temperature('celsius')["temp"]) - temperature_min = int(weather.temperature('celsius')["temp_min"]) - temperature_max = int(weather.temperature('celsius')["temp_max"]) - wind_speed = int(weather.wind()["speed"]) - # pressure = int(weather.pressure["press"] / 1.333) # переведено из гПА в мм рт.ст. - - speaker.speak(f"Сейчас на улице {temperature} градусов, минимальная {temperature_min}, максимальная {temperature_max}, скорость ветра {wind_speed} метров в секунду") - # ", давление {pressure} миллиметров ртутного столба") + status = now.weather.detailed_status + temperature = int(now.weather.temperature('celsius')["temp"]) + + # Начинаем собирать строку с погодой + weather = f"Сейчас {status} {temperature} градусов." + # Если в прогнозе есть дождь + if forecast.will_have_rain(): + weather += _precipitation_today_message(forecast.when_rain()) + # Если в прогнозе есть снег + if forecast.will_have_snow(): + weather += _precipitation_today_message(forecast.when_rain()) + + speaker.speak(weather) return "Начало" # Переход на приветствие и на "Начало"