与相干研究dcs v3+远程计量服务器接口的python模块

pythondcs的Python项目详细描述


蟒蛇

python dcs模块提供了一种方便的方式,允许python应用程序通过其内置的web api(使用json格式)访问concertive research中的数据。这可能是下载抄表数据以验证发票、大数据分析,或者只是转储到文件中供其他系统使用。无论是什么目的,此模块都会处理到dcs的链接并以标准python数据类型返回数据,包括在标准的datetime库中找到的数据。

开始

这个模块是用纯python编写的,应该在python 3.6及更高版本上工作。

先决条件

当然,您必须能够访问一致的dcs服务器系统,并拥有有效的用户名和密码才能访问它。假设您熟悉仪表数据在dcs中的结构,并理解使用的概念和术语。如果不是这样,请参阅您服务器的dcs用户指南,或与您的dcs系统管理员联系。

唯一需要的外部模块是python请求库。如果通过PIP安装pyhondcs,则会为您安装。

为了有效地处理更大的数据集,您可以选择使用ijson,如果您设想在每个事务中访问大量数据(例如一次访问数年半小时的数据),则建议使用该选项,因为这将提供节省内存的迭代器,而不是列表。但是,如果您只计划在每个事务中获取少量数据,或者不介意使用嵌套字典的非常大的列表带来的内存负担,则可以选择省略ijson模块。ijson模块也可以通过PIP获得。

安装

pythondcs软件包可通过PIP获得,如果您还没有安装,PIP还将为您安装请求先决条件。

在命令行(不在python中),例如windows cmd或linux/mac shell/terminal:

pip install pythondcs

如果您希望确保拥有最新版本,请运行pip install--upgrade pythondcs

一旦安装,pythondcs应该可以从python解释器中导入,并且可以在脚本中使用。

import pythondcs

您现在可以连接到dcs服务器。

用法

dcssession类提供了允许您登录会话并获取数据的方法/函数。提供的方法本质上只是dcs web api的包装器。有关更多详细信息,请参见官方的Concordent Research DCS Web API规范。

登录会话

要创建dcs会话,请使用服务器的url创建一个对象,并提供用户名和密码。要使用的URL将与普通用户界面相同。

dcs = pythondcs.DCSSession("https://url-of-dcs/", "myUsername", "MySuperSecurePassword")

这将返回:以"myusername"身份以查看器权限成功登录到dcs

此会话对象将在对象的生存期内获取并存储您的身份验证cookie。

您也可以只提供将创建未经身份验证的dcssession对象的url,然后可以直接使用login方法。

dcs = pythondcs.DCSSession("https://url-of-dcs/")
dcs.login("myUsername", "MySuperSecurePassword")

获取仪表或虚拟仪表的列表

获取电表或虚拟电表的列表非常简单,只需调用get metersget vms方法即可。

米: 可以获取所有仪表或一个特定仪表的列表。

listofallmeters = dcs.get_meters()
singlemeter = dcs.get_meters(405)

在这两种情况下返回的数据将很像这里的漂亮表示:

[
  {
    "connectionMethod": "tcp",
    "deviceId": "",
    "id": 405,
    "name": "Sample meter",
    "remoteAddress": "10.8.222.99:5000",
    "serialNumber": "R1100729",
    "status": "online",
    "registers": [
      {
        "address": "130",
        "id": 733,
        "isInstantaneous": false,
        "name": "Active Energy (import)",
        "scaleFactor": "",
        "defaultScaleFactor": "1",
        "unit": "kWh"
      }
    ],
  },
  ...
  ...
}]

虚拟仪表: 可以获取所有虚拟仪表或一个特定仪表的列表。

listofallvms = dcs.get_vms()
singlevm =  dcs.get_vms(9)

在这两种情况下返回的数据看起来都很像这里的漂亮表示:

[
   {
    "id": 9,
    "name": "Sample Virtual Meter",
    "expression": "R1+R2+R3",
    "decimalPlaces": 2,    
    "isInstantaneous": false,
    "unit": "kWh",
    "registerAliases": [
      {
        "alias": "R1",
        "registerId": 1156,
        "registerName": ""
      },
      {
        "alias": "R2",
        "registerId": 1164,
        "registerName": ""
      },
      {
        "alias": "R3",
        "registerId": 1168,
        "registerName": ""
      }
    ]
  },
  ...
  ...
}]

有关输出的更多详细信息,请参见dcs web api spec

要获取读数,您需要的重要ID号是仪表下面的寄存器的ID,例如上面示例中的130,以及405,或者是在Exa中9虚拟仪表本身。枫树上面。这些数字也可以在dcs前端接口中找到(这是一个供人使用的接口!)查看仪表数据时,从"寄存器"选项卡,或直接从虚拟仪表列表中,确保您不会意外使用仪表ID。

获取读数数据

这可能是最重要的功能,也是您使用此模块的原因。 即使底层api调用不同,也提供了相同的方法来访问寄存器数据和虚拟仪表数据。参数基本上是相同的,结果集具有相同的结构,因此为了方便和一致,在该模块中只有一个方法。

results = dcs.get_readings(id, isVirtual, start, end, decimalPlaces, calibrated, interpolated, useLocalTime, integrationPeriod, source, iterator)

唯一需要的项目是id。其他选项是可选的,与dcs网络前端的选项相关。

  • id-寄存器(不是仪表)或虚拟仪表(必需)。
  • isvirtual-如果id指虚拟仪表id,则为true,否则为false。(可选,默认为false)
  • 开始-一个python对象,如datetime.dATE(2019,1,1)。如果是ommitted,则使用的默认日期由服务器定义
  • 结束-日期时间或日期对象(可选,默认为ommitted),如上所述。如果是ommitted,则使用的默认日期由服务器定义。
  • 返回数据的小数位数0-15(可选,默认值15)
  • 校准-要校准的总值(可选,默认为真)
  • 插值-线性填充的间隙(可选,默认为真)
  • 使用本地时间-对于时间戳(可选,对于UTC默认为false)。无论返回的数据是什么,它都可以识别时区。
  • 集成周期-默认为"半小时",或"小时"、"日"、"周"、"月"(可选)
  • 来源-默认为"自动"或"手动""合并"(可选)
  • 迭代器-false(默认)将结果作为一个大列表给出,true将返回一个生成器,其中每个读数可以一次使用一个(推荐)

如果省略了开始日期和结束日期,则使用服务器默认值,通常是今天的开始日期和1天后的结束日期。在几乎所有情况下,都会指定这些参数。

结果将是如下结构:

pip install pythondcs
0

如果在安装ijson时使用迭代器选项,则生成器函数将生成原本是"list"的每个dictionary元素,因此您可以将其嵌入for循环:

pip install pythondcs
1

要使迭代器选项起作用,必须提供ijson模块,否则不会有任何效果。 使用迭代器(iterator=trueijson模块一起使用)将一次产生一次读取,对于非常大的TA集(即多年半小时数据等),特别是如果,例如,您只想计算平均值而不保留所有数据。但是,如果不考虑内存使用情况,或者需要保留数据以进行更复杂的操作,则iterator=false(默认值)将只返回一个读取列表。这可能非常大。在这两种情况下,列表或迭代器的每个元素都将由服务器接收的字典组成,所有数字都是整数或浮点数,时间戳是时区感知的日期时间对象。

有关每个项的含义的更多信息,特别是生成的中间的标志,请参阅dcs web api specid字段可以丢弃。

注销

完成后,最好注销会话,以免在服务器上运行休眠/孤立的身份验证会话,或将身份验证cookie存储在应用程序内存中。如果要在带有块的中使用dcssession对象作为上下文管理器,则无需执行此操作。

pip install pythondcs
2

logout方法不会删除dcssession对象,并且可以直接使用login方法。这可用于再次登录或在执行期间更改凭据。

用作上下文管理器

dcssession类可以用作上下文管理器,用于在with块中完成实际工作的更紧凑的代码。当输入和退出块时,这将为您处理登录和退出。 例子:

pip install pythondcs
3

基本示例

pip install pythondcs
4

在这个简单的示例中,将导入适当的模块,包括datetime这将确保正确处理所有日期和时间。然后脚本登录,并下载2019年1月寄存器id 123的读数。这将默认为校准的、内插的半小时自动数据,最多15个小数位,以UTC/GMT格式给出,当这些设置被写入时,这将是默认值。然后会话将注销。

详细示例

pip install pythondcs
5

在本例中,使用稍微精简的名称空间,并使用上下文管理器创建经过身份验证的会话,然后使用该会话获取所有虚拟仪表的列表。然后,该列表(包含字典)循环搜索第一个名为"virtual meter of interest"(虚拟兴趣表)(假设服务器上至少存在一个)的列表,此时将保留ID号并断开循环。然后,这将用于有效地(使用带iterator=true选项的生成器理解)查找新年和当前日期之间该虚拟仪表的最大半小时需求值。然后,在使用块退出时,经过身份验证的会话将自动注销。

例外情况

底层api调用引发的任何异常都将传播到调用方,因此应由更高级别的应用程序处理这些异常。例如,这很可能是因为在获取读数时提供了无效的ID号。唯一不会发生这种情况的地方是登录时返回服务器的错误消息,或者注销时忽略异常。如果在登录期间发生异常(即无效凭据),dcssession对象仍将以未经身份验证的状态提供,在这种状态下,可以直接再次调用login方法。

并发事务

这个模块并没有被特别设计成线程安全的,但是可能在多线程环境中工作得很好。但是有一个T一次故意将dcssession对象的每个实例限制为单个并发事务的线程锁(不考虑可能尝试使用它的线程数)。这主要是为了保护dcs服务器本身不受并发事务的影响。但是,连续交易的发生率没有限制。因此,必须注意不要用大量小而快的请求(包括引发错误的无效请求)压倒服务器。在多个数据会话对象或多进程环境中,并发事务仍然是可能的。

其他功能

附加功能是可用的,但它们没有记录在dcs web api spec中,因为它们没有正式支持第三方使用。所提供的功能是从分析前端用户界面的工作原理中逆向设计而来的,因此它们的使用风险由您自己承担,并且它们的行为可能随时发生变化。这些在本项目提供的pythondcspro模块中可用。该模块基本上复制了标准功能,因此可以代替pythondcs使用,但具有附加功能,其中一些功能可以修改dcs数据库,因此将由您自行承担风险。有关详细信息,请参阅此文件中的源代码内联注释。

作者

mark jarvis-linkedingithubpypi

我受雇于沃里克大学房地产办公室,能源和可持续发展团队,作为一名可持续发展工程师,作为该职位的一部分,我负责管理该大学的几千米和远程计量。环网基础设施基于Concertive Research的设备和DCS软件平台。虽然这个模块将不可避免地用于我的工作中,以清理和分析数据,并可能有利于其他用户或与大学合作的研究项目,但这个模块是作为一个个人项目编写的,因为我不是一个软件开发人员!

贡献和功能请求

对于bug或功能请求,请通过github与我联系,或提出问题

许可证

该项目在GNU通用公共许可v3.0下获得许可-有关详细信息,请参见许可文件

致谢

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将向量的内容从一个包发送到另一个包?   java无法扩展类并对ArrayList进行排序   java无法对字符串的ArrayList进行排序   JavaP:ajax更改事件请求返回500错误   java如何为TableHeader使用渲染器   带有记号的java JSlider问题   Java如何在不同的类中调用add()方法   java如何使用JDBC和HSQLDB检索以前自动生成的PK ID值   java如何使dropwizard应用程序在启动完成之前忽略所有调用   使用MethodValidationPostProcessor进行java Spring验证   java Mediaplayer错误(19 0)不适用于release()   java UnsatifiedPendencyException Swigger2+Sringboot+@RestClientTest   java如何从onActivityResult更新回收器视图元素   java基于图像添加地板或如何优化已有方法   jComboBox的java奇怪行为   java从数据库表php中提取信息   Android-sqlite更新方法;JAVAlang.IllegalStateException:无法执行活动的方法   java如何将多个XSD文件合并到一个XSD文件?   java在不使用大多数API的情况下消除空格