使用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连接字符串的方法小结
Jul 13 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
深入理解Python分布式爬虫原理
Nov 23 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
对numpy中二进制格式的数据存储与读取方法详解
Nov 01 Python
python根据url地址下载小文件的实例
Dec 18 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
python闭包与引用以及需要注意的陷阱
Sep 18 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 mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
利用JS实现数字增长
2016/07/28 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
vue组件name的作用小结
2018/05/23 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python字符串处理实现单词反转
2017/06/14 Python
python3调用R的示例代码
2018/02/23 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
Apache部署Django项目图文详解
2019/07/30 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
美国渔具店:FishUSA
2019/08/07 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
优秀员工推荐材料
2014/12/20 职场文书
肖申克救赎观后感
2015/06/02 职场文书
人民调解协议书
2016/03/21 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python