使用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基础教程之基本内置数据类型介绍
Feb 20 Python
python操作日期和时间的方法
Mar 11 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
利用Python如何生成随机密码
Apr 20 Python
python装饰器初探(推荐)
Jul 21 Python
解决python 输出是省略号的问题
Apr 19 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python版DDOS攻击脚本
Jun 12 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 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引用
2015/02/22 PHP
php计算整个目录大小的方法
2015/06/19 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python中一行和多行import模块问题
2018/04/01 Python
python多线程同步之文件读写控制
2021/02/25 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
2020/04/20 Python
python3.7调试的实例方法
2020/07/21 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
医院护士的求职信范文
2013/12/26 职场文书
模具数控专业自荐信
2014/01/27 职场文书
仓库组长岗位职责
2014/01/29 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android