- Notifications
You must be signed in to change notification settings - Fork0
Read the wireless mbus protocol to acquire utility meter readings.
License
jnxxx/wmbusmeters
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
The program receives and decodes C1,T1 or S1 telegrams(using the wireless mbus protocol or the wired mbus protocol) to acquireutility meter readings. The readings can then be published usingMQTT, curled to a REST api, inserted into a database or stored in a log file.
The program runs on GNU/Linux, MacOSX, FreeBSD, and Raspberry Pi.
System | Status |
---|---|
Ubuntu | |
MacOSX | |
Docker | |
Snap |
wmbusmeters package is available onFedora(version 31 or newer) and can be simply installed by using:
dnf install wmbusmeters
Availability ofwmbusmeters for other Linux distributions can be checked onrelease-monitoring project page.
Experimental docker containers are available here:https://hub.docker.com/r/weetmuts/wmbusmeters
Experimental snaps are available here:https://snapcraft.io/wmbusmetersRead the wiki for more info on how to use the snap:https://weetmuts.github.io/wmbusmeterswiki/SNAP.html
Building and installing from source is easy and recommended since thedevelopment progresses quickly. First remove the wmbus dongle(im871a,amb8465,amb3665,cul,rc1180) or the generic rtlsdr dongle (RTL2832U)from your computer. Then do:
./configure; make; sudo make install
will install wmbusmeters as a daemon.
Check the contents of your/etc/wmbusmeters.conf
file, assuming ithasdevice=auto:t1
and you are using a im871a,amb8465,amb3665,rc1180,cul or rtlsdr device,then you can now start the daemon withsudo systemctl start wmbusmeters
or you can try it from the command linewmbusmeters auto:t1
Wmbusmeters will scan for wmbus devices every few seconds and detect whenevera device is plugged in or removed. However since wmbusmeters now supportsseveral dongle types, the scan can take some time!
Useauto
for testing and to find your dongle. For production it is very muchrecommended that you changeauto:t1
to the device name with the full device path(eg/dev/ttyUSB0:im871a:c1,t1
). This will skip the slow probing for all possiblewmbus dongles when wmbusmeters startup.
If the serial device (ttyUSB0) might change you can also usedevice=im871a:c1,t1
which will probe all serial devices but only scans for im871a which also speeds it up.
If you have to scan serial devices, then remember that some Raspberry PIs are upset whenrandom data is sent to/dev/ttyAMA0
when it is configured in bluetooth mode.To solve this, adddonotprobe=/dev/ttyAMA0
To have the wmbusmeters daemon start automatically when the computer boots do:sudo systemctl enable wmbusmeters
You can trigger a reload of the config files withsudo killall -HUP wmbusmetersd
(Note! make install only works for GNU/Linux. For MacOSX try to startwmbusmetersd /tmp/thepidfile
from a script instead.)
You can also start the daemon with another set of config files:wmbusmetersd --useconfig=/home/me/.config/wmbusmeters /tmp/thepidfile
When using useconfig, the files/dir should be:/home/me/.config/wmbusmeters/wmbusmeters.conf
and the meters dir:/home/me/.config/wmbusmeters/wmbusmeters.d
Check the config file /etc/wmbusmeters.conf and edit the device. For example:/dev/ttyUSB1:amb8465:c1,t1
orim871a:c1,t1
orim871a[457200101056]:t1
.
Adding a device like auto or im871a will trigger an automatic probe of all serial ttysto auto find or to find on which tty the im871a resides.
If you specify a full device path like/dev/ttyUSB0:im871a:c1
orrtlwmbus
orrtl433
then it will not probe the serial devices. If you must be really sure that it will not probe somethingyou can adddonotprobe=/dev/ttyUSB0
ordonotprobe=all
.
You can specify combinations like:device=rc1180:t1
device=auto:c1
to set the rc1180 dongle to t1 but any other auto-detected dongle to c1.
Some dongles have identifiers (im871a,amb8465,amb3665 and rtlsdrs) (for example: rtlsdr can be set withrtl_eeprom -s myname
)You might have two rtlsdr dongles, one attached to an antenna tuned to 433MHz and the otherattached to an antenna tuned for 868.95MHz, then a more complicated setup could look like this:
device=rtlwmbus[555555]:433Mdevice=rtlwmbus[112233]device=/dev/ttyUSB0:im871a[00102759]:c1,t1device=/dev/ttyUSB1:rc1180:t1
To poll an C2/T2/S2 wireless meter or an wired m-bus meter you need to give the (w)mbus device a bus-alias, for examplehere we pick the bus alias MAIN for the mbus using 2400 bps for all meters on this bus.
MAIN=/dev/ttyUSB0:mbus:2400
and here we pick the bus alias RADIOMAIN for an im871a dongle:
RADIOMAIN=/dev/ttyUSB1:im871a:c2
The bus alias is then used in the meter driver specification to specify whichbus the mbus poll request should be sent to.
wmbusmeters --pollinterval=60s MAIN=/dev/ttyUSB0:mbus:2400 MyTempMeter piigth:MAIN:mbus 12001932 NOKEY
loglevel=normal# You can use auto:t1 to find the device you have connected to your system.# But do not use auto here since it will cause unnecessary and slow probing of the serial ports.device=/dev/ttyUSB0:im871a:c1,t1# And mbusdevice=MAIN=/dev/ttyUSB1:mbus:2400# But do not probe this serial tty.donotprobe=/dev/ttyACM2logtelegrams=falseformat=jsonmeterfiles=/var/lib/wmbusmeters/meter_readingsmeterfilesaction=overwritemeterfilesnaming=namemeterfilestimestamp=daylogfile=/var/log/wmbusmeters/wmbusmeters.logshell=/usr/bin/mosquitto_pub -h localhost -t wmbusmeters/$METER_ID -m"$METER_JSON"alarmshell=/usr/bin/mosquitto_pub -h localhost -t wmbusmeters_alarm -m"$ALARM_TYPE $ALARM_MESSAGE"alarmtimeout=1halarmexpectedactivity=mon-sun(00-23)ignoreduplicates=true
Then add a meter file in /etc/wmbusmeters.d/MyTapWater
name=MyTapWaterid=12345678key=00112233445566778899AABBCCDDEEFFdriver=multical21
And an mbus meter file in /etc/wmbusmeters.d/MyTempHygro
name=MyTempHygroid=11223344driver=piigth:mbuspollinterval=60s
You can usedriver=auto
to have wmbusmeters automatically detectand use the best driver for your meter, but you should >not< use auto in production.
You can find out which driver is recommended by runningwmbusmeters im871a:t1
.This will print information like:
Received telegram from: 71727374 manufacturer: (BMT) BMETERS, Italy (0x9b4) type: Heat/Cooling load meter (0x0d) encrypted ver: 0x0b driver: hydrocalm3
For production use it is very much recommended that you specify the exact driverin the meter file. The reason is that new and better drivers might be developedfor your meter, where the keys and the content of the json might change.Such new drivers are guaranteed to have a different driver name.The auto look up will change to the new driver, but the old driver will still work.
So wmbusmeters strives to guarantee that if you have specified the driver name,then wmbusmeters can be safely upgraded at any time. The json will notchange in an incompatible way. (The only allowed changes are: adding new fieldsand changing the ordering.)
Now plugin your wmbus dongle.
Wmbusmeters should start automatically, check withtail -f /var/log/syslog
andtail -f /var/log/wmbusmeters/wmbusmeters.log
(If you are using an rtlsdr dongle, then make sure that either the binaries/usr/bin/rtl_sdr
and/usr/bin/rtl_wmbus
exists and are executable. Or that the executablertl_sdr/rtl_wmbus
binariesexists inside the same directory as the wmbusmeters executable. If not you will see theerror message(rtlwmbus) error: when starting as daemon, wmbusmeters looked for .../rtl_wmbus and /usr/bin/rtl_wmbus, but found neither!
and the daemon will refuse to start.)
The latest reading of the meter can also be found here:/var/lib/wmbusmeters/meter_readings/MyTapWater
You can use several ids usingid=1111111,2222222,3333333
or you can listen to allmeters of a certain typeid=*
or you can suffix with starid=8765*
to matchall meters with a given prefix. If you supply at least one positive match rule, then youcan add negative match rules as well. For exampleid=*,!2222*
which will match all meter ids, except those that begin with 2222.
You can add the static json data"address":"RoadenRd 456","city":"Stockholm"
to every json message with thewmbusmeters.conf setting:
field_address=RoadenRd 456field_city=Stockholm
If you addfield_floor=5
to the meter fileMyTapWater
, then you can have the meter tailored static json"floor":"5"
added to telegrams handled by that particular meter. (The old prefix json_ still works.)
If you are running on a Raspberry PI with flash storage and you relay the data toanother computer using a shell command (mosquitto_pub
orcurl
or similar) then you might want to removemeterfiles
andmeterfilesaction
to minimize the writes to the local flash file system.
Also when using the Raspberry PI it can get confused by the serial ports, in particular the bluetooth port might come andgo as a serial tty depending on the config. Therefore it can be advantageous to use the auto device to find the proper tty(eg /dev/ttyUSB0) and then specify this tty device explicitly in the config file, instead of using auto. This assumes thatyou only have a single usb dongle otherwise the USB tty names can change depending on how and when the devices areunplugged/replugged and the pi restarted. If you have multiple devies with different antennas, then you should insteaduse donotprobe to avoid the ttys that can never have a wmbus dongle.
If you specify--meterfilesaction=append --meterfilestimestamp=day
then wmbusmeters will append all todays received telegrams in for example the fileWater_2019-12-11
, the day after the telegrams will be recorded inWater_2019-12-12
. You can change the resolution to day,hour,minute and micros. Micros means that every telegram gets their own file.
The purpose of the alarm shell and timeout is to notify you aboutproblems within wmbusmeters and the wmbus dongles, not the metersthemselves. Thus the timeout is for a dongle to receive some telegramat all. It does not matter from which meter.
If you cannot install as a daemon, then you can also startwmbusmeters in your terminal using the config files in/etc/wmbusmeters
.
wmbusmeters --useconfig=/etc
Or you can start wmbusmeters with your own config files:
wmbusmeters --useconfig=/home/me/.config/wmbusmeters
If you already have config with a device specified, and you want to usethe config with another device. You might have multiple meters in the configthat you want to listen to. Then you can add--overridedevice
to override the settingsin the config. Like this:
wmbusmeters --useconfig=/home/me/.config/wmbusmeters --overridedevice=rtlwmbus
You must have both--useconfig=
and--overridedevice=
for it to work.
The files/dir should then be located here:/home/me/.config/wmbusmeters/wmbusmeters.conf
and/home/me/.config/wmbusmeters/wmbusmeters.d
The option--useconfig=
can only be combined with a few other options:--overridedevice= --listento= --exitafter= --oneshot= --silent --normal --verbose --debug --trace
When running using config files then you can trigger a reload of the config filesusingsudo killall -HUP wmbusmetersd
orkillall -HUP wmbusmeters
depending on if you are running as a daemon or not.
wmbusmeters version: 1.8.0Usage: wmbusmeters {options} [device] { [meter_name] [meter_driver] [meter_id] [meter_key] }* wmbusmeters {options} [hex] { [meter_name] [meter_driver] [meter_id] [meter_key] }* wmbusmetersd {options} [pid_file]As {options} you can use: --addconversions=<unit>+ add conversion to these units to json and meter env variables (GJ) --alarmexpectedactivity=mon-fri(08-17),sat-sun(09-12) Specify when the timeout is tested, default is mon-sun(00-23) --alarmshell=<cmdline> invokes cmdline when an alarm triggers --alarmtimeout=<time> Expect a telegram to arrive within <time> seconds, eg 60s, 60m, 24h during expected activity. --analyze Analyze a telegram to find the best driver. --analyze=<key> Analyze a telegram to find the best driver use the provided decryption key. --analyze=<driver> Analyze a telegram and use only this driver. --analyze=<driver>:<key> Analyze a telegram and use only this driver with this key. --debug for a lot of information --donotprobe=<tty> do not auto-probe this tty. Use multiple times for several ttys or specify "all" for all ttys. --exitafter=<time> exit program after time, eg 20h, 10m 5s --format=<hr/json/fields> for human readable, json or semicolon separated fields --help list all options --ignoreduplicates=<bool> ignore duplicate telegrams, remember the last 10 telegrams --field_xxx=yyy always add "xxx"="yyy" to the json output and add shell env METER_xxx=yyy (--json_xxx=yyy also works) --license print GPLv3+ license --listento=<mode> listen to one of the c1,t1,s1,s1m,n1a-n1f link modes --listento=<mode>,<mode> listen to more than one link mode at the same time, assuming the dongle supports it --listenvs=<meter_driver> list the env variables available for the given meter driver --listfields=<meter_driver> list the fields selectable for the given meter driver --listmeters list all meter drivers --listmeters=<search> list all meter drivers containing the text <search> --listunits list all unit suffixes that can be used for typing values --logfile=<file> use this file for logging --logtelegrams log the contents of the telegrams for easy replay --logtimestamps=<when> add log timestamps: always never important --meterfiles=<dir> store meter readings in dir --meterfilesaction=(overwrite|append) overwrite or append to the meter readings file --meterfilesnaming=(name|id|name-id) the meter file is the meter's: name, id or name-id --meterfilestimestamp=(never|day|hour|minute|micros) the meter file is suffixed with a timestamp (localtime) with the given resolution. --nodeviceexit if no wmbus devices are found, then exit immediately --normal for normal logging --oneshot wait for an update from each meter, then quit --overridedevice=<device> override device in config files. Use only in combination with --useconfig= option --ppjson pretty print the json --pollinterval=<time> time between polling of meters, must be set to get polling. --resetafter=<time> reset the wmbus dongle regularly, default is 23h --selectfields=id,timestamp,total_m3 select only these fields to be printed (--listfields=<meter> to list available fields) --separator=<c> change field separator to c --shell=<cmdline> invokes cmdline with env variables containing the latest reading --silent do not print informational messages nor warnings --trace for tons of information --useconfig=<dir> load config <dir>/wmbusmeters.conf and meters from <dir>/wmbusmeters.d --usestderr write notices/debug/verbose and other logging output to stderr (the default) --usestdoutforlogging write debug/verbose and logging output to stdout --verbose for more information --version print version
As device you can use:
auto:c1
, to have wmbusmeters probe for devices: im871a, amb8465, amb3665, cul, rc1180 or rtlsdr (spawns rtlwmbus).
im871a:c1
to start all connectedim871a devices inc1 mode, ignore all other devices.
/dev/ttyUSB1:amb8465:c1
to start only this device on this tty. Do not probe for other devices.
If you have two im871a you can supply both of them with their unique id:s and set different listening modes:im871a[12345678]:c1
im871a[11223344]:t1
You can also specify rtlwmbus and if you set the serial in the rtlsdrdongle usingrtl_eeprom -s 1234
you can also refer to a specificrtlsdr dongle like thisrtlwmbus[1234]
.
/dev/ttyUSB0:amb8465
, if you have an amb8465 dongle assigned to ttyUSB0. Other suffixes are im871a,cul.
/dev/ttyUSB0
, to have wmbusmeters auto-detect amb8465, amb3665, im871a, rc1180 or cul device.
/dev/ttyUSB0:38400
, to have wmbusmeters set the baud rate to 38400 and listen for raw wmbus telegrams.These telegrams are expected to have the data link layer crc bytes removed already!
MAIN=/dev/ttyUSB0:mbus:2400
, assume ttyUSB0 is an serial to mbus-master converter. The speed is set to 2400 bps.
rtlwmbus
, to spawn the background process:rtl_sdr -f 868.625M -s 1600000 - 2>/dev/null | rtl_wmbus -s
for each attached rtlsdr dongle. This will listen to S1,T1 and C1 meters in parallel.
Note that this uses a noticeable amount of CPU time by rtl_wmbus.You can therefore use a tailored rtl_wmbus command that is more suitable for your needs.
rtlwmbus:CMD(<command line>)
, to specify the entire backgroundprocess command line that is expected to produce rtlwmbus compatibleoutput.The command line cannot contain parentheses.Likewise for rtl433.
Here is an example command line that reduces the rtl_wmbus CPU usage if you only need T1/C1 telegrams.It disable S1 decoding (-p s
) and trades lower cpu usage for reception performance (-a
):
rtlwmbus:CMD(rtl_sdr -f 868.95M -s 1600000 - 2>/dev/null | rtl_wmbus -p s -a)
rtlwmbus(ppm=17)
, to tune your rtlsdr dongle accordingly.Use this to tune your dongle and at the same time listen to S1,T1 and C1.
rtlwmbus:433M
, to tune to this fq instead.This will listen to exactly to what is on this frequency.
rtl433
, to spawn the background process:rtl_433 -F csv -f 868.95M
rtl433(ppm=17)
, to tune your rtlsdr dongle accordingly.
rtl433:433M
, to tune to this fq instead.
stdin
, to read raw binary telegrams from stdin.These telegrams are expected to have the data link layer crc bytes removed already!
telegrams.bin
, to read raw wmbus telegrams from this file.These telegrams are expected to have the data link layer crc bytes removed already!
stdin:hex
, to read hex characters wmbus telegrams from stdin.These telegrams are expected to have the data link layer crc bytes removed already!
telegrams.txt:hex
, to read hex characters wmbus telegrams from this file.These telegrams are expected to have the data link layer crc bytes removed already!
stdin:rtlwmbus
, to read telegrams formatted using the rtlwmbus format from stdin. Works for rtl433 as well.
telegrams.msg:rtlwmbus
, to read rtlwmbus formatted telegrams from this file. Works for rtl433 as well.
simulation_abc.txt
, to read telegrams from the file (the file must have a name beginning with simulation_....)expecting the same format that is the output from--logtelegrams
. This format also supports replay with timing.The telegrams are allowed to have valid dll crcs, which will be automatically stripped.
As meter quadruples you specify:
<meter_name>
: a mnemonic for this particular meter (!Must not contain a colon ':' character!)<meter_driver>
: useauto
or one of the supported meters (can be suffixed with::<bus_alias>
for selecting which bus where we should send the poll requests:<mode>
to specify which mode you expect the meter to use when transmitting)<meter_id>
: an 8 digit mbus id, usually printed on the meter<meter_key>
: an encryption key unique for the meterif the meter uses no encryption, then supplyNOKEY
Supported wmbus dongles:IMST 871a (im871a)Amber 8465/8665/8665-M (amb8465) 868MHzAmber 3665-M (amb3665) 169MHzCUL family (cul)Radiocraft (RC1180)rtl_wmbus (rtlwmbus)rtl_433 (rtl433)Supported mbus dongles:Any bus controller dongle/board behaving like a plain serial port.Supported water meters:Aventies (aventieswm)Apator at-wmbus-08 (apator08) (non-standard protocol)Apator at-wmbus-16-2 (apator162) (non-standard protocol)Apator at-wmbus-17-2 (apator172) (non-standard protocol)Apator Ultrimis (ultrimis)Aquametro/Integra Topas Es Kr (topaseskr)Axioma W1 (q400)Bmeters Hydrodigit (hydrodigit) (partly non-standard protocol)Diehl/Sappel IZAR RC 868 I R4 PL and R3 (izar) (non-standard protocol)Diehl HYDRUS (hydrus)Diehl IZAR RC I G4 (dme_07)Elster Merlin 868 (emerlin868)Elster V200H (ev200)Maddalena EVO 868 (evo868)Honeywell Q400 (q400)Itron (itron)Kamstrup Multical 21 (kamwater)Kamstrup flowIQ 2200 (kamwater)Kamstrup flowIQ 3100 (kamwater)Qundis QWater5.5 (lse_07_17)Sontex Supercom 587 (supercom587)Sensus iPERL (iperl)Techem MK Radio 3 and 4 (mkradio3,mkradio4) (non-standard protocols)Waterstar M (waterstarm)Zenner Minomess (minomess)Supported heat cost allocators:Apator E-ITN 30.51 (apatoreitn)Innotas EurisII (eurisii)Qundis Q caloric (qcaloric)Sontex 868 (sontex868)Techem FHKV data II/III (fhkvdataiii)Siemens WHE542 (whe5x)BMeters Hydroclima RFM (hydroclima)BFW 240 (bfw240radio)Supported heat meters:Heat meter Techem Compact V / Compact Ve (compact5) (non-standard protocol)Heat meter Techem Vario 4 (vario451) (non-standard protocol)Heat meter Kamstrup Multical 302 (multical302) (in C1 mode, please open issue for T1 mode)Heat and Cooling meter Kamstrup Multical 403 (multical403) (in C1 mode)Heat and Cooling meter Kamstrup Multical 602 (multical602) (in C1 mode)Heat and Cooling meter Kamstrup Multical 603 (multical603) (in C1 mode)Heat and Cooling meter Kamstrup Multical 803 (multical803) (in C1 mode)Heat meter Apator Elf (elf)Heat meter Enercal F2 (enercal)Heat meter Diehl Sharky 775 (sharky)Heat meter Diehl Sharky 774 (sharky774)Heat meter Maddelena microClima (microclima)Heat and Cooling meter BMeters Hydrocal-M3 (hydrocalm3)Heat and Cooling meter Axioma Qualcosonic E3 (qualcosonic)Heat meter Qundis Q heat 5.5 (qheat)Supported room sensors:Bmeters RFM-AMB Thermometer/Hygrometer (rfmamb)Elvaco CMa12w Thermometer (cma12w)Lansen Thermometer/Hygrometer (lansenth)Weptech Munia Thermometer/Hygrometer (munia)PiiGAB Thermometer/Hygrometer (piigth) wiredSupported smoke detectors:Lansen Smoke Detector (lansensm)EI Electronics Smoke Detector ei6500-oms (ei6500)Supported door/window detectors:Lansen Door/Window Detector (lansendw)Supported pulse counter:Lansen Pulse Counter (lansenpu)Supported electricity meters:Easy Meter ESYS-WM20 (esyswm)eBZ wMB-E01 (ebzwmbe)EMH Metering (ehzp)Tauron Amiplus (amiplus) (includes vendor apator and echelon)Gavazzi EM24 (em24)Gransystems 301 and 303 (gransystems)Kamstrup Omnipower (omnipower)Supported gas meters:uniSMART (unismart)Supported pressure sensors:Kamstrup Pressure Sensor (kampress)
The wmbus dongle im871a can listen to either s1, c1 or t1.However with the latest firmware version (0x15) im871a canalso listen to c1 and t1 telegrams at the same time.(Use--verbose
to see your dongles firmware version.)If you have the older firmware you can download the upgrader here:https://wireless-solutions.de/downloadfile/wireless-m-bus-software/
The amb8465 dongle can listen to either s1, c1 or t1. However itcan also listen to c1 and t1 at the same time.
With the latest rtlwmbus you can listen to s1, c1 and t1 atthe same time.
The cul dongle can listen to c1 and t1 at the same time, but onlyif you specify c1! If you specify t1 or s1, then it will only listen to t1 or s1.
Imporant!!!! Note that the cul dongle is limited to shortertelegrams. There is a firmware fix that allows somewhat longer,but still not full length telegrams. This can be a serious blockerif you want to receive long telegrams from advanced meters.Read the wiki to find this firmware.
The rc1180 dongle can listen only to t1.
wmbusmeters auto:c1
Listens for C1 telegrams using any of your available wmbus dongles:
Received telegram from: 12345678 manufacturer: (KAM) Kamstrup Energi (0x2c2d) device type: Cold water meter (0x16) encrypted device ver: 0x1b device: im871a[12345678] rssi: -77 dBm driver: multical21
You can see that this telegram is encrypted and therefore you need a key.Now listen to this specific meter, since the driver is auto-detected, we can useauto
for the meter driver.
wmbusmeters auto:c1 MyTapWater auto 12345678 00112233445566778899AABBCCDDEEFF
(The Multical21 and other meters use compressed telegrams, which meansthat you might have to wait up to 8 telegrams (8*16 seconds) until youreceive a full length telegram which gives all the information neededto decode the compressed telegrams.)
Example output:
MyTapWater 12345678 6.388 m3 6.377 m3 0.000 m3/h 8°C 23°C DRY(dry 22-31 days) 2018-03-05 12:02.50
(Here the multical21 itself, is configured to send target volume, therefore the max flow is 0.000 m3/h.)
Example format json output:
wmbusmeters --format=json /dev/ttyUSB0:im871a MyTapWater multical21:c1 12345678 00112233445566778899AABBCCDDEEFF MyHeater multical302 22222222 00112233445566778899AABBCCDDEEFF
{"media":"cold water","meter":"multical21","name":"MyTapWater","id":"12345678","total_m3":6.388,"target_m3":6.377,"max_flow_m3h":0.000,"flow_temperature":8,"external_temperature":23,"current_status":"DRY","time_dry":"22-31 days","time_reversed":"","time_leaking":"","time_bursting":"","timestamp":"2018-02-08T09:07:22Z","device":"im871a[1234567]","rssi_dbm":-40}
{"media":"heat","meter":"multical302","name":"MyHeater","id":"22222222","total_kwh":0.000,"total_volume_m3":0.000,"current_kw":"0.000","timestamp":"2018-02-08T09:07:22Z"}
Example format fields output and use tuned rtlsdr dongle with rtlwmbus.
wmbusmeters --format=fields'rtlwmbus(ppm=72)' GreenhouseWater multical21:c1 33333333 NOKEY
GreenhouseTapWater;33333333;9999.099;77.712;0.000;11;31;;2018-03-05 12:10.24
You can select a subset of all available fields, where we also select to print the timestamp as a unix timestamp.The timestamp field is UTC time for json and local time when hr and fields. To explicitly select utc youcan specify timestamp_utc and timestamp_lt for local time.
wmbusmeters --format=fields --selectfields=id,total_m3,timestamp_ut,timestamp_utc /dev/ttyUSB0:im871a GreenhouseWater multical21:c1 33333333 NOKEY
33333333;9999.099;1628434800;2021-08-08T15:00.00Z
You can list all available fields for a meter:wmbusmeters --listfields=multical21
You can list all meters:wmbusmeters --listmeters
You can search for meters:wmbusmeters --listmeters=water
orwmbusmeters --listmeters=q
Eaxmple of using the shell command to publish to MQTT:
wmbusmeters --shell='HOME=/home/you mosquitto_pub -h localhost -t water -m "$METER_JSON"' /dev/ttyUSB0:im871a GreenhouseWater multical21:c1 33333333 NOKEY
Example of using the shell command to inject data into postgresql database:
wmbusmeters --shell="psql waterreadings -c\"insert into readings values ('\$METER_ID',\$METER_TOTAL_M3,'\$METER_TIMESTAMP')\"" /dev/ttyUSB0:amb8465 MyColdWater multical21:c1 12345678 NOKEY
(It is much easier to add shell commands in the conf file since you do not need to quote the quotes.)
You can have multiple shell commands and they will be executed in the order you gave them on the command line.
To list the shell env variables available for a meter, runwmbusmeters --listenvs=multical21
which outputs:
METER_JSONMETER_TYPEMETER_NAMEMETER_IDMETER_TOTAL_M3METER_TARGET_M3METER_MAX_FLOW_M3HMETER_FLOW_TEMPERATURE_CMETER_EXTERNAL_TEMPERATURE_CMETER_CURRENT_STATUSMETER_TIME_DRYMETER_TIME_REVERSEDMETER_TIME_LEAKINGMETER_TIME_BURSTINGMETER_TIMESTAMP
(If you have supplied--field_floor=5
then you will also seeMETER_floor
in the list)
Note that theMETER_TIMESTAMP
and the timestamp in the json output, is in UTC format, this is not your localtime.However the hr and fields output will print your localtime.
You can addshell=commandline
to a meter file stored inwmbusmeters.d
, then this meter will usethis shell command instead of the command stored inwmbusmeters.conf
.
You can use--debug
to get both verbose output and the actual data bytes sent back and forth with the wmbus usb dongle.
If the meter does not use encryption of its meter data, then enter NOKEY on the command line.
wmbusmeters --format=json --meterfiles /dev/ttyUSB0:im871a:c1 MyTapWater multical21:c1 12345678 NOKEY
rtl_sdr -f 868.625M -s 1600000 -2>/dev/null| rtl_wmbus -s| wmbusmeters --format=json stdin:rtlwmbus MyMeter auto 12345678 NOKEY| ...more processing...
Or you can send rtl_wmbus formatted telegrams using nc over UDP to wmbusmeters.
rtl_sdr -f 868.95M -s 1600000 -2>/dev/null| rtl_wmbus -p s -a| nc -u localhost 4444
And receive the telegrams with nc spawned by wmbusmeters.
wmbusmeters'rtlwmbus:CMD(nc -lku 4444)'
Or start nc explicitly in a pipe.
nc -lku 4444| wmbusmeters stdin:rtlwmbus
If you have a single telegram as hex, which you want decoded, you do not need to create a simulation file,you can just supply the telegram as a hex string on the command line.
wmbusmeters 234433300602010014007a8e0000002f2f0efd3a1147000000008e40fd3a341200000000
which will output:
No meters configured. Printing id:s of all telegrams heard!Received telegram from: 00010206 manufacturer: (LAS) Lansen Systems, Sweden (0x3033) type: Other (0x00) ver: 0x14 driver: lansenpu
You can of course decode the meter on the fly:
wmbusmeters --format=json 234433300602010014007a8e0000002f2f0efd3a1147000000008e40fd3a341200000000 MyCounter auto 00010206 NOKEY
which will output:
{"media":"other","meter":"lansenpu","name":"MyCounter","id":"00010206","a_counter":4711,"b_counter":1234,"timestamp":"2021-09-12T08:45:52Z"}
You can also pipe the hex into wmbusmeters like this:
echo 234433300602010014007a8e0000002f2f0efd3a1147000000008e40fd3a341200000000| ./build/wmbusmeters --silent --format=json stdin:hex MyCounter auto 00010206 NOKEY
or read hex data from a a file,wmbusmeters myfile.txt:hex
Any non-hex characters are ignored when using the suffix:hex
. However when the hex string issupplied on the command line it must be a proper hex string with no spaces.
When a telegram is supplied on the command line, then any valid dll crcs will be automatically removed,like when the telegram is suppled in a simulation file.
You can analyze a telegram, this is useful when developing new drivers or tryingto find which driver is the best fit for an unknown mfct,type,ver combo.
wmbusmeters --analyze 3E44A5119035246141047A1A0030052F2F#0C06026301000C13688609040B3B0802000C2B220000F00A5A71020A5E72020AA61800004C0636370100426CBF25
Fields marked withC!
(and green background) are content that is understood and put to use in the json. For example:
019 C!: 02630100 ("total_energy_consumption_kwh":16302)
Which shows the telegram raw data bytes and the json field into which the decoded value was presented.Fields marked withC?
(and red background) are content that is not understood nor used in the json.
To force a driver use:--analyze=<driver>
to supply a decryption key:--analyze=<key>
and to do both:--analyze=<key>:<driver>
You can run the analyze functionality online here:wmbusmeters.org
If you have a Kamstrup meter and you have received a KEM file and itspassword from your supplier, then you can usepython2 utils/kem-import.py
utils/kem-import.py to extract meterinformation from that file (including the AES key) and to createcorresponding meter files in wmbusmeters' config directory.
You can also use the XMLExtract Java program.javac utils/XMLExtract
and thenjava -cp utils XMLExtract
to print the key on the command line.
You can run wmbusmeters with--logtelegrams
to get log output that canbe placed in a simulation.txt file. You can then run wmbusmeters andinstead of an usb device, you provide thesimulation.txt
file asargument. See test.sh for more info.
If you do not specify any meters on the command line, then wmbusmeterswill listen and print the header information of any telegram it hears.
(For MacOSX dobrew install librtlsdr libusb
which takes such a longtime that the MacOSX travis build is disabled for the moment.)
./configure && make && make test
Binary generated:./build/wmbusmeters
make install
will install this binary.
make HOST=arm
to cross compile from GNU/Linux to Raspberry PI.
Binary generated:./build_arm/wmbusmeters
make DEBUG=true
Binary generated:./build_debug/wmbusmeters
make testd
to run all tests using the debug build.
Debug builds only work on FreeBSD if the compiler is LLVM. If yoursystem default compiler is gcc, setCXX=clang++
to the buildenvironment to force LLVM to be used.
make DEBUG=true HOST=arm
Binary generated:./build_arm_debug/wmbusmeters
make install
installs the files:
/etc/wmbusmeters.conf
/usr/bin/wmbusmeters
/usr/sbin/wmbusmetersd
/etc/systemd/system/wmbusmeters.service
/etc/logrotate.d/wmbusmeters
creates these directories:
/etc/wmbusmeters.d
/var/lib/wmbusmeters/meter_readings
and adds the userwmbusmeters
with no login account.
If wmbusmeters detects no device, but you know you have plugged in your wmbus dongle, thenrun with--verbose
to get more information on why the devices are not detected.Typically this is because you are not in the dialout (for usb-serial dongles) or plugdev (for rtlsdr) group.
Runsudo make install
to add the current user to the dialout group and the wmbusmeters group.
If the daemon has started then the wmbus device will be taken and you cannot start wmbusmeters manually.
To run manually, first make sure the daemon is stoppedsudo systemctl stop wmbusmeters
if this hangs, then dosudo killall -9 wmbusmetersd
and/orsudo killall -9 wmbusmeters
.
I only have personal experience of the im871a,amb8465 and an rtlsdrcompatible dongle. The commercial dongles (im871a,amb8464) receivewell despite having tiny antennas inside the dongle. However thereception range is limited by walls and you must definitely get quiteclose to the meter if it is mounted underground in a concrete tube.
The rtlsdr/rtl-wmbus solution seems to work for a lot of users, but itdoes use more cpu-power since it decodes the radio traffic insoftware. Range seems to be similar to the other dongles, despite theantenna being much larger.
At least one professional collector use the same commercial dongles,but the versions with an external antenna connector, into which theyattach a radio amplifier for the proper frequency, and then a largerantennna. This makes it possible to receive telegrams from metersunderground and over larger distances.
Wmbusmeters expects the serial baud rate for the AMB8465 USB stick to be 9600 8n1.If you have used another tool and changed the baud rate to something elseyou need to restore the baud rate to 9600 8n1. You can do that with that other tool,or you can try wmbusmeters-admin and selectReset wmbus receives
this command try all potential baud rates and send the factory reset command.Then you have to unplug and reinsert the dongle.
If you like to send the bytes manually, the correct bytes are:
- Factory reset of the settings:
0xFF1100EE
- Reset the stick to apply the factory defaults:
0xFF0500FA
this is not necessary if you unplug and reinsert the dongle.
Drivers are self contained source code files namedsrc/driver_xyz.cc
They register themselves at startup. The source file also contains the necessary tests for that driver.
Read more here:doc/CreateDriver.md
If you do not get proper readings from the meters with non-standard protocols. apator162, mkradio3, vario451then you have to open an issue here and help out by logging a lot of messages and reverse engineer themeven more..... :-/
There is also a lot of wmbus protocol implementation details thatare missing. They will be added to the program as we figure outhow the meters send their data.
About
Read the wireless mbus protocol to acquire utility meter readings.
Resources
License
Stars
Watchers
Forks
Packages0
Languages
- C++80.8%
- C8.6%
- Shell7.6%
- M41.0%
- Makefile0.8%
- Roff0.5%
- Other0.7%