Add iem3000 driver.

pull/1129/head^2
Fredrik Öhrström 2024-01-11 18:34:46 +01:00
rodzic c08bf05521
commit cddcc9ae26
8 zmienionych plików z 1640 dodań i 3 usunięć

Wyświetl plik

@ -192,7 +192,7 @@ ifeq ($(DRIVER),)
DRIVER_OBJS:=$(wildcard src/meter_*.cc) $(wildcard src/driver_*.cc)
else
$(info Building a single driver $(DRIVER))
DRIVER_OBJS:=src/driver_auto.cc src/driver_unknown.cc $(wildcard src/meter_*.cc) src/driver_$(DRIVER).cc
DRIVER_OBJS:=src/driver_auto.cc src/driver_unknown.cc src/driver_dynamic.cc $(wildcard src/meter_*.cc) src/driver_$(DRIVER).cc
endif
DRIVER_OBJS:=$(patsubst src/%.cc,$(BUILD)/%.o,$(DRIVER_OBJS))

Wyświetl plik

@ -468,8 +468,8 @@ namespace
);
addNumericFieldWithExtractor(
"voltage_l3_l2",
"Instantaneous voltage between L3 and L2.",
"voltage_l3_l1",
"Instantaneous voltage between L3 and L1.",
DEFAULT_PRINT_PROPERTIES,
Quantity::Voltage,
VifScaling::AutoSigned,

Wyświetl plik

@ -101,6 +101,12 @@ DriverDynamic::DriverDynamic(MeterInfo &mi, DriverInfo &di) :
catch (...)
{
}
xmqFreeDoc(doc);
}
DriverDynamic::~DriverDynamic()
{
}
XMQProceed DriverDynamic::add_detect(XMQDoc *doc, XMQNode *detect, DriverInfo *di)

Wyświetl plik

@ -23,6 +23,7 @@
struct DriverDynamic : public virtual MeterCommonImplementation
{
DriverDynamic(MeterInfo &mi, DriverInfo &di);
~DriverDynamic();
static bool load(DriverInfo *di, const string &name);
static XMQProceed add_detect(XMQDoc *doc, XMQNode *detect, DriverInfo *di);
static XMQProceed add_field(XMQDoc *doc, XMQNode *field, DriverDynamic *dd);

1592
src/driver_iem3000.c 100644

Plik diff jest za duży Load Diff

Wyświetl plik

@ -256,6 +256,16 @@ bool parseDV(Telegram *t,
t->addExplanationAndIncrementPos(data, datalen, KindOfData::CONTENT, Understanding::NONE, "%02X manufacturer specific data %s", dif, value.c_str());
break;
}
if (dif == 0x1f)
{
DEBUG_PARSER("(dvparser) reached dif %02x more records in next telegram.\n", dif);
datalen = std::distance(data,data_end);
string value = bin2hex(data+1, data_end, datalen-1);
t->mfct_0f_index = 1+std::distance(data_start, data);
assert(t->mfct_0f_index >= 0);
t->addExplanationAndIncrementPos(data, datalen, KindOfData::CONTENT, Understanding::FULL, "%02X more data in next telegram %s", dif, value.c_str());
break;
}
DEBUG_PARSER("(dvparser) reached unknown dif %02x treating remaining data as manufacturer specific, parsing is done.\n", dif);
datalen = std::distance(data,data_end);
string value = bin2hex(data+1, data_end, datalen-1);

Wyświetl plik

@ -49,6 +49,8 @@
X(EnhancedIdentification,0x79,0x79, Quantity::Text, Unit::TXT) \
X(RelativeHumidity,0x7B1A,0x7B1B, Quantity::RH, Unit::RH) \
X(AccessNumber,0x7D08,0x7D08, Quantity::Counter, Unit::COUNTER) \
X(Medium,0x7D09,0x7D09, Quantity::Text, Unit::TXT) \
X(Manufacturer,0x7D0A,0x7D0A, Quantity::Text, Unit::TXT) \
X(ParameterSet,0x7D0B,0x7D0B, Quantity::Text, Unit::TXT) \
X(ModelVersion,0x7D0C,0x7D0C, Quantity::Text, Unit::TXT) \
X(HardwareVersion,0x7D0D,0x7D0D, Quantity::Text, Unit::TXT) \

Wyświetl plik

@ -2491,6 +2491,8 @@ bool FieldInfo::extractString(Meter *m, Telegram *t, DVEntry *dve)
matcher_.vif_range == VIFRange::FabricationNo ||
matcher_.vif_range == VIFRange::HardwareVersion ||
matcher_.vif_range == VIFRange::FirmwareVersion ||
matcher_.vif_range == VIFRange::Medium ||
matcher_.vif_range == VIFRange::Manufacturer ||
matcher_.vif_range == VIFRange::ModelVersion ||
matcher_.vif_range == VIFRange::SoftwareVersion ||
matcher_.vif_range == VIFRange::Customer ||
@ -2686,6 +2688,18 @@ void MeterCommonImplementation::addOptionalCommonFields(string field_names)
);
}
if (checkIf(fields,"manufacturer"))
{
addStringFieldWithExtractor(
"manufacturer",
"Meter manufacturer.",
DEFAULT_PRINT_PROPERTIES,
FieldMatcher::build()
.set(MeasurementType::Instantaneous)
.set(VIFRange::Manufacturer)
);
}
if (checkIf(fields,"model_version"))
{
addStringFieldWithExtractor(
@ -2698,6 +2712,18 @@ void MeterCommonImplementation::addOptionalCommonFields(string field_names)
);
}
if (checkIf(fields,"firmware_version"))
{
addStringFieldWithExtractor(
"firmware_version",
"Meter firmware version.",
DEFAULT_PRINT_PROPERTIES,
FieldMatcher::build()
.set(MeasurementType::Instantaneous)
.set(VIFRange::FirmwareVersion)
);
}
if (checkIf(fields,"parameter_set"))
{
addStringFieldWithExtractor(