def exposed_getPropertyLog(self, name, property_id): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が既に利用されていないかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return None # # プロパティの取得 # prop = obj.properties.filter_by(property_id=property_id).first() if prop == None: return None # # ログ の 取得 # logs = session.query(BACnetSimulationLog).filter_by( object_id=obj.object_id, instance_id=obj.instance_id, property_id=prop.property_id, ).all() # # JSON 出力用の辞書化 # return [log.to_dict() for log in logs]
def exposed_addObject(self, name, object_id, instance_id): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が既に利用されていないかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if not obj == None: return False # # オブジェクトの登録 # if addBACnetObject(name, object_id, instance_id) == False: return False # # オブジェクトの登録(DB) # session.add(BACnetSimulationObject(name, object_id, instance_id)) session.commit() return True
def exposed_addProperty(self, name, property_id): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が登録されているかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return False # # プロパティ名が既に存在していないかを確認 # prop = obj.properties.filter_by(property_id=property_id).first() if not prop == None: return False # # プロパティの登録 # if addBACnetProperty(obj.name, obj.object_id, obj.instance_id, property_id) == False: return False # # プロパティの登録(DB) # obj.properties.append(BACnetSimulationProperty(property_id)) session.commit() return True
def exposed_setProperty(self, name, property_id, value): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が登録されているかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return False # # プロパティ名が登録されているかを確認 # prop = obj.properties.filter_by(property_id=property_id).first() if prop == None: return False # # Datastore の 取得 # datastore = SingleBACnetd().getDatastore() # # 値の設定 # datastore.set(obj.object_id, obj.instance_id, prop.property_id, value) return True
def ReadProperty(self, obj, arrayIndex=None): # # Access an array # if arrayIndex is not None: raise ExecutionError(errorClass='property', errorCode='propertyIsNotAnArray') # # キャッシュに値があれば、キャシュの値を返す # datastore = SingleBACnetd().getDatastore() value = datastore.get(self.object_id, self.instance_id, self.property_id) # # DB への 接続 # with SessionFactory() as session: # # DBへの登録 # session.add( BACnetSimulationLog(self.object_id, self.instance_id, self.property_id, value)) session.commit() # # 値の返却 # if not value == None: return value raise ExecutionError(errorClass='property', errorCode='abortProprietary')
def exposed_setPropertyType(self, name, property_id, type, value): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') bacnet = BACnetClient(app) # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が登録されているかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return False # # プロパティ名が登録されているかを確認 # prop = obj.properties.filter_by(property_id=property_id).first() if prop == None: return False # # BACnet オブジェクトの検索 # property = definition.findPropertyByID(property_id) if property == None: return None property = bacnet.getProperty(name, property['name']) if property == None: return None # # プロパティ種別の設定 # if property.setType(type, value) == False: return False # # プロパティ(DB)の更新 # prop.type = type prop.value = value # # 変更処理のコミット # session.commit() return True # # 例外の確認 # assert sys.exc_info()[0] == None, sys.exc_info() return False
def exposed_getObjects(self): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト一覧の取得 # objs = session.query(BACnetSimulationObject).all() return [obj.to_dict() for obj in objs]
def job_function(name): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト一覧の取得 # taskGroup = session.query(TaskGroup).filter_by( name=name).first() if taskGroup == None: return # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: return bacnet = BACnetClient(app) # # Data Store の 取得 # datastore = SingleBACnetd().getDatastore() # # タスクの取得 # for task in taskGroup.bacnetTasks: # # リクエストの実行 # value = bacnet.ReadPropertyRequest(task.device_id, task.object_id, task.instance_id, task.property_id) # # 計測値のセットアップ # datastore.setBACnetValue(DatastoreType.MEASUREMENT, task.object_id, task.instance_id, task.property_id, value) # # 値の保存 # task.measuredValues.append(BACnetMeasuredValue(value)) session.commit() # # 例外の検知 # assert sys.exc_info()[0] == None, sys.exc_info() return False
def exposed_getTaskGroups(self): # # DB への 接続 # with SessionFactory() as session: # # タスクグループの取得 # taskGroups = [ taskGroup.to_dict() for taskGroup in session.query(TaskGroup).all() ] return taskGroups
def setType(self, type, value): # # プロパティ種別の設定 # self.type = type datastore = SingleBACnetd().getDatastore() # # プロパティ種別が「STATIC」の場合 # if type == DatastoreType.STATIC: # # 鍵の取得 # self.key = datastore.getBACnetKey( DatastoreType.STATIC, self.object_id, self.instance_id, self.property_id, ) # # 初期値の設定 # datastore.setBACnetValue(DatastoreType.STATIC, self.object_id, self.instance_id, self.property_id, value) return True # # プロパティ種別が「MEASUREMENT」の場合 # else: # # DB への 接続 # with SessionFactory() as session: # # タスクの確認 # task = session.query(BACnetTask).filter_by(id=value).first() # # 鍵の取得 # self.key = datastore.getBACnetKey( DatastoreType.MEASUREMENT, task.object_id, task.instance_id, task.property_id, ) return True return False
def start_scheduler(): # # DB への 接続 # with SessionFactory() as session: # # 既に登録されているタスクグループの取得 # taskGroups = session.query(TaskGroup).all() # # 登録されているタスクの呼び出し # for taskGroup in taskGroups: addTaskGroup(taskGroup.name, taskGroup.interval)
def exposed_addProperty(self, name, property_id, value, type=DatastoreType.STATIC): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が登録されているかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return False # # プロパティ名が既に存在していないかを確認 # prop = obj.properties.filter_by(property_id=property_id).first() if not prop == None: return False # # プロパティの登録 # if addBACnetProperty(obj.name, obj.object_id, obj.instance_id, property_id, type, value) == False: return False # # プロパティの登録(DB) # obj.properties.append( BACnetSimulationProperty(type, property_id, value)) session.commit() return True assert sys.exc_info()[0] == None, sys.exc_info() return False
def exposed_setProperty(self, name, property_id, value): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が登録されているかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if obj == None: return False # # プロパティ名が登録されているかを確認 # prop = obj.properties.filter_by(property_id=property_id).first() if prop == None: return False # # Datastore の 取得 # datastore = SingleBACnetd().getDatastore() # # 値の設定 # datastore.setBACnetValue(DatastoreType.STATIC, obj.object_id, obj.instance_id, prop.property_id, value) # # プロパティ(DB)の更新 # prop.value = value # # 変更処理のコミット # session.commit() return True # # 例外の確認 # assert sys.exc_info()[0] == None, sys.exc_info() return False
def exposed_getBACnetMeasuredValues(self, task_id): # # DB への 接続 # with SessionFactory() as session: # # タスクの取得 # query = session.query(BACnetMeasuredValue).filter_by( task_id=task_id) values = [value.to_dict() for value in query.all()] return values # # 例外の確認 # assert sys.exc_info()[0] == None, sys.exc_info() return []
def exposed_addBACnetTask(self, name, device_id, object_id, instance_id, property_id): # # DB への 接続 # with SessionFactory() as session: # # グループ名が存在するかの確認 # taskGroup = session.query(TaskGroup).filter_by(name=name).first() if taskGroup == None: return False # # タスクが登録済みであるかを確認 # task = taskGroup.bacnetTasks.filter_by( device_id=device_id, object_id=object_id, instance_id=instance_id, property_id=property_id).first() if not task == None: return False # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: return False bacnet = BACnetClient(app) # # 値が取得できるかを確認 # value = bacnet.ReadPropertyRequest(device_id, object_id, instance_id, property_id) if value == None: return False # # タスクの登録 # new_task = BACnetTask(device_id, object_id, instance_id, property_id) taskGroup.bacnetTasks.append(new_task) session.commit() return True
def start_bacnet_emulation(): # # DB への 接続 # with SessionFactory() as session: # # ポイント名が既に利用されていないかを確認 # objects = session.query(BACnetSimulationObject).all() for obj in objects: # # オブジェクト の 登録 # addBACnetObject(obj.name, obj.object_id, obj.instance_id) for prop in obj.properties: # # プロパティの登録 # addBACnetProperty(obj.name, obj.object_id, obj.instance_id, prop.property_id)
def exposed_addTaskGroup(self, name, interval): # # DB への 接続 # with SessionFactory() as session: # # グループ名が既に登録されていないかを確認 # if not session.query(TaskGroup).filter_by(name = name).first() == None: return False # # タスクグループの追加 # addTaskGroup(name, interval) # # タスクグループの登録 # session.add(TaskGroup(name, interval)) session.commit() return True
def start_bacnet_emulation(): # # DB への 接続 # with SessionFactory() as session: # # ポイント名が既に利用されていないかを確認 # objects = session.query(BACnetSimulationObject).all() for obj in objects: # # オブジェクト の 登録 # if addBACnetObject(obj.name, obj.object_id, obj.instance_id) == False: logger.debug( 'Failed to add BACnet object(name=%s, object_id=%d, instance_id=%d)' % (obj.name, obj.object_id, obj.instance_id)) for prop in obj.properties: # # プロパティの登録 # if addBACnetProperty(obj.name, obj.object_id, obj.instance_id, prop.property_id, prop.type, prop.value) == False: logger.debug( 'Failed to add BACnet property(name=%s, property_id=%d)' % (obj.name, prop.property_id)) # # 正常終了 # return True # # 例外確認要 # assert sys.exc_info()[0] == None, sys.exc_info() return False
def job_function(name): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト一覧の取得 # taskGroup = session.query(TaskGroup).filter_by( name=name).first() print taskGroup if taskGroup == None: return # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: return bacnet = BACnetClient(app) # # タスクの取得 # for task in taskGroup.bacnetTasks: print task # # リクエストの実行 # value = bacnet.ReadPropertyRequest(task.device_id, task.object_id, task.instance_id, task.property_id) # # 値の保存 # print name, value
def exposed_getBACnetTasks(self, name): # # DB への 接続 # with SessionFactory() as session: # # タスクグループの取得 # taskGroup = session.query(TaskGroup).filter_by(name=name).first() if taskGroup == None: return [] # # タスク情報の辞書化 # tasks = [task.to_dict() for task in taskGroup.bacnetTasks] return tasks # # 例外の確認 # assert sys.exc_info()[0] == None, sys.exc_info() return []
def exposed_addObject(self, name, object_id, instance_id): # # DB への 接続 # with SessionFactory() as session: # # オブジェクト名が既に利用されていないかを確認 # obj = session.query(BACnetSimulationObject).filter_by( name=name).first() if not obj == None: return False # # オブジェクトの登録 # if addBACnetObject(name, object_id, instance_id) == False: return False # # オブジェクトの登録(DB) # session.add(BACnetSimulationObject(name, object_id, instance_id)) session.commit() return True
def start_bacnetd(interface, device_id): # # BACnet Daemon が 起動しているか確認 # single = SingleBACnetd.getInstance() if not single.bacnetd == None: return False # # DB への 接続 # with SessionFactory() as session: # # DB から BACNET INTERFACE を取得 # bacnet_interface = session.query(Config).filter_by( key='BACNET_INTERFACE').first() if interface == None: if bacnet_interface == None: return False interface = bacnet_interface.value # # DB から BACNET DEVICE ID を取得 # bacnet_device_id = session.query(Config).filter_by( key='BACNET_DEVICE_ID').first() if device_id == None: if bacnet_device_id == None: return False device_id = int(bacnet_device_id.value) # # NIC の 情報取得 # bacnet_address = None try: # # NIC から IPv4 アドレスの取得 # iface_data = netifaces.ifaddresses(interface) ipv4 = iface_data.get(netifaces.AF_INET) if not ipv4 == None: prefix = IPAddress(ipv4[0]['netmask']).netmask_bits() bacnet_address = '%s/%d' % (ipv4[0]['addr'], prefix) # # NIC の情報が見つからなかった場合の処理 # except ValueError: return False # # BACnet アドレスが定義されていない場合 # if bacnet_address == None: return False # # BACnet Daemon の 起動 # single.bacnetd = BACnetd(bacnet_address, device_id) single.bacnetd.start() # # BACnet Interface を DB に書き込み # if bacnet_interface == None: session.add(Config('BACNET_INTERFACE', interface)) session.add(Config('BACNET_DEVICE_ID', device_id)) else: bacnet_interface.value = interface bacnet_device_id.value = str(device_id) # # コミット # session.commit() return True