使用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 base64编码解码实例
Jun 21 Python
python正则表达式的使用
Jun 12 Python
Python使用numpy模块创建数组操作示例
Jun 20 Python
Python清空文件并替换内容的实例
Oct 22 Python
Python格式化输出字符串方法小结【%与format】
Oct 29 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
Python3.5集合及其常见运算实例详解
May 01 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
Python logging日志库空间不足问题解决
Sep 14 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
python3 字符串str和bytes相互转换
Mar 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
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
javascript常用方法汇总
2014/12/02 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
Angular2库初探
2017/03/01 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
python中的一些类型转换函数小结
2013/02/10 Python
python修改字典内key对应值的方法
2015/07/11 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python实现学生管理系统
2018/01/11 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python statsmodel的使用
2020/12/21 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
20年同学聚会感言
2014/02/03 职场文书
员工生日会策划方案
2014/06/14 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python