// Copyright (C) 2026 Fredrik Öhrström (gpl-3.0-or-later)
driver {
name = aptmbusna
meter_type = WaterMeter
default_fields = name,id,status,total_m3,target_m3,timestamp
detect {
mvt = APA,15,07
// APT-MBUS-NA-1 (-C)
}
library {
use = meter_datetime
use = fabrication_no
use = total_m3
use = target_m3
use = target_date
use = volume_flow_m3h
use = operating_time_h
}
fields {
// difvifkey = 04FF0A = optical_diagnostic, bits unknown.
// difvifkey = 02FF0B = oscillator_diagnostic, bits unknown.
// difvifkey = 03FF0C = power_supply_diagnostic, bits unknown.
field {
name = status
quantity = Text
info = 'Status and error flags.'
attributes = STATUS,INCLUDE_TPL_STATUS
match {
measurement_type = Instantaneous
vif_range = ErrorFlags
}
lookup {
name = ERROR_FLAGS
map_type = BitToString
mask_bits = 0xffffff
default_message = OK
// First byte
map {
name = P_MAGNETIC_FIELD
info = 'Magnetic field has been detected.'
value = 0x000001
test = Set
}
map {
name = P_STRONG_LIGHT
info = 'Strong light has been detected.'
value = 0x000002
test = Set
}
map {
name = P_MBUS_DISCONNECTED
info = 'The mbus has been disconnected.'
value = 0x000004
test = Set
}
map {
name = P_DETECTION_WITHOUT_CHANGES
info = Woot?
value = 0x000008
test = Set
}
map {
name = P_MINIMUM_FLOW
info = 'Minimum flow has been detected.'
value = 0x000010
test = Set
}
map {
name = P_MAXIMUM_FLOW
info = 'Maximum flow has been detected.'
value = 0x000020
test = Set
}
map {
name = P_REVERSE_FLOW
info = 'Reverse flow has been detected.'
value = 0x000040
test = Set
}
map {
name = P_LEAK
info = 'Leak has been detected.'
value = 0x0000800
test = Set
}
// 2nd byte
map {
name = P_PROCESSOR_RESET
info = 'Critical internal error has triggered a processor reset.'
value = 0x000100
test = Set
}
map {
name = P_CLOCK_HAND_ERROR
info = Woot?
value = 0x000200
test = Set
}
map {
name = BATTERY_LOW
info = 'Low battery warning.'
value = 0x000400
test = Set
}
map {
name = P_DETECTOR_ERROR
info = Woot?
value = 0x000800
test = Set
}
// 3rd byte
map {
name = MAGNETIC_FIELD
info = 'Magnetic field is being detected.'
value = 0x010000
test = Set
}
map {
name = STRONG_LIGHT
info = 'Strong light is being detected.'
value = 0x020000
test = Set
}
map {
name = MBUS_DISCONNECTED
info = 'The mbus is disconnected.'
value = 0x040000
test = Set
}
map {
name = DETECTION_WITHOUT_CHANGES
info = Woot?
value = 0x080000
test = Set
}
map {
name = MINIMUM_FLOW
info = 'Minimum flow is being detected.'
value = 0x100000
test = Set
}
map {
name = MAXIMUM_FLOW
info = 'Maximum flow is being detected.'
value = 0x200000
test = Set
}
map {
name = REVERSE_FLOW
info = 'Reverse flow is being detected.'
value = 0x400000
test = Set
}
map {
name = PROCESSOR_RESET
info = 'Critical internal error has triggered a processor reset.'
value = 0x800000
test = Set
}
}
}
}
tests {
test {
args = 'W aptmbusna 00683775 NOKEY'
telegram = 685656680800727537680001061507CCE800000C7875376800046D1DB458340413F73E0000023B0D00441385010000426C41340227090203FD171C030004FF0A0404000002FF0B000003FF0C1300B20F00042C1B1B00010200003716
json = '{"_": "telegram","fabrication_no": "00683775","id": "00683775","media": "water","meter": "aptmbusna","meter_datetime": "2026-04-24 20:29","name": "W","operating_time_h": 12504,"status": "PERMANENT_ERROR P_CLOCK_HAND_ERROR P_DETECTION_WITHOUT_CHANGES P_MBUS_DISCONNECTED P_MINIMUM_FLOW P_PROCESSOR_RESET UNKNOWN_E0","target_date": "2026-04-01","target_m3": 0.389,"timestamp": "1111-11-11T11:11:11Z","total_m3": 16.119,"volume_flow_m3h": 0.013}'
fields = 'W;00683775;PERMANENT_ERROR P_CLOCK_HAND_ERROR P_DETECTION_WITHOUT_CHANGES P_MBUS_DISCONNECTED P_MINIMUM_FLOW P_PROCESSOR_RESET UNKNOWN_E0;16.119;0.389;1111-11-11 11:11.11'
}
test {
args = 'W aptmbusna 00345157 NOKEY'
telegram = 68565668086C7257513400010615072EF80000_0C7857513400046D0BAB5934041307590000023B00004413A2560000426C41340227CB0803FD175E0B0004FF0A0404010002FF0B000003FF0C9700B90F0004351BFF0001020100_A716
json = '{"_": "telegram","fabrication_no": "00345157","id": "00345157","media": "water","meter": "aptmbusna","meter_datetime": "2026-04-25 11:11","name": "W","operating_time_h": 54024,"status": "PERMANENT_ERROR P_CLOCK_HAND_ERROR P_DETECTION_WITHOUT_CHANGES P_LEAK P_MBUS_DISCONNECTED P_MINIMUM_FLOW P_PROCESSOR_RESET P_REVERSE_FLOW P_STRONG_LIGHT TEMPORARY_ERROR UNKNOWN_E0","target_date": "2026-04-01","target_m3": 22.178,"timestamp": "1111-11-11T11:11:11Z","total_m3": 22.791,"volume_flow_m3h": 0}'
fields = 'W;00345157;PERMANENT_ERROR P_CLOCK_HAND_ERROR P_DETECTION_WITHOUT_CHANGES P_LEAK P_MBUS_DISCONNECTED P_MINIMUM_FLOW P_PROCESSOR_RESET P_REVERSE_FLOW P_STRONG_LIGHT TEMPORARY_ERROR UNKNOWN_E0;22.791;22.178;1111-11-11 11:11.11'
}
}
}