使用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网络编程之文件下载实例分析
May 20 Python
详解Python中的Cookie模块使用
Jul 06 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
详解K-means算法在Python中的实现
Dec 05 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
python实现socket简单通信的示例代码
Apr 13 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学习之数组值的操作
2011/04/17 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
js 性能优化之算法和流程控制
2017/02/15 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
python pdb调试方法分享
2014/01/21 Python
Python标准库之循环器(itertools)介绍
2014/11/25 Python
Python Socket传输文件示例
2017/01/16 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
艺术应用与设计专业个人的自我评价
2013/11/19 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
工地质量标语
2014/06/12 职场文书
职工小家建设活动方案
2014/08/25 职场文书
个人总结格式范文
2015/03/09 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
情况说明书格式及范文
2019/06/24 职场文书