/* Copyright (C) 2024 Fredrik Öhrström (gpl-3.0-or-later)

   Warning! This meter is seriously bonkers!
   Do not use or buy it! The meter implements its own scaling system for
   all Note 1 values (like positive_total_active_energy)
   If you are lucky you will get zeroes when the scale factor is unknown.
   If you are unlucky you will get brokenly scaled values. */
driver {
    name           = ime
    info           = 'This meter uses a seriously bonkers violation of the wmbus protocol. Avoid at all cost!'
    default_fields = name,id,positive_total_active_energy_kwh,timestamp
    meter_type     = ElectricityMeter
    detect {
        mvt = IME,66,02
    }
    fields {
        field {
            name       = status
            quantity   = Text
            info       = 'Meter status from tpl field.'
            attributes = INCLUDE_TPL_STATUS
        }
        // Telegram 1 fields
        field {
            name           = positive_total_active_energy
            quantity       = Energy
            info           = 'Positive Three-phase Active Energy (Total).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 849010FF80843B
            }
        }
        field {
            name           = negative_total_active_energy
            quantity       = Energy
            info           = 'Negative Three-phase Active Energy (Total).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 849010FF80843C
            }
        }
        field {
            name           = positive_total_reactive_energy
            quantity       = Energy
            info           = 'Positive Three-phase Reactive Energy (Total).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 849010FF81843B
            }
        }
        field {
            name           = negative_total_reactive_energy
            quantity       = Energy
            info           = 'Negative Three-phase Reactive Energy (Total).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 849010FF81843C
            }
        }
        field {
            name           = positive_tariff1_active_energy
            quantity       = Energy
            info           = 'Positive Three-phase Active Energy (Tariff 1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 8410FF80843B
            }
        }
        field {
            name           = positive_tariff2_active_energy
            quantity       = Energy
            info           = 'Positive Three-phase Active Energy (Tariff 2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 8420FF80843B
            }
        }
        field {
            name           = negative_tariff1_active_energy
            quantity       = Energy
            info           = 'Negative Three-phase Active Energy (Tariff 1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 8410FF80843C
            }
        }
        field {
            name           = negative_tariff2_active_energy
            quantity       = Energy
            info           = 'Negative Three-phase Active Energy (Tariff 2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 8420FF80843C
            }
        }
        field {
            name           = positive_tariff1_reactive_energy
            quantity       = Energy
            info           = 'Positive Three-phase Reactive Energy (Tariff 1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 8410FF81843B
            }
        }
        field {
            name           = positive_tariff2_reactive_energy
            quantity       = Energy
            info           = 'Positive Three-phase Reactive Energy (Tariff 2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 8420FF81843B
            }
        }
        field {
            name           = negative_tariff1_reactive_energy
            quantity       = Energy
            info           = 'Negative Three-phase Reactive Energy (Tariff 1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 8410FF81843C
            }
        }
        field {
            name           = negative_tariff2_reactive_energy
            quantity       = Energy
            info           = 'Negative Three-phase Reactive Energy (Tariff 2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 8420FF81843C
            }
        }
        field {
            name           = partial_positive_active_energy
            quantity       = Energy
            info           = 'Partial Positive Three-phase Active Energy.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 84A010FF80843B
            }
        }
        field {
            name           = partial_negative_active_energy
            quantity       = Energy
            info           = 'Partial Negative Three-phase Active Energy.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kwh
            match {
                difvifkey = 84A010FF80843C
            }
        }
        field {
            name           = partial_positive_reactive_energy
            quantity       = Energy
            info           = 'Partial Positive Three-phase Reactive Energy.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 84A010FF81843B
            }
        }
        field {
            name           = partial_negative_reactive_energy
            quantity       = Energy
            info           = 'Partial Negative Three-phase Reactive Energy.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = kvarh
            match {
                difvifkey = 84A010FF81843C
            }
        }
        field {
            name           = pulse_input
            quantity       = Dimensionless
            info           = 'Pulse Input.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.01
            display_unit   = counter
            match {
                difvifkey = 04FF9029
            }
        }
        field {
            name     = pulse_unit
            quantity = Text
            info     = 'Pulse Unit.'
            match {
                difvifkey = 02FF912B
            }
            lookup {
                name      = UNIT
                map_type  = IndexToString
                mask_bits = 0xffff
                map {
                    name  = WH
                    info  = Wh
                    value = 0
                    test  = Set
                }
                map {
                    name  = KWH
                    info  = kWh
                    value = 1
                    test  = Set
                }
                map {
                    name  = MWH
                    info  = MWh
                    value = 2
                    test  = Set
                }
                map {
                    name  = VARH
                    info  = varh
                    value = 3
                    test  = Set
                }
                map {
                    name  = KVARH
                    info  = kvarh
                    value = 4
                    test  = Set
                }
                map {
                    name  = MVARH
                    info  = mvarh
                    value = 5
                    test  = Set
                }
                map {
                    name  = VAH
                    info  = VAh
                    value = 6
                    test  = Set
                }
                map {
                    name  = KVAH
                    info  = kVAh
                    value = 7
                    test  = Set
                }
                map {
                    name  = MVAH
                    info  = mVAh
                    value = 8
                    test  = Set
                }
                map {
                    name  = M3
                    info  = 
                    value = 9
                    test  = Set
                }
                map {
                    name  = KM3
                    info  = km³
                    value = 10
                    test  = Set
                }
                map {
                    name  = WOOT
                    info  = 'woot not in manual'
                    value = 11
                    test  = Set
                }
                map {
                    name  = NM3
                    info  = Nm³
                    value = 12
                    test  = Set
                }
                map {
                    name  = KNM3
                    info  = kNm³
                    value = 13
                    test  = Set
                }
                map {
                    name  = MNM3
                    info  = MNm³
                    value = 14
                    test  = Set
                }
                map {
                    name  = J
                    info  = J
                    value = 15
                    test  = Set
                }
                map {
                    name  = KJ
                    info  = kJ
                    value = 16
                    test  = Set
                }
                map {
                    name  = MJ
                    info  = MJ
                    value = 17
                    test  = Set
                }
                map {
                    name  = cal
                    info  = cal
                    value = 18
                    test  = Set
                }
                map {
                    name  = KCAL
                    info  = kcal
                    value = 19
                    test  = Set
                }
                map {
                    name  = G
                    info  = g
                    value = 20
                    test  = Set
                }
                map {
                    name  = KG
                    info  = kg
                    value = 21
                    test  = Set
                }
                map {
                    name  = T
                    info  = T
                    value = 21
                    test  = Set
                }
            }
        }
        field {
            name           = kta
            quantity       = Text
            info           = 'Current Transformer Ratio (KTA).'
            vif_scaling    = None
            dif_signedness = Unsigned
            display_unit   = txt
            match {
                difvifkey = 02FF922B
            }
        }
        field {
            name           = ktv
            quantity       = Text
            info           = 'Voltage Transformer Ratio (KTV).'
            vif_scaling    = None
            dif_signedness = Unsigned
            display_unit   = txt
            match {
                difvifkey = 02FF9329
            }
        }
        // Telegram 2 fields
        field {
            name           = three_phase_total_active_power
            quantity       = Power
            info           = 'Three-phase Total Active Power.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 84B010FF842B
            }
        }
        field {
            name           = active_power_l1
            quantity       = Power
            info           = 'Active Power L1.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 848020FF842B
            }
        }
        field {
            name           = active_power_l2
            quantity       = Power
            info           = 'Active Power L2.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 849020FF842B
            }
        }
        field {
            name           = active_power_l3
            quantity       = Power
            info           = 'Active Power L3.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 84A020FF842B
            }
        }
        field {
            name           = three_phase_total_reactive_power
            quantity       = Power
            info           = 'Three-phase Total Reactive Power.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kvar
            match {
                difvifkey = 84B010FF852B
            }
        }
        field {
            name           = reactive_power_l1
            quantity       = Power
            info           = 'Reactive Power L1.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kvar
            match {
                difvifkey = 848020FF852B
            }
        }
        field {
            name           = reactive_power_l2
            quantity       = Power
            info           = 'Reactive Power L2.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kvar
            match {
                difvifkey = 849020FF852B
            }
        }
        field {
            name           = reactive_power_l3
            quantity       = Power
            info           = 'Reactive Power L3.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kvar
            match {
                difvifkey = 84A020FF852B
            }
        }
        field {
            name           = three_phase_total_apparent_power
            quantity       = Power
            info           = 'Three-phase Total Apparent Power.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kva
            match {
                difvifkey = 84B010FF862B
            }
        }
        field {
            name           = apparent_power_l1
            quantity       = Power
            info           = 'Apparent Power L1.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kva
            match {
                difvifkey = 848020FF862B
            }
        }
        field {
            name           = apparent_power_l2
            quantity       = Power
            info           = 'Apparent Power L2.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kva
            match {
                difvifkey = 849020FF862B
            }
        }
        field {
            name           = apparent_power_l3
            quantity       = Power
            info           = 'Apparent Power L3.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kva
            match {
                difvifkey = 84A020FF862B
            }
        }
        // Telegram 3 fields
        field {
            name           = voltage_1_n
            quantity       = Voltage
            info           = '1-N Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 848020FF8748
            }
        }
        field {
            name           = voltage_2_n
            quantity       = Voltage
            info           = '2-N Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 849020FF8748
            }
        }
        field {
            name           = voltage_3_n
            quantity       = Voltage
            info           = '3-N Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 84A020FF8748
            }
        }
        field {
            name           = voltage_1_2
            quantity       = Voltage
            info           = '1-2 Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 848020FF8848
            }
        }
        field {
            name           = voltage_2_3
            quantity       = Voltage
            info           = '2-3 Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 849020FF8848
            }
        }
        field {
            name           = voltage_3_1
            quantity       = Voltage
            info           = '3-1 Voltage.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = v
            match {
                difvifkey = 84A020FF8848
            }
        }
        field {
            name           = current_l1
            quantity       = Amperage
            info           = 'Phase 1 Current Value.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = a
            match {
                difvifkey = 848020FF8959
            }
        }
        field {
            name           = current_l2
            quantity       = Amperage
            info           = 'Phase 2 Current Value.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = a
            match {
                difvifkey = 849020FF8959
            }
        }
        field {
            name           = current_l3
            quantity       = Amperage
            info           = 'Phase 3 Current Value.'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = a
            match {
                difvifkey = 84A020FF8959
            }
        }
        field {
            name           = frequency
            quantity       = Frequency
            info           = Frequency.
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.1
            display_unit   = hz
            match {
                difvifkey = 02FF8A48
            }
        }
        // Telegram 4 fields
        field {
            name           = three_phase_power
            quantity       = Dimensionless
            info           = 'Three-phase Power Factor (PF).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = factor
            match {
                difvifkey = 82B010FF8B28
            }
        }
        field {
            name     = power_factor_sector
            quantity = Text
            info     = 'Power Factor (PF) sector.'
            match {
                difvifkey = 82B010FF8C2B
            }
            lookup {
                name      = SECTOR_NR
                map_type  = IndexToString
                mask_bits = 0xffff
                map {
                    name  = RESISTIVE
                    info  = Resistive
                    value = 0
                    test  = Set
                }
                map {
                    name  = INDUCTIVE
                    info  = Inductive
                    value = 1
                    test  = Set
                }
                map {
                    name  = CAPACITIVE
                    info  = Capacitive
                    value = 2
                    test  = Set
                }
            }
        }
        field {
            name           = total_active_power_requirement
            quantity       = Power
            info           = 'Total Active Power Requirement (MD).'
            vif_scaling    = None
            dif_signedness = Unsigned
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 8410FF8D2B
            }
        }
        field {
            name           = max_total_active_power_tariff1
            quantity       = Power
            info           = 'Maximum Total Active Power Requirement Tariff 1 (PMD T1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 8410FF8E2B
            }
        }
        field {
            name           = max_total_active_power_tariff2
            quantity       = Power
            info           = 'Maximum Total Active Power Requirement Tariff 2 (PMD T2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 0.001
            display_unit   = kw
            match {
                difvifkey = 8420FF8E2B
            }
        }
        field {
            name           = run_meter_total
            quantity       = Time
            info           = 'Run hour meter (TOT).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 1/60
            display_unit   = h
            match {
                difvifkey = 84B010FF8F21
            }
        }
        field {
            name           = run_meter_tariff1
            quantity       = Time
            info           = 'Run hour meter (Tariff 1).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 1/60
            display_unit   = h
            match {
                difvifkey = 8410FF8F21
            }
        }
        field {
            name           = run_meter_tariff2
            quantity       = Time
            info           = 'Run hour meter (Tariff 2).'
            vif_scaling    = None
            dif_signedness = Signed
            force_scale    = 1/60
            display_unit   = h
            match {
                difvifkey = 8420FF8F21
            }
        }
    }
    tests {
        test {
            args     = 'MyMeter ime 12345678 NOKEY'
            comment  = 'Telegram 1'
            telegram = 68CBCB6808017278563412A525660200000000_849010FF80843B362A0C00849010FF80843C00000000849010FF81843BD1490700849010FF81843C060000008410FF80843BFE180C008420FF80843B381100008410FF80843C000000008420FF80843C000000008410FF81843B393D07008420FF81843B980C00008410FF81843C060000008420FF81843C0000000084A010FF80843B362A0C0084A010FF80843C0000000084A010FF81843BD149070084A010FF81843C0600000004FF90290000000002FF912B00001F0000000000_4116
            json     = '{"_":"telegram","id": "12345678","media": "electricity","meter": "ime","name": "MyMeter","negative_tariff1_active_energy_kwh": 0,"negative_tariff1_reactive_energy_kvarh": 0.06,"negative_tariff2_active_energy_kwh": 0,"negative_tariff2_reactive_energy_kvarh": 0,"negative_total_active_energy_kwh": 0,"negative_total_reactive_energy_kvarh": 0.06,"partial_negative_active_energy_kwh": 0,"partial_negative_reactive_energy_kvarh": 0.06,"partial_positive_active_energy_kwh": 7972.38,"partial_positive_reactive_energy_kvarh": 4776.49,"positive_tariff1_active_energy_kwh": 7928.3,"positive_tariff1_reactive_energy_kvarh": 4744.25,"positive_tariff2_active_energy_kwh": 44.08,"positive_tariff2_reactive_energy_kvarh": 32.24,"positive_total_active_energy_kwh": 7972.38,"positive_total_reactive_energy_kvarh": 4776.49,"pulse_input_counter": 0,"pulse_unit": "WH","status":"OK","timestamp": "1111-11-11T11:11:11Z"}'
            fields   = 'MyMeter;12345678;7972.38;1111-11-11 11:11.11'
        }
        test {
            args     = 'MyMeter ime 12345678 NOKEY'
            comment  = 'Telegram 2'
            telegram = 688D8D6808017278563412A525660201000000_84B010FF842B06000000848020FF842B00000000849020FF842B0600000084A020FF842B0000000084B010FF852B00000000848020FF852B00000000849020FF852B0000000084A020FF852B0000000084B010FF862B08000000848020FF862B00000000849020FF862B0800000084A020FF862B000000001F0000000000_D116
            json     = '{"_":"telegram","active_power_l1_kw": 0,"active_power_l2_kw": 0.006,"active_power_l3_kw": 0,"apparent_power_l1_kva": 0,"apparent_power_l2_kva": 0.008,"apparent_power_l3_kva": 0,"id": "12345678","media": "electricity","meter": "ime","name": "MyMeter","reactive_power_l1_kvar": 0,"reactive_power_l2_kvar": 0,"reactive_power_l3_kvar": 0,"three_phase_total_active_power_kw": 0.006,"three_phase_total_apparent_power_kva": 0.008,"three_phase_total_reactive_power_kvar": 0,"status":"OK","timestamp": "1111-11-11T11:11:11Z"}'
            fields   = 'MyMeter;12345678;null;1111-11-11 11:11.11'
        }
        test {
            args     = 'MyMeter ime 12345678 NOKEY'
            comment  = 'Telegram 3'
            telegram = 6875756808017278563412A525660202000000_848020FF8748F6080000849020FF87489F08000084A020FF8748E2080000848020FF88482D0F0000849020FF8848460F000084A020FF8848640F0000848020FF895900000000849020FF89592600000084A020FF89590000000002FF8A48F4011F0000000000_B116
            json     = '{"_":"telegram","current_l1_a": 0,"current_l2_a": 0.038,"current_l3_a": 0,"frequency_hz": 50,"id": "12345678","media": "electricity","meter": "ime","name": "MyMeter","status":"OK","timestamp": "1111-11-11T11:11:11Z","voltage_1_2_v": 388.5,"voltage_1_n_v": 229.4,"voltage_2_3_v": 391,"voltage_2_n_v": 220.7,"voltage_3_1_v": 394,"voltage_3_n_v": 227.4}'
            fields   = 'MyMeter;12345678;null;1111-11-11 11:11.11'
        }
        test {
            args     = 'MyMeter ime 12345678 NOKEY'
            comment  = 'Telegram 4'
            telegram = 685C5C6808017278563412A525660203000000_82B010FF8B28EB0282B010FF8C2B01008410FF8D2B070000008410FF8E2B691D00008420FF8E2BC50D000084B010FF8F21BB260C008410FF8F215A1C0C008420FF8F21610A00000F0000000000_6216
            json     = '{"_":"telegram","id": "12345678","max_total_active_power_tariff1_kw": 7.529,"max_total_active_power_tariff2_kw": 3.525,"media": "electricity","meter": "ime","name": "MyMeter","power_factor_sector": "INDUCTIVE","run_meter_tariff1_h": 13228.166667,"run_meter_tariff2_h": 44.283333,"run_meter_total_h": 13272.45,"three_phase_power_factor": 0.747,"status":"OK","timestamp": "1111-11-11T11:11:11Z","total_active_power_requirement_kw": 0.007}'
            fields   = 'MyMeter;12345678;null;1111-11-11 11:11.11'
        }
    }
}