/* Copyright (C) 2017-2019 Fredrik Öhrström 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 the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef METER_H_ #define METER_H_ #include"util.h" #include"wmbus.h" #include #include #define LIST_OF_METERS X(MULTICAL21_METER)X(FLOWIQ3100_METER)X(MULTICAL302_METER)X(OMNIPOWER_METER)X(SUPERCOM587_METER)X(IPERL_METER)X(QCALORIC_METER)X(APATOR162_METER)X(AMIPLUS_METER)X(MKRADIO3_METER)X(VARIO451_METER)X(UNKNOWN_METER) enum MeterType { #define X(name) name, LIST_OF_METERS #undef X }; using namespace std; typedef unsigned char uchar; struct Meter { virtual vector ids() = 0; virtual string name() = 0; virtual MeterType type() = 0; virtual vector media() = 0; virtual WMBus *bus() = 0; virtual LinkMode requiredLinkMode() = 0; virtual string datetimeOfUpdateHumanReadable() = 0; virtual string datetimeOfUpdateRobot() = 0; virtual void onUpdate(function cb) = 0; virtual int numUpdates() = 0; virtual void printMeter(Telegram *t, string *human_readable, string *fields, char separator, string *json, vector *envs) = 0; virtual bool isTelegramForMe(Telegram *t) = 0; virtual bool useAes() = 0; virtual vector key() = 0; // Dynamically access all data received for the meter. virtual std::vector getRecords() = 0; virtual double getRecordAsDouble(std::string record) = 0; virtual uint16_t getRecordAsUInt16(std::string record) = 0; virtual ~Meter() = default; }; struct WaterMeter : public virtual Meter { virtual double totalWaterConsumption() = 0; // m3 virtual bool hasTotalWaterConsumption() = 0; virtual double targetWaterConsumption() = 0; // m3 virtual bool hasTargetWaterConsumption() = 0; virtual double maxFlow() = 0; virtual bool hasMaxFlow() = 0; virtual double flowTemperature() = 0; // °C virtual bool hasFlowTemperature() = 0; virtual double externalTemperature() = 0; // °C virtual bool hasExternalTemperature() = 0; virtual string statusHumanReadable() = 0; virtual string status() = 0; virtual string timeDry() = 0; virtual string timeReversed() = 0; virtual string timeLeaking() = 0; virtual string timeBursting() = 0; }; struct HeatMeter : public virtual Meter { virtual double totalEnergyConsumption() = 0; // kwh virtual double currentPowerConsumption() = 0; // kw virtual double totalVolume() = 0; // m3 }; struct TechemHeatMeter : public virtual Meter { virtual double totalEnergyConsumption() = 0; // GJ virtual double currentEnergyConsumption() = 0; // GJ virtual double previousEnergyConsumption() = 0; // GJ }; struct ElectricityMeter : public virtual Meter { virtual double totalEnergyConsumption() = 0; // kwh virtual double currentPowerConsumption() = 0; // kw virtual double totalEnergyProduction() = 0; // kwh virtual double currentPowerProduction() = 0; // kw }; struct HeatCostMeter : public virtual Meter { virtual double currentConsumption() = 0; virtual string setDate() = 0; virtual double consumptionAtSetDate() = 0; }; struct GenericMeter : public virtual Meter { }; MeterType toMeterType(string& type); LinkMode toMeterLinkMode(string& type); unique_ptr createMultical21(WMBus *bus, string& name, string& id, string& key); unique_ptr createFlowIQ3100(WMBus *bus, string& name, string& id, string& key); unique_ptr createMultical302(WMBus *bus, string& name, string& id, string& key); unique_ptr createVario451(WMBus *bus, string& name, string& id, string& key); unique_ptr createOmnipower(WMBus *bus, string& name, string& id, string& key); unique_ptr createAmiplus(WMBus *bus, string& name, string& id, string& key); unique_ptr createSupercom587(WMBus *bus, string& name, string& id, string& key); unique_ptr createMKRadio3(WMBus *bus, string& name, string& id, string& key); unique_ptr createApator162(WMBus *bus, string& name, string& id, string& key); unique_ptr createIperl(WMBus *bus, string& name, string& id, string& key); unique_ptr createQCaloric(WMBus *bus, string& name, string& id, string& key); GenericMeter *createGeneric(WMBus *bus, string& name, string& id, string& key); #endif