如何将数据从Node-RED(message.payload)传输到Azure Blob存储?

时间:2019-04-04 10:01:53

标签: node-red azure-blob-storage

我有一个python脚本,可从智能插头检索数据(以监视设备的能耗)。我的最终目标是使用Stream Analytics分析此数据,因此我需要将其发送到Microsoft Azure中的数据库。

现在,我在Node-RED上运行python脚本,输出进入message.payload。我想将此数据发送到Blob存储,为此,我正在使用此节点https://flows.nodered.org/node/node-red-contrib-azure-blob-storage

问题是我遇到此错误:

4 Apr 11:57:51 - [info] [Save Blob:Azure Save Blob Storage] Uploading blob...
4 Apr 11:57:51 - [info] [Save Blob:Azure Save Blob Storage] Container 'container5' ready for blob creation
4 Apr 11:57:52 - [info] [Save Blob:Azure Save Blob Storage] Error: ENOENT: no such file or directory, stat 'Thu Apr  4 11:57:51 2019
21 mA
229867 mV
0 mW
556 Wh

这些值(21 mA,229867 mV,0 mW,556 Wh)是我要保存在Blob存储中的值。我知道此节点可以连接到我的Blob存储帐户,因为每次按Inject时都会创建container5。但是数据不会随处可见。谁能提供帮助?

1 个答案:

答案 0 :(得分:0)

由于您已经在使用Python,因此使用官方的Azure Blob存储客户端从Python内编写blob会容易得多。

一旦安装了客户端(例如pip install azure-storage-blob),就应该这样做(干编码,YMMV):

import io
import datetime
from azure.storage.blob import BlockBlobService

my_data = '''
Thu Apr  4 11:57:51 2019
21 mA
229867 mV
0 mW
556 Wh
'''


# Will generate something like 'stats-20190404-110930'
filename = 'stats-%s' % datetime.datetime.utcnow().strftime('%Y%m%d-%H%M%S')

# Grab a reference to the block blob storage service
block_blob_service = BlockBlobService(
    account_name='azure-storage-account-name',
    sas_token='access-token-from-azure-access-keys-page',
)

# Upload directly from the text you have
block_blob_service.create_blob_from_text(
    container_name='azure-storage-container-name',
    blob_name=filename,
    text=my_data,
)

不过,将数据保存为JSON之类的结构化格式会更好,因此,您无需在任何地方解析此自定义文本格式,也可以使用ISO8601标准作为日期:

import json
import datetime

data = {
  'date': datetime.datetime.utcnow().isoformat(),
  'voltage_mv': 229867,
  'current_ma': 21,
  'power_mw': 0,
  'energy_wh': 556,
}

my_data = json.dumps(data)  # encode into JSON

# (the same upload dance as before)