kopia lustrzana https://github.com/weetmuts/wmbusmeters
Propagate timestamps from rtlwmbus
rodzic
c6bf8a114e
commit
d338de8101
|
@ -0,0 +1,5 @@
|
||||||
|
T1;1;1;2019-04-03 19:10:42.000;97;148;77777777;0x5744b40988227711101b7ab20800000265a00842658f088201659f08226589081265a0086265510852652b0902fb1aba0142fb1ab0018201fb1abd0122fb1aa90112fb1aba0162fb1aa60152fb1af501066d3b3bb36b2a00
|
||||||
|
#2019-04-03T19:10:42Z
|
||||||
|
T1;0;0;2021-12-29 13:50:57.000;11;108;99999999;0x294468505953629176f0a0009f29982b00e0982b00802e0601316acd636bcd63008dc3009ed4000fe5ff
|
||||||
|
T1;1;1;2019-04-03 19:00:42.000;97;148;88888888;0x2e44333003020100071b7a634820252f2f0265840842658308820165950802fb1aae0142fb1aae018201fb1aa9012f
|
||||||
|
#2019-04-03T19:00:42Z
|
|
@ -630,7 +630,7 @@ void MeterCommonImplementation::poll(shared_ptr<BusManager> bus_manager)
|
||||||
if (pollInterval() <= 0) return;
|
if (pollInterval() <= 0) return;
|
||||||
|
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
time_t next_poll_time = timestampLastUpdate()+pollInterval();
|
time_t next_poll_time = datetime_of_poll_+pollInterval();
|
||||||
if (now < next_poll_time)
|
if (now < next_poll_time)
|
||||||
{
|
{
|
||||||
// Not yet time to poll this meter.
|
// Not yet time to poll this meter.
|
||||||
|
@ -979,7 +979,8 @@ void MeterCommonImplementation::triggerUpdate(Telegram *t)
|
||||||
// Check if processContent has discarded this telegram.
|
// Check if processContent has discarded this telegram.
|
||||||
if (t->discard) return;
|
if (t->discard) return;
|
||||||
|
|
||||||
datetime_of_update_ = time(NULL);
|
datetime_of_poll_ = time(NULL);
|
||||||
|
datetime_of_update_ = t->about.timestamp ? t->about.timestamp : datetime_of_poll_;
|
||||||
num_updates_++;
|
num_updates_++;
|
||||||
for (auto &cb : on_update_) if (cb) cb(t, this);
|
for (auto &cb : on_update_) if (cb) cb(t, this);
|
||||||
t->handled = true;
|
t->handled = true;
|
||||||
|
|
|
@ -266,6 +266,7 @@ private:
|
||||||
vector<function<void(Telegram*,Meter*)>> on_update_;
|
vector<function<void(Telegram*,Meter*)>> on_update_;
|
||||||
int num_updates_ {};
|
int num_updates_ {};
|
||||||
time_t datetime_of_update_ {};
|
time_t datetime_of_update_ {};
|
||||||
|
time_t datetime_of_poll_ {};
|
||||||
LinkModeSet link_modes_ {};
|
LinkModeSet link_modes_ {};
|
||||||
vector<string> shell_cmdlines_;
|
vector<string> shell_cmdlines_;
|
||||||
vector<string> extra_constant_fields_;
|
vector<string> extra_constant_fields_;
|
||||||
|
|
|
@ -366,8 +366,10 @@ struct AboutTelegram
|
||||||
int rssi_dbm {};
|
int rssi_dbm {};
|
||||||
// WMBus or MBus
|
// WMBus or MBus
|
||||||
FrameType type {};
|
FrameType type {};
|
||||||
|
// time the telegram was received
|
||||||
|
time_t timestamp;
|
||||||
|
|
||||||
AboutTelegram(string dv, int rs, FrameType t) : device(dv), rssi_dbm(rs), type(t) {}
|
AboutTelegram(string dv, int rs, FrameType t, time_t ts = 0) : device(dv), rssi_dbm(rs), type(t), timestamp(ts) {}
|
||||||
AboutTelegram() {}
|
AboutTelegram() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include<errno.h>
|
#include<errno.h>
|
||||||
#include<sys/stat.h>
|
#include<sys/stat.h>
|
||||||
#include<sys/types.h>
|
#include<sys/types.h>
|
||||||
|
#include<time.h>
|
||||||
#include<unistd.h>
|
#include<unistd.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -75,7 +76,8 @@ private:
|
||||||
size_t *hex_frame_length,
|
size_t *hex_frame_length,
|
||||||
int *hex_payload_len_out,
|
int *hex_payload_len_out,
|
||||||
int *hex_payload_offset,
|
int *hex_payload_offset,
|
||||||
double *rssi);
|
double *rssi,
|
||||||
|
struct tm *timestamp);
|
||||||
void handleMessage(vector<uchar> &frame);
|
void handleMessage(vector<uchar> &frame);
|
||||||
|
|
||||||
string setup_;
|
string setup_;
|
||||||
|
@ -239,11 +241,12 @@ void WMBusRTLWMBUS::processSerialData()
|
||||||
|
|
||||||
size_t frame_length;
|
size_t frame_length;
|
||||||
int hex_payload_len, hex_payload_offset;
|
int hex_payload_len, hex_payload_offset;
|
||||||
|
struct tm timestamp;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
double rssi = 0;
|
double rssi = 0;
|
||||||
FrameStatus status = checkRTLWMBUSFrame(read_buffer_, &frame_length, &hex_payload_len, &hex_payload_offset, &rssi);
|
FrameStatus status = checkRTLWMBUSFrame(read_buffer_, &frame_length, &hex_payload_len, &hex_payload_offset, &rssi, ×tamp);
|
||||||
|
|
||||||
if (status == PartialFrame)
|
if (status == PartialFrame)
|
||||||
{
|
{
|
||||||
|
@ -298,7 +301,7 @@ void WMBusRTLWMBUS::processSerialData()
|
||||||
}
|
}
|
||||||
|
|
||||||
string id = string("rtlwmbus[")+getDeviceId()+"]";
|
string id = string("rtlwmbus[")+getDeviceId()+"]";
|
||||||
AboutTelegram about(id, rssi, FrameType::WMBUS);
|
AboutTelegram about(id, rssi, FrameType::WMBUS, timestamp.tm_mday ? timegm(×tamp) : 0);
|
||||||
handleTelegram(about, payload);
|
handleTelegram(about, payload);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -312,7 +315,8 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
|
||||||
size_t *hex_frame_length,
|
size_t *hex_frame_length,
|
||||||
int *hex_payload_len_out,
|
int *hex_payload_len_out,
|
||||||
int *hex_payload_offset,
|
int *hex_payload_offset,
|
||||||
double *rssi)
|
double *rssi,
|
||||||
|
struct tm *timestamp)
|
||||||
{
|
{
|
||||||
// C1;1;1;2019-02-09 07:14:18.000;117;102;94740459;0x49449344590474943508780dff5f3500827f0000f10007b06effff530100005f2c620100007f2118010000008000800080008000000000000000000e003f005500d4ff2f046d10086922
|
// C1;1;1;2019-02-09 07:14:18.000;117;102;94740459;0x49449344590474943508780dff5f3500827f0000f10007b06effff530100005f2c620100007f2118010000008000800080008000000000000000000e003f005500d4ff2f046d10086922
|
||||||
// There might be a second telegram on the same line ;0x4944.......
|
// There might be a second telegram on the same line ;0x4944.......
|
||||||
|
@ -374,9 +378,15 @@ FrameStatus WMBusRTLWMBUS::checkRTLWMBUSFrame(vector<uchar> &data,
|
||||||
}
|
}
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
// Look for packet rssi
|
*timestamp = { 0 };
|
||||||
|
// Look for packet timestamp and rssi
|
||||||
for (; i+1 < data.size(); ++i) {
|
for (; i+1 < data.size(); ++i) {
|
||||||
if (data[i] == ';') count++;
|
if (data[i] != ';') continue;
|
||||||
|
count++;
|
||||||
|
if (count == 3 && !strptime((const char*)&data[i+1], "%Y-%m-%d %H:%M:%S", timestamp)) {
|
||||||
|
debug("(rtlwmbus) invalid timestamp\n");
|
||||||
|
return ErrorInFrame;
|
||||||
|
}
|
||||||
if (count == 4) break;
|
if (count == 4) break;
|
||||||
}
|
}
|
||||||
if (count == 4)
|
if (count == 4)
|
||||||
|
|
3
test.sh
3
test.sh
|
@ -160,6 +160,9 @@ if [ "$?" != "0" ]; then RC="1"; fi
|
||||||
./tests/test_rtlwmbus_crc_errors.sh $PROG
|
./tests/test_rtlwmbus_crc_errors.sh $PROG
|
||||||
if [ "$?" != "0" ]; then RC="1"; fi
|
if [ "$?" != "0" ]; then RC="1"; fi
|
||||||
|
|
||||||
|
./tests/test_rtlwmbus_timestamps.sh $PROG
|
||||||
|
if [ "$?" != "0" ]; then RC="1"; fi
|
||||||
|
|
||||||
./tests/test_drivers.sh $PROG
|
./tests/test_drivers.sh $PROG
|
||||||
if [ "$?" != "0" ]; then RC="1"; fi
|
if [ "$?" != "0" ]; then RC="1"; fi
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PROG="$1"
|
||||||
|
|
||||||
|
TEST=testoutput
|
||||||
|
|
||||||
|
rm -rf $TEST
|
||||||
|
mkdir -p $TEST
|
||||||
|
|
||||||
|
TESTNAME="Test timestamps from rtlwmbus"
|
||||||
|
TESTRESULT="ERROR"
|
||||||
|
|
||||||
|
cat simulations/serial_rtlwmbus_with_timestamps.msg | grep '^\#' | tr -d '#' > $TEST/test_expected.txt
|
||||||
|
cat simulations/serial_rtlwmbus_with_timestamps.msg | grep '^[CT]' > $TEST/test_input.txt
|
||||||
|
cat $TEST/test_input.txt | $PROG --format=json "stdin:rtlwmbus" \
|
||||||
|
Rummet1 lansenth 00010203 "" \
|
||||||
|
Rummet2 rfmamb 11772288 "" \
|
||||||
|
2> $TEST/test_stderr.txt | jq -r .timestamp > $TEST/test_output.txt
|
||||||
|
|
||||||
|
diff $TEST/test_expected.txt $TEST/test_output.txt
|
||||||
|
if [ "$?" = "0" ]
|
||||||
|
then
|
||||||
|
echo "OK: $TESTNAME"
|
||||||
|
TESTRESULT="OK"
|
||||||
|
else
|
||||||
|
if [ "$USE_MELD" = "true" ]
|
||||||
|
then
|
||||||
|
meld $TEST/test_expected.txt $TEST/test_output.txt
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$TESTRESULT" = "ERROR" ]; then echo ERROR: $TESTNAME; exit 1; fi
|
Ładowanie…
Reference in New Issue