# ====================================================================================================================== # Author: BERKYT # ====================================================================================================================== # Температура, открытие, закрытие открытие дверей, вкл выкл свет, в случае протечки: замыкание или размыкание # Статус: онлайн и оффлайн, # уровень света, открыто или закрыто окно, время суток, время года. import random import shm_exceptions from datetime import datetime # Обычная заглушка для значений _PASS = 'PASS' class DataForSensor: def __init__(self, *, name_sensor, status_network, name_room, temperature='10', status_door_switch='close', status_light_switch='off', status_window_switch='close', status_light_level_switch='0'): self.name_sensor = name_sensor self.status_network = status_network self.name_room = name_room self.temperature = temperature self.status_door_switch = status_door_switch self.status_light_switch = status_light_switch self.status_window_switch = status_window_switch self.status_light_level_switch = status_light_level_switch self._check_status_network() def _check_status_network(self): if self.status_network == 'online': return True elif self.status_network == 'offline': return False else: raise shm_exceptions.ExceptionOnlineStatus def _get_status_network(self): if self._check_status_network(): return {'bool': True, 'info': 'Доступ есть!'} else: return {'bool': False, 'info': 'Не могу получить доступ!'} def _now_hour(self): return datetime.now().time().hour def _get_sub_time_range(self, start, end): return str(list(range(start, end))) def get_now_date_and_time(self): if self._get_status_network()['bool']: return f'Текущая дата и время = {datetime.now().strftime("Дата: %d/%m/%Y Время: %H:%M:%S")}' else: return self._get_status_network()['info'] def get_name_room(self): if self._get_status_network()['bool']: return self.name_room else: return self._get_status_network()['info'] def get_temperature(self): """ Возвращает температуру в комнате в зависимости от времени суток. """ if self._get_status_network()['bool']: time_range_with_temperature = { self._get_sub_time_range(0, 6): random.randint(-1, 5), self._get_sub_time_range(6, 10): random.randint(13, 20), self._get_sub_time_range(10, 16): random.randint(20, 30), self._get_sub_time_range(16, 20): random.randint(15, 20), self._get_sub_time_range(20, 24): random.randint(5, 10), } temperature = self.temperature koef_temperature = 10 for key in time_range_with_temperature: if str(self._now_hour()) in key: temperature = time_range_with_temperature[key] break return f'Температура в комнате "{self.get_name_room()}" = {temperature + koef_temperature} градусов.' else: return self._get_status_network()['info'] def get_status_online(self): return self.status_network def get_status_window_switch(self): if self._get_status_network()['bool']: return self.status_window_switch else: return self._get_status_network()['info'] def get_status_door_switch(self): if self._get_status_network()['bool']: return self.status_door_switch else: return self._get_status_network()['info'] def get_status_light_switch(self): if self._get_status_network()['bool']: return self.status_light_switch else: return self._get_status_network()['info'] def get_light_level(self): """ Возвращает уровень освещенности в комнате в зависимости от того, открыло ли окно, открыта ли дверь и включен ли свет? """ if self._get_status_network()['bool']: koef_light_level = random.randint(5, 10) result_list = [koef_light_level] for item in [self.status_light_switch, self.status_door_switch, self.status_window_switch]: if 'on' in item or 'open' in item: result_list.append(random.randint(10, 30)) return 'Уровень освещенности в комнате {name_room} = {level_light}%'.format(level_light=sum(result_list), name_room=self.get_name_room()) else: return self._get_status_network()['info'] def set_status_network(self, new_status_network): self.status_network = new_status_network def set_status_door_switch(self, status_window_switch): if self._get_status_network()['bool']: self.status_window_switch = status_window_switch else: print(self._get_status_network()['info']) def set_status_light_switch(self, status_light_switch): if self._get_status_network()['bool']: self.status_light_switch = status_light_switch else: print(self._get_status_network()['info']) def set_name_room(self, name_room): if self._get_status_network()['bool']: self.name_room = name_room else: print(self._get_status_network()['info']) if __name__ == '__main__': # Тестовый код dfs = DataForSensor(name_sensor='test_sensor', status_network='offline', name_room='Спальня') print('Вывод без подключения к сети: ') print(dfs.get_temperature()) dfs.set_status_network('online') print('Вывод c подключением к сети: ') print(dfs.get_temperature()) print(dfs.get_light_level()) print(dfs.get_now_date_and_time()) print(dfs.get_name_room()) print(dfs.get_status_door_switch()) print(dfs.get_status_light_switch()) print(dfs.get_status_window_switch()) print(dfs.get_status_online()) dfs.set_status_network('offline') print('Вывод без подключения к сети: ') print(dfs.get_temperature()) print(dfs.get_light_level()) print(dfs.get_now_date_and_time()) print(dfs.get_name_room()) print(dfs.get_status_door_switch()) print(dfs.get_status_light_switch()) print(dfs.get_status_window_switch()) print(dfs.get_status_online())