def build_device_inventory(): global in_mem_relsens, in_mem_devices, new_devices try: new_devices = { } # reset this data structure also: to start from scratch #dprint ('\nbuilding [enabled] in-memory devices..') in_mem_devices = r.dump_active_device_spec_tree() if (len(in_mem_devices) > 0): print("\nactive in-memory devices:") print(in_mem_devices) else: print('Error: Could not build in-memory devices') return False #dprint ('\nbuilding [enabled] in-memory relsens..') in_mem_relsens = r.get_active_relsen_tree() if (len(in_mem_relsens) > 0): print("\nactive in-memory relsens:") print(in_mem_relsens) return True else: print('Error: Could not build in-memory relsons') return False except Exception as e: print('* EXCEPTION 1: ', str(e)) return False
def simul_update_device(): dev = m.Device.query.filter_by(device_id='labs1').first() if (not dev): return {'error': 'labs1 : invalid device_id'} en = not (dev.enabled) # toggle the current status jupdate = {'device_id': 'labs1', 'enabled': en} r.update_device(jupdate) return {'result': 'device labs1 updated'}
def initialize_all(): # this is called from __init__.py at startup print('\n+ in the application initialization block..') r.build_constant_lists() build_device_inventory() build_initial_status() # to correctly light the buttons initially start_daemon() #sleep(5) # this does not help delay the MQTT subsciption subscribe_mqtt() # subscribing here is a safety net
def simul_update_relsen(): rs = m.Relsen.query.filter_by (device_id='labs1', relsen_id='POWER1').first() if (not rs): return {'error' : 'invalid device_id or relsen_id'} jupdate = { 'device_id':'labs1', 'relsen_id':'POWER2', 'relsen_name':'Table fan', 'relsen_type': 'Fan', 'room_name':'Grandpa\'s room', 'room_type': 'Dining room', 'group_name':'Basement', 'schedule': [["10:00","11:30"],["17:20","18:45"]], 'repeat':False } r.update_relsen (jupdate) return {'result' : 'relsen {}/{} updated'.format(jupdate['device_id'], jupdate['relsen_id'])}
def simul_onboard_device(): jnew_device = { 'device_id': 'intof_A9417E', 'relsen_list': ['POWER1', 'POWER2', 'Sensor'] } if r.onboard_device(jnew_device): return {'result': 'device onboarded successfully'} return {'error': 'failed to onboard device'}
def simul_onboard_device(): jnew_device = { 'device_id': 'LatestDevice', 'relsen_list': ['Relay1', 'Relay2', 'Sensor'] } if r.onboard_device(jnew_device): return {'result': 'device onboarded successfully'} return {'error': 'failed to onboard device'}
def simul_bulk_onboard(): jnew_devices = { 'NewDevice1': ['Rel1', 'Rel2'], 'NewDevice2': ['Relay8'], 'NewDevice3': ['Rels1', 'Rels2', 'Sensor1'] } if r.bulk_onboard_devices(jnew_devices): return {'result': 'all devices onboarded successfully'} return {'error': 'failed to onboard at least one device'}
def simul_update_relsen(): rs = m.Relsen.query.filter_by(device_id='labs1', relsen_id='POWER1').first() if (not rs): return {'error': 'invalid device_id or relsen_id'} jupdate = { 'device_id': 'labs1', 'relsen_id': 'POWER1', 'relsen_name': 'Table fan', 'relsen_type': 'Fan', 'room_name': 'Grandpa\'s room', 'room_type': 'Dining room', 'group_name': 'Basement', 'schedule': json.dumps({"schedule": [[10.0, 11.30]]}), 'repeat': False } r.update_relsen(jupdate) return {'result': 'relsen labs1.POWER1 updated'}
def simul_bulk_onboard(): jnew_devices = { 'intof_EE487C': ['POWER1', 'POWER2', 'SENSOR'], 'intof_FF432D': ['POWER1'], 'intof_AB9A82': ['POWER1', 'POWER2', 'POWER3', 'POWER4'] } if r.bulk_onboard_devices(jnew_devices): return {'result': 'all devices onboarded successfully'} return {'error': 'failed to onboard at least one device'}
def auto_onboard_devices(): print('\nAuto-onboarding all newly discovered devices..') if new_devices is None or len(new_devices) == 0: return { 'result': False, 'error': 'No new devices; please call discover/devices first' } if r.bulk_onboard_devices(new_devices): return {'result': True, 'msg': 'all devices onboarded successfully'} return {'result': False, 'error': 'failed to onboard at least one device'}
def simul_onboard_device(): jnew_device = { 'device_id': 'intof_DD417E', 'relsen_list': ['POWER1', 'POWER2', 'SENSOR'] } if r.onboard_device( jnew_device ): # TODO: you need to add it to in-memory structures also. return {'result': 'device onboarded successfully'} return {'error': 'failed to onboard device'}
def clear_timers_route(): if SIMULATION_MODE: return ({'error' : 'in simulation mode'}) devid = request.args.get('device_id') if (not devid): return ({'error' : 'device_id is required'}) rsid = request.args.get('relsen_id') if (not rsid): return ({'error' : 'relsen_id is required'}) clear_timers (devid, rsid) # clear from Tasmota jrelsen = {'device_id':devid, 'relsen_id':rsid, 'schedule':[], 'repeat':False} # [["10:10","20:20"]] print (jrelsen) res = r.update_relsen (jrelsen) # remove from database print (res) return ({'result' : 'timer schedules of device cleared'})
def add_test_data(): dprint(add_test_users()) DEV1 = 'AA12345' DEV2 = 'BB45678' DEV3 = 'CC67890' DEV4 = 'labs1' # TODO: all the following calls return False if they fail. Handle it! # device r.insert_device(device_id=DEV1, fallback_id='fb_DVES0BC870', mac='A2390BC870', ip='192.168.0.2', hardware_type="Generic", num_relays=1, num_sensors=1, enabled=True) r.insert_device(device_id=DEV2, fallback_id='fb_DVESBC8991', mac='B9034BC8991', ip='192.168.0.3', hardware_type="RND.MCU.AL2", num_relays=2, num_sensors=1, enabled=False) r.insert_device(device_id=DEV3, fallback_id='fb_DVES9021A8', mac='C0B5E59021A8', ip='192.168.0.4', hardware_type="Generic", num_relays=4, num_sensors=0, enabled=True) r.insert_device(device_id=DEV4, fallback_id='fb_DVES0C45A1', mac='FF34E0C45A1', ip='192.168.0.5', hardware_type="MCU.4.PIR.RAD.2R", num_relays=4, num_sensors=1, enabled=True) # relsen sched1 = json.dumps({"schedule": [["6:30", "7:25"], ["18:0", "19:05"]]}) sched2 = json.dumps({"schedule": [["11:0", "12:10"], ["13:0", "14:50"]]}) sched3 = json.dumps({"schedule": [["10:0", "15:15"]]}) sched4 = json.dumps({ "schedule": [["9:0", "12:0"], ["12:10", "12:40"], ["16:0", "18:30"]] }) # the third one will be ignored; only 2 schedules per relay r.insert_relsen(device_id=DEV1, relsen_id='POWER1', relsen_name='Guest fan', relsen_type='Fan', room_name='Master bed room', room_type='Bed room', group_name='Ground floor', schedule=None, repeat=False) r.insert_relsen(device_id=DEV1, relsen_id='SENSOR', relsen_name='Temperature', relsen_type='Temperature sensor', room_name='Guest room', room_type='Bed room', group_name='Sensors', schedule=sched1, repeat=False) r.insert_relsen(device_id=DEV1, relsen_id='SENSOR', relsen_name='Humidity', relsen_type='Humidity sensor', room_name='Master bed room', room_type='Bed room', group_name='Sensors', schedule=None, repeat=False) r.insert_relsen(device_id=DEV2, relsen_id='POWER1', relsen_name='Bed room fan', relsen_type='Fan', room_name='Master bed room', room_type='Bed room', group_name='Ground floor', schedule=sched2, repeat=True) r.insert_relsen(device_id=DEV2, relsen_id='POWER2', relsen_name='Bed room light', relsen_type='Tube light', room_name='Master bed room', room_type='Bed room', group_name='Ground floor', schedule=sched3, repeat=True) r.insert_relsen(device_id=DEV2, relsen_id='SENSOR', relsen_name='Garage door', relsen_type='Door sensor', room_name='Garage', room_type='Garage', group_name='Sensors', schedule=None, repeat=False) r.insert_relsen(device_id=DEV3, relsen_id='POWER1', relsen_name='Bath light', relsen_type='Bulb', room_name='Main bath room', room_type='Bath room', group_name='Ground floor', schedule=sched1, repeat=True) r.insert_relsen(device_id=DEV3, relsen_id='POWER2', relsen_name='Corridor light', relsen_type='Bulb', room_name='Varanda', room_type='Corridor', group_name='Ground floor', schedule=None, repeat=False) r.insert_relsen(device_id=DEV3, relsen_id='POWER3', relsen_name='Sit out light', relsen_type='Flood light', room_name='sit out', room_type='Balcony', group_name='First floor', schedule=None, repeat=False) r.insert_relsen(device_id=DEV3, relsen_id='POWER4', relsen_name='Balcony light', relsen_type='Tube light', room_name='sit out', room_type='Balcony', group_name='First floor', schedule=sched3, repeat=False) r.insert_relsen(device_id=DEV4, relsen_id='POWER1', relsen_name='AC', relsen_type='Air conditioner', room_name='Kids bed room', room_type='Bed room', group_name='First floor', schedule=sched1, repeat=True) r.insert_relsen(device_id=DEV4, relsen_id='POWER2', relsen_name='Geyser', relsen_type='Water heater', room_name='Kids bath room', room_type='Bath room', group_name='First floor', schedule=sched4, repeat=True) r.insert_relsen(device_id=DEV4, relsen_id='POWER3', relsen_name='AC', relsen_type='Air conditioner', room_name='Grandma\'s bed room', room_type='Bed room', group_name='Ground floor', schedule=sched4, repeat=True) r.insert_relsen(device_id=DEV4, relsen_id='POWER4', relsen_name='Fan', relsen_type='Fan', room_name='Grandma\'s bath room', room_type='Bath room', group_name='Ground floor', schedule=sched4, repeat=True) r.insert_relsen(device_id=DEV4, relsen_id='SENSOR', relsen_name='Garage door', relsen_type='Door sensor', room_name='Garage', room_type='Basement', group_name='Sensors', schedule=None, repeat=False) # status stat1 = json.dumps({"Relays": [1, 0, 1, 0]}) stat2 = json.dumps({"Relays": [1, 0, 1, 0]}) stat3 = json.dumps({"Relays": [1, 0, 1, 0]}) stat4 = json.dumps({"Relays": [1, 0, 1, 0]}) sensor1 = json.dumps({"Temperature": 31.6, "Humidity": 76.1}) sensor2 = json.dumps({"Temperature": 22.2, "Humidity": 66.9}) sensor3 = json.dumps({"Light": 786}) sensor4 = json.dumps({"Light": 1022}) sensor5 = json.dumps({"Garage door": "Open"}) r.insert_status(device_id=DEV1, relay_status=stat1, event_type='Response', online=True) r.insert_status(device_id=DEV1, sensor_values=sensor1, event_type='Autonomous', online=True) r.insert_status(device_id=DEV2, relay_status=stat2, event_type='Event', online=True) r.insert_status(device_id=DEV3, relay_status=stat3, sensor_values=sensor2, event_type='Health', online=True) r.insert_status(device_id=DEV4, relay_status=stat4, sensor_values=sensor3, event_type='Health', online=True) r.insert_status(device_id=DEV4, sensor_values=sensor5, event_type='Event', online=True) return ({'result': '4 Test devices added (if not existing)'})
def add_minimal_data(): dprint(add_test_users()) DEV1 = 'fan' DEV2 = 'portico' DEV3 = 'hydro' DEV4 = 'labs1' DEV5 = 'coffee' # this is not enabled initially # TODO: all the following calls return False if they fail. Handle it! r.insert_device(device_id=DEV1, num_relays=1, enabled=True) r.insert_device(device_id=DEV2, num_relays=2, enabled=True) r.insert_device(device_id=DEV3, num_relays=2, enabled=True) r.insert_device(device_id=DEV4, num_relays=4, enabled=True) r.insert_device(device_id=DEV5, num_relays=2, enabled=False) # onboard it in disabled status r.insert_relsen(device_id=DEV1, relsen_id='POWER') r.insert_relsen(device_id=DEV2, relsen_id='POWER1') r.insert_relsen(device_id=DEV2, relsen_id='POWER2') r.insert_relsen(device_id=DEV3, relsen_id='POWER1') r.insert_relsen(device_id=DEV3, relsen_id='POWER2') r.insert_relsen(device_id=DEV4, relsen_id='POWER1') r.insert_relsen(device_id=DEV4, relsen_id='POWER2') r.insert_relsen(device_id=DEV4, relsen_id='POWER3') r.insert_relsen(device_id=DEV4, relsen_id='POWER4') r.insert_relsen(device_id=DEV5, relsen_id='POWER1') r.insert_relsen(device_id=DEV5, relsen_id='POWER2') return ({'result': '5 Test devices added (if not existing)'})
def buttons(): result = r.get_relsen_tree() dprint(result) if ('error' in result): return (result) return render_template('buttons.html', SerVar=result)