Какова полезная структура сообщений Azure IoT Hub JSON для использования в анализе временных рядов

#json #azure #time-series #azure-iot-hub

#json #azure #временные ряды #azure-iot-hub

Вопрос:

Название звучит довольно исчерпывающе, но мой базовый вопрос, я думаю, довольно прост.

Контекст

В Azure у меня есть IoT hub, на который я отправляю сообщения. Я использую модифицированную версию одного из примеров из Azure Iot SDK для python.

Отправка работает нормально. Однако вместо строки я отправляю структуру JSON.

Когда я наблюдаю за событиями, поступающими в IoT hub, используя облачную оболочку, это выглядит так:

 PS /home/marcel> az iot hub monitor-events --hub-name weathertestiothub
This extension 'azure-cli-iot-ext' is deprecated and scheduled for removal. Please remove and add 'azure-iot' instead.
Starting event monitor, use ctrl-c to stop...
{
"event": {
        "origin": "raspberrypi-zero-wh",
        "payload": "{ "timestamp": "1608643863720", "locationDescription": "Attic", "temperature": "21.941", "relhumidity": "71.602" }"
    }
}
 

Проблема

Данные кажутся нормальными, за исключением того, что полезная нагрузка выглядит здесь странно. НО полезная нагрузка — это буквально то, что я отправляю с устройства, используя образец SDK.

Это правильный способ сделать это? В конце концов, мне очень сложно получить данные в модель анализа временных рядов. Так что, я думаю, виновата моя структура.

Вопрос

Какую структуру данных JSON рекомендуется отправлять в IoT hub для последующего использования?

Ответ №1:

Вы должны добавить следующие 2 строки в свое сообщение в образце python SDK:

 msg.content_encoding = "utf-8"
msg.content_type = "application/json"
 

Это должно решить вашу проблему с форматированием.

Мы также обновили наши образцы, чтобы отразить это: https://github.com/Azure/azure-iot-sdk-python/blob/master/azure-iot-device/samples/sync-samples/send_message.py

Комментарии:

1. Привет и добро пожаловать в Stackoverflow. Этот сайт работает немного иначе, чем обычный форум, и уделяет гораздо больше внимания предоставлению прямых ответов на вопросы. Я немного отформатировал ваш пост в этом направлении. Также очень приветствуется раскрытие информации, поэтому, если вы работаете в вовлеченной компании, в данном случае в Microsoft.

2. Добавление кодировки и типа — хороший совет, хотя и не решающий. Смотрите мой собственный ответ ниже.

Ответ №2:

В итоге я использовал подсказку @elhorton, но это не было ключевым изменением. Тем не менее, форматирование в Azure Shell Monitor теперь выглядит намного лучше:

 "event": {
    "origin": "raspberrypi-zero-wh",
    "payload": {
        "temperature": 21.543947753906245,
        "humidity": 69.22964477539062,
        "locationDescription": "Attic"
    }
}
 

Ключ был:

  1. включите время источника сообщения в формате ISO
     from datetime import datetime
    timestampIso = datetime.now().isoformat()
    message.custom_properties["iothub-creation-time-utc"] = timestampIso
 
  1. Используя locationDescription как Time Series ID Property см. https://docs.microsoft.com/en-us/azure/time-series-insights/how-to-select-tsid (Возможно, я мог бы также взять iothub-connection-device-id , но я не проверял это специально)

Ответ №3:

Я предполагаю, что использование « iothub-connection-device-id » сделает « raspberrypi-zero-wh » в качестве имени экземпляра временного ряда. Я согласен с вашим выбором использования « locationDescription » в качестве TSID; таким образом, Attic становится именем экземпляра временного ряда, температура и влажность будут вашими переменными.

Комментарии:

1. Да, на данный момент я думаю, что вы абсолютно правы. В первый раз я использовал deviceId только буквальное значение, потому что не понимал значения exaxt. К сожалению, необработанные сообщения не отображаются в облачной оболочке, как я описал в своем вопросе. Это может быть препятствием для понимания механики в фоновом режиме.