使用云PE版本制造商级别,我的客户需要设备数据的报告时间表。 我意识到用户可以手动执行表导出,但这对于客户端来说还不够。 我注意到过去提出过类似的问题,但我看不到这个问题的完整答案。对此有什么新建议吗? https://stackoverflow.com/questions/62844153/export-telemetry-data-of-a-device-in-thingsboard
Trendz ($)有提供这个功能吗?
我还发现可以使用 REST API,但这只会增加处理 JSON 来生成报告的复杂性。并不是真正满足需求的解决方案。
抱歉,这对使用 Thingsboard 来说是一个大问题。
我现在创建了一个 python 脚本来从 Thingsboard 生成 csv 文件报告,下面概述了实现此目标所需的关键概念。我发现 TB 文档有点简单,所以希望其中的一些细节对其他人有帮助。
我使用的过程是使用 TB python 库进行 REST API 调用。这非常有效。
但是在开始使用 python 之前,请使用 swagger 接口来测试您的登录和数据调用:
https://thingsboard.cloud/swagger-ui/ (针对TB云实例)
确保在进行 REST 调用之前通过“授权”按钮登录 使用简单的方法进行第一次测试很有用,例如设备控制器,获取设备 ID: https://thingsboard.cloud/swagger-ui/#/device-controller/getDeviceByIdUsingGET
这将检查您的登录名和所需的设备 ID 是否正常工作。 顺便说一下,设备 ID 是在管理仪表板的“实体”->“设备”->[选择感兴趣的设备]->[复制设备 ID]下列出的设备 ID。
由于我想要来自特定设备的时间序列数据,请使用遥测控制器、获取时间序列数据部分下的方法:https://thingsboard.cloud/swagger-ui/#/telemetry-controller/getTimeseriesUsingGET
请注意,该方法要求提供实体类型 (DEVICE) 和实体 ID(您从上面的设备 ID 中复制的内容)。您还需要提供所需遥测的参数密钥。如果您不确定确切的密钥名称,请返回到上面的管理仪表板,然后选择“最新遥测”选项卡以查看您的设备正在使用的密钥。在 swagger 中使用此功能将检查您是否可以在您想要的时间段内访问设备并从数据库中提取数据。最好先这样做,而不是稍后还对 python 代码操作产生疑问。
现在进入Python: 首先参考TB文档:
https://thingsboard.io/docs/reference/python-rest-client/ 使用以下命令将 TB python 库安装到您的计算机/服务器上: https://thingsboard.io/docs/reference/python-rest-client/
现在开始编写脚本。下面的代码行不是完整工作的 python 脚本,而是您需要的关键行。建议从简单开始,以确保登录和 GET 方法适合您。
# library modules you'll likely need are
from tb_rest_client.rest_client_pe import *
from tb_rest_client.rest import ApiException
import logging
import json
import datetime
import time
import csv
# provide the TB url to use
url = 'https://thingsboard.cloud'
# create a TB object for the code
rest_client = RestClientPE(base_url=url)
try:
result = rest_client.login(username='your_username', password='your_password')
current_user = rest_client.get_user()
print('login result: {}'.format(current_user))
except ApiException as e:
print('login error: {}'.format(e))
# with a successful login now get data
# annoyed note: the device id is NOT the entity ID!!
# have to provide python object that states the entity type and id
# refer to the swagger page for what is expected by each method
entity_id = EntityId(entity_type='DEVICE', id=TB_creds['device_id'])
# make an object for the parameter keys you want to get
keys = "key1,key2,key3" # note: do NOT put spaces between the keys!
start_ts = 1704153600000 # an epoch value in ms to start from e.g. Jan 2 2024
finish_ts = 1704240000000 # an epoch value in ms to finish at e.g. Jan 3 2024
# now use the above with the TB rest api to get timeseries for the selected device, telemetry keys and defined time period
result_js = rest_client.get_timeseries(entity_id, keys, start_ts, finish_ts)
其他一些需要注意的观察结果:
一次调用中可以检索的数据行数似乎存在限制。即可以下载100个时间点。超过这个就被截断了。
可以在连续的时间块进行多次调用以克服 100 次限制。但最终您将需要解析多组数据以创建所需的输出格式。
数据按最新的最先返回的顺序。如果您首先想要最早的数据,这可能有点出乎您的意料。
每个参数键都是单独排序的,这意味着结果数据先按键排序,然后按时间戳排序。如果您像我一样想要按时间顺序列出然后键值,那么有必要解析返回的数据并创建一个按时间戳和键值排序的新对象。我不会详细介绍如何解析数据块以创建可以保存为 csv 的对象。但现在假设您有一个数据字典对象,其中包含时间戳,后跟每个键的遥测数据列表。
如何用Python编写csv文件: file_name = 'some_file_name.csv' 将 open(file_name, 'w', newline='') 作为 csvfile: 尝试: file_obj = csv.writer(csvfile, 分隔符=',', quotechar=''', 引用=csv.QUOTE_MINIMAL) file_obj.writerow(["Thingsboard report", time.strftime('%d/%b/%Y %X', start.timetuple())]) # 为报告添加标题行 file_obj.writerow(["device id", TB_creds['device_id']]) # 将设备 id 放入文件中 file_obj.writerow(['ts'] + key_list) # 为 ts 和关键项写入列标题 对于 ts_point,data_obj.items() 中的值: file_line = [ts_point] + 值 file_obj.writerow(文件行) 除了: print('无法制作csv文件')
欢迎对此提供反馈或评论,如果可能,我会尽力回答问题。