kopia lustrzana https://github.com/weetmuts/wmbusmeters
Refactor MeterType to MeterDriver.
rodzic
9faee235c5
commit
a53cb1f77c
16
README.md
16
README.md
|
@ -87,8 +87,8 @@ key=00112233445566778899AABBCCDDEEFF
|
|||
```
|
||||
|
||||
Meter driver detection will be automatic. You can also provide an
|
||||
explicit driver name with: `type=multical21:c1` or explicitly state
|
||||
that driver detection is automatic: `type=auto`.
|
||||
explicit driver name with: `driver=multical21:c1` or explicitly state
|
||||
that driver detection is automatic: `driver=auto`.
|
||||
|
||||
Now plugin your wmbus dongle. Wmbusmeters should start automatically,
|
||||
check with `tail -f /var/log/syslog` and `tail -f /var/log/wmbusmeters/wmbusmeters.log`
|
||||
|
@ -157,7 +157,7 @@ depending on if you are running as a daemon or not.
|
|||
# Running without config files, good for experimentation and test.
|
||||
```
|
||||
wmbusmeters version: 1.0.3
|
||||
Usage: wmbusmeters {options} <device> ( [meter_name] [meter_type]{:<modes>} [meter_id] [meter_key] )*
|
||||
Usage: wmbusmeters {options} <device> ( [meter_name] [meter_driver]{:<modes>} [meter_id] [meter_key] )*
|
||||
|
||||
As <options> you can use:
|
||||
|
||||
|
@ -170,10 +170,10 @@ As <options> you can use:
|
|||
--exitafter=<time> exit program after time, eg 20h, 10m 5s
|
||||
--format=<hr/json/fields> for human readable, json or semicolon separated fields
|
||||
--json_xxx=yyy always add "xxx"="yyy" to the json output and add shell env METER_xxx=yyy
|
||||
--listenvs=<meter_type> list the env variables available for the given meter type
|
||||
--listfields=<meter_type> list the fields selectable for the given meter type
|
||||
--listmeters list all meter types
|
||||
--listmeters=<search> list all meter types containing the text <search>
|
||||
--listenvs=<meter_driver> list the env variables available for the given meter driver
|
||||
--listfields=<meter_driver> list the fields selectable for the given meter driver
|
||||
--listmeters list all meter drivers
|
||||
--listmeters=<search> list all meter drivers containing the text <search>
|
||||
--logfile=<file> use this file instead of stdout
|
||||
--logtelegrams log the contents of the telegrams for easy replay
|
||||
--ignoreduplicates=<bool> ignore duplicate telegrams, remember the last 10 telegrams
|
||||
|
@ -250,7 +250,7 @@ expecting the same format that is the output from --logtelegrams. This format al
|
|||
As meter quadruples you specify:
|
||||
|
||||
* <meter_name> a mnemonic for this particular meter (!Must not contain a colon ':' character!)
|
||||
* <meter_type> use "auto" or one of the supported meters (can be suffixed with :<mode> to specify which mode you expect the meter to use when transmitting)
|
||||
* <meter_driver> use "auto" or one of the supported meters (can be suffixed with :<mode> to specify which mode you expect the meter to use when transmitting)
|
||||
* <meter_id> an 8 digit mbus id, usually printed on the meter
|
||||
* <meter_key> an encryption key unique for the meter if the meter uses no encryption, then supply NOKEY
|
||||
|
||||
|
|
|
@ -554,15 +554,15 @@ shared_ptr<Configuration> parseCommandLine(int argc, char **argv) {
|
|||
LinkModeSet modes;
|
||||
int bps = 0;
|
||||
size_t colon = type.find(':');
|
||||
MeterType mt = toMeterType(type);
|
||||
MeterDriver mt = toMeterDriver(type);
|
||||
if (colon != string::npos)
|
||||
{
|
||||
// The config can be supplied after the type, like this:
|
||||
// apator162:c1
|
||||
string modess = type.substr(colon+1);
|
||||
type = type.substr(0, colon);
|
||||
mt = toMeterType(type);
|
||||
if (mt == MeterType::UNKNOWN) error("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
mt = toMeterDriver(type);
|
||||
if (mt == MeterDriver::UNKNOWN) error("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
modes = parseLinkModes(modess);
|
||||
LinkModeSet default_modes = toMeterLinkModeSet(type);
|
||||
if (!default_modes.hasAll(modes))
|
||||
|
@ -580,9 +580,9 @@ shared_ptr<Configuration> parseCommandLine(int argc, char **argv) {
|
|||
modes = toMeterLinkModeSet(type);
|
||||
}
|
||||
|
||||
mt = toMeterType(type);
|
||||
mt = toMeterDriver(type);
|
||||
|
||||
if (mt == MeterType::UNKNOWN) error("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
if (mt == MeterDriver::UNKNOWN) error("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
if (!isValidMatchExpressions(id, true)) error("Not a valid id nor a valid meter match expression \"%s\"\n", id.c_str());
|
||||
if (!isValidKey(key, mt)) error("Not a valid meter key \"%s\"\n", key.c_str());
|
||||
vector<string> no_meter_shells, no_meter_jsons;
|
||||
|
|
|
@ -51,7 +51,7 @@ void parseMeterConfig(Configuration *c, vector<char> &buf, string file)
|
|||
auto i = buf.begin();
|
||||
string bus;
|
||||
string name;
|
||||
string type = "auto";
|
||||
string driver = "auto";
|
||||
string id;
|
||||
string key = "";
|
||||
string linkmodes;
|
||||
|
@ -98,7 +98,9 @@ void parseMeterConfig(Configuration *c, vector<char> &buf, string file)
|
|||
}
|
||||
}
|
||||
else
|
||||
if (p.first == "type") type = p.second;
|
||||
if (p.first == "type") driver = p.second;
|
||||
else
|
||||
if (p.first == "driver") driver = p.second;
|
||||
else
|
||||
if (p.first == "id") id = p.second;
|
||||
else
|
||||
|
@ -128,44 +130,46 @@ void parseMeterConfig(Configuration *c, vector<char> &buf, string file)
|
|||
debug("(config) %s=%s\n", p.first.c_str(), p.second.c_str());
|
||||
}
|
||||
}
|
||||
MeterType mt = toMeterType(type);
|
||||
bool use = true;
|
||||
|
||||
LinkModeSet modes;
|
||||
size_t colon = type.find(':');
|
||||
if (colon != string::npos)
|
||||
MeterDriver mt = toMeterDriver(driver);
|
||||
size_t colon = driver.find(':');
|
||||
if (colon == string::npos)
|
||||
{
|
||||
// The config can be supplied after the type, like this:
|
||||
// No suffixes to control the driver.
|
||||
modes = toMeterLinkModeSet(driver);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The config can be supplied after the driver, like this:
|
||||
// apator162:c1
|
||||
// or
|
||||
// pith:mainbus:2400
|
||||
string modess = type.substr(colon+1);
|
||||
type = type.substr(0, colon);
|
||||
mt = toMeterType(type);
|
||||
if (mt == MeterType::UNKNOWN) {
|
||||
warning("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
string modess = driver.substr(colon+1);
|
||||
driver = driver.substr(0, colon);
|
||||
mt = toMeterDriver(driver);
|
||||
if (mt == MeterDriver::UNKNOWN) {
|
||||
warning("Not a valid meter driver \"%s\"\n", driver.c_str());
|
||||
use = false;
|
||||
}
|
||||
modes = parseLinkModes(modess);
|
||||
LinkModeSet default_modes = toMeterLinkModeSet(type);
|
||||
if (!default_modes.hasAll(modes))
|
||||
LinkModeSet default_modes = toMeterLinkModeSet(driver);
|
||||
if (!modes.empty() && !default_modes.hasAll(modes))
|
||||
{
|
||||
string want = modes.hr();
|
||||
string has = default_modes.hr();
|
||||
error("(cmdline) cannot set link modes to: %s because meter %s only transmits on: %s\n",
|
||||
want.c_str(), type.c_str(), has.c_str());
|
||||
want.c_str(), driver.c_str(), has.c_str());
|
||||
}
|
||||
|
||||
string modeshr = modes.hr();
|
||||
debug("(cmdline) setting link modes to %s for meter %s\n",
|
||||
modeshr.c_str(), name.c_str());
|
||||
}
|
||||
else {
|
||||
modes = toMeterLinkModeSet(type);
|
||||
}
|
||||
|
||||
if (mt == MeterType::UNKNOWN) {
|
||||
warning("Not a valid meter type \"%s\"\n", type.c_str());
|
||||
if (mt == MeterDriver::UNKNOWN) {
|
||||
warning("Not a valid meter driver \"%s\"\n", driver.c_str());
|
||||
use = false;
|
||||
}
|
||||
if (!isValidMatchExpressions(id, true)) {
|
||||
|
@ -660,7 +664,7 @@ LinkModeCalculationResult calculateLinkModes(Configuration *config, WMBus *wmbus
|
|||
{
|
||||
meters_union.unionLinkModeSet(m.link_modes);
|
||||
string meter = m.link_modes.hr();
|
||||
debug("(config) meter %s link mode(s): %s\n", toMeterDriver(m.type).c_str(), meter.c_str());
|
||||
debug("(config) meter %s link mode(s): %s\n", toMeterDriver(m.driver).c_str(), meter.c_str());
|
||||
}
|
||||
string metersu = meters_union.hr();
|
||||
debug("(config) all possible link modes that the meters might transmit on: %s\n", metersu.c_str());
|
||||
|
|
|
@ -606,14 +606,14 @@ void find_specified_device_and_mark_as_handled(Configuration *c, Detected *d)
|
|||
}
|
||||
}
|
||||
|
||||
void list_shell_envs(Configuration *config, string meter_type)
|
||||
void list_shell_envs(Configuration *config, string meter_driver)
|
||||
{
|
||||
string ignore1, ignore2, ignore3;
|
||||
vector<string> envs;
|
||||
Telegram t;
|
||||
t.about.device = "?";
|
||||
MeterInfo mi;
|
||||
mi.type = toMeterType(meter_type);
|
||||
mi.driver = toMeterDriver(meter_driver);
|
||||
shared_ptr<Meter> meter = createMeter(&mi);
|
||||
meter->printMeter(&t,
|
||||
&ignore1,
|
||||
|
@ -631,10 +631,10 @@ void list_shell_envs(Configuration *config, string meter_type)
|
|||
}
|
||||
}
|
||||
|
||||
void list_fields(Configuration *config, string meter_type)
|
||||
void list_fields(Configuration *config, string meter_driver)
|
||||
{
|
||||
MeterInfo mi;
|
||||
mi.type = toMeterType(meter_type);
|
||||
mi.driver = toMeterDriver(meter_driver);
|
||||
shared_ptr<Meter> meter = createMeter(&mi);
|
||||
|
||||
int width = 0;
|
||||
|
|
|
@ -42,7 +42,7 @@ private:
|
|||
};
|
||||
|
||||
MeterAmiplus::MeterAmiplus(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::AMIPLUS)
|
||||
MeterCommonImplementation(mi, MeterDriver::AMIPLUS)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ shared_ptr<WaterMeter> createApator08(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterApator08::MeterApator08(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::APATOR08)
|
||||
MeterCommonImplementation(mi, MeterDriver::APATOR08)
|
||||
{
|
||||
// manufacturer 0x8614 is not compliant with flags encoding.
|
||||
// forced decode will decode to APT.
|
||||
|
|
|
@ -43,7 +43,7 @@ shared_ptr<WaterMeter> createApator162(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterApator162::MeterApator162(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::APATOR162)
|
||||
MeterCommonImplementation(mi, MeterDriver::APATOR162)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ struct MeterAuto : public virtual UnknownMeter, public virtual MeterCommonImplem
|
|||
};
|
||||
|
||||
MeterAuto::MeterAuto(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::AUTO)
|
||||
MeterCommonImplementation(mi, MeterDriver::AUTO)
|
||||
{
|
||||
addPrint("meter_info", Quantity::Text,
|
||||
[&](){ return meter_info_; },
|
||||
|
|
|
@ -36,7 +36,7 @@ private:
|
|||
};
|
||||
|
||||
MeterCMa12w::MeterCMa12w(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::CMA12W)
|
||||
MeterCommonImplementation(mi, MeterDriver::CMA12W)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ shared_ptr<HeatMeter> createCompact5(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterCompact5::MeterCompact5(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::COMPACT5)
|
||||
MeterCommonImplementation(mi, MeterDriver::COMPACT5)
|
||||
{
|
||||
// media 0x04 is used for C telegrams
|
||||
// media 0xC3 is used for T telegrams
|
||||
|
|
|
@ -45,7 +45,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEBZWMBE::MeterEBZWMBE(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EBZWMBE)
|
||||
MeterCommonImplementation(mi, MeterDriver::EBZWMBE)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_NO_IV);
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEHZP::MeterEHZP(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EHZP)
|
||||
MeterCommonImplementation(mi, MeterDriver::EHZP)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_NO_IV);
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEI6500::MeterEI6500(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EI6500)
|
||||
MeterCommonImplementation(mi, MeterDriver::EI6500)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ private:
|
|||
};
|
||||
|
||||
MeterElf::MeterElf(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::ELF)
|
||||
MeterCommonImplementation(mi, MeterDriver::ELF)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ shared_ptr<ElectricityMeter> createEM24(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterEM24::MeterEM24(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EM24)
|
||||
MeterCommonImplementation(mi, MeterDriver::EM24)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEMerlin868::MeterEMerlin868(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EMERLIN868)
|
||||
MeterCommonImplementation(mi, MeterDriver::EMERLIN868)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ private:
|
|||
};
|
||||
|
||||
MeterESYSWM::MeterESYSWM(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::ESYSWM)
|
||||
MeterCommonImplementation(mi, MeterDriver::ESYSWM)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_NO_IV);
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEurisII::MeterEurisII(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EURISII)
|
||||
MeterCommonImplementation(mi, MeterDriver::EURISII)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MeterEV200::MeterEV200(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EV200)
|
||||
MeterCommonImplementation(mi, MeterDriver::EV200)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ shared_ptr<WaterMeter> createEVO868(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterEvo868::MeterEvo868(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::EVO868)
|
||||
MeterCommonImplementation(mi, MeterDriver::EVO868)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ shared_ptr<HeatCostAllocationMeter> createFHKVDataIII(MeterInfo &mi)
|
|||
|
||||
|
||||
MeterFHKVDataIII::MeterFHKVDataIII(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::FHKVDATAIII)
|
||||
MeterCommonImplementation(mi, MeterDriver::FHKVDATAIII)
|
||||
{
|
||||
// media 0x80 T telegrams
|
||||
addLinkMode(LinkMode::T1);
|
||||
|
|
|
@ -46,7 +46,7 @@ private:
|
|||
};
|
||||
|
||||
MeterFHKVDataIV::MeterFHKVDataIV(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::FHKVDATAIV)
|
||||
MeterCommonImplementation(mi, MeterDriver::FHKVDATAIV)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ using namespace std;
|
|||
#define INFO_CODE_BURST_SHIFT (4+9)
|
||||
|
||||
struct MeterFlowIQ2200 : public virtual WaterMeter, public virtual MeterCommonImplementation {
|
||||
MeterFlowIQ2200(MeterInfo &mi, MeterType mt);
|
||||
MeterFlowIQ2200(MeterInfo &mi, MeterDriver mt);
|
||||
|
||||
// Total water counted through the meter
|
||||
double totalWaterConsumption(Unit u);
|
||||
|
@ -104,7 +104,7 @@ private:
|
|||
string target_datetime_;
|
||||
};
|
||||
|
||||
MeterFlowIQ2200::MeterFlowIQ2200(MeterInfo &mi, MeterType mt) :
|
||||
MeterFlowIQ2200::MeterFlowIQ2200(MeterInfo &mi, MeterDriver mt) :
|
||||
MeterCommonImplementation(mi, mt)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
@ -269,7 +269,7 @@ bool MeterFlowIQ2200::hasExternalTemperature()
|
|||
|
||||
shared_ptr<WaterMeter> createFlowIQ2200(MeterInfo &mi)
|
||||
{
|
||||
return shared_ptr<WaterMeter>(new MeterFlowIQ2200(mi, MeterType::FLOWIQ2200));
|
||||
return shared_ptr<WaterMeter>(new MeterFlowIQ2200(mi, MeterDriver::FLOWIQ2200));
|
||||
}
|
||||
|
||||
void MeterFlowIQ2200::processContent(Telegram *t)
|
||||
|
@ -316,7 +316,7 @@ void MeterFlowIQ2200::processContent(Telegram *t)
|
|||
(flowiq2200) 4c: 67 vif (External temperature °C)
|
||||
(flowiq2200) 4d: * 13 external temperature (19.000000 °C)
|
||||
*/
|
||||
string meter_name = toMeterDriver(type()).c_str();
|
||||
string meter_name = toMeterDriver(driver()).c_str();
|
||||
|
||||
int offset;
|
||||
string key;
|
||||
|
@ -473,7 +473,7 @@ string MeterFlowIQ2200::statusHumanReadable()
|
|||
string MeterFlowIQ2200::decodeTime(int time)
|
||||
{
|
||||
if (time>7) {
|
||||
string meter_name = toMeterDriver(type()).c_str();
|
||||
string meter_name = toMeterDriver(driver()).c_str();
|
||||
warning("(%s) warning: Cannot decode time %d should be 0-7.\n", meter_name.c_str(), time);
|
||||
}
|
||||
switch (time) {
|
||||
|
|
|
@ -83,7 +83,7 @@ shared_ptr<ElectricityMeter> createCCx01(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterGransystemsCCx01::MeterGransystemsCCx01(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::CCx01)
|
||||
MeterCommonImplementation(mi, MeterDriver::CCx01)
|
||||
{
|
||||
addLinkMode(LinkMode::T1);
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ private:
|
|||
};
|
||||
|
||||
MeterHydrocalM3::MeterHydrocalM3(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::HYDROCALM3)
|
||||
MeterCommonImplementation(mi, MeterDriver::HYDROCALM3)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ shared_ptr<WaterMeter> createHydrodigit(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterHydrodigit::MeterHydrodigit(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::HYDRODIGIT)
|
||||
MeterCommonImplementation(mi, MeterDriver::HYDRODIGIT)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ private:
|
|||
};
|
||||
|
||||
MeterHydrus::MeterHydrus(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::HYDRUS)
|
||||
MeterCommonImplementation(mi, MeterDriver::HYDRUS)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MeterIperl::MeterIperl(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::IPERL)
|
||||
MeterCommonImplementation(mi, MeterDriver::IPERL)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ shared_ptr<WaterMeter> createIzar(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterIzar::MeterIzar(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::IZAR)
|
||||
MeterCommonImplementation(mi, MeterDriver::IZAR)
|
||||
{
|
||||
initializeDiehlDefaultKeySupport(meterKeys()->confidentiality_key, keys);
|
||||
addLinkMode(LinkMode::T1);
|
||||
|
|
|
@ -43,7 +43,7 @@ shared_ptr<WaterMeter> createIzar3(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterIzar3::MeterIzar3(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::IZAR3)
|
||||
MeterCommonImplementation(mi, MeterDriver::IZAR3)
|
||||
{
|
||||
// We do not know how to decode the IZAR r3 aka Diehl AQUARIUS!
|
||||
addLinkMode(LinkMode::T1);
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MeterLansenDW::MeterLansenDW(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::LANSENDW)
|
||||
MeterCommonImplementation(mi, MeterDriver::LANSENDW)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ private:
|
|||
};
|
||||
|
||||
MeterLansenPU::MeterLansenPU(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::LANSENPU)
|
||||
MeterCommonImplementation(mi, MeterDriver::LANSENPU)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MeterLansenSM::MeterLansenSM(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::LANSENSM)
|
||||
MeterCommonImplementation(mi, MeterDriver::LANSENSM)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ private:
|
|||
};
|
||||
|
||||
MeterLansenTH::MeterLansenTH(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::LANSENTH)
|
||||
MeterCommonImplementation(mi, MeterDriver::LANSENTH)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ private:
|
|||
};
|
||||
|
||||
MeterLSE_08::MeterLSE_08(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::LSE_08)
|
||||
MeterCommonImplementation(mi, MeterDriver::LSE_08)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ private:
|
|||
};
|
||||
|
||||
MKRadio3::MKRadio3(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MKRADIO3)
|
||||
MeterCommonImplementation(mi, MeterDriver::MKRADIO3)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
};
|
||||
|
||||
MKRadio4::MKRadio4(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MKRADIO4)
|
||||
MeterCommonImplementation(mi, MeterDriver::MKRADIO4)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ using namespace std;
|
|||
#define INFO_CODE_BURST_SHIFT (4+9)
|
||||
|
||||
struct MeterMultical21 : public virtual WaterMeter, public virtual MeterCommonImplementation {
|
||||
MeterMultical21(MeterInfo &mi, MeterType mt);
|
||||
MeterMultical21(MeterInfo &mi, MeterDriver mt);
|
||||
|
||||
// Total water counted through the meter
|
||||
double totalWaterConsumption(Unit u);
|
||||
|
@ -89,7 +89,7 @@ private:
|
|||
bool has_external_temperature_ {};
|
||||
};
|
||||
|
||||
MeterMultical21::MeterMultical21(MeterInfo &mi, MeterType mt) :
|
||||
MeterMultical21::MeterMultical21(MeterInfo &mi, MeterDriver mt) :
|
||||
MeterCommonImplementation(mi, mt)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
@ -207,9 +207,9 @@ bool MeterMultical21::hasExternalTemperature()
|
|||
return has_external_temperature_;
|
||||
}
|
||||
|
||||
shared_ptr<WaterMeter> createMulticalWaterMeter(MeterInfo &mi, MeterType mt)
|
||||
shared_ptr<WaterMeter> createMulticalWaterMeter(MeterInfo &mi, MeterDriver mt)
|
||||
{
|
||||
if (mt != MeterType::MULTICAL21 && mt != MeterType::FLOWIQ3100) {
|
||||
if (mt != MeterDriver::MULTICAL21 && mt != MeterDriver::FLOWIQ3100) {
|
||||
error("Internal error! Not a proper meter type when creating a multical21 style meter.\n");
|
||||
}
|
||||
return shared_ptr<WaterMeter>(new MeterMultical21(mi,mt));
|
||||
|
@ -217,12 +217,12 @@ shared_ptr<WaterMeter> createMulticalWaterMeter(MeterInfo &mi, MeterType mt)
|
|||
|
||||
shared_ptr<WaterMeter> createMultical21(MeterInfo &mi)
|
||||
{
|
||||
return createMulticalWaterMeter(mi, MeterType::MULTICAL21);
|
||||
return createMulticalWaterMeter(mi, MeterDriver::MULTICAL21);
|
||||
}
|
||||
|
||||
shared_ptr<WaterMeter> createFlowIQ3100(MeterInfo &mi)
|
||||
{
|
||||
return createMulticalWaterMeter(mi, MeterType::FLOWIQ3100);
|
||||
return createMulticalWaterMeter(mi, MeterDriver::FLOWIQ3100);
|
||||
}
|
||||
|
||||
void MeterMultical21::processContent(Telegram *t)
|
||||
|
@ -287,7 +287,7 @@ void MeterMultical21::processContent(Telegram *t)
|
|||
// 2d: 0F vife (?)
|
||||
// 2e: * 0D external temperature (13.000000 °C)
|
||||
|
||||
string meter_name = toMeterDriver(type()).c_str();
|
||||
string meter_name = toMeterDriver(driver()).c_str();
|
||||
|
||||
int offset;
|
||||
string key;
|
||||
|
@ -423,7 +423,7 @@ string MeterMultical21::statusHumanReadable()
|
|||
string MeterMultical21::decodeTime(int time)
|
||||
{
|
||||
if (time>7) {
|
||||
string meter_name = toMeterDriver(type()).c_str();
|
||||
string meter_name = toMeterDriver(driver()).c_str();
|
||||
warning("(%s) warning: Cannot decode time %d should be 0-7.\n", meter_name.c_str(), time);
|
||||
}
|
||||
switch (time) {
|
||||
|
|
|
@ -52,7 +52,7 @@ private:
|
|||
};
|
||||
|
||||
MeterMultical302::MeterMultical302(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MULTICAL302)
|
||||
MeterCommonImplementation(mi, MeterDriver::MULTICAL302)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ private:
|
|||
};
|
||||
|
||||
MeterMultical403::MeterMultical403(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MULTICAL403)
|
||||
MeterCommonImplementation(mi, MeterDriver::MULTICAL403)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ private:
|
|||
};
|
||||
|
||||
MeterMultical603::MeterMultical603(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MULTICAL603)
|
||||
MeterCommonImplementation(mi, MeterDriver::MULTICAL603)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ private:
|
|||
};
|
||||
|
||||
MeterMultical803::MeterMultical803(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::MULTICAL803)
|
||||
MeterCommonImplementation(mi, MeterDriver::MULTICAL803)
|
||||
{
|
||||
setExpectedELLSecurityMode(ELLSecurityMode::AES_CTR);
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ shared_ptr<ElectricityMeter> createOmnipower(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterOmnipower::MeterOmnipower(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::OMNIPOWER)
|
||||
MeterCommonImplementation(mi, MeterDriver::OMNIPOWER)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ private:
|
|||
};
|
||||
|
||||
MeterPIIGTH::MeterPIIGTH(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::PIIGTH)
|
||||
MeterCommonImplementation(mi, MeterDriver::PIIGTH)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ shared_ptr<WaterMeter> createQ400(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterQ400::MeterQ400(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::Q400)
|
||||
MeterCommonImplementation(mi, MeterDriver::Q400)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ private:
|
|||
};
|
||||
|
||||
MeterQCaloric::MeterQCaloric(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::QCALORIC)
|
||||
MeterCommonImplementation(mi, MeterDriver::QCALORIC)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ private:
|
|||
};
|
||||
|
||||
MeterRfmAmb::MeterRfmAmb(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::RFMAMB)
|
||||
MeterCommonImplementation(mi, MeterDriver::RFMAMB)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ shared_ptr<WaterMeter> createRfmTX1(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterRfmTX1::MeterRfmTX1(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::RFMTX1)
|
||||
MeterCommonImplementation(mi, MeterDriver::RFMTX1)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ shared_ptr<HeatMeter> createSensostar(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterSensostar::MeterSensostar(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::SENSOSTAR)
|
||||
MeterCommonImplementation(mi, MeterDriver::SENSOSTAR)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ private:
|
|||
};
|
||||
|
||||
MeterSharky::MeterSharky(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::SHARKY)
|
||||
MeterCommonImplementation(mi, MeterDriver::SHARKY)
|
||||
{
|
||||
addLinkMode(LinkMode::T1);
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ private:
|
|||
};
|
||||
|
||||
MeterSontex868::MeterSontex868(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::SONTEX868)
|
||||
MeterCommonImplementation(mi, MeterDriver::SONTEX868)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ shared_ptr<WaterMeter> createSupercom587(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterSupercom587::MeterSupercom587(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::SUPERCOM587)
|
||||
MeterCommonImplementation(mi, MeterDriver::SUPERCOM587)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ shared_ptr<WaterMeter> createTopasEsKr(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterTopasEsKr::MeterTopasEsKr(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::TOPASESKR)
|
||||
MeterCommonImplementation(mi, MeterDriver::TOPASESKR)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ private:
|
|||
};
|
||||
|
||||
MeterTSD2::MeterTSD2(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::TSD2)
|
||||
MeterCommonImplementation(mi, MeterDriver::TSD2)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ shared_ptr<WaterMeter> createUltrimis(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterUltrimis::MeterUltrimis(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::ULTRIMIS)
|
||||
MeterCommonImplementation(mi, MeterDriver::ULTRIMIS)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ struct MeterUnknown : public virtual UnknownMeter, public virtual MeterCommonImp
|
|||
};
|
||||
|
||||
MeterUnknown::MeterUnknown(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::AUTO)
|
||||
MeterCommonImplementation(mi, MeterDriver::AUTO)
|
||||
{
|
||||
addPrint("meter_info", Quantity::Text,
|
||||
[&](){ return meter_info_; },
|
||||
|
|
|
@ -46,7 +46,7 @@ shared_ptr<HeatMeter> createVario451(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterVario451::MeterVario451(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::VARIO451)
|
||||
MeterCommonImplementation(mi, MeterDriver::VARIO451)
|
||||
{
|
||||
// media 0x04 C telegrams
|
||||
// media 0xC3 T telegrams
|
||||
|
|
|
@ -52,7 +52,7 @@ shared_ptr<WaterMeter> createWaterstarM(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterWaterstarM::MeterWaterstarM(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::WATERSTARM)
|
||||
MeterCommonImplementation(mi, MeterDriver::WATERSTARM)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ shared_ptr<WaterMeter> createWEH_07(MeterInfo &mi)
|
|||
}
|
||||
|
||||
MeterWEH_07::MeterWEH_07(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::WEH_07)
|
||||
MeterCommonImplementation(mi, MeterDriver::WEH_07)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ private:
|
|||
};
|
||||
|
||||
MeterWhe46x::MeterWhe46x(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::WHE46X)
|
||||
MeterCommonImplementation(mi, MeterDriver::WHE46X)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ private:
|
|||
};
|
||||
|
||||
MeterWhe5x::MeterWhe5x(MeterInfo &mi) :
|
||||
MeterCommonImplementation(mi, MeterType::WHE5X)
|
||||
MeterCommonImplementation(mi, MeterDriver::WHE5X)
|
||||
{
|
||||
setExpectedTPLSecurityMode(TPLSecurityMode::AES_CBC_IV);
|
||||
|
||||
|
|
|
@ -165,11 +165,11 @@ public:
|
|||
tmp.ids = tmp_ids;
|
||||
tmp.idsc = t.ids.back();
|
||||
|
||||
if (tmp.type == MeterType::AUTO)
|
||||
if (tmp.driver == MeterDriver::AUTO)
|
||||
{
|
||||
// Look up the proper meter driver!
|
||||
tmp.type = pickMeterDriver(&t);
|
||||
if (tmp.type == MeterType::UNKNOWN)
|
||||
tmp.driver = pickMeterDriver(&t);
|
||||
if (tmp.driver == MeterDriver::UNKNOWN)
|
||||
{
|
||||
warnForUnknownDriver(mi.name, &t);
|
||||
}
|
||||
|
@ -183,7 +183,7 @@ public:
|
|||
verbose("(meter) used meter template %s %s %s to match %s\n",
|
||||
mi.name.c_str(),
|
||||
mi.idsc.c_str(),
|
||||
toMeterDriver(mi.type).c_str(),
|
||||
toMeterDriver(mi.driver).c_str(),
|
||||
idsc.c_str());
|
||||
|
||||
if (is_daemon_)
|
||||
|
@ -192,7 +192,7 @@ public:
|
|||
meter->index(),
|
||||
mi.name.c_str(),
|
||||
tmp.idsc.c_str(),
|
||||
toMeterDriver(mi.type).c_str());
|
||||
toMeterDriver(mi.driver).c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -200,7 +200,7 @@ public:
|
|||
meter->index(),
|
||||
mi.name.c_str(),
|
||||
tmp.idsc.c_str(),
|
||||
toMeterDriver(mi.type).c_str());
|
||||
toMeterDriver(mi.driver).c_str());
|
||||
}
|
||||
|
||||
bool match = false;
|
||||
|
@ -211,7 +211,7 @@ public:
|
|||
// but it still did not match! This is probably an error in wmbusmeters!
|
||||
warning("(meter) newly created meter (%s %s %s) did not match telegram! ",
|
||||
"Please open an issue at https://github.com/weetmuts/wmbusmeters/\n",
|
||||
meter->name().c_str(), meter->idsc().c_str(), toMeterDriver(meter->type()).c_str());
|
||||
meter->name().c_str(), meter->idsc().c_str(), toMeterDriver(meter->driver()).c_str());
|
||||
}
|
||||
else if (!h)
|
||||
{
|
||||
|
@ -219,7 +219,7 @@ public:
|
|||
// but it still did not handle it! This can happen if the wrong
|
||||
// decryption key was used.
|
||||
warning("(meter) newly created meter (%s %s %s) did not handle telegram!\n",
|
||||
meter->name().c_str(), meter->idsc().c_str(), toMeterDriver(meter->type()).c_str());
|
||||
meter->name().c_str(), meter->idsc().c_str(), toMeterDriver(meter->driver()).c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -255,8 +255,8 @@ shared_ptr<MeterManager> createMeterManager(bool daemon)
|
|||
}
|
||||
|
||||
MeterCommonImplementation::MeterCommonImplementation(MeterInfo &mi,
|
||||
MeterType type) :
|
||||
type_(type), name_(mi.name)
|
||||
MeterDriver driver) :
|
||||
driver_(driver), name_(mi.name)
|
||||
{
|
||||
ids_ = mi.ids;
|
||||
idsc_ = toIdsCommaSeparated(ids_);
|
||||
|
@ -301,9 +301,9 @@ vector<string> &MeterCommonImplementation::additionalJsons()
|
|||
return jsons_;
|
||||
}
|
||||
|
||||
MeterType MeterCommonImplementation::type()
|
||||
MeterDriver MeterCommonImplementation::driver()
|
||||
{
|
||||
return type_;
|
||||
return driver_;
|
||||
}
|
||||
|
||||
void MeterCommonImplementation::addLinkMode(LinkMode lm)
|
||||
|
@ -388,20 +388,20 @@ string MeterCommonImplementation::datetimeOfUpdateRobot()
|
|||
return string(datetime);
|
||||
}
|
||||
|
||||
string toMeterDriver(MeterType mt)
|
||||
string toMeterDriver(MeterDriver mt)
|
||||
{
|
||||
#define X(mname,link,info,type,cname) if (mt == MeterType::type) return #mname;
|
||||
#define X(mname,link,info,type,cname) if (mt == MeterDriver::type) return #mname;
|
||||
LIST_OF_METERS
|
||||
#undef X
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
MeterType toMeterType(string& t)
|
||||
MeterDriver toMeterDriver(string& t)
|
||||
{
|
||||
#define X(mname,linkmodes,info,type,cname) if (t == #mname) return MeterType::type;
|
||||
#define X(mname,linkmodes,info,type,cname) if (t == #mname) return MeterDriver::type;
|
||||
LIST_OF_METERS
|
||||
#undef X
|
||||
return MeterType::UNKNOWN;
|
||||
return MeterDriver::UNKNOWN;
|
||||
}
|
||||
|
||||
LinkModeSet toMeterLinkModeSet(string& t)
|
||||
|
@ -417,7 +417,7 @@ bool MeterCommonImplementation::isTelegramForMeter(Telegram *t, Meter *meter, Me
|
|||
string name;
|
||||
vector<string> ids;
|
||||
string idsc;
|
||||
MeterType type;
|
||||
MeterDriver driver;
|
||||
|
||||
assert((meter && !mi) ||
|
||||
(!meter && mi));
|
||||
|
@ -427,14 +427,14 @@ bool MeterCommonImplementation::isTelegramForMeter(Telegram *t, Meter *meter, Me
|
|||
name = meter->name();
|
||||
ids = meter->ids();
|
||||
idsc = meter->idsc();
|
||||
type = meter->type();
|
||||
driver = meter->driver();
|
||||
}
|
||||
else
|
||||
{
|
||||
name = mi->name;
|
||||
ids = mi->ids;
|
||||
idsc = mi->idsc;
|
||||
type = mi->type;
|
||||
driver = mi->driver;
|
||||
}
|
||||
|
||||
debug("(meter) %s: for me? %s\n", name.c_str(), idsc.c_str());
|
||||
|
@ -448,13 +448,13 @@ bool MeterCommonImplementation::isTelegramForMeter(Telegram *t, Meter *meter, Me
|
|||
return false;
|
||||
}
|
||||
|
||||
bool valid_driver = isMeterDriverValid(type, t->dll_mfct, t->dll_type, t->dll_version);
|
||||
bool valid_driver = isMeterDriverValid(driver, t->dll_mfct, t->dll_type, t->dll_version);
|
||||
if (!valid_driver && t->tpl_id_found)
|
||||
{
|
||||
valid_driver = isMeterDriverValid(type, t->tpl_mfct, t->tpl_type, t->tpl_version);
|
||||
valid_driver = isMeterDriverValid(driver, t->tpl_mfct, t->tpl_type, t->tpl_version);
|
||||
}
|
||||
|
||||
if (!valid_driver && type != MeterType::AUTO)
|
||||
if (!valid_driver && driver != MeterDriver::AUTO)
|
||||
{
|
||||
// Are we using the right driver? Perhaps not since
|
||||
// this particular driver, mfct, media, version combo
|
||||
|
@ -479,7 +479,7 @@ bool MeterCommonImplementation::isTelegramForMeter(Telegram *t, Meter *meter, Me
|
|||
warning("(meter) %s: meter detection did not match the selected driver %s! correct driver is: %s\n"
|
||||
"(meter) Not printing this warning agin for id: %02x%02x%02x%02x mfct: (%s) %s (0x%02x) type: %s (0x%02x) ver: 0x%02x\n",
|
||||
name.c_str(),
|
||||
toMeterDriver(type).c_str(),
|
||||
toMeterDriver(driver).c_str(),
|
||||
possible_drivers.c_str(),
|
||||
t->dll_id_b[3], t->dll_id_b[2], t->dll_id_b[1], t->dll_id_b[0],
|
||||
manufacturerFlag(t->dll_mfct).c_str(),
|
||||
|
@ -911,21 +911,21 @@ ELLSecurityMode MeterCommonImplementation::expectedELLSecurityMode()
|
|||
|
||||
void detectMeterDrivers(int manufacturer, int media, int version, vector<string> *drivers)
|
||||
{
|
||||
#define X(TY,MA,ME,VE) { if (manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { drivers->push_back(toMeterDriver(MeterType::TY)); }}
|
||||
#define X(TY,MA,ME,VE) { if (manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { drivers->push_back(toMeterDriver(MeterDriver::TY)); }}
|
||||
METER_DETECTION
|
||||
#undef X
|
||||
}
|
||||
|
||||
bool isMeterDriverValid(MeterType type, int manufacturer, int media, int version)
|
||||
bool isMeterDriverValid(MeterDriver type, int manufacturer, int media, int version)
|
||||
{
|
||||
#define X(TY,MA,ME,VE) { if (type == MeterType::TY && manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { return true; }}
|
||||
#define X(TY,MA,ME,VE) { if (type == MeterDriver::TY && manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { return true; }}
|
||||
METER_DETECTION
|
||||
#undef X
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
MeterType pickMeterDriver(Telegram *t)
|
||||
MeterDriver pickMeterDriver(Telegram *t)
|
||||
{
|
||||
int manufacturer = t->dll_mfct;
|
||||
int media = t->dll_type;
|
||||
|
@ -938,10 +938,10 @@ MeterType pickMeterDriver(Telegram *t)
|
|||
version = t->tpl_version;
|
||||
}
|
||||
|
||||
#define X(TY,MA,ME,VE) { if (manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { return MeterType::TY; }}
|
||||
#define X(TY,MA,ME,VE) { if (manufacturer == MA && (media == ME || ME == -1) && (version == VE || VE == -1)) { return MeterDriver::TY; }}
|
||||
METER_DETECTION
|
||||
#undef X
|
||||
return MeterType::UNKNOWN;
|
||||
return MeterDriver::UNKNOWN;
|
||||
}
|
||||
|
||||
shared_ptr<Meter> createMeter(MeterInfo *mi)
|
||||
|
@ -950,10 +950,10 @@ shared_ptr<Meter> createMeter(MeterInfo *mi)
|
|||
|
||||
const char *keymsg = (mi->key[0] == 0) ? "not-encrypted" : "encrypted";
|
||||
|
||||
switch (mi->type)
|
||||
switch (mi->driver)
|
||||
{
|
||||
#define X(mname,link,info,type,cname) \
|
||||
case MeterType::type: \
|
||||
#define X(mname,link,info,driver,cname) \
|
||||
case MeterDriver::driver: \
|
||||
{ \
|
||||
newm = create##cname(*mi); \
|
||||
newm->addConversions(mi->conversions); \
|
||||
|
|
23
src/meters.h
23
src/meters.h
|
@ -88,7 +88,7 @@
|
|||
X(weh_07, C1_bit, WaterMeter, WEH_07, WEH_07) \
|
||||
|
||||
|
||||
enum class MeterType {
|
||||
enum class MeterDriver {
|
||||
#define X(mname,linkmode,info,type,cname) type,
|
||||
LIST_OF_METERS
|
||||
#undef X
|
||||
|
@ -96,7 +96,7 @@ LIST_OF_METERS
|
|||
|
||||
struct MeterMatch
|
||||
{
|
||||
MeterType driver;
|
||||
MeterDriver driver;
|
||||
int manufacturer;
|
||||
int media;
|
||||
int version;
|
||||
|
@ -106,9 +106,9 @@ struct MeterMatch
|
|||
void detectMeterDrivers(int manufacturer, int media, int version, std::vector<std::string> *drivers);
|
||||
// When entering the driver, check that the telegram is indeed known to be
|
||||
// compatible with the driver(type), if not then print a warning.
|
||||
bool isMeterDriverValid(MeterType type, int manufacturer, int media, int version);
|
||||
bool isMeterDriverValid(MeterDriver type, int manufacturer, int media, int version);
|
||||
// Return the best driver match for a telegram.
|
||||
MeterType pickMeterDriver(Telegram *t);
|
||||
MeterDriver pickMeterDriver(Telegram *t);
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -120,7 +120,8 @@ struct MeterInfo
|
|||
// A bus can be an mbus or a wmbus dongle.
|
||||
// The bus can be the empty string, which means that it will fallback to the first defined bus.
|
||||
string name; // User specified name of this (group of) meters.
|
||||
MeterType type {}; // Driver
|
||||
MeterDriver driver {}; // Requested driver for decoding telegrams from this meter.
|
||||
string extras; // Extra driver specific settings.
|
||||
vector<string> ids; // Match expressions for ids.
|
||||
string idsc; // Comma separated ids.
|
||||
string key; // Decryption key.
|
||||
|
@ -134,11 +135,11 @@ struct MeterInfo
|
|||
{
|
||||
}
|
||||
|
||||
MeterInfo(string b, string n, MeterType t, vector<string> i, string k, LinkModeSet lms, int baud, vector<string> &s, vector<string> &j)
|
||||
MeterInfo(string b, string n, MeterDriver d, vector<string> i, string k, LinkModeSet lms, int baud, vector<string> &s, vector<string> &j)
|
||||
{
|
||||
bus = b;
|
||||
name = n;
|
||||
type = t;
|
||||
driver = d;
|
||||
ids = i;
|
||||
idsc = toIdsCommaSeparated(ids);
|
||||
key = k;
|
||||
|
@ -177,7 +178,7 @@ struct Meter
|
|||
virtual vector<Print> prints() = 0;
|
||||
virtual string meterDriver() = 0;
|
||||
virtual string name() = 0;
|
||||
virtual MeterType type() = 0;
|
||||
virtual MeterDriver driver() = 0;
|
||||
|
||||
virtual string datetimeOfUpdateHumanReadable() = 0;
|
||||
virtual string datetimeOfUpdateRobot() = 0;
|
||||
|
@ -324,9 +325,9 @@ struct PulseCounter : public virtual Meter
|
|||
struct Generic : public virtual Meter {
|
||||
};
|
||||
|
||||
string toMeterDriver(MeterType mt);
|
||||
MeterType toMeterType(string& type);
|
||||
LinkModeSet toMeterLinkModeSet(string& type);
|
||||
string toMeterDriver(MeterDriver driver);
|
||||
MeterDriver toMeterDriver(string& driver);
|
||||
LinkModeSet toMeterLinkModeSet(string& driver);
|
||||
|
||||
#define X(mname,linkmode,info,type,cname) shared_ptr<info> create##cname(MeterInfo &m);
|
||||
LIST_OF_METERS
|
||||
|
|
|
@ -33,7 +33,7 @@ struct MeterCommonImplementation : public virtual Meter
|
|||
vector<string> fields();
|
||||
vector<Print> prints();
|
||||
string name();
|
||||
MeterType type();
|
||||
MeterDriver driver();
|
||||
|
||||
ELLSecurityMode expectedELLSecurityMode();
|
||||
TPLSecurityMode expectedTPLSecurityMode();
|
||||
|
@ -51,11 +51,11 @@ struct MeterCommonImplementation : public virtual Meter
|
|||
double getRecordAsDouble(std::string record);
|
||||
uint16_t getRecordAsUInt16(std::string record);
|
||||
|
||||
MeterCommonImplementation(MeterInfo &mi, MeterType type);
|
||||
MeterCommonImplementation(MeterInfo &mi, MeterDriver driver);
|
||||
|
||||
~MeterCommonImplementation() = default;
|
||||
|
||||
string meterDriver() { return toMeterDriver(type_); }
|
||||
string meterDriver() { return toMeterDriver(driver_); }
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -91,7 +91,7 @@ protected:
|
|||
private:
|
||||
|
||||
int index_ {};
|
||||
MeterType type_ {};
|
||||
MeterDriver driver_ {};
|
||||
MeterKeys meter_keys_ {};
|
||||
ELLSecurityMode expected_ell_sec_mode_ {};
|
||||
TPLSecurityMode expected_tpl_sec_mode_ {};
|
||||
|
|
|
@ -267,7 +267,7 @@ int test_linkmodes()
|
|||
vector<string> ids = { "12345678" };
|
||||
apator_config.meters.push_back(MeterInfo("", // bus
|
||||
"m1", // name
|
||||
MeterType::APATOR162, // driver/type
|
||||
MeterDriver::APATOR162, // driver/type
|
||||
ids, // ids
|
||||
"", // Key
|
||||
toMeterLinkModeSet(apator162), // link mode set
|
||||
|
@ -308,12 +308,12 @@ int test_linkmodes()
|
|||
string multical21 = "multical21";
|
||||
string supercom587 = "supercom587";
|
||||
|
||||
multical21_and_supercom587_config.meters.push_back(MeterInfo("", "m1", MeterType::MULTICAL21, ids, "",
|
||||
multical21_and_supercom587_config.meters.push_back(MeterInfo("", "m1", MeterDriver::MULTICAL21, ids, "",
|
||||
toMeterLinkModeSet(multical21),
|
||||
0,
|
||||
no_meter_shells,
|
||||
no_meter_jsons));
|
||||
multical21_and_supercom587_config.meters.push_back(MeterInfo("", "m2", MeterType::SUPERCOM587, ids, "",
|
||||
multical21_and_supercom587_config.meters.push_back(MeterInfo("", "m2", MeterDriver::SUPERCOM587, ids, "",
|
||||
toMeterLinkModeSet(supercom587),
|
||||
0,
|
||||
no_meter_shells,
|
||||
|
|
|
@ -741,15 +741,15 @@ string toIdsCommaSeparated(std::vector<std::string> &ids)
|
|||
return cs;
|
||||
}
|
||||
|
||||
bool isValidKey(string& key, MeterType mt)
|
||||
bool isValidKey(string& key, MeterDriver mt)
|
||||
{
|
||||
if (key.length() == 0) return true;
|
||||
if (key == "NOKEY") {
|
||||
key = "";
|
||||
return true;
|
||||
}
|
||||
if (mt == MeterType::IZAR ||
|
||||
mt == MeterType::HYDRUS)
|
||||
if (mt == MeterDriver::IZAR ||
|
||||
mt == MeterDriver::HYDRUS)
|
||||
{
|
||||
// These meters can either be OMS compatible 128 bit key (32 hex).
|
||||
// Or using an older proprietary encryption with 64 bit keys (16 hex)
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include<map>
|
||||
#include<vector>
|
||||
|
||||
enum class MeterType;
|
||||
enum class MeterDriver;
|
||||
|
||||
void onExit(std::function<void()> cb);
|
||||
void restoreSignalHandlers();
|
||||
|
@ -113,7 +113,7 @@ std::string toIdsCommaSeparated(std::vector<std::string> &ids);
|
|||
|
||||
bool isValidId(std::string id, bool accept_non_compliant);
|
||||
|
||||
bool isValidKey(std::string& key, MeterType mt);
|
||||
bool isValidKey(std::string& key, MeterDriver mt);
|
||||
bool isFrequency(std::string& fq);
|
||||
bool isNumber(std::string& fq);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name=Smokey
|
||||
type=ei6500
|
||||
driver=ei6500
|
||||
id=00012811
|
||||
key=
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name=myomnipower
|
||||
type=omnipower
|
||||
driver=auto
|
||||
id=32666857
|
||||
key=
|
||||
|
|
Ładowanie…
Reference in New Issue