Пример #1
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
Пример #2
0
    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)
Пример #3
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')
Пример #4
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
Пример #5
0
    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
Пример #6
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
Пример #7
0
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
Пример #8
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
Пример #9
0
 def exposed_getStatus(self):
     #
     # BACnet Daemon が 起動しているか確認
     #
     single = SingleBACnetd.getInstance()
     if single.bacnetd == None:
         return False
     return True
Пример #10
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
Пример #11
0
    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)
Пример #12
0
    def exposed_stop(self):
        #
        # 既にサービスが起動していないかを確認
        #
        if self.exposed_getStatus() == False:
            return False

        #
        # BACnetd の 停止
        #
        single = SingleBACnetd.getInstance()
        single.bacnetd.stop()
        single.bacnetd = None
        return True
Пример #13
0
    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'])
Пример #14
0
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
Пример #15
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
Пример #16
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
Пример #17
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
Пример #18
0
    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}
Пример #19
0
    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
Пример #20
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
Пример #21
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