wmbusmeters/HowToAddaNewMeter.txt

99 wiersze
4.0 KiB
Plaintext

So you want to add a new meter! Great!
Use the command line version of wmbusmeters instead of
the daemon when developing and testing for a new meter.
This makes it much easier and faster.
But first collect a few telegrams of your meter:
wmbusmeters --logtelegrams auto:t1
Received telegram from: 12345678
manufacturer: (MMC) My Meter Company (0x1234)
type: Cold water meter (0x16)
ver: 0x01
device: im871a[01020304]
rssi: -39 dBm
driver: unknown
telegram=||2344xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|+24
(The || means that the telegram is not decrypted. When you are actually decoding
a specific meter the firs |...| will mark the header part of the telegram.)
Now store the telegram=||xxxxx...| (skip the +24 at the end) into the file simulation_mymeter.txt
Be careful, the file must have a name beginning with "simulation_".
Now you can re-run: wmbusmeters simulation_mymeter.txt
And it will print the same output (minus the rssi/device).
You can also do: wmbusmeters --analyze simulation_mymeter.txt Wasser supercom587 12345678 <yourkey>
It does not matter that your meter is not compatible with the supercom587, wmbusmeters
will still decrypt and decode the OMS compliant wmbus encoded values as much as possible.
In the long debug log you will see
telegram=|2E44xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|+0
(supercom587) 00: 2e length (46 bytes)
(supercom587) 01: 44 dll-c (from meter SND_NR)
(supercom587) 02: 3412 dll-mfct (MMC)
(supercom587) 04: 78563412 dll-id (12345678)
(supercom587) 08: 01 dll-version
(supercom587) 09: 16 dll-type (Cold water meter)
(supercom587) 0a: 7a tpl-ci-field (EN 13757-3 Application Layer (short tplh))
(supercom587) 0b: 4b tpl-acc-field
(supercom587) 0c: 03 tpl-sts-field
(supercom587) 0d: 2005 tpl-cfg 0520 (AES_CBC_IV nb=2 cntn=0 ra=0 hc=0 )
(supercom587) 0f: 2f2f decrypt check bytes
(supercom587) 11: 04 dif (32 Bit Integer/Binary Instantaneous value)
(supercom587) 12: 13 vif (Volume l)
(supercom587) 13: * 320C0000 total consumption (3.122000 m3)
(supercom587) 17: 03 dif (24 Bit Integer/Binary Instantaneous value)
(supercom587) 18: FD vif (Second extension of VIF-codes)
(supercom587) 19: 17 vife (Error flags (binary))
(supercom587) 1a: 000000
(supercom587) 1d: 44 dif (32 Bit Integer/Binary Instantaneous value storagenr=1)
(supercom587) 1e: 13 vif (Volume l)
(supercom587) 1f: 21090000
(supercom587) 23: 04 dif (32 Bit Integer/Binary Instantaneous value)
(supercom587) 24: 93 vif (Volume l)
(supercom587) 25: 3C vife (backward flow)
(supercom587) 26: 05000000
(supercom587) 2a: 2F skip
(supercom587) 2b: 2F skip
(supercom587) 2c: 2F skip
(supercom587) 2d: 2F skip
(supercom587) 2e: 2F skip
You can see that the supercom587 driver already picked out the total consumption above.
That value is marked with an '*' and there is an explanation after the value 320C0000
to show in debug mode how it has been decoded and what it means. You can see
that there are three more values 000000, 21090000 and 05000000. Your
goal is to find/decode and print them.
Ok, now it is time to program.
To add a meter type, make a copy of meter_supercom587.cc to meter_mymeter.cc
(No other file needs to be changed, not even the Makefile.)
Change all supercom587 strings to mymeter.
Build with address sanitizer and gdb debug info:
make DEBUG=true
Run your code:
./build_debug/wmbusmeters simulation_mymeter.txt
Now test your code:
./build_debug/wmbusmeters --format=json simulation_mymeter.txt Water MyMeter 12345678 <key>
It should print at least:
{"media":"cold water","meter":"mymeter","name":"Vatten","id":"12345678","total_m3":3.122,"timestamp":"2020-11-04T07:01:12Z"}
and any other fields you have added.
Now you can run it for real:
./build_debug/wmbusmeters --format=json auto:t1 Water MyMeter 12345678 <key>
Finally try the daemon: make; sudo make install
(Do the daemon reload command if such is requested.)
sudo systemctl start wmbusmeters.service
Update the regression tests in the end of meter_mymeter.cc