当前位置: 首页 > 编程笔记 >

使用Python通过oBIX协议访问Niagara数据的示例

鲁弘厚
2023-03-14
本文向大家介绍使用Python通过oBIX协议访问Niagara数据的示例,包括了使用Python通过oBIX协议访问Niagara数据的示例的使用技巧和注意事项,需要的朋友参考一下

oBIX 全称是 Open Building Information Exchange,它是基于 RESTful Web Service 的接口的标准,用于构建控制系统。oBIX是在专为楼宇自动化设计的框架内,使用XML和URI在设备网络上读写数据的。

因项目需要使用 Python 对 Niagara 软件中的数据进行读写和控制,所以写了一个该协议的Python版本包,发布在这里:https://pypi.org/project/oBIX/

使用 pip 安装使用即可:

pip install oBIX

本文主要介绍使用 Python 通过 oBIX 协议对 Niagara 软件中的点进行读、写操作。

一、准备工作

1. 在 Niagara 软件中配置好 oBIX 协议,确保已经可以正常访问;

(1)Palette 搜 oBIX, 添加一个 ObixNetwork 到 Drivers中

(2)Palette 搜 baja, 将 AuthenticationSchemes/WebServicesSchemes/的 HTTPBasicScheme 拖拽到 Services/AuthenticationService/Authentication Schemes/

(3)UserServices 右键 View, AX User Manager下新建一个用户,配置如下:

* 用户名:oBIX
* 密码:oBIX.12345
* Authentication Schemes Name 选:HTTPBasicScheme
* Admin 权限
2. Niagara 中新建一个数值类型的可读写的点,命名为:temp1,完整路径是:/config/AHU/temp1/,后面以此为例进行访问

3. 安装python的oBIX包:pip install oBIX

二、快速开始

from oBIX.common import Point, DataType
from oBIX import Client


if __name__ == '__main__':
  # ip, userName, password
  # 可选项:
  #  port: 端口号,如:8080
  #  https: 是否使用 https,默认:True
  client = Client("127.0.0.1", "oBIX", "oBIX.12345")

  # 点的路径
  point_path = "/config/AHU/temp1/"

  # 读取一个点的值
  point_value = client.read_point_value(point_path)
  print("point value is {0}".format(point_value))

三、基本实例

3.1 读取点

# 点的路径
  point_path = "/config/AHU/temp1/"

  # 读取一个点的值
  point_value = client.read_point_value(point_path)
  print("point value is {0}".format(point_value))

  # 读取一个点实例
  # 然后就能获取到这个点所包含的常用属性
  # 例如:name, val, status, display, href, in1, in2 ... in16, fallback, out
  point_obj = client.read_point(point_path)
  print("name is {0}".format(point_obj.name))
  print("fallback is {0}".format(point_obj.fallback))
  print("in10 is {0}".format(point_obj.in10))
  
  # 也可以使用下面代码直接获取
  point_in10_value = client.read_point_slot(point_path, "in10")
  print("in10 is {0}".format(point_in10_value))

3.2 写入点

# 点的路径
  point_path = "/config/AHU/temp1/"

  # set 一个点的值
  client.write_point(point_path, 15.2, DataType.real)
  # set point auto
  client.set_point_auto(point_path, DataType.real)
  # override a point
  client.override_point(point_path, 14, DataType.real)
  # emergency override a point
  client.emergency_override_point(point_path, 15, DataType.real)
  # set a point emergency auto
  client.set_point_emergency_auto(point_path, DataType.real)

四、高级应用

4.1 读取历史数据

# 起始时间
  start_time = datetime.now(tz=timezone(timedelta(hours=8))) - timedelta(minutes=10)
  # 结束时间
  end_time = datetime.now(tz=timezone(timedelta(hours=8)))

  # 读取该断时间内的历史数据
  history = client.read_history("Station01", "OutDoorTemp", start_time, end_time)

  # 取起始时间往后指定个数的历史数据
  limit_num = 1
  history = client.read_history("Station01", "OutDoorTemp", start_time=start_time, limit=limit_num)

4.2 读取报警数据

# 起始时间
  start_time = datetime.now(tz=timezone(timedelta(hours=8))) - timedelta(minutes=10)
  # 结束时间
  end_time = datetime.now(tz=timezone(timedelta(hours=8)))

  # 读取该段时间内的报警数据
  alarms = client.read_alarms("Station01", "OutDoorTemp", start_time, end_time)

  # 取起始时间往后指定个数的报警数据
  limit_num = 1
  alarms = client.read_alarms("Station01", "OutDoorTemp", start_time=start_time, limit=limit_num)

4.3 监控点的数据变化
监控点的数据变化时 oBIX 协议的一部分。添加想要监控的点,然后当 Niagara 中点的值发生变化后,会自动触发相应的函数。

from oBIX.common import Point, DataType
from oBIX import Client


def init_watch():
  global client, point_path
  # 添加监控
  point_path_list = [point_path] # 这里可以是多个点
  result = client.add_watch_points(point_path_list)
  client.watch_changed_handler.on_change += on_watch_changed


# Niagara 里改点的值发生变化时,会自动触发改函数
def on_watch_changed(points: [Point]):
  for point in points:
    val = point.val
    print(f"on_watch_changed: {val}")


if __name__ == '__main__':
  # ip, userName, password
  # 可选项:
  # port: 端口号,如:8080
  # https: 是否使用 https,默认:True
  client = Client("127.0.0.1", "oBIX", "oBIX.12345")
  
  # 点的路径
  point_path = "/config/AHU/temp1/"

  init_watch()
  client.start_watch()
  while True:
    i = 0

4.4 导出所有点的信息
如果一个项目中有大量的目录和点,手动挨个去写比较麻烦,所以这里提供了一个导出点信息的函数。将点的信息保存文件后,再直接从文件中读取点的信息就会方便很多。

# 导出所有点的信息
export_result = client.export_points()

# folder_path [optional]: 想要导出的目录,如: "/config/xxx/",默认会导出所有点的信息
# export_file_name [optional]: 导出文件的名称,默认: "all_points.json"
# export_type [optional]:
#   0: JSON格式,嵌套格式并保留目录信息
#   1: JSON格式, 只保留点的信息,不保留目录信息
#   2: 字符串列表格式, 只输出点的路径信息

export_result = client.export_points(folder_path="/config/AHU/", export_file_name="output.json", export_type=1)

以上就是使用Python通过oBIX协议访问Niagara数据的示例的详细内容,更多关于Python通过oBIX协议访问Niagara数据的资料请关注小牛知识库其它相关文章!

 类似资料:
  • 我有一个由Python构建的API服务器。我需要一组客户端/计算机通过发出http post请求将数据发送到API服务器。 这里的数据实际上是html内容。(注意:我没有将合法数据转换为HTML/XML格式,数据本身就是我从web上收集的HTML),通常每页约200KB。我正试图通过使用串行/串行和压缩来尽可能减轻网络负载。 我正在考虑通过网络发送原始超文本标记语言。有没有类似序列化html对象的

  • 我试图使用SnmpWalk访问Windows Server 2012上的MSSQLSERVER-MIB。exe。我特别感兴趣的对象是mssqlSrvState,它的oid是:1.3.6.1.4.1.311.1.4.1.1.1.1.5。虽然MS SQL服务正在服务器上运行,但我无法获取有关MSSQLSERVER-MIB中任何对象的信息。这是否意味着SnmpWalk不知道MSSQLSERVER的MIB

  • 问题内容: 我在HDFS中有一些数据,我需要使用python访问该数据,有人可以告诉我如何使用python从蜂巢访问数据吗? 问题答案: 您可以使用hive库从python访问hive,因为要从hive导入ThriveHive导入hive类 下面的例子

  • 由于TCP是基于流的,客户端发送的请求数据是像水流一样流入到服务端,服务端探测到有数据到来后应该检查数据是否是完整的,因为可能只是一个请求的部分数据到达服务端,甚至可能是多个请求连在一起到达服务端。如何判断请求是否全部到达或者从多个连在一起的请求中分离请求,就需要规定一套通讯协议。 在WorkerMan中为什么要制定协议? 传统PHP开发都是基于Web的,基本上都是HTTP协议,HTTP协议的解析

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • 问题内容: 我是PHP和SQL领域的一名新开发人员。到目前为止,我只完成了Objective- C编程。但是,我的一个项目要求我拥有一个在线数据库,我需要从我的应用程序访问该数据库。我打算使用该框架来远程访问数据库,如下所示: 但这是行不通的,因为我联系了我的托管服务提供商,并且他们已经对其进行了设置,因此我无法从外部主机访问我的数据库(出于安全性考虑)。因此,我将不得不寻找替代方案。我唯一想到的