Esempio n. 1
0
    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]
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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')
Esempio n. 6
0
    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
Esempio n. 7
0
 def exposed_getObjects(self):
     #
     # DB への 接続
     #
     with SessionFactory() as session:
         #
         # オブジェクト一覧の取得
         #
         objs = session.query(BACnetSimulationObject).all()
         return [obj.to_dict() for obj in objs]
Esempio n. 8
0
        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
Esempio n. 9
0
 def exposed_getTaskGroups(self):
     #
     # DB への 接続
     #
     with SessionFactory() as session:
         #
         # タスクグループの取得
         #
         taskGroups = [
             taskGroup.to_dict()
             for taskGroup in session.query(TaskGroup).all()
         ]
         return taskGroups
Esempio n. 10
0
    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
Esempio n. 11
0
def start_scheduler():
    #
    # DB への 接続
    #
    with SessionFactory() as session:
        #
        # 既に登録されているタスクグループの取得
        #
        taskGroups = session.query(TaskGroup).all()

        #
        # 登録されているタスクの呼び出し
        #
        for taskGroup in taskGroups:
            addTaskGroup(taskGroup.name, taskGroup.interval)
Esempio n. 12
0
    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
Esempio n. 13
0
    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
Esempio n. 14
0
    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 []
Esempio n. 15
0
    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
Esempio n. 16
0
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)
Esempio n. 17
0
	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
Esempio n. 18
0
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
Esempio n. 19
0
        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
Esempio n. 20
0
    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 []
Esempio n. 21
0
    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
Esempio n. 22
0
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