ZeWaren / izar-prios-smart-meter-collector

WMBus PRIOS smart meter collector implementation for IZAR 868MHz I R4 water meters
https://zewaren.net/wmbus-izar-meter.html
BSD 3-Clause "New" or "Revised" License
39 stars 5 forks source link
collector izar mbus prios stm32 wireless wmbus wmbus-dongle

IZAR I R4 PRIOS meter collector

izar_rc_i_r4 STEVAL-FKI868V2

Introduction

This project contains the implementation of a Wireless M-Bus (WMBus) collector for DIEHL IZAR I R4 smart meters, running on a ST-Micro STEVAL-FKI868V2 kit (a NUCLEO-L053R8 board with a S2-LP 868MHz transceiver).

Supported smart meters

Many more devices should be supported (probably most if not all DIEHL PRIOS smart water meters).

Please report yours if you tested them.

Usage

General

Build the application using your favorite IDE (an IAR/EWARM workspace is provided).

Flash the firmware into the Cortex M0 microcontroller.

Plug the board into a computer using a USB connector.

Open the USB virtual COM port provided by the board, with speed 115200.

The device outputs every smart meter readings in real time:

# socat open:/dev/cuaU0,raw,echo=0,ispeed=115200,ospeed=115200 -
20d01c15,70.686996,69.581001,m3,2020,04,01,9.0,32,1,0,0,0,0,0,0,0,0,0,0,0,0
20d02a72,65.434998,64.680000,m3,2020,04,01,9.0,32,3,0,0,0,0,0,0,0,0,0,0,0,0
20d03c19,174.847000,172.501999,m3,2020,04,01,9.0,32,3,0,0,0,0,0,0,0,0,0,0,0,0
20d04a74,59.242001,58.627998,m3,2020,04,01,9.0,32,2,0,0,0,0,0,0,0,0,0,0,0,0
20d05c1d,92.295998,90.585999,m3,2020,04,01,9.0,32,2,0,0,0,0,0,0,0,0,0,0,0,0
20d06a73,100.885002,99.934998,m3,2020,04,01,9.0,32,2,0,0,0,0,0,0,0,0,0,0,0,0
20d07c1c,301.843994,300.838989,m3,2020,04,01,9.0,32,2,0,0,0,0,0,0,0,0,0,0,0,0
20d08c1e,102.694000,101.646004,m3,2020,04,01,9.0,32,0,0,0,0,0,0,0,0,0,0,0,0,0
20d09c16,92.638000,92.277000,m3,2020,04,01,9.0,32,2,0,0,0,0,0,0,0,0,0,0,0,0

The fields are:

In my case, the H0 value is the reading at the end of the last month.

Shell

Logging the values for a specific meter in a file, prepending each line with the current timestamp can be done with some shell scripting:

socat open:/dev/cuaU0,raw,echo=0,ispeed=115200,ospeed=115200 - | grep 20d78c1e | awk '{cmd="date +%s"; (cmd | getline date); close(cmd); print date "," $1}' >> /var/log/izar_local.log

Here's how to convert a line to JSON using jq:

$ echo "1587574231,20d78c16,92.638000,92.277000,m3,2020,04,01,9.0,32,0,0,0,0,0,0,0,0,0,0,0,0,0" | jq --slurp --raw-input --raw-output \
'split(",") |
    {
    "timestamp": .[0] | tonumber,
    "meter_id": .[1],
    "current_reading": .[2] | tonumber,
    "h0_reading": .[3] | tonumber,
    "measurement_unit": .[4],
    "h0_year": .[5] | tonumber,
    "h0_month": .[6] | tonumber,
    "h0_day": .[7] | tonumber,
    "remaining_battery_life": .[8] | tonumber,
    "radio_interval": .[9] | tonumber,
    "random_generator": .[10] | tonumber,
    "alarms": {
        "general_alarm": .[11] | test("1"),
        "leakage_currently": .[12] | test("1"),
        "leakage_previously": .[13] | test("1"),
        "meter_blocked": .[14] | test("1"),
        "back_flow": .[15] | test("1"),
        "underflow": .[16] | test("1"),
        "overflow": .[17] | test("1"),
        "submarine": .[18] | test("1"),
        "sensor_fraud_currently": .[19] | test("1"),
        "sensor_fraud_previously": .[20] | test("1"),
        "mechanical_fraud_currently": .[21] | test("1"),
        "mechanical_fraud_previously": .[22] | test("1")
    }}'

{
  "timestamp": 1587574231,
  "meter_id": "20d78c16",
  "current_reading": 92.638,
  "h0_reading": 92.277,
  "measurement_unit": "m3",
  "h0_year": 2020,
  "h0_month": 4,
  "h0_day": 1,
  "remaining_battery_life": 9,
  "radio_interval": 32,
  "random_generator": 0,
  "alarms": {
    "general_alarm": false,
    "leakage_currently": false,
    "leakage_previously": false,
    "meter_blocked": false,
    "back_flow": false,
    "underflow": false,
    "overflow": false,
    "submarine": false,
    "sensor_fraud_currently": false,
    "sensor_fraud_previously": false,
    "mechanical_fraud_currently": false,
    "mechanical_fraud_previously": false
  }
}

Authors

Erwan Martin public@fzwte.net

The logic to decrypt and decode the PRIOS protocol is originally from Jacek Tomasiak.

Licence

The application code is protected by licence BSD-3-Clause.

The project uses C libraries provided by STMicroelectronics, which are protected by their own licences.