def reboot_all_devices(): local_data_gateway.get_data_for('{}/reboot'.format( config_service.load_cfg()["urls"]['denva'])) local_data_gateway.get_data_for('{}/reboot'.format( config_service.load_cfg()["urls"]['enviro'])) local_data_gateway.get_data_for('{}/reboot'.format( config_service.load_cfg()["urls"]['delight'])) return {'result': 'All devices starting to reboot'}
def stop_all_devices(): local_data_gateway.get_data_for('{}/halt'.format( config_service.load_cfg()["urls"]['denva'])) local_data_gateway.get_data_for('{}/halt'.format( config_service.load_cfg()["urls"]['enviro'])) local_data_gateway.get_data_for('{}/halt'.format( config_service.load_cfg()["urls"]['delight'])) return {'result': 'All devices stopped'}
def load_cfg() -> dict: if config_service.load_cfg()['mode'] == 'dev': path = r'd:\denva\email.json' elif config_service.load_cfg()['mode'] == 'server': path = r'd:\denva\email.json' else: path = '/home/pi/email.json' # actual cfg is different place with open(path, READ) as email_config: return json.load(email_config)
def get_current_system_information_for_all_services(): return { 'server': system_data_service.get_system_information(), 'denva': local_data_gateway.get_data_for('{}/system'.format( config_service.load_cfg()["urls"]['denva'])), 'enviro': local_data_gateway.get_data_for('{}/system'.format( config_service.load_cfg()["urls"]['enviro'])), 'delight': local_data_gateway.get_data_for('{}/system'.format( config_service.load_cfg()["urls"]['delight'])) }
def get_url_for(name: str): cfg = config_service.load_cfg() if name == 'enviro': return '{}/enviro'.format(cfg['urls']['server']) elif name == 'denva': return '{}/denva'.format(cfg['urls']['server']) else: logging.error('unknown name: {}'.format(name))
def set_denva_status(cfg): # 1. DENVA state = status.Status() logger.info('Getting status for denva..') server_data = local_data_gateway.get_data_for('{}/system'.format( config_service.load_cfg()["urls"]['denva'])) if 'error' in server_data: logger.warning('Unable to get Denva status due to {}'.format( server_data['error'])) state.set_error() else: system_health_check_service.update_hc_for('denva', 'ui') if float(dom_utils.get_float_number_from_text( server_data['CPU Temp'])) > cfg['sensor']['cpu_temp_error']: logger.warning('status: RED due to very high cpu temp on Denva )') state.set_error() elif float( dom_utils.get_float_number_from_text( server_data['CPU Temp'])) > cfg['sensor']['cpu_temp_warn']: logger.warning('status: ORANGE due to high cpu temp on Denva )') state.set_warn() if dom_utils.get_int_number_from_text( server_data['Memory Available']) < 384: logger.warning( 'status: RED due to very low memory available on Denva') state.set_error() elif dom_utils.get_int_number_from_text( server_data['Memory Available']) < 512: logger.warning( 'status: ORANGE due to low memory available on Denva') state.set_warn() if dom_utils.get_int_number_from_text(server_data['Free Space']) < 256: logger.warning('status: RED due to very low free space on Denva') state.set_error() elif dom_utils.get_int_number_from_text( server_data['Free Space']) < 1024: logger.warning('status: ORANGE due to low free space on Denva') state.set_warn() if dom_utils.get_int_number_from_text( server_data['Data Free Space']) < 256: logger.warning( 'status: RED due to very low data free space on Denva') state.set_error() elif dom_utils.get_int_number_from_text( server_data['Data Free Space']) < 1024: logger.warning( 'status: ORANGE due to low data free space on Denva') state.set_warn() color_red, color_green, color_blue = delight_utils.get_state_colour(state) update_blink(state.state) unicornhathd.set_pixel(ui_utils.to_x(1), 1, purple_r, purple_g, purple_b) set_status_for_device(1, 13, color_red, color_green, color_blue) logger.info('Denva: {}'.format(state.get_status_as_light_colour())) return blink
def get_random_frame_picture_path(): path = config_service.load_cfg()['paths']['frame'][ config_service.get_mode()] files_list = [] with os.scandir(path) as files: for file in files: files_list.append(path + "\\" + file.name) return files_list[random.randint(0, len(files_list) - 1)]
def get_links_for(suffix: str, sensor_only: bool = False) -> dict: urls = config_service.load_cfg()['urls'] result = { 'denva': '{}/{}'.format(urls['denva'], suffix), 'enviro': '{}/{}'.format(urls['enviro'], suffix) } if not sensor_only: result['server'] = '{}/{}'.format(urls['server'], suffix) return result
def get_colour_for_cpu(): cpu_temp = float(re.sub('[^0-9.]', '', commands.get_cpu_temp())) config = config_service.load_cfg() if cpu_temp > config['sensor']['cpu_temp_fatal']: return ['Fatal', 255, 16, 1] elif cpu_temp > config['sensor']['cpu_temp_error']: return ['Fatal', 246, 108, 8] elif cpu_temp > config['sensor']['cpu_temp_warn']: return ['Warn', 255, 215, 0] else: return ['Good', 106, 168, 79]
def get_current_log_counts() -> dict: return { 'app': { 'denva': get_data_for('{}/log/count/app'.format( config_service.load_cfg()["urls"]['denva'])), 'enviro': get_data_for('{}/log/count/app'.format( config_service.load_cfg()["urls"]['enviro'])), 'delight': get_data_for('{}/log/count/app'.format( config_service.load_cfg()["urls"]['delight'])) }, 'ui': { 'denva': get_data_for('{}/log/count/ui'.format( config_service.load_cfg()["urls"]['denva'])), 'enviro': get_data_for('{}/log/count/ui'.format( config_service.load_cfg()["urls"]['enviro'])), 'delight': get_data_for('{}/log/count/ui'.format( config_service.load_cfg()["urls"]['delight'])) } }
def get_current_logs_for_all_services() -> dict: return { 'app': { 'denva': get_data_for('{}/log/app/recent'.format( config_service.load_cfg()["urls"]['denva'])), 'enviro': get_data_for('{}/log/app/recent'.format( config_service.load_cfg()["urls"]['enviro'])), 'delight': get_data_for('{}/log/app/recent'.format( config_service.load_cfg()["urls"]['delight'])) }, 'hc': { 'denva': get_data_for('{}/log/hc/recent'.format( config_service.load_cfg()["urls"]['denva'])), 'enviro': get_data_for('{}/log/hc/recent'.format( config_service.load_cfg()["urls"]['enviro'])) } }
def set_delight_status(cfg): # 4. DELIGHT state = status.Status() try: delight_data = delight_service.get_system_info() cpu_temp = str(delight_data['CPU Temp']) if float(dom_utils.get_float_number_from_text( cpu_temp)) > cfg['sensor']['cpu_temp_error']: logger.warning('status: RED due to very high cpu temp on Delight') state.set_error() elif float(dom_utils.get_float_number_from_text( cpu_temp)) > cfg['sensor']['cpu_temp_warn']: logger.warning('status: ORANGE due to high cpu temp on Delight') state.set_warn() if dom_utils.get_int_number_from_text( delight_data['Memory Available']) < 128: logger.warning( 'status: RED due to very low memory available on Delight') state.set_error() elif dom_utils.get_int_number_from_text( delight_data['Memory Available']) < 256: logger.warning( 'status: ORANGE due to low memory available on Delight') state.set_warn() if dom_utils.get_int_number_from_text( delight_data['Free Space']) < 128: logger.warning('status: RED due to very low free space on Delight') state.set_error() elif dom_utils.get_int_number_from_text( delight_data['Free Space']) < 512: logger.warning('status: ORANGE due to low free space on Delight') state.set_warn() except Exception as set_state_exception: logger.error( 'Something went badly wrong\n{}'.format(set_state_exception), exc_info=True) state.set_error() delight_ui_response = local_data_gateway.get_data_for('{}/hc'.format( config_service.load_cfg()["urls"]['delight'])) if not 'error' in delight_ui_response: system_health_check_service.update_hc_for('delight', 'ui') color_blue, color_green, color_red = delight_utils.get_state_colour(state) update_blink(state.state) unicornhathd.set_pixel(ui_utils.to_x(13), 1, purple_r, purple_g, purple_b) unicornhathd.set_pixel(ui_utils.to_x(15), 1, purple_r, purple_g, purple_b) unicornhathd.set_pixel(ui_utils.to_x(13), 2, purple_r, purple_g, purple_b) unicornhathd.set_pixel(ui_utils.to_x(15), 2, purple_r, purple_g, purple_b) set_status_for_device(13, 13, color_red, color_green, color_blue) logger.info('Delight: {}'.format(state.get_status_as_light_colour()))
def main(): global report_generation_cooldown counter = 0 while True: counter += 1 time.sleep(5) if config_service.load_cfg( )['mode'] == 'server' and config_service.is_cctv_camera_on(): last_picture = webcam_service.capture_picture() if last_picture != "": pictures.append(last_picture) if len(pictures) > 5: pictures.pop(0) if counter % 2 == 0: local_data_gateway.post_healthcheck_beat('server', 'app') information.should_refresh() should_send_email() report_generation_cooldown = report_service.create_and_store_it_if_needed( report_generation_cooldown)
def test_get_environment_log_path_for(self): # given scale_params_list = [ ('denva', 'app', '/home/pi/denva-master/src/configs/log_app_config.json'), ('denva', 'ui', '/home/pi/denva-master/src/configs/log_ui_config.json'), ('dev', 'app', 'D:\GitHub\denva\src\configs\dev_log_app_config.json'), ('dev', 'ui', 'D:\GitHub\denva\src\configs\dev_log_ui_config.json'), ('server', 'app', 'd:\denva\src\configs\server_log_app_config.json'), ('server', 'ui', 'd:\denva\src\configs\server_log_ui_config.json'), ('dev', 'ddd', 'D:\GitHub\denva\src\configs\dev_log_app_config.json'), ('ddd', 'ddd', 'D:\GitHub\denva\src\configs\dev_log_app_config.json'), ('overseer_mode', 'overseer_mode', 'd:\\denva\\src\\configs\\overseer_mode.json'), ('overseer', 'overseer', 'd:\\denva\\src\\configs\\overseer.json'), ('cctv', 'cctv', '/home/pi/denva-master/src/configs/log_cctv_config.json'), ('hc', 'hc', '/home/pi/denva-master/src/configs/log_config.json'), ] for mode, an_input, expected_result in scale_params_list: with self.subTest( msg= "Checking to get_environment_log_path_for() for mode {} & app type {} " .format(mode, an_input)): # given config_service.load_cfg()['mode'] = mode # when result = config_service.get_environment_log_path_for(an_input) # then self.assertEqual(expected_result, result)
def set_mothership_status(): # 3. MOTHERSHIP SERVER state = status.Status() server_data = local_data_gateway.get_data_for('{}/system'.format( config_service.load_cfg()["urls"]['server'])) if 'error' in server_data: logger.warning('Unable to get Server status due to {}'.format( server_data['error'])) state.set_error() else: system_health_check_service.update_hc_for('server', 'ui') if dom_utils.get_int_number_from_text( server_data['Memory Available']) < 384: logger.warning( 'status: RED due to very low memory available on Server') state.set_error() elif dom_utils.get_int_number_from_text( server_data['Memory Available']) < 512: logger.warning( 'status: ORANGE due to low memory available on Server') state.set_warn() if dom_utils.get_int_number_from_text(server_data['Disk Free']) < 256: logger.warning( 'status: RED due to very low disk free space on Server') state.set_error() elif dom_utils.get_int_number_from_text( server_data['Disk Free']) < 1024: logger.warning('status: RED due to low disk free space on Server') state.set_warn() color_red, color_green, color_blue = delight_utils.get_state_colour(state) update_blink(state.state) unicornhathd.set_pixel(ui_utils.to_x(9), 1, purple_r, purple_g, purple_b) unicornhathd.set_pixel(ui_utils.to_x(11), 1, purple_r, purple_g, purple_b) unicornhathd.set_pixel(ui_utils.to_x(9), 2, purple_r, purple_g, purple_b) set_status_for_device(9, 13, color_red, color_green, color_blue) logger.info('Server: {}'.format(state.get_status_as_light_colour()))
def _get_hc_result(service: str): hc_result = get_data_for('{}/hc'.format( config_service.load_cfg()["urls"][service])) if 'error' in hc_result: return 'DOWN' return 'UP'
def device_status(): global cycle cycle += 1 logger.info('Checking devices status... (Cycle: {})'.format(cycle)) # 1. denva, 2. denviro, 3. server, 4. delight 5. radar unicornhathd.rotation(270) delight_display.reset_screen() cfg = config_service.load_cfg() set_denva_status(cfg) set_denviro_status(cfg) set_mothership_status() set_delight_status(cfg) system_health_status = system_health_check_service.get_system_healthcheck() color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['denva']['app']) set_status_for_device(1, 7, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['denva']['ui']) set_status_for_device(1, 10, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['denviro']['app']) set_status_for_device(5, 7, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['denviro']['ui']) set_status_for_device(5, 10, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['server']['app']) set_status_for_device(9, 7, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['server']['ui']) set_status_for_device(9, 10, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['delight']['app']) set_status_for_device(13, 7, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['delight']['ui']) set_status_for_device(13, 10, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['other']['cctv']) unicornhathd.set_pixel(ui_utils.to_x(1), 4, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(2), 4, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(3), 4, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['other']['digest']) unicornhathd.set_pixel(ui_utils.to_x(13), 6, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(14), 6, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(15), 6, color_red, color_green, color_blue) color_red, color_green, color_blue = delight_utils.get_state_colour_for_hc( system_health_status['other']['radar']) unicornhathd.set_pixel(ui_utils.to_x(1), 6, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(2), 6, color_red, color_green, color_blue) unicornhathd.set_pixel(ui_utils.to_x(3), 6, color_red, color_green, color_blue) if is_night_mode(): unicornhathd.brightness(0.1) unicornhathd.show() time.sleep(15) else: if blink: ui_utils.perform_blink_animation(unicornhathd) else: unicornhathd.brightness( config_service.get_default_brightness_for_delight_display()) unicornhathd.show() time.sleep(30) unicornhathd.rotation(180)
def get_yesterday_report_for_aircraft(): return get_data_for('{}/flights/yesterday'.format( config_service.load_cfg()["urls"]['delight']))
def get_current_reading_for_enviro() -> dict: return get_data_for('{}/now'.format( config_service.load_cfg()["urls"]['enviro']))
def get_yesterday_report_for_enviro() -> dict: return get_data_for( '{}/report/yesterday'.format( config_service.load_cfg()["urls"]['enviro']), REPORT_TIMEOUT)
* IT BLOG: https://dominiksymonowicz.blogspot.co.uk * Github: https://github.com/pastorcmentarny * Google Play: https://play.google.com/store/apps/developer?id=Dominik+Symonowicz * LinkedIn: https://www.linkedin.com/in/dominik-symonowicz """ import logging import re import config_service from common import commands, dom_utils, get_description_for, data_files, loggy from denva import denva_sensors_service from denviro import denviro_sensors_service warnings_logger = logging.getLogger('warnings') shaking_level = config_service.load_cfg()['sensors']['motion']['sensitivity'] config = config_service.load_cfg() def get_warnings_for(year: str, month: str, day: str) -> list: date = dom_utils.get_filename_for_warnings(year, month, day) return data_files.load_warnings('/home/pi/logs/' + date) def get_warnings_for_today() -> list: return data_files.load_warnings('/home/pi/logs/warnings.log') def get_current_warnings() -> dict: data = denva_sensors_service.get_last_measurement()
def get_warnings(data) -> dict: warnings = {} if type(data['temp']) is not float: data['temp'] = float(data['temp']) if data['temp'] < 16: warnings[ 'temp'] = 'Temperature is too low [tle]. Current temperature is: {}'.format( str(data['temp'])) elif data['temp'] < 18: warnings[ 'temp'] = 'Temperature is low [tlw]. Current temperature is: {}'.format( str(data['temp'])) elif data['temp'] > 25: warnings[ 'temp'] = 'Temperature is high [thw]. Current temperature is: {}'.format( str(data['temp'])) elif data['temp'] > 30: warnings[ 'temp'] = 'Temperature is too high [the]. Current temperature is: {}'.format( str(data['temp'])) data['humidity'] = float(data['humidity']) if data['humidity'] < 30: warnings[ 'humidity'] = 'Humidity is too low [hle]. Current humidity is: {}'.format( str(data['humidity'])) elif data['humidity'] < 40: warnings[ 'humidity'] = 'Humidity is low [hlw]. Current humidity is: {}'.format( str(data['humidity'])) elif data['humidity'] > 60: warnings[ 'humidity'] = 'Humidity is high [hhw]. Current humidity is: {}'.format( str(data['humidity'])) elif data['humidity'] > 70: warnings[ 'humidity'] = 'Humidity is too high [hhe]. Current humidity is: {}'.format( str(data['humidity'])) data['uva_index'] = float(data['uva_index']) if data['uva_index'] > 6: warnings[ 'uva_index'] = 'UV A is too high [uvae]. Current UV A is: {}'.format( str(data['uva_index'])) data['uvb_index'] = float(data['uvb_index']) if data['uvb_index'] > 6: warnings[ 'uvb_index'] = 'UV B is too high [uvbe]. Current UV B is: {}'.format( str(data['uvb_index'])) data['cpu_temp'] = float(re.sub('[^0-9.]', '', data['cpu_temp'])) sensor_config_data = config.load_cfg() if data['cpu_temp'] > sensor_config_data['sensor']['cpu_temp_fatal']: warnings[ 'cpu_temp'] = 'CPU temperature is too high [cthf]. Current temperature is: {}'.format( str(data['cpu_temp'])) elif data['cpu_temp'] > sensor_config_data['sensor']['cpu_temp_error']: warnings[ 'cpu_temp'] = 'CPU temperature is very high [cthe]. Current temperature is: {}'.format( str(data['cpu_temp'])) elif data['cpu_temp'] > sensor_config_data['sensor']['cpu_temp_warn']: warnings[ 'cpu_temp'] = 'CPU temperature is high [cthw]. Current temperature is: {}'.format( str(data['cpu_temp'])) data['motion'] = float(data['motion']) if data['motion'] > 1000: warnings['motion'] = 'Dom is shaking his legs [slw]. Value: {}'.format( str(data['motion'])) if int(commands.get_space_available()) < 500: warnings['free_space'] = 'Low Free Space: {}'.format( commands.get_space_available() + 'MB') if int(data['eco2']) > 1000: warnings['eco2'] = 'High CO2 level: {}'.format(data['eco2']) if int(data['tvoc']) > 5000: warnings['tvoc'] = 'Air Quality BAD: {}'.format(data['tvoc']) elif int(data['tvoc']) > 1500: warnings['tvoc'] = 'Air Quality POOR: {}'.format(data['tvoc']) loggy.log_error_count(warnings) return warnings
def get_current_reading_for_aircraft(): return get_data_for('{}/flights/today'.format( config_service.load_cfg()["urls"]['delight']))