Add support for real ieee 754 floating point mbus values.

pull/553/head
Fredrik Öhrström 2022-05-25 16:59:55 +02:00
rodzic 24c487842b
commit 6d59eb4bbe
6 zmienionych plików z 80 dodań i 28 usunięć

Wyświetl plik

@ -2,8 +2,6 @@
ATTENTION! Counter suffix _int is changed to _counter.
New fields are added to lansendw, lansenpu, qsmoke drivers.
Eventually the old fields will go away in drivers.
Duration tariff added properly this causes a change in the
ei6500 driver json.
ATTENTION! When a field is not optional in the driver description,
but alas, no data has arrived in the telegram, then the json now
@ -14,6 +12,7 @@ from /var/log/wmbusmeters/meter_readings to /var/lib/wmbusmeters/meter_readings
This only affects new installations. Existing conf files will use the old location
as specified int the conf file.
Added ei6500 smoke detector.
Added kampress pressure sensor.
Added hydroclima HCA.

Wyświetl plik

@ -483,7 +483,7 @@ PiiGAB Thermometer/Hygrometer (piigth) wired
Supported smoke detectors:
Lansen Smoke Detector (lansensm)
Ei Electronics Smoke Detector ei6500-oms (ei6500) (work in progress)
EI Electronics Smoke Detector ei6500-oms (ei6500)
Supported door/window detectors:
Lansen Door/Window Detector (lansendw)

Wyświetl plik

@ -51,7 +51,7 @@ namespace
{
addStringFieldWithExtractorAndLookup(
"status",
"Status and error flags.",
"Meter error flags. IMPORTANT! Smoke alarm is NOT reported here! You MUST check last alarm date and counter!",
PrintProperty::JSON | PrintProperty::FIELD | PrintProperty::IMPORTANT |
PrintProperty::STATUS | PrintProperty::JOIN_TPL_STATUS,
FieldMatcher::build()
@ -338,7 +338,6 @@ namespace
// {"media":"smoke detector","meter":"ei6500","name":"Smokey","id":"01097274","status":"OK","last_alarm_date":"2000-01-01","alarm_counter":0,"software_version":"010107","message_datetime":"2022-05-24 06:42","duration_removed_h":0,"last_remove_date":"2000-01-01","removed_counter":0,"test_button_last_date":"2000-01-01","test_button_counter":0,"installation_date":"2022-05-24","last_sound_check_date":"2022-03-16","dust_level":"DUST_0","battery_level":"3.00V","obstacle_distance":"","timestamp":"1111-11-11T11:11:11Z"}
// |Smokey;01097274;OK;2000-01-01;0.000000;1111-11-11 11:11.11
// telegram=|58442515747209010C1A7A8D0000000BFD0F070101046D2E06D82502FD17000082206CD825426CD0238440FF2C000F11008250FD61000082506C01018260FD6100008360FD3100000082606C01018270FD61020082706CD825|
// {"media":"smoke detector","meter":"ei6500","name":"Smokey","id":"01097274","status":"OK","last_alarm_date":"2000-01-01","alarm_counter":0,"software_version":"010107","message_datetime":"2022-05-24 06:46","duration_removed_h":0,"last_remove_date":"2000-01-01","removed_counter":0,"test_button_last_date":"2022-05-24","test_button_counter":2,"installation_date":"2022-05-24","last_sound_check_date":"2022-03-16","dust_level":"DUST_0","battery_level":"3.00V","obstacle_distance":"","timestamp":"1111-11-11T11:11:11Z"}
// |Smokey;01097274;OK;2000-01-01;0.000000;1111-11-11 11:11.11

Wyświetl plik

@ -35,6 +35,31 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addStringFieldWithExtractorAndLookup(
"status",
"Status and error flags.",
PrintProperty::JSON | PrintProperty::FIELD | JOIN_TPL_STATUS,
FieldMatcher::build()
.set(VIFRange::ErrorFlags),
{
{
{
"ERROR_FLAGS",
Translate::Type::BitToString,
0xffff,
"OK",
{
{ 0x01, "DROP" }, // Unexpected drop in pressure in relation to average pressure.
{ 0x02, "SURGE" }, // Unexpected increase in pressure in relation to average pressure.
{ 0x04, "HIGH" }, // Average pressure has reached configurable limit. Default 15 bar
{ 0x08, "LOW" }, // Average pressure has reached configurable limit. Default 1.5 bar
{ 0x10, "TRANSIENT" }, // Pressure changes quickly over short timeperiods. Average is fluctuating.
{ 0x20, "COMM_ERROR" } // Cannot measure properly or bad internal communication.
}
},
},
});
addNumericFieldWithExtractor(
"pressure",
"The measured pressure.",
@ -68,34 +93,37 @@ namespace
.set(VIFRange::Pressure)
);
addStringFieldWithExtractorAndLookup(
"status",
"Status and error flags.",
PrintProperty::JSON | PrintProperty::FIELD | JOIN_TPL_STATUS,
addNumericFieldWithExtractor(
"alfa",
"We do not know what this is.",
PrintProperty::JSON,
Quantity::Counter,
VifScaling::None,
FieldMatcher::build()
.set(VIFRange::ErrorFlags),
{
{
{
"ERROR_FLAGS",
Translate::Type::BitToString,
0xffff,
"OK",
{
// { 0x01, "?" },
}
},
},
});
.set(DifVifKey("05FF09"))
);
addNumericFieldWithExtractor(
"beta",
"We do not know what this is.",
PrintProperty::JSON,
Quantity::Counter,
VifScaling::None,
FieldMatcher::build()
.set(DifVifKey("05FF0A"))
);
}
}
// Test: Pressing kampress 77000317 NOKEY
// telegram=|32442D2C1703007701188D280080E39322DB8F78_22696600126967000269660005FF091954A33A05FF0A99BD823A02FD170800|
// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"status":"ERROR_FLAGS_8","timestamp":"1111-11-11T11:11:11Z"}
// |Pressing;77000317;1.020000;1.030000;1.020000;ERROR_FLAGS_8;1111-11-11 11:11.11
// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"alfa_counter":0.001246,"beta_counter":0.000997,"timestamp":"1111-11-11T11:11:11Z"}
// |Pressing;77000317;LOW;1.020000;1.030000;1.020000;1111-11-11 11:11.11
// telegram=|27442D2C1703007701188D280194E393226EC679DE735657_660067006600962B913A21B9423A0800|
// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"status":"ERROR_FLAGS_8","timestamp":"1111-11-11T11:11:11Z"}
// |Pressing;77000317;1.020000;1.030000;1.020000;ERROR_FLAGS_8;1111-11-11 11:11.11
// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.03,"min_pressure_bar":1.02,"alfa_counter":0.001108,"beta_counter":0.000743,"timestamp":"1111-11-11T11:11:11Z"}
// |Pressing;77000317;LOW;1.020000;1.030000;1.020000;1111-11-11 11:11.11
// telegram=|27442D2C1703007701188D289554F295224ED579DE73188A_650066006600E80EA43A6B97A3BA0800|
// {"media":"pressure","meter":"kampress","name":"Pressing","id":"77000317","status":"LOW","pressure_bar":1.02,"max_pressure_bar":1.02,"min_pressure_bar":1.01,"alfa_counter":0.001252,"beta_counter":-0.001248,"timestamp":"1111-11-11T11:11:11Z"}
// |Pressing;77000317;LOW;1.020000;1.020000;1.010000;1111-11-11 11:11.11

Wyświetl plik

@ -30,6 +30,12 @@
using namespace std;
union RealConversion
{
uint32_t i;
float f;
};
const char *toString(VIFRange v)
{
switch (v) {
@ -785,6 +791,24 @@ bool DVEntry::extractDouble(double *out, bool auto_scale, bool assume_signed)
*out = (draw) / scale;
}
else
if (t == 0x5) // 32 Bit Real
{
vector<uchar> v;
hex2bin(value, &v);
assert(v.size() == 4);
RealConversion rc;
rc.i = v[3]<<24 | v[2]<<16 | v[1]<<8 | v[0];
// Assumes float uses the standard IEEE 754 bit set.
// 1 bit sign, 8 bit exp, 23 bit mantissa
// RealConversion is tested on an amd64 platform. How about
// other platsforms with different byte ordering?
double draw = rc.f;
double scale = 1.0;
if (auto_scale) scale = vifScale(dif_vif_key.vif());
*out = (draw) / scale;
}
else
{
printf("Unsupported dif format for extraction to double! dif=%02x\n", dif_vif_key.dif());
assert(false);

Wyświetl plik

@ -51,8 +51,10 @@
X(SoftwareVersion,0x7D0F,0x7D0F, Quantity::Text, Unit::TXT) \
X(ErrorFlags,0x7D17,0x7D17, Quantity::Text, Unit::TXT) \
X(DurationOfTariff,0x7D31,0x7D33, Quantity::Time, Unit::Hour) \
X(Dimensionless,0x7D3A,0x7D3A, Quantity::Time, Unit::Hour) \
X(Voltage,0x7D40,0x7D4F, Quantity::Voltage, Unit::Volt) \
X(Current,0x7D50,0x7D5F, Quantity::Current, Unit::Ampere) \
X(ResetCounter,0x7D60,0x7D60, Quantity::Counter, Unit::COUNTER) \
X(CumulationCounter,0x7D61,0x7D61, Quantity::Counter, Unit::COUNTER) \
X(AnyVolumeVIF,0x00,0x00, Quantity::Volume, Unit::Unknown) \
X(AnyEnergyVIF,0x00,0x00, Quantity::Energy, Unit::Unknown) \