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


Posted in Python onDecember 04, 2020

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 相关文章推荐
python encode和decode的妙用
Sep 02 Python
python的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
使用python 写一个静态服务(实战)
Jun 28 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
python实现图像全景拼接
Mar 27 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
python 获取字典键值对的实现
Nov 12 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
python 学习GCN图卷积神经网络
May 11 Python
python飞机大战游戏实例讲解
Dec 04 #Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 #Python
python中字符串的编码与解码详析
Dec 03 #Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 #Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 #Python
python3代码输出嵌套式对象实例详解
Dec 03 #Python
python3代码中实现加法重载的实例
Dec 03 #Python
You might like
一个php作的文本留言本的例子(六)
2006/10/09 PHP
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
javascript事件模型介绍
2016/05/31 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
javascript编写简易计算器
2017/05/06 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
python 判断自定义对象类型
2009/03/21 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
Python 移动光标位置的方法
2019/01/20 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
经济学博士求职自荐信范文
2013/11/23 职场文书
教师岗位职责范本
2013/12/29 职场文书
人大代表选举标语
2014/10/07 职场文书
作风建设整改方案
2014/10/27 职场文书
求职意向书范本
2015/05/11 职场文书
元旦晚会开场白
2015/05/29 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
创业计划书之酒吧
2019/12/02 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL