107 Commits

Author SHA1 Message Date
d063561b27 ignore known warnings 2020-11-20 11:15:04 +01:00
e1f4dbdd52 changelog: Add release 0.9.0 2020-07-19 12:58:27 +02:00
107d44b7e9 build: temporary revert to autotools (#174)
As long as cmake doesn't generate suitable deb packages, we need to
switch back :(
2020-07-19 12:58:27 +02:00
f498cf1a37 Add Dockerfile.test to run tests from docker (#165) 2020-07-08 15:47:03 +02:00
3897ac72da Rewrite ccpp.yml to use multi-line command (#165)
For enhanced readability, split the commands over several lines.
2020-07-08 15:47:03 +02:00
e89f929f6c Fix bug, test script should accept both 1 and 2 arguments (#165)
Usefull when placing the output in another directory.
2020-07-08 15:47:03 +02:00
69019312c9 Enforce tests execute ok (#165) 2020-07-08 15:47:03 +02:00
2d09cfc41d Move invalid_length*.hex to test/unsupported-frames (#165) 2020-07-08 15:47:03 +02:00
446cf41a2a Move RVD235 out of unsupported
Especially after the recent changes, we can consider Siemens RVD235 as
supported.
2020-07-08 12:48:26 +02:00
ec4bff91db Remove duplicate
rvd235.hex is the same as siemens_rvd235.hex
2020-07-08 12:48:26 +02:00
fe2b4ec024 Add more test frames
Aquametro CALEC MB (Heat)
Eastron SDM630 (Electricity)
Sensus PolluCom E (Heat)
Tecson (Oil)
2020-07-08 11:54:38 +02:00
8d781ad240 Improve product strings for Aquametro and Sensus 2020-07-08 11:54:38 +02:00
67ea2d3900 Implement all of VIF extensions for 0xFB (#166) 2020-07-08 11:31:13 +02:00
5b26e62f55 Implement all of VIF extensions for 0xFD (#166) 2020-07-08 11:31:13 +02:00
6c1e2026d6 Update normalized XML files
This updates the affected XML files after the recent fixes to the VIF
description.
2020-07-07 10:17:39 +02:00
908334af0b Fix VIF descriptions 2020-07-07 10:17:39 +02:00
e27a95c4db Merge pull request #168 from rscada/generate-norm-xml
Also generate normalized XML
2020-07-06 13:07:05 +02:00
9799794213 Add normalized XML files of test frames 2020-07-06 12:55:05 +02:00
bf177d1fe7 Also generate normalized XML
In order to increase the test coverage also generate the normalized version
of XML output.
2020-07-06 12:06:39 +02:00
17a73287c2 Improve BCD decoding (#167)
* Introduce mbus_data_bcd_decode_hex

The convert function mbus_data_bcd_decode (BCD to decimal) suffers from
information loss in case of hexacimal digits. So introduce a new function
mbus_data_bcd_decode_hex (BCD to hexadecimal), which isn't affected and
use this for default XML output. But keep mbus_data_bcd_decode for
normalized output.
2020-06-28 10:28:40 +02:00
1e25cf1096 Fix Linux build target
Linux uses lib as prefix, which results into unintended liblibmbus.so
So avoid such a prefix.
2020-06-27 16:10:17 +02:00
23d8ee4844 Added more medium definitions according to DIN EN 13757-7:2018-06 (#162) 2020-06-05 13:12:44 +02:00
643022388d Add product strings for Sensoco devices (#161) 2020-06-05 13:05:43 +02:00
b5e59aa52f fix: add missing declaration to header (#160) 2020-05-15 19:05:36 +02:00
baf03e2a47 Merge pull request #151 from gocarlos/feat--add-cmake-support
build: add cmake support
2020-04-24 20:18:09 +02:00
ba18321e11 chore: run tests also with pull requests 2020-04-24 15:14:15 +02:00
f569816788 chore: make path to tests optional 2020-04-24 09:55:01 +02:00
716fe0358c fix: debian package blank line in value of field Description 2020-04-14 11:36:39 +02:00
ee3a69e5df docs: add better usage to generate xml script 2020-04-14 11:22:40 +02:00
9f9c7a5dbf fix: unit tests 2020-04-14 11:01:07 +02:00
f31fbea817 build: add devel package 2020-04-14 10:29:22 +02:00
f3a62d560b chore: apply suggestions from code review
Co-Authored-By: Anonymous Maarten <madebr@users.noreply.github.com>
2020-04-01 22:38:53 +02:00
989404de83 chore: simplify cmake 2020-04-01 15:53:54 +02:00
b58aca4432 build: symplify clang tidy 2020-04-01 15:52:21 +02:00
505c25aa9b chore: apply suggestions from code review
Co-Authored-By: Anonymous Maarten <madebr@users.noreply.github.com>
2020-03-31 23:45:53 +02:00
fffdca0504 build: apply suggestions from code review
Co-Authored-By: Anonymous Maarten <madebr@users.noreply.github.com>
2020-03-31 21:42:49 +02:00
b0f413037a test: update generate-xml script 2020-03-31 21:38:51 +02:00
724822b3ab build: add pkg config file 2020-03-31 20:31:18 +02:00
155e245b61 build: add also android 2020-03-31 20:31:18 +02:00
ff2e50a38a build: do not use gnu style warnings for msvc 2020-03-31 20:31:18 +02:00
bd2fa5759b build: remove old build system 2020-03-31 20:31:18 +02:00
6fb724698f build: install doxygen in ci 2020-03-31 20:31:18 +02:00
5a3d13e7ad build: add documentation 2020-03-31 20:31:14 +02:00
576da85302 build: add dockerfiles for deb and rpm 2020-03-31 20:30:53 +02:00
433b3c4219 feat: add github actions
* feat: add github actions

* Update ccpp.yml

* build: build and install deb in container

* build: clean up
2020-03-31 20:30:50 +02:00
e864d27fbf build: add debian package 2020-03-31 20:30:23 +02:00
89db118821 build: add coverage information 2020-03-31 20:30:23 +02:00
d96dcfad09 build: add cmake support
feat: add cmake support

chore: remove old code

revert: remove mbus_data_record_unit

build: do not break existing building system
2020-03-31 20:30:18 +02:00
6edab86078 refactor: clean up some compiler warnings (#152) 2020-03-21 10:50:33 +01:00
62ac3678ff Fix prefixes (#148) 2019-07-08 10:38:20 +02:00
2dc3daaf70 Prepare new release 0.9.0 2019-02-22 19:08:04 +01:00
36a85d3737 Add product string of Hydrometer Sharky 775 2019-02-20 22:01:47 +01:00
2f9fa5ccc8 Implement negative BCD number (Type A)
According to W4B21021.pdf Appendix A a hex code Fh in the MSD
position signals a negative BCD number.
2019-02-20 22:01:47 +01:00
027f6fb689 prevent multiple calls to disconnect for serial and tcp (#137)
* prevent multiple calls to disconnect for serial and tcp
2018-03-28 19:53:17 +02:00
de4a899b9d Merge pull request #136 from Apollon77/iso-dates
make generated timestamps conform to ISO definition
2018-03-28 17:09:56 +02:00
2a2fbc372a make generated timestamps conform to ISO definition 2018-03-28 14:26:06 +02:00
6d3bb00d97 Merge pull request #134 from lategoodbye/set-primary-address
Add binary to set primary address
2018-03-26 11:15:40 +02:00
84c43fe7a3 Add new program to set primary address 2018-03-21 21:44:50 +01:00
73d58a9f7d Implement mbus_set_primary_address()
This function sends a frame to change primary address of a slave.
2018-03-21 21:40:58 +01:00
ab8919136d Update LICENSE
See #129
2017-08-27 12:10:13 +02:00
2680079db4 Move license into separate file
See: https://github.com/rscada/libmbus/issues/129
2017-08-16 19:31:49 +02:00
a572c0f742 mbus-serial: Increase serial timeouts
We need to take USB to serial adapters into account for timeout
calculation.
2017-04-07 15:59:44 +00:00
3d5b865ebe Merge pull request #111 from lategoodbye/upstream-cp48
Implement type I CP48 (date and time)
2016-07-28 16:22:26 +02:00
3a2357324d Update test frames to new date/time decoding 2016-07-23 09:38:57 +00:00
87e3c22f85 Implement Type I CP48 (date and time) 2016-07-23 09:38:41 +00:00
094c9ef453 Fix year handling in mbus_data_tm_decode
According to ANSI C the member tm_year saves the years since
1900.
2016-07-23 09:38:14 +00:00
6fd4ca2714 Merge pull request #103 from strongly-typed/fix/xmlregression
Fix regression with XML output.
2016-05-09 20:06:39 +02:00
3aba0a062e Merge pull request #102 from strongly-typed/feature/travisci
Travis builds for OS X, too. And Travis badge.
2016-05-09 19:57:34 +02:00
b9bec04027 Tests: Add XML files for hexdumps of error frames. 2016-05-09 01:36:50 +02:00
9bf9f4bbf0 Tests: Add XML files for hexdumps added in a659ca0.
It is unclear if these interpretations are correct.
But at least it can spot regressions in future commits.
2016-05-09 01:36:27 +02:00
c59f584937 Tests: Update XML files fixes in a8eaced. 2016-05-09 01:28:08 +02:00
ab59b56a49 Tests: add product strings added with ed87f62 2016-05-09 01:28:08 +02:00
1fc2323080 Run tests with Travis CI. gitignore test xml.new. 2016-05-09 01:28:02 +02:00
0e5b5b46a8 Fix regression with XML output.
Copy-paste error from 9edcc44.

Spotted with `cd test && ./generate-xml.sh test-frames`

    --- test-frames/manual_frame2.xml	2016-05-09 00:19:44.000000000 +0200
    +++ test-frames/manual_frame2.xml.new	2016-05-09 01:09:09.000000000 +0200
    @@ -17,7 +17,7 @@
         <DataRecord id="1">
             <Function>Actual value</Function>
             <Unit>reserved but historic</Unit>
    -        <Value>135</Value>
    +        <Value>1</Value>
         </DataRecord>
    
     </MBusData>
2016-05-09 01:11:23 +02:00
8c232f3da3 Travis builds for OS X, too. And Travis badge.
s/README/README.md/ to add badge to Github main page.
2016-05-08 22:47:28 +02:00
a8eaceda40 Merge pull request #99 from rscada/bugfixes
Bugfixes
2016-04-01 21:26:40 +02:00
9edcc44eeb Fix several format string issues 2016-04-01 19:20:00 +00:00
7fe67c8586 Fix format string in mbus_send_user_data_frame 2016-04-01 18:27:59 +00:00
9906723447 Fix IEEE754 conversion
It seems that the endianness handling was broken in
ef6c4be655 ("Safer IEEE754 conversion."). So drop it.
2016-04-01 18:19:32 +00:00
78298bc68e Merge pull request #93 from arska/feature-ignoretestbinaries
Thanks a lot
2016-03-26 11:43:42 +01:00
b6cbb1de1e merge rscada/master with arska/feature-ignoretestbinaries 2016-03-25 23:20:34 +01:00
b9b131d064 Order device detection by manufacurer
merging ELS so that TMP-A is detected again
2016-02-08 14:06:24 +01:00
ee2c4bada8 Merge pull request #96 from lategoodbye/upstream-merge2
Upstream merge round #2
2016-02-06 13:37:12 +01:00
ed87f62a87 Add product strings for devices from ABB, Elster and Relay
This patch adds product identification for:
* ABB Delta-Meter
* Elster Falcon
* Relay PadPuls M1
* Relay PadPuls M4
* Relay Padin 4
* Relay AnDi 4
* Relay PadPuls M2
2016-02-06 12:04:13 +00:00
a659ca0494 Add some hexdumps of M-Bus frames 2016-02-06 11:06:03 +00:00
cf4d11b0fc Merge pull request #92 from arska/feature-macosxbuild
Add Macos X build support (thanks @samkrew)
2016-02-06 00:54:25 +01:00
8af6b97647 Add MacOS X build support 2016-02-05 18:51:02 +01:00
eaeb6e5502 retab and remove trailing whitespace 2016-02-05 14:42:16 +01:00
c11ef4b830 add XML output for existing test cases 2016-02-05 14:42:15 +01:00
9fb9f30a58 add new test cases from my lab 2016-02-05 14:42:15 +01:00
7eaadad124 update existing test-case-output with the changes introduced in 781736fe4c 2016-02-05 14:42:15 +01:00
0751e0d88f remove exec bit from test cases 2016-02-05 14:42:12 +01:00
b55422b034 move error test cases to their own folder 2016-02-05 14:41:05 +01:00
89195f627a retab and remove trailing whitespace 2016-02-05 14:36:19 +01:00
2170faa357 gitignore test binaries and testing temp files 2016-02-05 13:41:01 +01:00
8b1c012a91 Add product strings of Janitza UMG 96S 2016-02-02 18:57:57 +00:00
012dc5ba36 Merge pull request #91 from lategoodbye/upstream-merge
Upstream merge
2016-01-31 19:19:03 +01:00
db40010b93 Add product strings of Berg DCMi, BLMi and BMB-10S0 2016-01-31 18:09:21 +00:00
04eae740b4 Add product strings of Carlo Gavazzi EM21,EM24,EM33 2016-01-31 18:00:02 +00:00
0927f23ee7 Let mbus_str_xml_encode return a resultcode 2016-01-31 17:55:09 +00:00
3699d25b10 Fix uninitialized strings 2016-01-31 17:44:08 +00:00
f6dcf6e8d1 Fixed naming in declaration
Signed-off-by: Stefan Wahren <info@lategoodbye.de>
2016-01-31 17:41:08 +00:00
5674b30a6c Make use of package version from autotools
Signed-off-by: Stefan Wahren <info@lategoodbye.de>
2016-01-31 17:40:58 +00:00
bce4c6959b Merge pull request #87 from vrtsystems/ieee754-conversion
IEEE754 conversion
2015-12-30 10:17:24 +09:00
ef6c4be655 Safer IEEE754 conversion.
The conversion given assumed two things:

1. the pointer was either 32-bit aligned or that unaligned word access
   was safe.  (Not the case on ARM)

We avoid this by using memcpy to copy to a buffer that *is*
32-bit-word-aligned.

2. the word was in native-endian format.

The original code appeared to assume the given word would be in
big-endian format (aka "network" byte order), so we convert it to the
host's native format before casting.

We re-instate the original implementation, controlled by a compiler
switch to allow easy rollback if problems are encountered.
2015-12-03 08:08:22 +10:00
583a397e8e Needless math.h include 2015-12-03 07:52:23 +10:00
7e1be93dbd Needless IEEE754 conversion, float pointer cast instead 2015-12-03 07:51:26 +10:00
255 changed files with 17756 additions and 489 deletions

2
.dockerignore Normal file
View File

@ -0,0 +1,2 @@
/_build
/build

17
.gitignore vendored
View File

@ -10,7 +10,6 @@ test/Makefile.in
/compile
config.guess
config.sub
config.h.in
configure
/depcomp
/install-sh
@ -52,6 +51,7 @@ bin/mbus-serial-request-data-multi-reply
bin/mbus-serial-scan
bin/mbus-serial-scan-secondary
bin/mbus-serial-select-secondary
bin/mbus-serial-set-address
bin/mbus-serial-switch-baudrate
bin/mbus-tcp-raw-send
bin/mbus-tcp-request-data
@ -62,3 +62,18 @@ bin/mbus-tcp-select-secondary
bin/mbus-tcp-application-reset
!*.c
# test binaries
test/mbus_parse
test/mbus_parse_hex
# test cases temp files
test/test-frames/*.xml.new
test/error-frames/*.xml.new
test/unsupported-frames/*.xml.new
/build/
_build/
# IDE
/.vscode/
CMakeLists.txt.user

View File

@ -4,4 +4,12 @@ compiler:
- gcc
- clang
script: ./build.sh
os:
- linux
- osx
script:
- ./build.sh
- cd test && make && ./generate-xml.sh test-frames
- cd test && make && ./generate-xml.sh test/error-frames || true
- cd test && make && ./generate-xml.sh test/unsupported-frames || true

16
COPYING
View File

@ -20,19 +20,5 @@ Contributers:
* Pelle van der Heide
* James Michael DuPont
* Uwe Grohnwaldt
* Markus Bergkvist
LICENSE (the BSD license):
Copyright (c) 2010-2012, Raditex Control AB
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the Raditex Control AB nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* Markus Bergkvist

View File

@ -14,7 +14,7 @@ Basic Installation
Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
more-detailed instructions are generic; see the `README.md' file for
instructions specific to this package. Some packages provide this
`INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
@ -38,7 +38,7 @@ cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
diffs or instructions to the address given in the `README.md' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
@ -200,7 +200,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
`README.md' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually

29
LICENSE Normal file
View File

@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2010-2012, Raditex Control AB
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -10,7 +10,7 @@ pkgconfig_DATA = libmbus.pc
docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)
dist_docdir = $(DESTDIR)$(docdir)
doc_DATA = README \
doc_DATA = README.md \
COPYING \
hardware/MBus_USB.pdf \
hardware/MBus_USB.txt

7
README
View File

@ -1,7 +0,0 @@
libmbus: M-bus Library from Raditex Control (http://www.rscada.se)
libmbus is an open source library for the M-bus (Meter-Bus) protocol. The Meter-Bus is a standard for reading out meter data from electricity meters, heat meters, gas meters, etc. The M-bus standard deals with both the electrical signals on the M-Bus, and the protocol and data format used in transmissions on the M-Bus. The role of libmbus is to decode/encode M-bus data, and to handle the communication with M-Bus devices.
For more information see http://www.rscada.se/libmbus

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# libmbus: M-bus Library from Raditex Control (http://www.rscada.se) <span style="float:right;"><a href="https://travis-ci.org/rscada/libmbus" style="border-bottom:none">![Build Status](https://travis-ci.org/rscada/libmbus.svg?branch=master)</a></span>
libmbus is an open source library for the M-bus (Meter-Bus) protocol.
The Meter-Bus is a standard for reading out meter data from electricity meters,
heat meters, gas meters, etc. The M-bus standard deals with both the electrical
signals on the M-Bus, and the protocol and data format used in transmissions on
the M-Bus. The role of libmbus is to decode/encode M-bus data, and to handle
the communication with M-Bus devices.
For more information see http://www.rscada.se/libmbus

View File

@ -17,7 +17,8 @@ bin_PROGRAMS = mbus-tcp-scan mbus-tcp-request-data mbus-tcp-request-data-multi
mbus-tcp-select-secondary mbus-tcp-scan-secondary \
mbus-serial-scan mbus-serial-request-data mbus-serial-request-data-multi-reply \
mbus-serial-select-secondary mbus-serial-scan-secondary \
mbus-serial-switch-baudrate mbus-tcp-raw-send mbus-tcp-application-reset
mbus-serial-switch-baudrate mbus-tcp-raw-send mbus-tcp-application-reset \
mbus-serial-set-address
# tcp
mbus_tcp_scan_LDFLAGS = -L$(top_builddir)/mbus
@ -73,6 +74,10 @@ mbus_serial_switch_baudrate_LDFLAGS = -L$(top_builddir)/mbus
mbus_serial_switch_baudrate_LDADD = -lmbus -lm
mbus_serial_switch_baudrate_SOURCES = mbus-serial-switch-baudrate.c
mbus_serial_set_address_LDFLAGS = -L$(top_builddir)/mbus
mbus_serial_set_address_LDADD = -lmbus -lm
mbus_serial_set_address_SOURCES = mbus-serial-set-address.c
# man pages
dist_man_MANS = libmbus.1 \
mbus-tcp-scan.1 \

View File

@ -10,6 +10,8 @@ the communication with M-Bus devices.
B<mbus-serial-switch-baudrate> [-b BAUDRATE] device address target-baudrate
B<mbus-serial-set-address> [-d] [-b BAUDRATE] device mbus-address new-primary-address
B<mbus-serial-scan> [-d] [-b BAUDRATE] [-r RETRIES] device
B<mbus-tcp-scan> [-d] [-r RETRIES] host port

View File

@ -0,0 +1,2 @@
.so man1/libmbus.1

View File

@ -0,0 +1,229 @@
//------------------------------------------------------------------------------
// Copyright (C) 2011, Robert Johansson, Raditex AB
// All rights reserved.
//
// rSCADA
// http://www.rSCADA.se
// info@rscada.se
//
//------------------------------------------------------------------------------
#include <string.h>
#include <stdio.h>
#include <mbus/mbus.h>
static int debug = 0;
//
// init slave to get really the beginning of the records
//
static int
init_slaves(mbus_handle *handle)
{
if (debug)
printf("%s: debug: sending init frame #1\n", __PRETTY_FUNCTION__);
if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1)
{
return 0;
}
//
// resend SND_NKE, maybe the first get lost
//
if (debug)
printf("%s: debug: sending init frame #2\n", __PRETTY_FUNCTION__);
if (mbus_send_ping_frame(handle, MBUS_ADDRESS_NETWORK_LAYER, 1) == -1)
{
return 0;
}
return 1;
}
//------------------------------------------------------------------------------
// set primary address
//------------------------------------------------------------------------------
int
main(int argc, char **argv)
{
mbus_handle *handle = NULL;
mbus_frame reply;
char *device, *old_address_str, *xml_result;
int old_address, new_address;
long baudrate = 9600;
int ret;
if (argc == 4)
{
device = argv[1];
old_address_str = argv[2];
new_address = atoi(argv[3]);
}
else if (argc == 5 && strcmp(argv[1], "-d") == 0)
{
device = argv[2];
old_address_str = argv[3];
new_address = atoi(argv[4]);
debug = 1;
}
else if (argc == 6 && strcmp(argv[1], "-b") == 0)
{
baudrate = atol(argv[2]);
device = argv[3];
old_address_str = argv[4];
new_address = atoi(argv[5]);
}
else if (argc == 7 && strcmp(argv[1], "-d") == 0 && strcmp(argv[2], "-b") == 0)
{
baudrate = atol(argv[3]);
device = argv[4];
old_address_str = argv[5];
new_address = atoi(argv[6]);
debug = 1;
}
else
{
fprintf(stderr, "usage: %s [-d] [-b BAUDRATE] device mbus-address new-primary-address\n", argv[0]);
fprintf(stderr, " optional flag -d for debug printout\n");
fprintf(stderr, " optional flag -b for selecting baudrate\n");
return 0;
}
if (mbus_is_primary_address(new_address) == 0)
{
fprintf(stderr, "Invalid new primary address\n");
return -1;
}
switch (new_address)
{
case MBUS_ADDRESS_NETWORK_LAYER:
case MBUS_ADDRESS_BROADCAST_REPLY:
case MBUS_ADDRESS_BROADCAST_NOREPLY:
fprintf(stderr, "Invalid new primary address\n");
return -1;
}
if ((handle = mbus_context_serial(device)) == NULL)
{
fprintf(stderr, "Could not initialize M-Bus context: %s\n", mbus_error_str());
return 1;
}
if (debug)
{
mbus_register_send_event(handle, &mbus_dump_send_event);
mbus_register_recv_event(handle, &mbus_dump_recv_event);
}
if (mbus_connect(handle) == -1)
{
fprintf(stderr,"Failed to setup connection to M-bus gateway\n");
mbus_context_free(handle);
return 1;
}
if (mbus_serial_set_baudrate(handle, baudrate) == -1)
{
fprintf(stderr,"Failed to set baud rate.\n");
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
if (init_slaves(handle) == 0)
{
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
if (mbus_send_ping_frame(handle, new_address, 0) == -1)
{
fprintf(stderr, "Verification failed. Could not send ping frame: %s\n", mbus_error_str());
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
if (mbus_recv_frame(handle, &reply) != MBUS_RECV_RESULT_TIMEOUT)
{
fprintf(stderr, "Verification failed. Got a response from new address\n");
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
if (mbus_is_secondary_address(old_address_str))
{
// secondary addressing
ret = mbus_select_secondary_address(handle, old_address_str);
if (ret == MBUS_PROBE_COLLISION)
{
fprintf(stderr, "%s: Error: The address mask [%s] matches more than one device.\n", __PRETTY_FUNCTION__, old_address_str);
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
else if (ret == MBUS_PROBE_NOTHING)
{
fprintf(stderr, "%s: Error: The selected secondary address does not match any device [%s].\n", __PRETTY_FUNCTION__, old_address_str);
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
else if (ret == MBUS_PROBE_ERROR)
{
fprintf(stderr, "%s: Error: Failed to select secondary address [%s].\n", __PRETTY_FUNCTION__, old_address_str);
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
// else MBUS_PROBE_SINGLE
old_address = MBUS_ADDRESS_NETWORK_LAYER;
}
else
{
// primary addressing
old_address = atoi(old_address_str);
}
if (mbus_set_primary_address(handle, old_address, new_address) == -1)
{
fprintf(stderr, "Failed to send set primary address frame: %s\n", mbus_error_str());
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
memset(&reply, 0, sizeof(mbus_frame));
ret = mbus_recv_frame(handle, &reply);
if (ret == MBUS_RECV_RESULT_TIMEOUT)
{
fprintf(stderr, "No reply from device\n");
mbus_disconnect(handle);
mbus_context_free(handle);
return 1;
}
else if (mbus_frame_type(&reply) != MBUS_FRAME_TYPE_ACK)
{
fprintf(stderr, "Unknown reply:\n");
mbus_frame_print(&reply);
}
else
{
printf("Set primary address of device to %d\n", new_address);
}
mbus_disconnect(handle);
mbus_context_free(handle);
return 0;
}

View File

@ -86,7 +86,7 @@ main(int argc, char **argv)
}
else
{
printf("Switched baud rate of device to %lu\n", target_baudrate);
printf("Switched baud rate of device to %ld\n", target_baudrate);
}
mbus_disconnect(handle);

View File

@ -2,19 +2,17 @@
#
if [ -f Makefile ]; then
#
# use existing automake files
#
echo >> /dev/null
# use existing automake files
echo >> /dev/null
else
#
# regenerate automake files
#
# regenerate automake files
echo "Running autotools..."
autoheader \
&& aclocal \
&& libtoolize --ltdl --copy --force \
&& case \
$(uname) in Darwin*) glibtoolize --ltdl --copy --force ;; \
*) libtoolize --ltdl --copy --force ;; esac \
&& automake --add-missing --copy \
&& autoconf \
&& ./configure

View File

@ -10,7 +10,7 @@ dnl ----------------------------------------------------------------------------
LT_CONFIG_LTDL_DIR([libltdl])
AC_INIT([libmbus], [0.8.0], [info@rscada.se], [libmbus], [http://www.rscada.se/libmbus/])
AC_INIT([libmbus], [0.9.0], [info@rscada.se], [libmbus], [http://www.rscada.se/libmbus/])
AC_CONFIG_AUX_DIR([libltdl/config])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
@ -18,7 +18,7 @@ AM_PROG_LIBTOOL
# fix for automake 1.11 & 1.12
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
LDFLAGS="$LDFLAGS -version-info 0:8:0"
LDFLAGS="$LDFLAGS -version-info 0:9:0"
dnl ----------------------
dnl

12
debian/changelog vendored
View File

@ -1,3 +1,15 @@
libmbus (0.9.0) xenial; urgency=medium
* New official release
- major improvement to frame decoding
- new binaries: mbus-tcp-raw-send, mbus-tcp-application-reset,
mbus-serial-set-address
- simple echo cancellation
- replace CUnit test with test/generate-xml.sh
* debian/control: new package libmbus1-dbg
-- Stefan Wahren <stefan.wahren@i2se.com> Fri, 22 Feb 2019 19:08:04 +0100
libmbus (0.8.0) precise; urgency=low
* New official release. Includes support for multi-telegram communication.

View File

@ -11,10 +11,10 @@
Summary: Open source M-bus (Meter-Bus) library
Name: libmbus
Version: 0.8.0
Version: 0.9.0
Release: 1
Source: http://www.rscada.se/public-dist/%{name}-%{version}.tar.gz
URL: http://www.rscada.se/libmbus/
Source: https://github.com/rscada/%{name}/archive/%{version}.tar.gz
URL: https://github.com/rscada/libmbus/
License: BSD
Vendor: Raditex Control AB
Packager: Stefan Wahren <info@lategoodbye.de>
@ -64,13 +64,12 @@ rm -rf "%buildroot"
%files
%defattr (-,root,root)
%doc COPYING README
%doc COPYING README.md
%{_bindir}/mbus-serial-*
%{_bindir}/mbus-tcp-*
%{_libdir}/libmbus.so*
# man pages doesn't exist in this version
# %{_mandir}/man1/libmbus.1
# %{_mandir}/man1/mbus-*
%{_mandir}/man1/libmbus.1
%{_mandir}/man1/mbus-*
%files devel
%defattr (-,root,root)
@ -80,5 +79,9 @@ rm -rf "%buildroot"
%{_libdir}/pkgconfig/libmbus.pc
%changelog
* Fri Feb 22 2019 Stefan Wahren <info@lategoodbye.de> - 0.9.0-1
- switch to github repo
- enable man pages
* Fri Mar 29 2013 Stefan Wahren <info@lategoodbye.de> - 0.8.0-1
- Initial package based on the last official release
- Initial package based on the last official release

View File

@ -154,17 +154,17 @@ mbus_variable_vif vif_table[] = {
{ 0x56, 1.0e3, "kg/h", "Mass flow" },
{ 0x57, 1.0e4, "kg/h", "Mass flow" },
/* E101 10nn Flow Temperature <EFBFBD>C (0.001<EFBFBD>C to 1<EFBFBD>C) */
{ 0x58, 1.0e-3, "<EFBFBD>C", "Flow temperature" },
{ 0x59, 1.0e-2, "<EFBFBD>C", "Flow temperature" },
{ 0x5A, 1.0e-1, "<EFBFBD>C", "Flow temperature" },
{ 0x5B, 1.0e0, "<EFBFBD>C", "Flow temperature" },
/* E101 10nn Flow Temperature °C (0.001°C to 1°C) */
{ 0x58, 1.0e-3, "°C", "Flow temperature" },
{ 0x59, 1.0e-2, "°C", "Flow temperature" },
{ 0x5A, 1.0e-1, "°C", "Flow temperature" },
{ 0x5B, 1.0e0, "°C", "Flow temperature" },
/* E101 11nn Return Temperature <EFBFBD>C (0.001<EFBFBD>C to 1<EFBFBD>C) */
{ 0x5C, 1.0e-3, "<EFBFBD>C", "Return temperature" },
{ 0x5D, 1.0e-2, "<EFBFBD>C", "Return temperature" },
{ 0x5E, 1.0e-1, "<EFBFBD>C", "Return temperature" },
{ 0x5F, 1.0e0, "<EFBFBD>C", "Return temperature" },
/* E101 11nn Return Temperature °C (0.001°C to 1°C) */
{ 0x5C, 1.0e-3, "°C", "Return temperature" },
{ 0x5D, 1.0e-2, "°C", "Return temperature" },
{ 0x5E, 1.0e-1, "°C", "Return temperature" },
{ 0x5F, 1.0e0, "°C", "Return temperature" },
/* E110 00nn Temperature Difference K (mK to K) */
{ 0x60, 1.0e-3, "K", "Temperature difference" },
@ -172,11 +172,11 @@ mbus_variable_vif vif_table[] = {
{ 0x62, 1.0e-1, "K", "Temperature difference" },
{ 0x63, 1.0e0, "K", "Temperature difference" },
/* E110 01nn External Temperature <EFBFBD>C (0.001<EFBFBD>C to 1<EFBFBD>C) */
{ 0x64, 1.0e-3, "<EFBFBD>C", "External temperature" },
{ 0x65, 1.0e-2, "<EFBFBD>C", "External temperature" },
{ 0x66, 1.0e-1, "<EFBFBD>C", "External temperature" },
{ 0x67, 1.0e0, "<EFBFBD>C", "External temperature" },
/* E110 01nn External Temperature °C (0.001°C to 1°C) */
{ 0x64, 1.0e-3, "°C", "External temperature" },
{ 0x65, 1.0e-2, "°C", "External temperature" },
{ 0x66, 1.0e-1, "°C", "External temperature" },
{ 0x67, 1.0e0, "°C", "External temperature" },
/* E110 10nn Pressure bar (1mbar to 1000mbar) */
{ 0x68, 1.0e-3, "bar", "Pressure" },
@ -201,10 +201,10 @@ mbus_variable_vif vif_table[] = {
{ 0x73, 86400.0, "s", "Averaging Duration" }, /* days */
/* E111 01nn Actuality Duration s */
{ 0x74, 1.0, "s", "Averaging Duration" }, /* seconds */
{ 0x75, 60.0, "s", "Averaging Duration" }, /* minutes */
{ 0x76, 3600.0, "s", "Averaging Duration" }, /* hours */
{ 0x77, 86400.0, "s", "Averaging Duration" }, /* days */
{ 0x74, 1.0, "s", "Actuality Duration" }, /* seconds */
{ 0x75, 60.0, "s", "Actuality Duration" }, /* minutes */
{ 0x76, 3600.0, "s", "Actuality Duration" }, /* hours */
{ 0x77, 86400.0, "s", "Actuality Duration" }, /* days */
/* Fabrication No */
{ 0x78, 1.0, "", "Fabrication No" },
@ -247,7 +247,7 @@ mbus_variable_vif vif_table[] = {
{ 0x108, 1.0e0, "", "Access Number (transmission count)" },
/* E000 1001 Medium (as in fixed header) */
{ 0x109, 1.0e0, "", "Device type" },
{ 0x109, 1.0e0, "", "Medium" },
/* E000 1010 Manufacturer (as in fixed header) */
{ 0x10A, 1.0e0, "", "Manufacturer" },
@ -256,7 +256,7 @@ mbus_variable_vif vif_table[] = {
{ 0x10B, 1.0e0, "", "Parameter set identification" },
/* E000 1100 Model / Version */
{ 0x10C, 1.0e0, "", "Device type" },
{ 0x10C, 1.0e0, "", "Model / Version" },
/* E000 1101 Hardware version # */
{ 0x10D, 1.0e0, "", "Hardware version" },
@ -356,9 +356,9 @@ mbus_variable_vif vif_table[] = {
{ 0x130, 1.0e0, "Reserved", "Reserved" }, /* ???? */
/* E011 00nn Duration of tariff (nn=01 ..11: min to days) */
{ 0x131, 60.0, "s", "Storage interval" }, /* minute(s) */
{ 0x132, 3600.0, "s", "Storage interval" }, /* hour(s) */
{ 0x133, 86400.0, "s", "Storage interval" }, /* day(s) */
{ 0x131, 60.0, "s", "Duration of tariff" }, /* minute(s) */
{ 0x132, 3600.0, "s", "Duration of tariff" }, /* hour(s) */
{ 0x133, 86400.0, "s", "Duration of tariff" }, /* day(s) */
/* E011 01nn Period of tariff [sec(s) to day(s)] */
{ 0x134, 1.0, "s", "Period of tariff" }, /* seconds */
@ -608,29 +608,29 @@ mbus_variable_vif vif_table[] = {
{ 0x256, 1.0e0, "Reserved", "Reserved" },
{ 0x257, 1.0e0, "Reserved", "Reserved" },
/* E101 10nn Flow Temperature 10(nn-3) <EFBFBD>F 0.001<EFBFBD>F to 1<EFBFBD>F */
{ 0x258, 1.0e-3, "<EFBFBD>F", "Flow temperature" },
{ 0x259, 1.0e-2, "<EFBFBD>F", "Flow temperature" },
{ 0x25A, 1.0e-1, "<EFBFBD>F", "Flow temperature" },
{ 0x25B, 1.0e0, "<EFBFBD>F", "Flow temperature" },
/* E101 10nn Flow Temperature 10(nn-3) °F 0.001°F to 1°F */
{ 0x258, 1.0e-3, "°F", "Flow temperature" },
{ 0x259, 1.0e-2, "°F", "Flow temperature" },
{ 0x25A, 1.0e-1, "°F", "Flow temperature" },
{ 0x25B, 1.0e0, "°F", "Flow temperature" },
/* E101 11nn Return Temperature 10(nn-3) <EFBFBD>F 0.001<EFBFBD>F to 1<EFBFBD>F */
{ 0x25C, 1.0e-3, "<EFBFBD>F", "Return temperature" },
{ 0x25D, 1.0e-2, "<EFBFBD>F", "Return temperature" },
{ 0x25E, 1.0e-1, "<EFBFBD>F", "Return temperature" },
{ 0x25F, 1.0e0, "<EFBFBD>F", "Return temperature" },
/* E101 11nn Return Temperature 10(nn-3) °F 0.001°F to 1°F */
{ 0x25C, 1.0e-3, "°F", "Return temperature" },
{ 0x25D, 1.0e-2, "°F", "Return temperature" },
{ 0x25E, 1.0e-1, "°F", "Return temperature" },
{ 0x25F, 1.0e0, "°F", "Return temperature" },
/* E110 00nn Temperature Difference 10(nn-3) <EFBFBD>F 0.001<EFBFBD>F to 1<EFBFBD>F */
{ 0x260, 1.0e-3, "<EFBFBD>F", "Temperature difference" },
{ 0x261, 1.0e-2, "<EFBFBD>F", "Temperature difference" },
{ 0x262, 1.0e-1, "<EFBFBD>F", "Temperature difference" },
{ 0x263, 1.0e0, "<EFBFBD>F", "Temperature difference" },
/* E110 00nn Temperature Difference 10(nn-3) °F 0.001°F to 1°F */
{ 0x260, 1.0e-3, "°F", "Temperature difference" },
{ 0x261, 1.0e-2, "°F", "Temperature difference" },
{ 0x262, 1.0e-1, "°F", "Temperature difference" },
{ 0x263, 1.0e0, "°F", "Temperature difference" },
/* E110 01nn External Temperature 10(nn-3) <EFBFBD>F 0.001<EFBFBD>F to 1<EFBFBD>F */
{ 0x264, 1.0e-3, "<EFBFBD>F", "External temperature" },
{ 0x265, 1.0e-2, "<EFBFBD>F", "External temperature" },
{ 0x266, 1.0e-1, "<EFBFBD>F", "External temperature" },
{ 0x267, 1.0e0, "<EFBFBD>F", "External temperature" },
/* E110 01nn External Temperature 10(nn-3) °F 0.001°F to 1°F */
{ 0x264, 1.0e-3, "°F", "External temperature" },
{ 0x265, 1.0e-2, "°F", "External temperature" },
{ 0x266, 1.0e-1, "°F", "External temperature" },
{ 0x267, 1.0e0, "°F", "External temperature" },
/* E110 1nnn Reserved */
{ 0x268, 1.0e0, "Reserved", "Reserved" },
@ -642,19 +642,19 @@ mbus_variable_vif vif_table[] = {
{ 0x26E, 1.0e0, "Reserved", "Reserved" },
{ 0x26F, 1.0e0, "Reserved", "Reserved" },
/* E111 00nn Cold / Warm Temperature Limit 10(nn-3) <EFBFBD>F 0.001<EFBFBD>F to 1<EFBFBD>F */
{ 0x270, 1.0e-3, "<EFBFBD>F", "Cold / Warm Temperature Limit" },
{ 0x271, 1.0e-2, "<EFBFBD>F", "Cold / Warm Temperature Limit" },
{ 0x272, 1.0e-1, "<EFBFBD>F", "Cold / Warm Temperature Limit" },
{ 0x273, 1.0e0, "<EFBFBD>F", "Cold / Warm Temperature Limit" },
/* E111 00nn Cold / Warm Temperature Limit 10(nn-3) °F 0.001°F to 1°F */
{ 0x270, 1.0e-3, "°F", "Cold / Warm Temperature Limit" },
{ 0x271, 1.0e-2, "°F", "Cold / Warm Temperature Limit" },
{ 0x272, 1.0e-1, "°F", "Cold / Warm Temperature Limit" },
{ 0x273, 1.0e0, "°F", "Cold / Warm Temperature Limit" },
/* E111 01nn Cold / Warm Temperature Limit 10(nn-3) <EFBFBD>C 0.001<EFBFBD>C to 1<EFBFBD>C */
{ 0x274, 1.0e-3, "<EFBFBD>C", "Cold / Warm Temperature Limit" },
{ 0x275, 1.0e-2, "<EFBFBD>C", "Cold / Warm Temperature Limit" },
{ 0x276, 1.0e-1, "<EFBFBD>C", "Cold / Warm Temperature Limit" },
{ 0x277, 1.0e0, "<EFBFBD>C", "Cold / Warm Temperature Limit" },
/* E111 01nn Cold / Warm Temperature Limit 10(nn-3) °C 0.001°C to 1°C */
{ 0x274, 1.0e-3, "°C", "Cold / Warm Temperature Limit" },
{ 0x275, 1.0e-2, "°C", "Cold / Warm Temperature Limit" },
{ 0x276, 1.0e-1, "°C", "Cold / Warm Temperature Limit" },
{ 0x277, 1.0e0, "°C", "Cold / Warm Temperature Limit" },
/* E111 1nnn cumul. count max power <EFBFBD> 10(nnn-3) W 0.001W to 10000W */
/* E111 1nnn cumul. count max power § 10(nnn-3) W 0.001W to 10000W */
{ 0x278, 1.0e-3, "W", "Cumul count max power" },
{ 0x279, 1.0e-3, "W", "Cumul count max power" },
{ 0x27A, 1.0e-1, "W", "Cumul count max power" },
@ -730,7 +730,7 @@ mbus_variable_vif fixed_table[] = {
{ 0x36, 1.0e1, "m^3/h", "Volume flow" },
{ 0x37, 1.0e2, "m^3/h", "Volume flow" },
{ 0x38, 1.0e-3, "<EFBFBD>C", "Temperature" },
{ 0x38, 1.0e-3, "°C", "Temperature" },
{ 0x39, 1.0e0, "Units for H.C.A.", "H.C.A." },
@ -785,8 +785,6 @@ mbus_register_found_event(mbus_handle * handle, void (*event)(mbus_handle * hand
int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, double *value_out, char **quantity_out)
{
double exponent = 0.0;
int i;
medium_unit = medium_unit & 0x3F;
if (unit_out == NULL || value_out == NULL || quantity_out == NULL)
@ -807,7 +805,7 @@ int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, do
break;
default:
for(i=0; fixed_table[i].vif < 0xfff; ++i)
for(int i=0; fixed_table[i].vif < 0xfff; ++i)
{
if (fixed_table[i].vif == medium_unit)
{
@ -820,7 +818,6 @@ int mbus_fixed_normalize(int medium_unit, long medium_value, char **unit_out, do
*unit_out = strdup("Unknown");
*quantity_out = strdup("Unknown");
exponent = 0.0;
*value_out = 0.0;
return -1;
}
@ -835,7 +832,6 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
unsigned char vif, vife;
struct tm time;
int value_out_int;
long value_out_long;
long long value_out_long_long;
*value_out_real = 0.0;
*value_out_str = NULL;
@ -857,6 +853,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
MBUS_ERROR("Unable to allocate memory");
return -1;
}
*value_out_str[0] = '\0';
*value_out_str_size = 0;
result = 0;
break;
@ -877,7 +874,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
return -1;
}
*value_out_str_size = snprintf(*value_out_str, 11, "%04d-%02d-%02d",
(time.tm_year + 2000),
(time.tm_year + 1900),
(time.tm_mon + 1),
time.tm_mday);
result = 0;
@ -885,7 +882,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
else // normal integer
{
result = mbus_data_int_decode(record->data, 2, &value_out_int);
*value_out_real = value_out_int;
*value_out_real = value_out_int;
}
break;
@ -903,13 +900,13 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
((record->drh.vib.vif == 0xFD) && (vife == 0x70)))
{
mbus_data_tm_decode(&time, record->data, 4);
if ((*value_out_str = (char*) malloc(20)) == NULL)
if ((*value_out_str = (char*) malloc(21)) == NULL)
{
MBUS_ERROR("Unable to allocate memory");
return -1;
}
*value_out_str_size = snprintf(*value_out_str, 20, "%04d-%02d-%02dT%02d:%02d:%02d",
(time.tm_year + 2000),
*value_out_str_size = snprintf(*value_out_str, 21, "%04d-%02d-%02dT%02d:%02d:%02dZ",
(time.tm_year + 1900),
(time.tm_mon + 1),
time.tm_mday,
time.tm_hour,
@ -920,7 +917,7 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
else // normal integer
{
result = mbus_data_int_decode(record->data, 4, &value_out_int);
*value_out_real = value_out_int;
*value_out_real = value_out_int;
}
break;
@ -930,8 +927,33 @@ int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real,
break;
case 0x06: /* 6 byte integer (48 bit) */
result = mbus_data_long_long_decode(record->data, 6, &value_out_long_long);
*value_out_real = value_out_long_long;
// E110 1101 Time Point (date/time)
// E011 0000 Start (date/time) of tariff
// E111 0000 Date and time of battery change
if ( (vif == 0x6D) ||
((record->drh.vib.vif == 0xFD) && (vife == 0x30)) ||
((record->drh.vib.vif == 0xFD) && (vife == 0x70)))
{
mbus_data_tm_decode(&time, record->data, 6);
if ((*value_out_str = (char*) malloc(21)) == NULL)
{
MBUS_ERROR("Unable to allocate memory");
return -1;
}
*value_out_str_size = snprintf(*value_out_str, 21, "%04d-%02d-%02dT%02d:%02d:%02dZ",
(time.tm_year + 1900),
(time.tm_mon + 1),
time.tm_mday,
time.tm_hour,
time.tm_min,
time.tm_sec);
result = 0;
}
else // normal integer
{
result = mbus_data_long_long_decode(record->data, 6, &value_out_long_long);
*value_out_real = value_out_long_long;
}
break;
case 0x07: /* 8 byte integer (64 bit) */
@ -1012,7 +1034,6 @@ int
mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *value_out, char **quantity_out)
{
int i;
double exponent = 1.0;
unsigned newVif = vif & 0xF7F; /* clear extension bit */
MBUS_DEBUG("vif_unit_normalize = 0x%03X \n", vif);
@ -1037,7 +1058,6 @@ mbus_vif_unit_normalize(int vif, double value, char **unit_out, double *value_ou
MBUS_ERROR("%s: Unknown VIF 0x%03X\n", __PRETTY_FUNCTION__, newVif);
*unit_out = strdup("Unknown (VIF=0x%.02X)");
*quantity_out = strdup("Unknown");
exponent = 0.0;
*value_out = 0.0;
return -1;
}
@ -1260,7 +1280,7 @@ mbus_parse_variable_record(mbus_data_record *data)
MBUS_ERROR("%s: memory allocation error\n", __PRETTY_FUNCTION__);
return NULL;
}
record->storage_number = mbus_data_record_storage_number(data);
record->tariff = mbus_data_record_tariff(data);
record->device = mbus_data_record_device(data);
@ -1362,7 +1382,7 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data)
mbus_data_record *record;
mbus_record *norm_record;
char *buff = NULL, *new_buff = NULL;
char str_encoded[768];
char str_encoded[768] = "";
size_t len = 0, buff_size = 8192;
size_t i;
@ -1398,7 +1418,7 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data)
buff = new_buff;
}
len += snprintf(&buff[len], buff_size - len, " <DataRecord id=\"%zd\">\n", i);
len += snprintf(&buff[len], buff_size - len, " <DataRecord id=\"%zu\">\n", i);
if (norm_record != NULL)
{
@ -1787,7 +1807,7 @@ mbus_send_switch_baudrate_frame(mbus_handle * handle, int address, long baudrate
control_information = MBUS_CONTROL_INFO_SET_BAUDRATE_38400;
break;
default:
MBUS_ERROR("%s: invalid baudrate %lu\n", __PRETTY_FUNCTION__, baudrate);
MBUS_ERROR("%s: invalid baudrate %ld\n", __PRETTY_FUNCTION__, baudrate);
return -1;
}
@ -1927,7 +1947,7 @@ mbus_send_user_data_frame(mbus_handle * handle, int address, const unsigned char
if ((data_size > MBUS_FRAME_DATA_LENGTH) || (data_size == 0))
{
MBUS_ERROR("%s: illegal data_size %d\n", __PRETTY_FUNCTION__, data_size);
MBUS_ERROR("%s: illegal data_size %zu\n", __PRETTY_FUNCTION__, data_size);
return -1;
}
@ -1955,6 +1975,33 @@ mbus_send_user_data_frame(mbus_handle * handle, int address, const unsigned char
return retval;
}
//------------------------------------------------------------------------------
// send a request from master to slave in order to change the primary address
//------------------------------------------------------------------------------
int
mbus_set_primary_address(mbus_handle * handle, int old_address, int new_address)
{
/* primary address record, see chapter 6.4.2 */
unsigned char buffer[3] = { 0x01, 0x7A, new_address };
if (mbus_is_primary_address(new_address) == 0)
{
MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, new_address);
return -1;
}
switch (new_address)
{
case MBUS_ADDRESS_NETWORK_LAYER:
case MBUS_ADDRESS_BROADCAST_REPLY:
case MBUS_ADDRESS_BROADCAST_NOREPLY:
MBUS_ERROR("%s: invalid address %d\n", __PRETTY_FUNCTION__, new_address);
return -1;
}
return mbus_send_user_data_frame(handle, old_address, buffer, sizeof(buffer));
}
//------------------------------------------------------------------------------
// send a request from master to slave and collect the reply (replies)
// from the slave.
@ -2278,7 +2325,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi
if (addr == NULL)
{
// show error message, but procede with scan
MBUS_ERROR("Failed to generate secondary address from M-Bus reply frame: %s\n",
MBUS_ERROR("Failed to generate secondary address from M-Bus reply frame: %s\n",
mbus_error_str());
return MBUS_PROBE_NOTHING;
}

View File

@ -307,6 +307,17 @@ int mbus_send_request_frame(mbus_handle * handle, int address);
*/
int mbus_send_user_data_frame(mbus_handle * handle, int address, const unsigned char *data, size_t data_size);
/**
* Sends frame to change primary address of given slave using "unified" handle
*
* @param handle Initialized handle
* @param old_address Old Address (0-255)
* @param new_address New Address (0-250)
*
* @return Zero when successful.
*/
int mbus_set_primary_address(mbus_handle * handle, int old_address, int new_address);
/**
* Sends a request and read replies until no more records available
* or limit is reached.
@ -429,7 +440,7 @@ int mbus_data_fixed_normalize(int medium_unit_byte, long medium_value, char **un
*
* @return zero when OK
*/
int mbus_data_variable_value_decode(mbus_record *record, double *value_out_real, char **value_out_str, int *value_out_str_size);
int mbus_variable_value_decode(mbus_data_record *record, double *value_out_real, char **value_out_str, int *value_out_str_size);
/**
* Decode units and normalize value using VIF/VIFE (used internally by mbus_vib_unit_normalize)

File diff suppressed because it is too large Load Diff

View File

@ -487,10 +487,27 @@ typedef struct _mbus_data_secondary_address {
#define MBUS_VARIABLE_DATA_MEDIUM_HEAT_COOL 0x0D
#define MBUS_VARIABLE_DATA_MEDIUM_BUS 0x0E
#define MBUS_VARIABLE_DATA_MEDIUM_UNKNOWN 0x0F
#define MBUS_VARIABLE_DATA_MEDIUM_IRRIGATION 0x10
#define MBUS_VARIABLE_DATA_MEDIUM_WATER_LOGGER 0x11
#define MBUS_VARIABLE_DATA_MEDIUM_GAS_LOGGER 0x12
#define MBUS_VARIABLE_DATA_MEDIUM_GAS_CONV 0x13
#define MBUS_VARIABLE_DATA_MEDIUM_COLORIFIC 0x14
#define MBUS_VARIABLE_DATA_MEDIUM_BOIL_WATER 0x15
#define MBUS_VARIABLE_DATA_MEDIUM_COLD_WATER 0x16
#define MBUS_VARIABLE_DATA_MEDIUM_DUAL_WATER 0x17
#define MBUS_VARIABLE_DATA_MEDIUM_PRESSURE 0x18
#define MBUS_VARIABLE_DATA_MEDIUM_ADC 0x19
#define MBUS_VARIABLE_DATA_MEDIUM_SMOKE 0x1A
#define MBUS_VARIABLE_DATA_MEDIUM_ROOM_SENSOR 0x1B
#define MBUS_VARIABLE_DATA_MEDIUM_GAS_DETECTOR 0x1C
#define MBUS_VARIABLE_DATA_MEDIUM_BREAKER_E 0x20
#define MBUS_VARIABLE_DATA_MEDIUM_VALVE 0x21
#define MBUS_VARIABLE_DATA_MEDIUM_CUSTOMER_UNIT 0x25
#define MBUS_VARIABLE_DATA_MEDIUM_WASTE_WATER 0x28
#define MBUS_VARIABLE_DATA_MEDIUM_GARBAGE 0x29
#define MBUS_VARIABLE_DATA_MEDIUM_SERVICE_UNIT 0x30
#define MBUS_VARIABLE_DATA_MEDIUM_RC_SYSTEM 0x36
#define MBUS_VARIABLE_DATA_MEDIUM_RC_METER 0x37
//
// Returns the manufacturer ID or zero if the given
@ -498,7 +515,7 @@ typedef struct _mbus_data_secondary_address {
//
unsigned int mbus_manufacturer_id(char *manufacturer);
// Since libmbus writes some special characters (ASCII > 0x7F) into the XML output (e.g. <20>C for centigrade == ASCII 0xB0)
// Since libmbus writes some special characters (ASCII > 0x7F) into the XML output (e.g. <20>C for centigrade == ASCII 0xB0)
// it is useful to attach the appropriate code page for postprocessing.
#define MBUS_XML_PROCESSING_INSTRUCTION "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
@ -554,6 +571,8 @@ const char *mbus_data_fixed_function(int status);
long mbus_data_record_storage_number(mbus_data_record *record);
long mbus_data_record_tariff(mbus_data_record *record);
int mbus_data_record_device(mbus_data_record *record);
const char *mbus_data_record_unit(mbus_data_record *record);
const char *mbus_data_record_value(mbus_data_record *record);
//
// M-Bus frame data struct access/write functions
@ -569,7 +588,7 @@ mbus_slave_data *mbus_slave_data_get(size_t i);
//
// XML generating functions
//
void mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len);
int mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len);
char *mbus_data_xml(mbus_frame_data *data);
char *mbus_data_variable_xml(mbus_data_variable *data);
char *mbus_data_fixed_xml(mbus_data_fixed *data);
@ -608,6 +627,7 @@ int mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int valu
int mbus_data_int_encode(unsigned char *int_data, size_t int_data_size, int value);
long long mbus_data_bcd_decode(unsigned char *bcd_data, size_t bcd_data_size);
long long mbus_data_bcd_decode_hex(unsigned char *bcd_data, size_t bcd_data_size);
int mbus_data_int_decode(unsigned char *int_data, size_t int_data_size, int *value);
int mbus_data_long_decode(unsigned char *int_data, size_t int_data_size, long *value);
int mbus_data_long_long_decode(unsigned char *int_data, size_t int_data_size, long long *value);
@ -643,4 +663,3 @@ int mbus_is_secondary_address(const char * value);
#endif
#endif /* _MBUS_PROTOCOL_H_ */

View File

@ -72,10 +72,13 @@ mbus_serial_connect(mbus_handle *handle)
// between the end of a master send telegram and the beginning of the response telegram of the slave shall be
// between 11 bit times and (330 bit times + 50ms).
//
// For 2400Bd this means (330 + 11) / 2400 + 0.05 = 188.75 ms (added 11 bit periods to receive first byte).
// I.e. timeout of 0.2s seems appropriate for 2400Bd.
// Nowadays the usage of USB to serial adapter is very common, which could
// result in additional delay of 100 ms in worst case.
//
// For 2400Bd this means (330 + 11) / 2400 + 0.15 = 292 ms (added 11 bit periods to receive first byte).
// I.e. timeout of 0.3s seems appropriate for 2400Bd.
term->c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
term->c_cc[VTIME] = (cc_t) 3; // Timeout in 1/10 sec
cfsetispeed(term, B2400);
cfsetospeed(term, B2400);
@ -113,42 +116,42 @@ mbus_serial_set_baudrate(mbus_handle *handle, long baudrate)
{
case 300:
speed = B300;
serial_data->t.c_cc[VTIME] = (cc_t) 12; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 13; // Timeout in 1/10 sec
break;
case 600:
speed = B600;
serial_data->t.c_cc[VTIME] = (cc_t) 6; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 8; // Timeout in 1/10 sec
break;
case 1200:
speed = B1200;
serial_data->t.c_cc[VTIME] = (cc_t) 4; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 5; // Timeout in 1/10 sec
break;
case 2400:
speed = B2400;
serial_data->t.c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 3; // Timeout in 1/10 sec
break;
case 4800:
speed = B4800;
serial_data->t.c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 3; // Timeout in 1/10 sec
break;
case 9600:
speed = B9600;
serial_data->t.c_cc[VTIME] = (cc_t) 1; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
break;
case 19200:
speed = B19200;
serial_data->t.c_cc[VTIME] = (cc_t) 1; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
break;
case 38400:
speed = B38400;
serial_data->t.c_cc[VTIME] = (cc_t) 1; // Timeout in 1/10 sec
serial_data->t.c_cc[VTIME] = (cc_t) 2; // Timeout in 1/10 sec
break;
default:
@ -188,7 +191,13 @@ mbus_serial_disconnect(mbus_handle *handle)
return -1;
}
if (handle->fd < 0)
{
return -1;
}
close(handle->fd);
handle->fd = -1;
return 0;
}
@ -371,4 +380,3 @@ mbus_serial_recv_frame(mbus_handle *handle, mbus_frame *frame)
return MBUS_RECV_RESULT_OK;
}

View File

@ -127,7 +127,13 @@ mbus_tcp_disconnect(mbus_handle *handle)
return -1;
}
if (handle->fd < 0)
{
return -1;
}
close(handle->fd);
handle->fd = -1;
return 0;
}
@ -262,4 +268,3 @@ mbus_tcp_set_timeout_set(double seconds)
return 0;
}

View File

@ -9,6 +9,7 @@
//------------------------------------------------------------------------------
#include "mbus-protocol.h"
#include "../config.h"
//
//
@ -19,4 +20,4 @@ int mbus_init() {return 0;}
/// Return current version of the library
///
const char*
mbus_get_current_version() {return "0.8.0";}
mbus_get_current_version() {return VERSION;}

View File

@ -1,5 +1,14 @@
Release notes for libmbus
Version 0.9.0 (2019-02-22):
Added support for negative BCD numbers (type A) and date time CP48 (type I),
new program (set primary address), extended XML output (storage number,
tariff, device), echo cancelation and better retry handling. Also this version
has countless bug fixes.
Many thanks to all contributers
Version 0.8.0 (2012-06-18):
--------------------------

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Application busy</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Buffer too long, truncated</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Unspecified error</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Premature end of record</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>More than 10 DIFE´s</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Too many readouts</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Too many records</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>More than 10 VIFE´s</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Unimplemented CI-Field</Error>
</SlaveInformation>
</MBusData>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Error>Unspecified error</Error>
</SlaveInformation>
</MBusData>

View File

@ -3,7 +3,7 @@
# Copyright (C) 2010-2012, Robert Johansson and contributors, Raditex AB
# All rights reserved.
#
# rSCADA
# rSCADA
# http://www.rSCADA.se
# info@rscada.se
#
@ -12,66 +12,130 @@
#
#------------------------------------------------------------------------------
# Check if mbus_parse_hex exists
if [ ! -x ./mbus_parse_hex ]; then
echo "mbus_parse_hex not found"
exit 3
fi
NUMBER_OF_PARSING_ERRORS=0
FAILING_TESTS=failing_tests.txt
NEW_TESTS=new_tests.txt
touch $FAILING_TESTS
touch $NEW_TESTS
# Check commandline parameter
if [ $# -ne 1 ]; then
echo "usage: $0 directory"
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo "usage: $0 path_to_directory_with_xml_files"
echo "or"
echo "usage: $0 path_to_directory_with_xml_files path_to_mbus_parse_hex_with_filename"
exit 3
fi
directory="$1"
# Check directory
# # Check directory
if [ ! -d "$directory" ]; then
echo "usage: $0 directory"
echo "$directory not found"
exit 3
fi
for hexfile in "$directory"/*.hex; do
if [ ! -f "$hexfile" ]; then
continue
fi
# Default location is this one
mbus_parse_hex="build/bin/mbus_parse_hex"
# though can be overriten
if [ $# -eq 2 ]; then
mbus_parse_hex="$2"
fi
# Check if mbus_parse_hex exists
if [ ! -x "$mbus_parse_hex" ]; then
echo "mbus_parse_hex not found"
echo "path to mbus_parse_hex: $mbus_parse_hex"
exit 3
fi
generate_xml() {
directory="$1"
hexfile="$2"
mode="$3"
filename=$(basename "$hexfile" .hex)
if [ "$mode" = "normalized" ]; then
options="-n"
mode=".norm"
else
options=""
mode=""
fi
filename=`basename $hexfile .hex`
# Parse hex file and write XML in file
./mbus_parse_hex "$hexfile" > "$directory/$filename.xml.new"
"$mbus_parse_hex" $options "$hexfile" > "$directory/$filename$mode.xml.new"
result=$?
# Check parsing result
if [ $result -ne 0 ]; then
NUMBER_OF_PARSING_ERRORS=$((NUMBER_OF_PARSING_ERRORS + 1))
echo "Unable to generate XML for $hexfile"
rm "$directory/$filename.xml.new"
continue
rm "$directory/$filename$mode.xml.new"
return 1
fi
# Compare old XML with new XML and write in file
diff -u "$directory/$filename.xml" "$directory/$filename.xml.new" 2> /dev/null > "$directory/$filename.dif"
diff -u "$directory/$filename$mode.xml" "$directory/$filename$mode.xml.new" 2> /dev/null > "$directory/$filename$mode.dif"
result=$?
case "$result" in
0)
# XML equal -> remove new
rm "$directory/$filename.xml.new"
rm "$directory/$filename.dif"
rm "$directory/$filename$mode.xml.new"
rm "$directory/$filename$mode.dif"
;;
1)
# different -> print diff
cat "$directory/$filename.dif" && rm "$directory/$filename.dif"
echo "== $directory/$filename$mode failed"
cat "$directory/$filename$mode.dif" && rm "$directory/$filename$mode.dif"
echo ""
echo "$filename$mode" >> $FAILING_TESTS
;;
*)
*)
# no old -> rename XML
echo "Create $filename.xml"
mv "$directory/$filename.xml.new" "$directory/$filename.xml"
rm "$directory/$filename.dif"
echo "Create $filename$mode.xml"
mv "$directory/$filename$mode.xml.new" "$directory/$filename$mode.xml"
rm "$directory/$filename$mode.dif"
echo "$filename$mode" >> $NEW_TESTS
;;
esac
return $result
}
for hexfile in "$directory"/*.hex; do
if [ ! -f "$hexfile" ]; then
continue
fi
generate_xml "$directory" "$hexfile" "default"
generate_xml "$directory" "$hexfile" "normalized"
done
# Check the size of the file $FAILING_TESTS. Make sure to indicate failure.
if [ -s $FAILING_TESTS ]; then
echo "** There were errors in the following file(s):"
cat $FAILING_TESTS
exit 1
else
rm $FAILING_TESTS
fi
if [ -s $NEW_TESTS ]; then
echo "** There were new test in the following file(s):"
cat $NEW_TESTS
else
rm $NEW_TESTS
fi
# Check that there was no files that failed to parse
if [ $NUMBER_OF_PARSING_ERRORS -ne 0 ]; then
echo "** There were $NUMBER_OF_PARSING_ERRORS files that did not parse, expected 0 files."
echo
exit $NUMBER_OF_PARSING_ERRORS
fi
DIRECTORY_BASENAME="$(basename "$directory")"
echo "** Tests executed successfully in \"$DIRECTORY_BASENAME\"."
echo

View File

@ -18,7 +18,7 @@ int
main(int argc, char *argv[])
{
FILE *fp = NULL;
size_t buff_len, len;
size_t len;
int normalized = 0;
unsigned char buf[1024];
mbus_frame reply;
@ -53,6 +53,7 @@ main(int argc, char *argv[])
if (ferror(fp) != 0)
{
fprintf(stderr, "%s: failed to read '%s'\n", argv[0], file);
fclose(fp);
return 1;
}

View File

@ -18,7 +18,7 @@ int
main(int argc, char *argv[])
{
FILE *fp = NULL;
size_t buff_len, len;
size_t buff_len;
int result, normalized = 0;
unsigned char raw_buff[4096], buff[4096];
mbus_frame reply;
@ -48,11 +48,12 @@ main(int argc, char *argv[])
}
memset(raw_buff, 0, sizeof(raw_buff));
len = fread(raw_buff, 1, sizeof(raw_buff), fp);
fread(raw_buff, 1, sizeof(raw_buff), fp);
if (ferror(fp) != 0)
{
fprintf(stderr, "%s: failed to read '%s'\n", argv[0], file);
fclose(fp);
return 1;
}

0
test/test-frames/ACW_Itron-BM-plus-m.hex Executable file → Normal file
View File

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11490378</Id>
<Manufacturer>ACW</Manufacturer>
<Version>14</Version>
<ProductName>Itron BM +m</ProductName>
<Medium>Cold water</Medium>
<AccessNumber>10</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>11490378.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>54.321000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2000-00-00</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-13T11:11:00Z</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Firmware version</Quantity>
<Value>2.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Software version</Quantity>
<Value>6.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Manufacturer specific</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value>00 01 75 13</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11490378</Id>
<Manufacturer>ACW</Manufacturer>
<Version>14</Version>
<ProductName>Itron BM +m</ProductName>
<Medium>Cold water</Medium>
<AccessNumber>10</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>11490378</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>54321</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2000-00-00</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2014-03-13T11:11:00</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Operating time (days)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Firmware version</Unit>
<Value>2</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Software version</Unit>
<Value>6</Value>
</DataRecord>
<DataRecord id="8">
<Function>Manufacturer specific</Function>
<Value>00 01 75 13</Value>
</DataRecord>
</MBusData>

0
test/test-frames/ACW_Itron-CYBLE-M-Bus-14.hex Executable file → Normal file
View File

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>9011523</Id>
<Manufacturer>ACW</Manufacturer>
<Version>20</Version>
<ProductName>Itron CYBLE M-Bus 1.4</ProductName>
<Medium>Water</Medium>
<AccessNumber>37</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>9011523.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>cust. ID</Quantity>
<Value>09LA076755</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-13T14:26:00Z</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>bat. time</Quantity>
<Value>2516.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.031000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.031000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Manufacturer specific</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value>00 01 1F</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>9011523</Id>
<Manufacturer>ACW</Manufacturer>
<Version>20</Version>
<ProductName>Itron CYBLE M-Bus 1.4</ProductName>
<Medium>Water</Medium>
<AccessNumber>37</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>9011523</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>cust. ID</Unit>
<Value>09LA076755</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2014-03-13T14:26:00</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>bat. time</Unit>
<Value>2516</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>31</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>31</Value>
</DataRecord>
<DataRecord id="7">
<Function>Manufacturer specific</Function>
<Value>00 01 1F</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,231 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11120895</Id>
<Manufacturer>EDC</Manufacturer>
<Version>2</Version>
<ProductName></ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>23</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>35000.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>465000.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>21.536703</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>21.605042</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>92.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>92.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000707</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.357622</Value>
</DataRecord>
<DataRecord id="11">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>18511.912109</Value>
</DataRecord>
<DataRecord id="15">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="16">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2012-07-10T15:25:00Z</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>-</Unit>
<Quantity>C</Quantity>
<Value>3571.000000</Value>
</DataRecord>
<DataRecord id="18">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>-</Unit>
<Quantity>C</Quantity>
<Value>413.000000</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>-</Unit>
<Quantity>c</Quantity>
<Value>1.000000</Value>
</DataRecord>
<DataRecord id="20">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>-</Unit>
<Quantity>c</Quantity>
<Value>1.000000</Value>
</DataRecord>
<DataRecord id="21">
<Function>Manufacturer specific</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value></Value>
</DataRecord>
</MBusData>

207
test/test-frames/EDC.xml Normal file
View File

@ -0,0 +1,207 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11120895</Id>
<Manufacturer>EDC</Manufacturer>
<Version>2</Version>
<ProductName></ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>23</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>35</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>465</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Flow temperature (deg C)</Unit>
<Value>21.536703</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Return temperature (deg C)</Unit>
<Value>21.605042</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Flow temperature (deg C)</Unit>
<Value>92.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Return temperature (deg C)</Unit>
<Value>92.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0.707039</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>357.621735</Value>
</DataRecord>
<DataRecord id="11">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Power (W)</Unit>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (W)</Unit>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Power (W)</Unit>
<Value>18511.912109</Value>
</DataRecord>
<DataRecord id="15">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (W)</Unit>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="16">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2012-07-10T15:25:00</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>C</Unit>
<Value>3571</Value>
</DataRecord>
<DataRecord id="18">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>C</Unit>
<Value>413</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>c</Unit>
<Value>1</Value>
</DataRecord>
<DataRecord id="20">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>c</Unit>
<Value>1</Value>
</DataRecord>
<DataRecord id="21">
<Function>Manufacturer specific</Function>
<Value></Value>
</DataRecord>
</MBusData>

0
test/test-frames/EFE_Engelmann-Elster-SensoStar-2.hex Executable file → Normal file
View File

View File

@ -0,0 +1,229 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24083345</Id>
<Manufacturer>EFE</Manufacturer>
<Version>0</Version>
<ProductName>Engelmann / Elster SensoStar 2</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>102</AccessNumber>
<Status>27</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>24083345.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-12T14:23:00Z</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2013-12-31</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>3</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="16">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.025000</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="18">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>11.000000</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>22.000000</Value>
</DataRecord>
<DataRecord id="20">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>21.000000</Value>
</DataRecord>
<DataRecord id="21">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>0.090000</Value>
</DataRecord>
<DataRecord id="22">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>On time</Quantity>
<Value>45273600.000000</Value>
</DataRecord>
<DataRecord id="23">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Error flags</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="24">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000011</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24083345</Id>
<Manufacturer>EFE</Manufacturer>
<Version>0</Version>
<ProductName>Engelmann / Elster SensoStar 2</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>102</AccessNumber>
<Status>27</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>24083345</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2014-03-12T14:23:00</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (1e-1 m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (1e-1 m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Volume (1e-1 m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2013-12-31</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>3</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="16">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>25</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="18">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>11</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Flow temperature (deg C)</Unit>
<Value>22</Value>
</DataRecord>
<DataRecord id="20">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Return temperature (deg C)</Unit>
<Value>21</Value>
</DataRecord>
<DataRecord id="21">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Temperature Difference (1e-2 deg C)</Unit>
<Value>9</Value>
</DataRecord>
<DataRecord id="22">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>On time (days)</Unit>
<Value>524</Value>
</DataRecord>
<DataRecord id="23">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Error flags</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="24">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (my m^3)</Unit>
<Value>11</Value>
</DataRecord>
</MBusData>

0
test/test-frames/EFE_Engelmann-WaterStar.hex Executable file → Normal file
View File

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>4990254</Id>
<Manufacturer>EFE</Manufacturer>
<Version>0</Version>
<ProductName>Engelmann WaterStar</ProductName>
<Medium>Warm water (30-90°C)</Medium>
<AccessNumber>12</AccessNumber>
<Status>27</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>4990254.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-13T12:10:00Z</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.332000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.331000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.332000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2013-12-31</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>2.070000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>On time</Quantity>
<Value>102902400.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Error flags</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000008</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>4990254</Id>
<Manufacturer>EFE</Manufacturer>
<Version>0</Version>
<ProductName>Engelmann WaterStar</ProductName>
<Medium>Warm water (30-90°C)</Medium>
<AccessNumber>12</AccessNumber>
<Status>27</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>4990254</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2014-03-13T12:10:00</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>332</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>331</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>Volume (m m^3)</Unit>
<Value>332</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2013-12-31</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="8">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>2070</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>On time (days)</Unit>
<Value>1191</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Error flags</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (my m^3)</Unit>
<Value>8</Value>
</DataRecord>
</MBusData>

0
test/test-frames/ELS_Elster-F96-Plus.hex Executable file → Normal file
View File

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>44493951</Id>
<Manufacturer>ELS</Manufacturer>
<Version>47</Version>
<ProductName>Elster F96 Plus</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>161</AccessNumber>
<Status>70</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>13131113.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>131.113000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>22.700000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>22.600000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>0.100000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>63072000.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-13T13:09:00Z</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2013-05-31</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>44493951</Id>
<Manufacturer>ELS</Manufacturer>
<Version>47</Version>
<ProductName>Elster F96 Plus</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>161</AccessNumber>
<Status>70</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>DDDDEBBD</Value>
</DataRecord>
<DataRecord id="5">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>DDEBBD</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Flow temperature (1e-1 deg C)</Unit>
<Value>227</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Return temperature (1e-1 deg C)</Unit>
<Value>226</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Temperature Difference (1e-1 deg C)</Unit>
<Value>1</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Operating time (days)</Unit>
<Value>730</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2014-03-13T13:09:00</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2013-05-31</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1 @@
68 53 53 68 08 0B 72 61 15 01 24 96 15 16 00 3F 00 00 00 01 FD 1B 02 02 FC 03 48 52 25 74 22 15 22 FC 03 48 52 25 74 24 0D 12 FC 03 48 52 25 74 C3 1C 02 65 2E 08 22 65 5C 05 12 65 A2 0B 01 72 18 42 65 2C 08 82 01 65 1F 08 0C 78 61 15 01 24 03 FD 0F 00 00 04 1F BD 16

View File

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24011561</Id>
<Manufacturer>ELV</Manufacturer>
<Version>22</Version>
<ProductName>Elvaco CMa10</ProductName>
<Medium>Other</Medium>
<AccessNumber>63</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Digital Input</Quantity>
<Value>2.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>%RH</Quantity>
<Value>54.100000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>%RH</Quantity>
<Value>33.640000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>%RH</Quantity>
<Value>73.630000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>External temperature</Quantity>
<Value>20.940000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>External temperature</Quantity>
<Value>13.720000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>External temperature</Quantity>
<Value>29.780000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Averaging Duration</Quantity>
<Value>86400.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>°C</Unit>
<Quantity>External temperature</Quantity>
<Value>20.920000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>°C</Unit>
<Quantity>External temperature</Quantity>
<Value>20.790000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>24011561.000000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Software version</Quantity>
<Value>262144.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>More records follow</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value></Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24011561</Id>
<Manufacturer>ELV</Manufacturer>
<Version>22</Version>
<ProductName>Elvaco CMa10</ProductName>
<Medium>Other</Medium>
<AccessNumber>63</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Digital input (binary)</Unit>
<Value>2</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-2 %RH</Unit>
<Value>5410</Value>
</DataRecord>
<DataRecord id="2">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-2 %RH</Unit>
<Value>3364</Value>
</DataRecord>
<DataRecord id="3">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-2 %RH</Unit>
<Value>7363</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>External temperature (1e-2 deg C)</Unit>
<Value>2094</Value>
</DataRecord>
<DataRecord id="5">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>External temperature (1e-2 deg C)</Unit>
<Value>1372</Value>
</DataRecord>
<DataRecord id="6">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>External temperature (1e-2 deg C)</Unit>
<Value>2978</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Averaging Duration (hours)</Unit>
<Value>24</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>External temperature (1e-2 deg C)</Unit>
<Value>2092</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>0</Tariff>
<Device>0</Device>
<Unit>External temperature (1e-2 deg C)</Unit>
<Value>2079</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>24011561</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Software version</Unit>
<Value>262144</Value>
</DataRecord>
<DataRecord id="12">
<Function>More records follow</Function>
<Value></Value>
</DataRecord>
</MBusData>

0
test/test-frames/EMU_EMU-Professional-375-M-Bus.hex Executable file → Normal file
View File

View File

@ -0,0 +1,287 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>32629</Id>
<Manufacturer>EMU</Manufacturer>
<Version>16</Version>
<ProductName>EMU Professional 3/75 M-Bus</ProductName>
<Medium>Electricity</Medium>
<AccessNumber>2</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>32629.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>1364.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>2</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>7854.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>2</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>-2.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>-2.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>14.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>14.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>225.700000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="16">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>187.400000</Value>
</DataRecord>
<DataRecord id="17">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="18">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="19">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>241.000000</Value>
</DataRecord>
<DataRecord id="20">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="21">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="22">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>-0.066000</Value>
</DataRecord>
<DataRecord id="23">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="24">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="25">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>-0.066000</Value>
</DataRecord>
<DataRecord id="26">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>13.000000</Value>
</DataRecord>
<DataRecord id="27">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="28">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="29">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>500.000000</Value>
</DataRecord>
<DataRecord id="30">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Reset counter</Quantity>
<Value>56.000000</Value>
</DataRecord>
<DataRecord id="31">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Error flags</Quantity>
<Value>0.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>32629</Id>
<Manufacturer>EMU</Manufacturer>
<Version>16</Version>
<ProductName>EMU Professional 3/75 M-Bus</ProductName>
<Medium>Electricity</Medium>
<AccessNumber>2</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>32629</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (Wh)</Unit>
<Value>1364</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Energy (Wh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>2</Device>
<Unit>Energy (Wh)</Unit>
<Value>7854</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>2</Device>
<Unit>Energy (Wh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>-2</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>-2</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>Power (W)</Unit>
<Value>14</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>Power (W)</Unit>
<Value>14</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>2257</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="16">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>1874</Value>
</DataRecord>
<DataRecord id="17">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="18">
<Function>Minimum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="19">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>2410</Value>
</DataRecord>
<DataRecord id="20">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="21">
<Function>Maximum value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="22">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m A</Unit>
<Value>-66</Value>
</DataRecord>
<DataRecord id="23">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m A</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="24">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m A</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="25">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m A</Unit>
<Value>-66</Value>
</DataRecord>
<DataRecord id="26">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>13</Value>
</DataRecord>
<DataRecord id="27">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="28">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="29">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>500</Value>
</DataRecord>
<DataRecord id="30">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Reset counter</Unit>
<Value>56</Value>
</DataRecord>
<DataRecord id="31">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Error flags</Unit>
<Value>0</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>802657</Id>
<Manufacturer>SVM</Manufacturer>
<Version>8</Version>
<ProductName>Elster F2 / Deltamess F2</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>70</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>5272000.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>1204.270000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>917.690000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>28.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>34.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>On time</Quantity>
<Value>149014800.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>149014800.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2013-06-29T12:12:00Z</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Units for H.C.A.</Unit>
<Quantity>H.C.A.</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>Units for H.C.A.</Unit>
<Quantity>H.C.A.</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>More records follow</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value>C4 09 01 01 12 00 01 01 01 07 57 26 80 00 CD 4E 08 04 07 A3 FF 03 57 26 80 00 04 04 0D 02 FF 0F 05 3C FF 62 E7 62 96 0A 89 0A 02 00 15 40 17 01 00 00 63 42</Value>
</DataRecord>
</MBusData>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>802657</Id>
<Manufacturer>SVM</Manufacturer>
<Version>8</Version>
<ProductName>Elster F2</ProductName>
<ProductName>Elster F2 / Deltamess F2</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>70</AccessNumber>
<Status>00</Status>

View File

@ -0,0 +1 @@
68 38 38 68 08 19 72 07 62 00 23 2E 19 23 02 92 00 00 00 8C 10 04 68 28 17 00 8C 11 04 68 28 17 00 02 FD C9 FF 01 E6 00 02 FD DB FF 01 06 00 02 AC FF 01 09 00 82 40 AC FF 01 FD FF 5B 16

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>23006207</Id>
<Manufacturer>FIN</Manufacturer>
<Version>35</Version>
<ProductName></ProductName>
<Medium>Electricity</Medium>
<AccessNumber>146</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>1728680.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>1728680.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>230.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.600000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>90.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>-30.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>23006207</Id>
<Manufacturer>FIN</Manufacturer>
<Version>35</Version>
<ProductName></ProductName>
<Medium>Electricity</Medium>
<AccessNumber>146</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>172868</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>172868</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit> V</Unit>
<Value>230</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 A</Unit>
<Value>6</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>9</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (10 W)</Unit>
<Value>-3</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1 @@
68 1B 1B 68 08 01 72 07 20 18 00 E6 1E 35 07 4C 00 00 00 0C 78 07 20 18 00 0C 16 69 02 00 00 96 16

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>182007</Id>
<Manufacturer>GWF</Manufacturer>
<Version>53</Version>
<ProductName></ProductName>
<Medium>Water</Medium>
<AccessNumber>76</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>182007.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>269.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>182007</Id>
<Manufacturer>GWF</Manufacturer>
<Version>53</Version>
<ProductName></ProductName>
<Medium>Water</Medium>
<AccessNumber>76</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>182007</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume ( m^3)</Unit>
<Value>269</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1 @@
68 40 40 68 08 01 72 58 20 08 12 E2 30 40 03 40 00 00 00 2F 2F 4C 13 92 40 83 10 46 6D 00 00 08 16 27 00 0D 78 11 34 31 38 35 30 32 38 30 32 31 39 35 37 31 30 30 47 89 40 FD 1A 01 01 FD 17 00 01 FD 67 0F 38 16

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>12082058</Id>
<Manufacturer>LGB</Manufacturer>
<Version>64</Version>
<ProductName></ProductName>
<Medium>Gas</Medium>
<AccessNumber>64</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>10834.092000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2016-07-22T08:00:00Z</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>G0017591208205814</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit></Unit>
<Quantity>Digital Output</Quantity>
<Value>1.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Error flags</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Special supplier information</Quantity>
<Value>15.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>12082058</Id>
<Manufacturer>LGB</Manufacturer>
<Version>64</Version>
<ProductName></ProductName>
<Medium>Gas</Medium>
<AccessNumber>64</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>10834092</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2016-07-22T08:00:00</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>G0017591208205814</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Digital output (binary)</Unit>
<Value>1</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Error flags</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Special supplier information</Unit>
<Value>15</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1 @@
68 2F 2F 68 08 16 72 01 63 21 11 AC 48 41 03 B1 00 00 00 0C 14 81 60 87 02 04 6D A1 15 E9 17 42 6C DF 1C 4C 14 82 73 59 02 42 EC 7E FF 1C 0F C0 01 01 0C BD 16

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11216301</Id>
<Manufacturer>REL</Manufacturer>
<Version>65</Version>
<ProductName></ProductName>
<Medium>Gas</Medium>
<AccessNumber>177</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>28760.810000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>1900-01-00T00:00:00Z</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>25973.820000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date)</Quantity>
<Value>2015-12-31</Value>
</DataRecord>
<DataRecord id="5">
<Function>Manufacturer specific</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value>C0 01 01 0C</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11216301</Id>
<Manufacturer>REL</Manufacturer>
<Version>65</Version>
<ProductName></ProductName>
<Medium>Gas</Medium>
<AccessNumber>177</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (1e-2 m^3)</Unit>
<Value>2876081</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>1900-01-00T00:00:00</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2014-12-31</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Volume (1e-2 m^3)</Unit>
<Value>2597382</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>1</StorageNumber>
<Unit>Time Point (date)</Unit>
<Value>2015-12-31</Value>
</DataRecord>
<DataRecord id="5">
<Function>Manufacturer specific</Function>
<Value>C0 01 01 0C</Value>
</DataRecord>
</MBusData>

0
test/test-frames/SBC_Saia-Burgess-ALE3.hex Executable file → Normal file
View File

View File

@ -0,0 +1,191 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>19000055</Id>
<Manufacturer>SBC</Manufacturer>
<Version>22</Version>
<ProductName>Saia-Burgess ALE3</ProductName>
<Medium>Electricity</Medium>
<AccessNumber>191</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>2930.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>2930.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>60.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>60.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>223.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>V</Unit>
<Quantity>Voltage</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>A</Unit>
<Quantity>Current</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="16">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="18">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>0.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>19000055</Id>
<Manufacturer>SBC</Manufacturer>
<Version>22</Version>
<ProductName>Saia-Burgess ALE3</ProductName>
<Medium>Electricity</Medium>
<AccessNumber>191</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>293</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>1</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>293</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>6</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>2</StorageNumber>
<Tariff>2</Tariff>
<Device>0</Device>
<Unit>Energy (10 Wh)</Unit>
<Value>6</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit> V</Unit>
<Value>223</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 A</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit> V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 A</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit> V</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>1e-1 A</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="16">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="17">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="18">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="19">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>0</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1 @@
68 71 71 68 08 04 72 88 17 01 00 AE 4C 06 0D 3E 00 00 00 04 6D 3B 0E E7 14 34 6D 00 00 01 01 34 FD 17 00 00 00 04 04 20 92 22 F1 00 04 24 A4 1A E7 00 04 86 3B 97 9B 00 00 04 13 BE 09 5E 00 05 2E B1 D1 2E BE 05 3E F5 B8 4E 40 05 5B B8 2D F9 41 05 5F 78 8B F9 41 05 63 00 80 3B BD 04 BE 50 71 BB B0 00 04 BE 58 F4 02 00 00 0C 78 88 17 01 00 02 7F 10 B5 5D 16

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11788</Id>
<Manufacturer>SEN</Manufacturer>
<Version>6</Version>
<ProductName></ProductName>
<Medium>Heat / Cooling load meter</Medium>
<AccessNumber>62</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2015-04-07T14:59:00Z</Value>
</DataRecord>
<DataRecord id="1">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2000-01-01T00:00:00Z</Value>
</DataRecord>
<DataRecord id="2">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Error flags</Quantity>
<Value>67108864.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>On time</Quantity>
<Value>15803026.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>15145636.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>39831000.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>6162.878000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>-170.721784</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>3.230039</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>31.147324</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>31.193100</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>-0.045776</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>11582321.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>756.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>11788.000000</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Manufacturer specific</Quantity>
<Value>-19184.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11788</Id>
<Manufacturer>SEN</Manufacturer>
<Version>6</Version>
<ProductName></ProductName>
<Medium>Heat / Cooling load meter</Medium>
<AccessNumber>62</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2015-04-07T14:59:00</Value>
</DataRecord>
<DataRecord id="1">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Time Point (time &amp; date)</Unit>
<Value>2000-01-01T00:00:00</Value>
</DataRecord>
<DataRecord id="2">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Error flags</Unit>
<Value>67108864</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>On time (seconds)</Unit>
<Value>15803026</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Operating time (seconds)</Unit>
<Value>15145636</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>39831</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>6162878</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (kW)</Unit>
<Value>-0.170722</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow ( m^3/h)</Unit>
<Value>3.230039</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Flow temperature (deg C)</Unit>
<Value>31.147324</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Return temperature (deg C)</Unit>
<Value>31.193100</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Temperature Difference ( deg C)</Unit>
<Value>-0.045776</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow ( m^3/h)</Unit>
<Value>11582321</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow ( m^3/h)</Unit>
<Value>756</Value>
</DataRecord>
<DataRecord id="14">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>11788</Value>
</DataRecord>
<DataRecord id="15">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Manufacturer specific</Unit>
<Value>-19184</Value>
</DataRecord>
</MBusData>

0
test/test-frames/SEN_Sensus-PolluStat-E.hex Executable file → Normal file
View File

View File

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>21265095</Id>
<Manufacturer>SEN</Manufacturer>
<Version>14</Version>
<ProductName>Sensus PolluStat E</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>181</AccessNumber>
<Status>10</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>20.100000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>20.200000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>21265095.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Customer location</Quantity>
<Value>21265095.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>More records follow</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value></Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>21265095</Id>
<Manufacturer>SEN</Manufacturer>
<Version>14</Version>
<ProductName>Sensus PolluStat E</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>181</AccessNumber>
<Status>10</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Energy (kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (m m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (m m^3/h)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Flow temperature (1e-1 deg C)</Unit>
<Value>201</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Return temperature (1e-1 deg C)</Unit>
<Value>202</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Temperature Difference (m deg C)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>21265095</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Customer location</Unit>
<Value>21265095</Value>
</DataRecord>
<DataRecord id="9">
<Function>More records follow</Function>
<Value></Value>
</DataRecord>
</MBusData>

0
test/test-frames/SEN_Sensus-PolluTherm.hex Executable file → Normal file
View File

View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24351689</Id>
<Manufacturer>SEN</Manufacturer>
<Version>11</Version>
<ProductName>Sensus PolluTherm</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>84</AccessNumber>
<Status>10</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>W</Unit>
<Quantity>Power</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>24351689.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Customer location</Quantity>
<Value>24351689.000000</Value>
</DataRecord>
</MBusData>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>24351689</Id>
<Manufacturer>SEN</Manufacturer>
<Version>11</Version>
<ProductName>Sensus PolluTherm</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>84</AccessNumber>
<Status>10</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Energy (10 kWh)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume (1e-2 m^3)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Volume flow (1e-2 m^3/h)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Power (10 W)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="4">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Flow temperature (1e-1 deg C)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="5">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Return temperature (1e-1 deg C)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="6">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>Temperature Difference (m deg C)</Unit>
<Value>0</Value>
</DataRecord>
<DataRecord id="7">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Fabrication number</Unit>
<Value>24351689</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Customer location</Unit>
<Value>24351689</Value>
</DataRecord>
</MBusData>

0
test/test-frames/SLB_CF-Compact-Integral-MK-MaXX.hex Executable file → Normal file
View File

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<MBusData>
<SlaveInformation>
<Id>11817314</Id>
<Manufacturer>SLB</Manufacturer>
<Version>6</Version>
<ProductName>CF Compact / Integral MK MaXX</ProductName>
<Medium>Heat: Outlet</Medium>
<AccessNumber>3</AccessNumber>
<Status>00</Status>
<Signature>0000</Signature>
</SlaveInformation>
<DataRecord id="0">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Fabrication No</Quantity>
<Value>11817314.000000</Value>
</DataRecord>
<DataRecord id="1">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>Wh</Unit>
<Quantity>Energy</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="2">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>0.020000</Value>
</DataRecord>
<DataRecord id="3">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>m^3/h</Unit>
<Quantity>Volume flow</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="4">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Flow temperature</Quantity>
<Value>21.800000</Value>
</DataRecord>
<DataRecord id="5">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>°C</Unit>
<Quantity>Return temperature</Quantity>
<Value>22.000000</Value>
</DataRecord>
<DataRecord id="6">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>K</Unit>
<Quantity>Temperature difference</Quantity>
<Value>-0.180000</Value>
</DataRecord>
<DataRecord id="7">
<Function>Value during error state</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>0.000000</Value>
</DataRecord>
<DataRecord id="8">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>s</Unit>
<Quantity>Operating time</Quantity>
<Value>101606400.000000</Value>
</DataRecord>
<DataRecord id="9">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit>-</Unit>
<Quantity>Time point (date &amp; time)</Quantity>
<Value>2014-03-13T14:02:00Z</Value>
</DataRecord>
<DataRecord id="10">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>1</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>1.230000</Value>
</DataRecord>
<DataRecord id="11">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Tariff>0</Tariff>
<Device>2</Device>
<Unit>m^3</Unit>
<Quantity>Volume</Quantity>
<Value>3.210000</Value>
</DataRecord>
<DataRecord id="12">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Firmware version</Quantity>
<Value>3.000000</Value>
</DataRecord>
<DataRecord id="13">
<Function>Instantaneous value</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity>Software version</Quantity>
<Value>18.000000</Value>
</DataRecord>
<DataRecord id="14">
<Function>Manufacturer specific</Function>
<StorageNumber>0</StorageNumber>
<Unit></Unit>
<Quantity></Quantity>
<Value>00 16</Value>
</DataRecord>
</MBusData>

Some files were not shown because too many files have changed in this diff Show More