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 __init__(self, object_id, instance_id, default_value=0.0): # # 各識別子の定義 # self.object_id = object_id self.instance_id = instance_id self.property_id = 85 self.identifier = 'presentValue' # # スーパクラスのコンストラクタ呼び出し # Property.__init__(self, self.identifier, Real, default=0.0, optional=True, mutable=False) # # 初期値のセットアップ # datastore = SingleBACnetd().getDatastore() datastore.set(self.object_id, self.instance_id, self.property_id, default_value)
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 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_doWhoIsRequest(self, timeout=10): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: return bacnet = BACnetClient(app) # # WhoIsRequest の 送信 # bacnet.WhoIsRequest() # # WhoIsRequest を 投げてから最初の IAmRequestを受け取るまで待つ # try: device_id = app.responseQueue.get(timeout=timeout) return {'device_id': device_id} except Exception: # # タイムアウトを通知 # return None
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 addBACnetProperty(name, object_id, instance_id, property_id, type, value): # # プロパティオブジェクトの定義 # propertyObjects = dict() propertyObjects[85] = EyedPresentValue # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() # # BACnet クライアント の 取得 # bacnet = BACnetClient(app) # # プロパティオブジェクト の インスタンス化 # if not property_id in propertyObjects: return False prop = propertyObjects[property_id](object_id, instance_id) print prop, type, value #prop.setType(type, value) # # プロパティ の 登録 # if bacnet.addProperty(name, prop) == False: return False return True
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_getStatus(self): # # BACnet Daemon が 起動しているか確認 # single = SingleBACnetd.getInstance() if single.bacnetd == None: return False 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.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_getObjectByName(self, name): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') bacnet = BACnetClient(app) # # BACnet オブジェクトの検索 # return bacnet.getObjectByName(name)
def exposed_stop(self): # # 既にサービスが起動していないかを確認 # if self.exposed_getStatus() == False: return False # # BACnetd の 停止 # single = SingleBACnetd.getInstance() single.bacnetd.stop() single.bacnetd = None return True
def exposed_getProperty(self, name, property_id): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') bacnet = BACnetClient(app) # # BACnet オブジェクトの検索 # property = definition.findPropertyByID(property_id) if property == None: return None return bacnet.getProperty(name, property['name'])
def addBACnetObject(name, object_id, instance_id): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() # # BACnet クライアント の 取得 # bacnet = BACnetClient(app) # # オブジェクトの登録 # if bacnet.addObject(name, object_id, instance_id) == False: return False return True
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_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 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 exposed_doReadPropertyRequest(self, device_id, object_id, instance_id, property_id): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not woring...') bacnet = BACnetClient(app) # # リクエストの実行 # value = bacnet.ReadPropertyRequest(device_id, object_id, instance_id, property_id) # # リクエスト結果をJSONで返す # return {'value': value}
def exposed_getDevices(self): # # BACnet コマンド操作用インスタンス取得 # app = SingleBACnetd.getApplication() if app == None: raise Exception('BAcnetd is not running...') bacnet = BACnetClient(app) # # デバイスリストの作成 # devices = [] for key, value in app.device_map.items(): devices.append({'device_id': key, 'ip': str(value)}) # # デバイスリストを返却 # return devices
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 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