====== Описание работы модулей для счетчиков газа Elster, Metrix, Samgaz ======
[[https://jooby.eu/rdc-en/|{{:ru:rdc:elster.png?nolink&200}}]] [[https://jooby.eu/rdc-en/|{{:ru:rdc:metrix.png?nolink&200}}]] [[https://jooby.eu/rdc-en/|{{:ru:rdc:samgas.png?nolink&200}}]]
Модули выполнены в разных корпусах. Алгоритм функционирования полностью идентичен.
===== LoRaWan sensor commands =====
{{ :ru:rdc:lorawan_sensor_commands._version_4.6_rev.2.22_.pdf |LoRaWan sensor commands. Version 4.6 (Rev.2.22)}}
===== Начало работы =====
Для корректной инсталляции модуля в NS, необходимо знать заводские параметры модуля (Уточнить в спецификации):
* Способ активации модуля в сети LoraWAN - ABP (Activation by personalisation) или OTAA (Over the Air Activation)
* Ключи (APPSKEY[16], NETSKEY[16] - ABP) или (APPKEY[16] - OTAA).
===== Индикация =====
Индикация с помощью светодиода:
* Короткая вспышка светодиода (20 мс) индицирует нажатие,отпускание кнопки.
* Увеличение счетчика импульсов также сопровождается короткой (20 мс) вспышкой светодиода.
* Активация модуля в сети LoraWAN подтверждается серией из 7 вспышек светодиода.
===== Время, дата =====
FIXME
Время модуля и сервера необходимо синхронизировать. В процессе работы необходимо корректировать время модуля при его расхождении с сервером. Допустимое отклонение не более 30 секунд
Время модуля передается в виде 4-х байтного счетчика. Это время в секундах, начиная с 2000 года. Время модуля необходимо синхронизировать с временем сервера. Установка времени может происходить при помощи 2 команд: **SET_TIME** и **CORRECT_TIME**. Команда **SET_TIME** предназначена для начальной установки времени и в случае корректировки более +/-128 секунд. При выполнении этой команды могут быть потеряны почасовые данные, если коррекция производиться назад. В дальнейшем сервер должен корректировать время модуля при его расхождении с временем сервера. Рекомендуемое допустимое отклонение времени не более 30 секунд, при его превышении проводится корректировка времени командой **CORRECT_TIME**.
===== Режим Активации =====
Активация происходит после того, как кнопка находится в "зажатом" состоянии 20 секунд. Это происходит при установке модуля в счетчик газа. Опрос датчика происходит постоянно. Режим **АКТИВАЦИИ** подтверждается светодиодной индикацией - 7 вспышек светодиода с периодом 50 мс. Под АКТИВАЦИЕЙ подразумевается то что модуль начнет пересылать кадры данных по радиотракту. До активации радиотракт выключен. В режиме АКТИВАЦИИ происходят [[#события]] **INSERT** и **ACTIVATE**, передаются кадры **NEW_EVENT** с событиями - **INSERT** и **ACTIVATE**, в данных этих событий передается время события. Также [[#команды|командой]] **GET_CURRENT** передаются текущие данные счетчика импульсов. Если модуль снять со счетчика газа (кнопка отжата), то через 30 секунд модуль будет деактивирован. На сервер будет отправлен кадр NEW_EVENT с событиями - **REMOVE** и **DEACTIVATE** (в данных этих событий передается время события) и командой **GET_CURRENT** передаются текущие данные счетчика импульсов.
===== Данные потребления =====
После активации модуль будет регулярно пересылать данные потребления. По умолчанию модуль передает данные почасового потребления с интервалом около 4 часов + псевдослучайная составляющая в пределах от 0 до 17 минут. Периодичность отправки данных может быть изменена, но период не может быть меньше 10 минут и больше 36 часов. Можно задать тип передаваемых данных. Возможно передача текущих данных, почасовых, посуточных. Также возможна передача по часовых и суточных одновременно (в одном кадре). Для выбора типа передаваемых данных следует воспользоваться параметром 5 (Тип выдаваемых данных).
Почасовые данные сохраняются в архиве, максимальная глубина архива 6 месяцев. Данные суточного потребления также сохраняются в архиве, максимальная глубина 2 года. Глубина архивов конфигурационно не меняется.
===== Элемент питания (Аккумуляторная батарея) =====
Один раз в сутки модуль измеряет параметры элемента питания. Измеряется напряжение батареи без нагрузки и напряжение батареи под нагрузкой резистора (150 Ом для модулей на WLE). Эти данные и вычисленное значение внутреннего сопротивления будет передаваться один раз за сутки. По результатам проверки батарейки возможен запуск процесса депассивации батарейки. В этом случае в журнал будет записано событие **DEPASS_DONE**.
===== Датчики магнитного поля =====
В модуле установлены два датчика магнитного поля. Первый датчик фиксирует потребление газа. В счетчике газа в одно из колец механизма установлен магнит. Таким образом модуль фиксирует количество оборотов этого кольца. Счетчик импульсов в модуле только наращивается, нет механизма для сброса счетчика импульсов. Наращивание счетчика импульсов сигнализируется короткой вспышкой светодиода (20 мс). Счетчик импульсов это беззнаковое 4-х байтовое число. При переполнении счетчика он начинает отсчет с “0”. При этом будет сформировано событие **COUNTER_OVER** и отправлен кадр **NEW_EVENT** с этим событием.
Второй датчик используется для фиксации вредоносного воздействия магнитом на счетчик газа. Если это воздействие было продолжительностью более 20 сек, то на сервер будет отправлен кадр **NEW_EVENT** с уведомлением о магнитном воздействии **MAGNIT_ON**. После снятия воздействия магнита на сервер будет отправлен кадр **NEW_EVENT** о прекращении воздействия магнитного поля **MAGNIT_OFF**. При кратком воздействии магнитного поля (2-20 сек), на сервер будут отправлены текущие данные счетчика импульсов **GET_CURRENT** для **HARD_TYPE 1,2** и **GET_CURRENT_MUL** для **HARD_TYPE 12**.
===== Организация хранения данных в модуле =====
==== CURRENT DATA ====
CURRENT DATA - Текущие данные счетчика импульсов. Данные хранятся в нескольких местах. При рестарте микроконтроллера производится попытка восстановления данных счетчика импульсов. Проверяется сохраненное значение в BACKUP-регистрах микроконтроллера. Если данные корректны, то они принимаются как данные счетчика импульсов. В противном случае происходит поиск последних сохраненных данных в памяти микроконтроллера. Запись текущих данных в BACKUP-регистр происходит при каждом приращении счетчика импульсов, т.е. в BACKUP-регистре всегда находится актуальное значение счетчика импульсов. Рестарт микроконтроллера не приводит к потере данных в BACKUP-регистрах. Значения счетчика импульсов записывается в память не чаще 90 секунд. Под хранение CURRENT_DATA выделено 2 страницы флеш-памяти - 2048*2=4096 байт.
^ Формат хранения CURRENT_DATA ^^^^^^^^^^^^^^^^
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| CNT[4] |||| RES]* || CRC16[2] || CNT[4] |||| RES* || CRC16[2] ||
==== HOURS_DATA ====
HOURS_DATA - почасовые данные счетчика импульсов. Данные записываются во флэш память микроконтроллера при смене часа по времени микроконтроллера. Под хранение архива почасовых данных отведено 24 страницы флэш памяти 2048*24 = 49152 байт. Почасовые данные за сутки занимают 256 байт. Общая глубина архива не более 6 месяцев.
^ Формат хранения HOURS_DATA |||||||||||||||||||
| | 0 | 1 | 2 | | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | | B | C | D | E | F |
| 0 | Y | M | D | Hour_0 | CNT[4] |||| LRC | Y | M | D | Hour_1 | CNT[4] |||| LRC |
| 10 | Y | M | D | Hour_2 | CNT[4] |||| LRC | Y | M | D | Hour_3 | CNT[4] |||| LRC |
| 20 | Y | M | D | Hour_4 | CNT[4] |||| LRC | Y | M | D | Hour_5 | CNT[4] |||| LRC |
| 30 | Y | M | D | Hour_6 | CNT[4] |||| LRC | Y | M | D | Hour_7 | CNT[4] |||| LRC |
| .. | .. | | | .. | .. |||| .. | .. | | | .. | .. |||| .. |
| A0 | Y | M | D | Hour_20 | CNT[4] |||| LRC | Y | M | D | Hour_21 | CNT[4] |||| LRC |
| B0 | Y | M | D | Hour_22 | CNT[4] |||| LRC | Y | M | D | Hour_23 | CNT[4] |||| LRC |
==== DAYS_DATA ====
DAYS_DATA - Данные суточного потребления. Данные записываются во флэш-память в "учетный час" суток. Учетный час можно задать произвольно в пределах 24 часов суток. По умолчанию "учетный час" равен 0 часов. Для хранения архивов суточных данных во флэш-памяти отведено 3 страницы - 2048*3=6144 байта.
^ Формат хранения DAYS_DATA ^^^^^^^^^^^^^^^^^
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| 0 | Y | M | D_1 | CNT[4] |||| LRC | Y | M | D_2 | CNT[4] |||| LRC |
| 10 | Y | M | D_3 | CNT[4] |||| LRC | Y | M | D_4 | CNT[4] |||| LRC |
| 20 | Y | M | D_5 | CNT[4] |||| LRC | Y | M | D_6 | CNT[4] |||| LRC |
| 30 | Y | M | D_7 | CNT[4] |||| LRC | Y | M | D_8 | CNT[4] |||| LRC |
| | | | | | | | | | | | | | | | | |
| E0 | Y | M | D_29 | CNT[4] |||| LRC | Y | M | D_30 | CNT[4] |||| LRC |
| F0 | Y | M | D_31 | CNT[4] |||| LRC | | | | |||| |
===== Абсолютные данные. Команды, настройки =====
Устройство поддерживает режим работы с абсолютными данными. Этот режим устанавливается для того, чтобы из переданных устройством данных можно было легко получить текущие показания прибора учета. В этом режиме устройство использует другой набор команд для передачи данных о потреблении.
Для установки начальных показаний прибора учета, необходимо использовать импульсный коэффициент - IPK, который является параметром прибора учета и обозначает объем ресурса на один импульс.
Для установки режима передачи абсолютных данных в модуль, необходимо передать импульсный коэффициент IPK и начальные показания прибора учета, выраженные с учетом импульсного коэффициента INITIAL_METER_DATA= INITIAL_CONSUMPTION/IPK. А также текущее значение счетчика импульсов. Значение счетчиков импульса можно получить в момент активации или инициировать передачу текущих данных с помощью слайдера, магнита, нажатии кнопки, установки разъема (замыкание тампера). При необходимости эти операции можно повторить.
Например, для газового модуля:
* IPK (импульсный коэффициент) = 100 литров на 1 импульс;
* Начальные показания INITIAL_CONSUMPTION = 12.5 м3;
* Текущее значение счетчика импульсов START_COUNTER = 0x5033.
При таких исходных данных необходимо установить INITIAL_METER_DATA в значение 12.5/0.1 = 125.
==== Установка параметров ====
Для установки [[#параметры|параметров]] режима абсолютных данных используется команда **SET_PARAMETERS = 0x03** c **TYPE_PARAMETERS = 23**.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0 | 0 | CMD SET_PARAMETERS = 0x03 |||||
| CMD_LENGTH = 10 ||||||||
| TYPE_PARAMETERS = 23 ||||||||
| INITIAL_METER_DATA[4] ||||||||
| IPK[1] ||||||||
| START_COUNTER[4] ||||||||
Пример:
hex dump: 030A170000007D6400005033
030A - SET_PARAMETERS = 0x03, len = 10 dec
17 - TYPE_PARAMETERS = 23
0000007D - INITIAL_METER_DATA = 0x0000007D = 125 dec
64 - IPK = 0x64 = 100 dec
00005033 - START_COUNTER = 0x5033 = 20531 dec
==== Режим передачи ====
Для включения режима передачи абсолютных данных используется команда **SET_PARAMETERS = 0x03** c **TYPE_PARAMETERS = 24**.
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 0 | 0 | 0 | CMD SET_PARAMETERS = 0x03 | | | | |
| CMD_LENGTH = 2 | | | | | | | |
| TYPE_PARAMETERS = 24 | | | | | | | |
| ABS_DATA_EN=1 | | | | | | | |
Пример:
hex dump: 03021801
Параметры TYPE_PARAMETERS = 23 и TYPE_PARAMETERS = 24 можно установить одним сообщением.
Пример:
hex dump: 030A170000007D640000503303021801+LRC
Выполнение команды подтверждается ответом ''hex dump: 0302170103021801'', что подтверждает успешную установку параметров. Так же после этого устройство начнет выдавать абсолютные данные прибора учета. Это означает, что вместо команд **DATA_DAY** и **DATA_HOUR_DIFF**, передаваемых периодически без запроса, будут передаваться команды **ABS_DATA_DAY** и **ABS_HOUR_DIFF** для модулей **HARD_TYPE=1,2** и вместо команд **DATA_DAY_MUL** и **DATA_HOUR_MUL** будут выдаваться команды **EX_ABS_DAY_MUL** и **EX_ABS_HOUR_MUL** для модулей **HARD_TYPE=12**.
В сообщениях мы будем получать показания прибора учета с учетом импульсного коэффициента.
Например:
если мы получим значение поля METER_DATA = 0x80 = 128 dec, то это соответствует показаниям прибора учета - METER_CONSUMPTION = METER_DATA*IPK = 128*100=12,8m3
==== Реализация в устройстве ====
* **INITIAL_CONSUMPTION** - начальные показания прибора учета, на момент активации.
* **IPK** - импульсный коэффициент устройства, определяющий соответствие потребленного ресурса на 1 импульс.
* **INITIAL_METER_DATA** = INITIAL_CONSUMPTION/IPK
* **START_COUNTER** - показания счетчика импульсов в момент активации, из сообщения об активации
* **CURRENT_COUNTER** - текущие показания счетчиков импульсов в устройстве
* **METER_CONSUMPTION** - текущие показания прибора учета METER_CONSUMPTION = METER_DATA*IPK
Устройство передает в сообщения данные **METER_DATA** = INITIAL_METER_DATA + (CURRENT_COUNTER-START_COUNTER).
Например:
Cтартовые показания прибора учета INITIAL_CONSUMPTION = 41.1 м3(41100 дм3, IPK=100 (100 дм3 на один импульс), текущие показания счетчика импульсов CURRENT_COUNTER = 4580, стартовые показания счетчика импульсов START_COUNTER=5. В результате: METER_DATA = 41100/100 + (4580-5)=4986.
В результате получаем текущие показания прибора учета:
METER_CONSUMPTION = 4986*100 = 498600 дм3 = 498.6 м3.
===== События =====
Все события в модуле записываются в архив событий. Емкость архива - не менее 256 событий и не более 512 событий. При этом в журнал событий записывается время события, код события и номер последовательности LAST_EVENT. Номер события инкрементируется с каждой записью. Этот номер передается на сервер командой LAST_EVENTS , которая добавляется к каждому UPLINK кадру, передаваемому без запроса. Приоритета сообщений в архиве нет. События записываются по циклу. Архивы можно запросить, как самые последние, так и самые старые и начиная с определенного времени.
^ Событие ^ Код ^ Описание ^
|**MAGNIT_ON**|0x01|Фиксация воздействия магнитного поля на время более 20 секунд|
|**MAGNIT_OFF**|0x02|Снятие воздействия магнитного поля|
|**ACTIVATE**|0x03|Произошла активация модуля|
|**DEACTIVATE**|0x04|Деактивация модуля. Прекращение передачи кадров в эфир|
|**INSERT**|0x07|Фиксация установки модуля в счетчик газа|
|**REMOVE**|0x08|Фиксация снятия модуля со счетчика газа|
|**COUNTER_OVER**|0x09|Произошло переполнение счетчика импульсов. Количество импульсов превысило 4294967295|
|**SET_TIME**|0x0A|Фиксация события установки времени модуля|
|**DEPASS_DONE**|0x0E|Фиксация депассивации батарейки модуля|
===== Команды =====
{{tablelayout?rowsHeaderSource=Auto&colwidth="270px,407px,268px"}}
^ HARD_TYPE=1,2 |^ HARD_TYPE=12 ||
| **UPLINK без запроса** ||||
| DATA_DAY = 0x20 | Данные счетчика импульсов датчика на учетный час. | DATA_DAY_MUL=0x16 | Данные счетчиков импульсов многоканального датчика на учетный час. |
| DATA_HOUR_DIF = 0x40 | Почасовые данные счетчика импульсов датчика с выдачей опорного счетчика и накопления счетчика в последовательных часах. | DATA_HOUR_DIF_MUL=0x17 | Данные счетчиков импульсов многоканального датчика на учетный час. |
| LAST_EVENTS = 0x60 | Последнее непрочитанное событие. | LAST_EVENTS = 0x60 | Последнее непрочитанное событие. |
| GET_CURRENT=0x07 | Команда выдачи текущих показаний счетчика импульсов датчика. | GET_CURRENT_MUL=0x18 | Команда выдачи текущих показаний счетчика импульсов ногоканального датчика. |
| ABS_HOUR_DIFF = 0xA0 | Почасовые данные прибора учета с выдачей импульсного коэффициента и опорного значения потребленного ресурса и накопления счетчика в последовательных часах. | EX_ABS_HOUR_MUL=0x1F-0x0A | Команда получения абсолютных данных в формате многоканального счетчика импульсов. |
| ABS_DATA_DAY = 0xC0 | Абсолютные данные прибора учета на учетный час. | EX_ABS_DAY_MUL=0x1F-0x0B | Команда получения абсолютных данных суточного потребления в формате многоканального счетчика импульсов. |
| TIME2000 = 0x09 | Текущее время датчика | TIME2000 = 0x09 | Текущее время датчика |
| NEW_STATUS=0x14 | Состояние датчика. | NEW_STATUS=0x14 | Состояние датчика. |
| NEW_EVENT=0x15 | Произошло событие. | NEW_EVENT=0x15 | Произошло событие. |
| **Команды, поступающие с сервера NS в DOWNLINK кадрах.** ||||
| SET_TIME_2000 = 0x02 | Корректировка времени в датчике. Четыре байта в параметрах команды знаковое число определяющее величину коррекции времени Time2000. | SET_TIME_2000 = 0x02 | Корректировка времени в датчике. Четыре байта в параметрах команды знаковое число определяющее величину коррекции времени Time2000. |
| CORRECT_TIME2000=0x0C | Аналогична команде SET_TIME_2000. В данных команды номер последовательности корректировки и один знаковый байт величины коррекции. Команда применяется только если номер последовательности отличается от текущего в датчике. | CORRECT_TIME2000=0x0C | Аналогична команде SET_TIME_2000. В данных команды номер последовательности корректировки и один знаковый байт величины коррекции. Команда применяется только если номер последовательности отличается от текущего в датчике. |
| GET_CURRENT = 0x07 | Запрос на чтение текущего значения счетчика импульсов. | GET_CURRENT_MUL = 0x18 | Запрос на чтение текущих значений многоканального счетчика импульсов. |
| SET_PARAMETERS = 0x03 | Установка параметров в датчик. | SET_PARAMETERS = 0x03 | Установка параметров в датчик. |
| GET_PARAMETERS = 0x04 | Запрос установленных параметров в датчике. | GET_PARAMETERS = 0x04 | Запрос установленных параметров в датчике. |
| GET_ARCHIVE_HOURS = 0x05 | Запрос на чтение архива часовых выборок счетчика импульсов. | GET_ARCHIVE_HOURS_MUL=0x1A | Запрос на чтение архива часовых выборок многоканального счетчика импульсов. |
| GET_ARCHIVE_DAYS = 0x06 | Запрос на чтение архива суточных (на 0 часов) выборок счетчика импульсов. | GET_ARCHIVE_DAYS_MUL = 0x1B | Запрос на чтение архива суточных (на учетный час) выборок многоканального счетчика импульсов. |
| GET_ARCHIVE_EVENTS=0x0B | Запрос на чтение архива событий | GET_ARCHIVE_EVENTS=0x0B | Запрос на чтение архива событий |
| SOFT RESET = 0x19 | Команда программного сброса. | SOFT RESET = 0x19 | Команда программного сброса. |
| GET_LMIC_VERSION=0x1F-0x02 | Команда запроса версии LMIC . | GET_LMIC_VERSION=0x1F-0x02 | Команда запроса версии LMIC . |
| GET_ABS_ARCHIVE_HOURS=0x1F-0x03 | Команда запроса архива данных почасового потребления прибора учета. | EX_ABS_ARCH_HOUR_MUL=0x1F-0x0C | Команда получения архива абсолютных данных почасового потребления в формате многоканального счетчика импульсов. |
| GET_ABS_ARCHIVE_DAYS=0x1F-0x04 | Команда запроса архива данных суточного потребления прибора учета. | EX_ABS_ARCH_DAY_MUL=0x1F-0x0D | Команда получения архива абсолютных данных суточного потребления в формате многоканального счетчика импульсов. |
===== Параметры =====
| **№ ** | **Тип/Значение** |
| **1** |Задание временных параметров работы. |
| **4** |Задание расчетного часа. |
| **5** |Тип выдаваемых данных. |
| **8** |Способ доставки приоритетных данных. |
| **9** |Способ активации устройства в сети LoraWAN. |
| **10** |Параметры депассивации батарейки модуля. |
| **11** |BATTERY_ACTIVE_TIME Минимально необходимое время нагрузки батарейки в сутки предохраняющее пассивации. |
| **18** |RX2_CFG. Для всех типов модулей. Позволяет настроить параметры работы второго окна приема. |
| **22** |DELTA_TIME_EN. |
| **23** |METER_BASE_DATA. |
| **24** |ABSOLUTE_DATA_EN. |
| **25** |SERIAL_NUMBER. |
| **26** |GEOLOCATION. |
| **28** |TimeExtraFrame. |