/* Copyright (C) 2018-2022 Fredrik Öhrström (gpl-3.0-or-later)
      Copyright (C) 2020 Janus Bo Andersen (gpl-3.0-or-later)

   Implemented October 2020 Janus Bo Andersen:
   Implements Kamstrup OmniPower, energy meter.
   This C1 WM-Bus meter broadcasts:
   - Accumulated energy consumption (A+, kWh)
   - Accumulated energy production (A-, kWh)
   - Current power consumption (P+, kW)
   - Current power production (P-, kW)

   According to Kamstrup doc. 58101496_C1_GB_05.2018
   (Wireless M-Bus Module for OMNIPOWER), the single-phase,
   three-phase and CT meters send the same datagram.

   Meter version. Implementation tested against meter:
   Kamstrup one-phase with firmware version 0x30.

   Meter uses AES-128 in CTR mode, which is the only mode supported by
   the extended link layer (wm-bus), see EN 13757-4:2019. */
driver {
    name           = omnipower
    meter_type     = ElectricityMeter
    default_fields = name,id,total_energy_consumption_kwh,total_energy_production_kwh,current_power_consumption_kw,current_power_production_kw,timestamp
    detect {
        mvt = KAM,30,02
    }
    compact_frame_formats {
        difvif = 040404843C042B04AB3C
    }
    fields {
        field {
            name     = total_energy_consumption
            info     = 'The total energy consumption recorded by this meter.'
            quantity = Energy
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
            }
        }
        field {
            name     = total_energy_production
            info     = 'The total energy backward (production) recorded by this meter.'
            quantity = Energy
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
                add_combinable   = BackwardFlow
            }
        }
        field {
            name     = current_power_consumption
            info     = 'The current power consumption.'
            quantity = Power
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
            }
        }
        field {
            name     = current_power_production
            info     = 'The current power production.'
            quantity = Power
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                add_combinable   = BackwardFlow
            }
        }
    }
    tests {
        test {
            comment  = 'Long Frame'
            args     = 'myomnipower omnipower 32666857 NOKEY'
            telegram = 2D442D2C5768663230028D20E4E2C81C20878C78_04041A03000004843C00000000042B0300000004AB3C00000000
            json     = '{"_":"telegram","media":"electricity","meter":"omnipower","name":"myomnipower","id":"32666857","total_energy_consumption_kwh":7.94,"total_energy_production_kwh":0,"current_power_consumption_kw":0.003,"current_power_production_kw":0,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'myomnipower;32666857;7.94;0;0.003;0;1111-11-11 11:11.11'
        }
        test {
            comment  = 'Compact Frame'
            args     = 'myomnipower omnipower 32666857 NOKEY'
            telegram = 27442D2C5768663230028D20E900C91C2011BA79138CCCFB_1A030000000000000300000000000000
            json     = '{"_":"telegram","media":"electricity","meter":"omnipower","name":"myomnipower","id":"32666857","total_energy_consumption_kwh":7.94,"total_energy_production_kwh":0,"current_power_consumption_kw":0.003,"current_power_production_kw":0,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'myomnipower;32666857;7.94;0;0.003;0;1111-11-11 11:11.11'
        }
    }
}