// 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'
}
}
}