Add on_time_h and batter_pct to qualcosonic driver. Add Percentage unit. Add 'keep open' tag and update workflow.

pull/1167/head
Fredrik Öhrström 2024-02-12 09:34:59 +01:00
rodzic 378c367475
commit 4d3e306f30
33 zmienionych plików z 65 dodań i 62 usunięć

Wyświetl plik

@ -17,6 +17,6 @@ jobs:
days-before-stale: 60
days-before-close: 30
operations-per-run: 1000
exempt-issue-labels: 'enhancement, Work in progress, Planned'
exempt-issue-labels: 'enhancement, work in progress, planned, keep open'
days-before-pr-stale: -1
days-before-pr-close: -1

Wyświetl plik

@ -39,7 +39,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("software_version");
addOptionalLibraryFields("software_version");
addStringField(
"status",

Wyświetl plik

@ -237,7 +237,7 @@ XMQProceed DriverDynamic::add_detect(XMQDoc *doc, XMQNode *detect, DriverInfo *d
XMQProceed DriverDynamic::add_use(XMQDoc *doc, XMQNode *field, DriverDynamic *dd)
{
string name = xmqGetString(doc, field, ".");
dd->addOptionalCommonFields(name);
dd->addOptionalLibraryFields(name);
return XMQ_CONTINUE;
}

Wyświetl plik

@ -40,7 +40,7 @@ namespace
"Meter status. Includes both meter error field and tpl status field.",
PrintProperty::STATUS | PrintProperty::INCLUDE_TPL_STATUS);
addOptionalCommonFields("on_time_h");
addOptionalLibraryFields("on_time_h");
addNumericFieldWithExtractor(
"total_energy_consumption",

Wyświetl plik

@ -237,7 +237,7 @@ namespace
.set(StorageNr(1))
);
addOptionalCommonFields("operating_time_h,on_time_h,meter_datetime");
addOptionalLibraryFields("operating_time_h,on_time_h,meter_datetime");
}
}

Wyświetl plik

@ -37,7 +37,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("fabrication_no,enhanced_id,location");
addOptionalLibraryFields("fabrication_no,enhanced_id,location");
addStringFieldWithExtractor(
"location_hex",

Wyświetl plik

@ -59,8 +59,8 @@ namespace
},
});
addOptionalCommonFields("fabrication_no");
addOptionalFlowRelatedFields("total_m3");
addOptionalLibraryFields("fabrication_no");
addOptionalLibraryFields("total_m3");
addNumericFieldWithExtractor(
"consumption_at_set_date",

Wyświetl plik

@ -38,8 +38,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("actuality_duration_s");
addOptionalFlowRelatedFields("total_m3,target_m3,target_date");
addOptionalLibraryFields("actuality_duration_s");
addOptionalLibraryFields("total_m3,target_m3,target_date");
addStringField(
"status",

Wyświetl plik

@ -44,8 +44,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("operating_time_h,actuality_duration_s,meter_datetime,customer");
addOptionalFlowRelatedFields("flow_temperature_c,external_temperature_c");
addOptionalLibraryFields("operating_time_h,actuality_duration_s,meter_datetime,customer");
addOptionalLibraryFields("flow_temperature_c,external_temperature_c");
addStringField(
"status",

Wyświetl plik

@ -38,7 +38,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("firmware_version,manufacturer,meter_datetime,model_version");
addOptionalLibraryFields("firmware_version,manufacturer,meter_datetime,model_version");
addStringField(
"status",

Wyświetl plik

@ -45,8 +45,8 @@ namespace
addLinkMode(LinkMode::T1);
addOptionalCommonFields("enhanced_id,meter_datetime");
addOptionalFlowRelatedFields("total_m3,total_backward_m3,volume_flow_m3h");
addOptionalLibraryFields("enhanced_id,meter_datetime");
addOptionalLibraryFields("total_m3,total_backward_m3,volume_flow_m3h");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -38,8 +38,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime");
addOptionalFlowRelatedFields("total_m3");
addOptionalLibraryFields("meter_datetime");
addOptionalLibraryFields("total_m3");
addStringField(
"status",

Wyświetl plik

@ -59,8 +59,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("fabrication_no,meter_datetime,on_time_h,on_time_at_error_h");
addOptionalFlowRelatedFields("flow_return_temperature_difference_c");
addOptionalLibraryFields("fabrication_no,meter_datetime,on_time_h,on_time_at_error_h");
addOptionalLibraryFields("flow_return_temperature_difference_c");
// Technical Description Multical 603 page 116 section 7.7.2 Information code types on serial communication.
addStringFieldWithExtractorAndLookup(

Wyświetl plik

@ -36,7 +36,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("on_time_h");
addOptionalLibraryFields("on_time_h");
setMfctTPLStatusBits(
Translate::Lookup()
.add(Translate::Rule("TPL_STS", Translate::Type::BitToString)

Wyświetl plik

@ -36,8 +36,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime,model_version,parameter_set");
addOptionalFlowRelatedFields("flow_temperature_c,return_temperature_c");
addOptionalLibraryFields("meter_datetime,model_version,parameter_set");
addOptionalLibraryFields("flow_temperature_c,return_temperature_c");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -39,8 +39,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_date,fabrication_no,operating_time_h,on_time_h,on_time_at_error_h,meter_datetime");
addOptionalFlowRelatedFields("total_m3,total_backward_m3,volume_flow_m3h");
addOptionalLibraryFields("meter_date,fabrication_no,operating_time_h,on_time_h,on_time_at_error_h,meter_datetime");
addOptionalLibraryFields("total_m3,total_backward_m3,volume_flow_m3h");
/* If the meter is recently commissioned, the target water consumption value is bogus.
The bits store 0xffffffff. Should we deal with this? Now a very large value is printed in the json.

Wyświetl plik

@ -36,7 +36,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("fabrication_no,software_version");
addOptionalLibraryFields("fabrication_no,software_version");
addStringField(
"status",

Wyświetl plik

@ -179,7 +179,7 @@ namespace
.set(StorageNr(1))
);
addOptionalCommonFields("operating_time_h,on_time_h,on_time_at_error_h,meter_datetime");
addOptionalLibraryFields("operating_time_h,on_time_h,on_time_at_error_h,meter_datetime");
}
}

Wyświetl plik

@ -36,8 +36,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime");
addOptionalFlowRelatedFields("total_m3,total_forward_m3,total_backward_m3,flow_temperature_c,volume_flow_m3h");
addOptionalLibraryFields("meter_datetime");
addOptionalLibraryFields("total_m3,total_forward_m3,total_backward_m3,flow_temperature_c,volume_flow_m3h");
addStringField(
"status",

Wyświetl plik

@ -1,5 +1,5 @@
/*
Copyright (C) 2022 Fredrik Öhrström (gpl-3.0-or-later)
Copyright (C) 2022-2024 Fredrik Öhrström (gpl-3.0-or-later)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -38,8 +38,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("fabrication_no,operating_time_h,on_time_h,meter_datetime,meter_datetime_at_error");
addOptionalFlowRelatedFields("total_m3,flow_temperature_c,return_temperature_c,flow_return_temperature_difference_c,volume_flow_m3h");
addOptionalLibraryFields("fabrication_no,on_time_h,operating_time_h,on_time_h,meter_datetime,meter_datetime_at_error");
addOptionalLibraryFields("total_m3,flow_temperature_c,return_temperature_c,flow_return_temperature_difference_c,volume_flow_m3h");
addStringFieldWithExtractorAndLookup(
"status",
@ -135,6 +135,17 @@ namespace
.set(StorageNr(16))
);
addNumericFieldWithExtractor(
"battery",
"Percentage of battery remaining.",
DEFAULT_PRINT_PROPERTIES,
Quantity::Dimensionless,
VifScaling::None,
FieldMatcher::build()
.set(DifVifKey("01FD74")),
Unit::PERCENTAGE
);
}
}
@ -152,3 +163,8 @@ namespace
// telegram=|9A440907859449980C0D7A8C000000_046D3201E122346D0000010134FD17000000000420BB776802042490776802048E3BF2190000048E3C00000000041329860100042B6A010000043B0B0000000259F615025D1E0B0261D80A0C788594499884086D3B17FF21820859BC1382085D720B840824915D680284088E3BED19000084088E3C00000000840813028601008408BE5800000000027F00AD|
// {"media":"heat/cooling load","meter":"qualcosonic","name":"qualcoe4long","id":"98499485","fabrication_no":"98499485","operating_time_h":11222.44,"on_time_h":11222.451944,"meter_datetime":"2023-02-01 01:50","meter_datetime_at_error":"2000-01-01 00:00","total_m3":99.881,"flow_temperature_c":56.22,"return_temperature_c":28.46,"flow_return_temperature_difference_c":27.76,"volume_flow_m3h":0.011,"status":"OK","total_heat_energy_kwh":1845,"total_cooling_energy_kwh":0,"power_kw":0.362,"target_datetime":"2023-01-31 23:59","target_heat_energy_kwh":1843.611111,"target_cooling_energy_kwh":0,"timestamp":"1111-11-11T11:11:11Z"}
// |qualcoe4long;98499485;OK;1845;0;0.362;2023-01-31 23:59;1843.611111;0;1111-11-11 11:11.11
// Test: M qualcosonic 05829163 NOKEY
// telegram=|544409076391820510077ABF100000046D2A0DC62C0420E80F430104130000000004933B0000000004933C00000000023B00000259F0D8446D0000C12C44130000000044933B0000000044933C0000000001FD7461|
// {"flow_temperature_c": 555.36,"id": "05829163","media": "water","meter": "qualcosonic","meter_datetime": "2022-12-06 13:42","name": "M","on_time_h": 5881.166667,"status": "TEMPORARY_ERROR","timestamp": "1111-11-11T11:11:11Z","total_m3": 0,"volume_flow_m3h": 0,"battery_pct": 97}
// |M;05829163;TEMPORARY_ERROR;null;null;null;null;null;null;1111-11-11 11:11.11

Wyświetl plik

@ -52,8 +52,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) :
MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime");
addOptionalFlowRelatedFields("total_m3");
addOptionalLibraryFields("meter_datetime");
addOptionalLibraryFields("total_m3");
addStringField(
"status",

Wyświetl plik

@ -41,7 +41,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("operating_time_h");
addOptionalLibraryFields("operating_time_h");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -37,8 +37,8 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("software_version");
addOptionalFlowRelatedFields("total_m3");
addOptionalLibraryFields("software_version");
addOptionalLibraryFields("total_m3");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -60,7 +60,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalFlowRelatedFields("total_m3,access_counter");
addOptionalLibraryFields("total_m3,access_counter");
addNumericFieldWithExtractor(
"temperature",

Wyświetl plik

@ -35,7 +35,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime,fabrication_no");
addOptionalLibraryFields("meter_datetime,fabrication_no");
addNumericFieldWithExtractor(
"heat",

Wyświetl plik

@ -37,7 +37,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("fabrication_no");
addOptionalLibraryFields("fabrication_no");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -36,7 +36,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("software_version,meter_datetime");
addOptionalLibraryFields("software_version,meter_datetime");
addStringFieldWithExtractorAndLookup(
"status",

Wyświetl plik

@ -39,7 +39,7 @@ namespace
Driver::Driver(MeterInfo &mi, DriverInfo &di) : MeterCommonImplementation(mi, di)
{
addOptionalCommonFields("meter_datetime,model_version");
addOptionalLibraryFields("meter_datetime,model_version");
addNumericField(
"total",

Wyświetl plik

@ -15,12 +15,12 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
// Generated 2024-02-12_00:51
// Generated 2024-02-12_01:46
BuiltinDriver builtins_[] =
{
{ "elster", "driver{name=elster meter_type=GasMeter default_fields=name,id,total_m3,timestamp detect{mvt=ELS,81,03}use=actuality_duration_s field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}test{args='Gas elster 05105025 NOKEY'telegram=3644A511640010253837722550100593158103E70020052F2F_0374E602000C137034220302FD74EE0F2F2F2F2F2F2F2F2F2F2F2F2F2F2F json='{\"media\":\"gas\",\"meter\":\"elster\",\"name\":\"Gas\",\"id\":\"05105025\",\"actuality_duration_s\":742,\"total_m3\":3223.47,\"timestamp\":\"1111-11-11T11:11:11Z\"}'fields='Gas;05105025;3223.47;1111-11-11 11:11.11'}}", false },
{ "iperl", "driver{name=iperl meter_type=WaterMeter default_fields=name,id,total_m3,max_flow_m3h,timestamp detect{mvt=SEN,68,06 mvt=SEN,68,07 mvt=SEN,7c,07}field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}field{name=max_flow quantity=Flow match{measurement_type=Instantaneous vif_range=VolumeFlow}about{en='The maximum flow recorded during previous period.'}}test{args='MoreWater iperl 12345699 NOKEY'coment='Test iPerl T1 telegram, that after decryption, has 2f2f markers.'telegram=1E44AE4C9956341268077A36001000_2F2F0413181E0000023B00002F2F2F2F json='{\"media\":\"water\",\"meter\":\"iperl\",\"name\":\"MoreWater\",\"id\":\"12345699\",\"total_m3\":7.704,\"max_flow_m3h\":0,\"timestamp\":\"1111-11-11T11:11:11Z\"}'fields='MoreWater;12345699;7.704;0;1111-11-11 11:11.11'}test{args='WaterWater iperl 33225544 NOKEY'comment='Test iPerl T1 telegram not encrypted, which has no 2f2f markers.'telegram=1844AE4C4455223368077A55000000_041389E20100023B0000 json='{\"media\":\"water\",\"meter\":\"iperl\",\"name\":\"WaterWater\",\"id\":\"33225544\",\"total_m3\":123.529,\"max_flow_m3h\":0,\"timestamp\":\"1111-11-11T11:11:11Z\"}'fields='WaterWater;33225544;123.529;0;1111-11-11 11:11.11'}}", false },
{ "elster", "driver{name=elster meter_type=GasMeter default_fields=name,id,total_m3,timestamp detect{mvt=ELS,81,03}use=actuality_duration_s field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}}", false },
{ "iperl", "driver{name=iperl meter_type=WaterMeter default_fields=name,id,total_m3,max_flow_m3h,timestamp detect{mvt=SEN,68,06 mvt=SEN,68,07 mvt=SEN,7c,07}field{name=total quantity=Volume match{measurement_type=Instantaneous vif_range=Volume}about{de='Der Gesamtwasserverbrauch.'en='The total water consumption.'fr='''La consommation totale d'eau.'''sv='Den totala vattenförbrukningen.'}}field{name=max_flow quantity=Flow match{measurement_type=Instantaneous vif_range=VolumeFlow}about{en='The maximum flow recorded during previous period.'}}}", false },
};
MapToDriver builtins_mvts_[] =

Wyświetl plik

@ -2692,7 +2692,7 @@ void checkFieldsEmpty(set<string> &fields, string name)
}
}
void MeterCommonImplementation::addOptionalCommonFields(string field_names)
void MeterCommonImplementation::addOptionalLibraryFields(string field_names)
{
set<string> fields = splitStringIntoSet(field_names, ',');
@ -2923,13 +2923,6 @@ void MeterCommonImplementation::addOptionalCommonFields(string field_names)
);
}
checkFieldsEmpty(fields, name());
}
void MeterCommonImplementation::addOptionalFlowRelatedFields(string field_names)
{
set<string> fields = splitStringIntoSet(field_names, ',');
if (checkIf(fields,"total_m3"))
{
addNumericFieldWithExtractor(
@ -3087,12 +3080,7 @@ void MeterCommonImplementation::addOptionalFlowRelatedFields(string field_names)
.set(MeasurementType::Instantaneous)
.set(VIFRange::AccessNumber)
);
}
}
void MeterCommonImplementation::addHCARelatedFields(string field_names)
{
set<string> fields = splitStringIntoSet(field_names, ',');
}
if (checkIf(fields,"consumption_hca"))
{

Wyświetl plik

@ -204,9 +204,7 @@ protected:
std::string decodeTPLStatusByte(uchar sts);
void addOptionalCommonFields(string fields);
void addOptionalFlowRelatedFields(string fields);
void addHCARelatedFields(string fields);
void addOptionalLibraryFields(string fields);
vector<string> &selectedFields() { return selected_fields_; }
void setSelectedFields(vector<string> &f) { selected_fields_ = f; }

Wyświetl plik

@ -121,6 +121,7 @@ LIST_OF_QUANTITIES
X(COUNTER,counter,"counter",Dimensionless,"counter") \
X(FACTOR,factor,"factor",Dimensionless,"factor") \
X(NUMBER,nr,"number",Dimensionless,"number") \
X(PERCENTAGE,pct,"percentage",Dimensionless,"percentage") \
enum class Unit
{

Wyświetl plik

@ -1,4 +1,4 @@
//2024-02-12_00:51
// Generated 2024-02-12_08:58
test {
args = 'Gas elster 05105025 NOKEY'
telegram = 3644A511640010253837722550100593158103E70020052F2F_0374E602000C137034220302FD74EE0F2F2F2F2F2F2F2F2F2F2F2F2F2F2F