// Copyright (C) 2023 Fredrik Öhrström (gpl-3.0-or-later)
driver {
    name           = nemo
    meter_type     = ElectricityMeter
    default_fields = name,id,status,total_active_positive_3phase_kwh,active_positive_3phase_kw,timestamp
    link_mode      = MBUS
    detect {
        mvt = IME,1d,02
    }
    fields {
        // Telegram 1 fields
        field {
            name     = total_active_positive_3phase
            quantity = Energy
            info     = 'Et+ the total 3-phase active positive energy.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
                storage_nr       = 0
                tariff_nr        = 1
                subunit_nr       = 1
            }
        }
        field {
            name     = active_positive_3phase
            quantity = Power
            info     = 'P+ the 3-phase active positive power.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                storage_nr       = 0
                tariff_nr        = 1
                subunit_nr       = 1
            }
        }
        field {
            name     = total_reactive_positive_3phase
            quantity = Energy
            info     = 'Er+ the total 3-phase reactive positive energy.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
                storage_nr       = 0
                tariff_nr        = 1
                subunit_nr       = 2
            }
        }
        field {
            name     = reactive_positive_3phase
            quantity = Power
            info     = 'Q+ the 3-phase reactive positive power.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                storage_nr       = 0
                tariff_nr        = 1
                subunit_nr       = 2
            }
        }
        field {
            name     = total_active_partial_3phase
            quantity = Energy
            info     = 'Part Et+ the total 3-phase active partial energy.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
                storage_nr       = 0
                tariff_nr        = 2
                subunit_nr       = 1
            }
        }
        field {
            name     = active_negative_3phase
            quantity = Power
            info     = 'P- the 3-phase active negative power.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                storage_nr       = 0
                tariff_nr        = 2
                subunit_nr       = 1
            }
        }
        field {
            name     = total_reactive_partial_3phase
            quantity = Energy
            info     = 'Part Er+ the total 3-phase reactive partial energy.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyEnergyVIF
                storage_nr       = 0
                tariff_nr        = 2
                subunit_nr       = 2
            }
        }
        field {
            name     = reactive_negative_3phase
            quantity = Power
            info     = 'Q- the 3-phase reactive negative power.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                storage_nr       = 0
                tariff_nr        = 2
                subunit_nr       = 2
            }
        }
        field {
            name         = power
            quantity     = Dimensionless
            info         = 'PF the power factor.'
            display_unit = factor
            match {
                measurement_type = Instantaneous
                vif_range        = Dimensionless
            }
        }
        field {
            name       = status
            quantity   = Text
            info       = 'Status. OK if no error flags are set.'
            attributes = STATUS,INCLUDE_TPL_STATUS
            match {
                measurement_type = Instantaneous
                vif_range        = ErrorFlags
            }
            lookup {
                name            = ERROR_FLAGS
                map_type        = BitToString
                mask_bits       = 0xff
                default_message = OK
            }
        }
        // Telegram 2 fields
        field {
            name     = current_at_phase_1
            quantity = Amperage
            info     = 'I1 Amperage for L1 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Amperage
                add_combinable   = Mfct01
            }
        }
        field {
            name     = current_at_phase_2
            quantity = Amperage
            info     = 'I2 Amperage for L2 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Amperage
                add_combinable   = Mfct02
            }
        }
        field {
            name     = current_at_phase_3
            quantity = Amperage
            info     = 'I3 Amperage for L3 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Amperage
                add_combinable   = Mfct03
            }
        }
        field {
            name     = voltage_at_phase_1
            quantity = Voltage
            info     = 'L1-N Voltage for L1 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct01
            }
        }
        field {
            name     = voltage_at_phase_2
            quantity = Voltage
            info     = 'L2-N Voltage for L2 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct02
            }
        }
        field {
            name     = voltage_at_phase_3
            quantity = Voltage
            info     = 'L3-N Voltage for L3 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct03
            }
        }
        // Telegram 3 fields
        field {
            name     = active_power_at_phase_1
            quantity = Power
            info     = 'P1 Power for L1 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 1
                add_combinable   = Mfct01
            }
        }
        field {
            name     = active_power_at_phase_2
            quantity = Power
            info     = 'P2 Power for L2 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 1
                add_combinable   = Mfct02
            }
        }
        field {
            name     = active_power_at_phase_3
            quantity = Power
            info     = 'P3 Power for L3 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 1
                add_combinable   = Mfct03
            }
        }
        field {
            name     = reactive_power_at_phase_1
            quantity = Power
            info     = 'Q1 Power for L1 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 2
                add_combinable   = Mfct01
            }
        }
        field {
            name     = reactive_power_at_phase_2
            quantity = Power
            info     = 'Q2 Power for L2 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 2
                add_combinable   = Mfct02
            }
        }
        field {
            name     = reactive_power_at_phase_3
            quantity = Power
            info     = 'Q3 Power for L3 phase.'
            match {
                measurement_type = Instantaneous
                vif_range        = AnyPowerVIF
                subunit_nr       = 2
                add_combinable   = Mfct03
            }
        }
        field {
            name         = at_phase_1_power
            quantity     = Dimensionless
            info         = 'PF1 the power factor for L1 phase.'
            display_unit = factor
            match {
                measurement_type = Instantaneous
                vif_range        = Dimensionless
                add_combinable   = Mfct01
            }
        }
        field {
            name         = at_phase_2_power
            quantity     = Dimensionless
            info         = 'PF2 the power factor for L2 phase.'
            display_unit = factor
            match {
                measurement_type = Instantaneous
                vif_range        = Dimensionless
                add_combinable   = Mfct02
            }
        }
        field {
            name         = at_phase_3_power
            quantity     = Dimensionless
            info         = 'PF3 the power factor for L3 phase.'
            display_unit = factor
            match {
                measurement_type = Instantaneous
                vif_range        = Dimensionless
                add_combinable   = Mfct03
            }
        }
        field {
            name     = voltage_l1_l2
            quantity = Voltage
            info     = 'L1-L2 Voltage between phases.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct04
            }
        }
        field {
            name     = voltage_l2_l3
            quantity = Voltage
            info     = 'L2-L3 Voltage between phases.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct05
            }
        }
        field {
            name     = voltage_l3_l1
            quantity = Voltage
            info     = 'L3-L1 Voltage between phases.'
            match {
                measurement_type = Instantaneous
                vif_range        = Voltage
                add_combinable   = Mfct06
            }
        }
        field {
            name     = current_in_neutral
            quantity = Amperage
            info     = 'I Neutral amperage.'
            match {
                measurement_type = Instantaneous
                vif_range        = Amperage
                add_combinable   = Mfct04
            }
        }
        field {
            name        = raw_frequency
            quantity    = Frequency
            info        = 'Frequency in 0.1 Hz'
            attributes  = HIDE
            vif_scaling = None
            match {
                difvifkey = 05FF5A
            }
        }
        field {
            name      = frequency
            quantity  = Frequency
            info      = 'Frequency of AC.'
            calculate = 'raw_frequency_hz / 10 counter'
        }
    }
    tests {
        test {
            args     = 'Elen nemo 00067609 NOKEY'
            comment  = 'Telegram 1'
            telegram = 6864646808657209760600A5251D02000000008E500400355873060085502B0013BF478E9040040029452501008590402B00F800468E600400000000000085602B000000008EA0400400890000000085A0402B0000000005FD3ADCF97E3F01FD17001F00000000009116
            json     = '{"_":"telegram","media":"electricity","meter":"nemo","name":"Elen","id":"00067609","total_active_positive_3phase_kwh":6735835,"active_positive_3phase_kw":97.83,"total_reactive_positive_3phase_kwh":1254529,"reactive_positive_3phase_kw":8.254,"total_active_partial_3phase_kwh":0,"active_negative_3phase_kw":0,"total_reactive_partial_3phase_kwh":89,"reactive_negative_3phase_kw":0,"power_factor":0.996,"status":"OK","frequency_hz":null,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Elen;00067609;OK;6735835;97.83;1111-11-11 11:11.11'
        }
        test {
            args     = 'Elen nemo 00067609 NOKEY'
            comment  = 'Telegram 2, this is decoded by itself in this test so the default fields become null because they are sent in the previous telegram.'
            telegram = 684B4B6808657209760600A5251D020100000005FDD9FF0100F4174805FDD9FF0200B8084805FDD9FF0300B0014805FDC8FF0100C0104505FDC8FF020040114505FDC8FF03005011451F00000000000716
            json     = '{"_":"telegram","media":"electricity","meter":"nemo","name":"Elen","id":"00067609","status":"OK","current_at_phase_1_a":155.6,"current_at_phase_2_a":140,"current_at_phase_3_a":132.8,"voltage_at_phase_1_v":231.6,"voltage_at_phase_2_v":232.4,"voltage_at_phase_3_v":232.5,"frequency_hz":null,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Elen;00067609;OK;null;null;1111-11-11 11:11.11'
        }
        test {
            args     = 'Elen nemo 00067609 NOKEY'
            comment  = 'Telegram 3, this is also decoded by itself in this test, thus the null default field values.'
            telegram = 689E9E6808657209760600A5251D02020000008540ABFF0100360B478540ABFF02002CFA468540ABFF030074ED46858040ABFF0100C0E244858040ABFF0200405A45858040ABFF030060364505FDBAFF0178BE7F3F05FDBAFF0240357E3F05FDBAFF0353B87E3F05FDC8FF0400907A4505FDC8FF0500707B4505FDC8FF0600807B4505FDD9FF0400502A4705FF5A0000FA4302FD3AC80002FD3A0A000F00000000008B16
            json     = '{"_":"telegram","media":"electricity","meter":"nemo","name":"Elen","id":"00067609","power_factor":200,"status":"OK","active_power_at_phase_1_kw":35.638,"active_power_at_phase_2_kw":32.022,"active_power_at_phase_3_kw":30.394,"reactive_power_at_phase_1_kw":1.814,"reactive_power_at_phase_2_kw":3.492,"reactive_power_at_phase_3_kw":2.918,"at_phase_1_power_factor":0.999,"at_phase_2_power_factor":0.993,"at_phase_3_power_factor":0.995,"voltage_l1_l2_v":400.9,"voltage_l2_l3_v":402.3,"voltage_l3_l1_v":402.4,"current_in_neutral_a":43.6,"frequency_hz":50,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Elen;00067609;OK;null;null;1111-11-11 11:11.11'
        }
    }
}