使用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系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
python的re模块应用实例
Sep 26 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
详解Python的Django框架中的中间件
Jul 24 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
pandas中去除指定字符的实例
May 18 Python
Python对接支付宝支付自实现功能
Oct 10 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
django框架单表操作之增删改实例分析
Dec 16 Python
Python字符串中删除特定字符的方法
Jan 15 Python
python中有函数重载吗
May 28 Python
一文搞懂Python Sklearn库使用
Aug 23 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
无限级别菜单的实现
2006/10/09 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
JS中==与===操作符的比较
2009/03/21 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
js实现抽奖的两种方法
2020/03/19 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python CSV模块使用实例
2015/04/09 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
详解Python中的正则表达式
2018/07/08 Python
python感知机实现代码
2019/01/18 Python
Python selenium自动化测试模型图解
2020/04/15 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
出纳员岗位职责
2014/03/13 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
财会专业大学生求职信
2014/09/26 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Python何绘制带有背景色块的折线图
2022/04/23 Python