// Copyright (C) 2017-2026 Fredrik Öhrström (gpl-3.0-or-later)
driver {
    name           = ultrimis
    meter_type     = WaterMeter
    default_fields = name,id,total_m3,target_m3,current_status,total_backward_flow_m3,timestamp
    manufacturer   = Apator
    detect {
        mvt = APA,01,16
    }
    fields {
        field {
            name     = total
            quantity = Volume
            info     = 'The total water consumption recorded by this meter.'
            match {
                measurement_type = Instantaneous
                vif_range        = Volume
            }
        }
        field {
            name     = target
            quantity = Volume
            info     = 'The total water consumption recorded at the beginning of this month.'
            match {
                measurement_type = Instantaneous
                vif_range        = Volume
                storage_nr       = 1
            }
        }
        field {
            name     = current_status
            quantity = Text
            info     = 'Status and error flags.'
            match {
                difvifkey = 03FD17
            }
            lookup {
                name            = ERROR_FLAGS
                map_type        = BitToString
                mask_bits       = 0xffffff
                default_message = OK
                map {
                    name  = TAMPER
                    value = 0x01
                    test  = Set
                }
                map {
                    name  = LOW_BATTERY
                    value = 0x02
                    test  = Set
                }
                map {
                    name  = DRY
                    value = 0x04
                    test  = Set
                }
                map {
                    name  = NO_FLOW
                    value = 0x08
                    test  = Set
                }
                map {
                    name  = HIGH_TEMPERATURE
                    value = 0x10
                    test  = Set
                }
                map {
                    name  = BURST
                    value = 0x20
                    test  = Set
                }
                map {
                    name  = REVERSE
                    value = 0x40
                    test  = Set
                }
                map {
                    name  = LEAK
                    value = 0x80
                    test  = Set
                }
            }
        }
        field {
            name           = total_backward_flow
            quantity       = Volume
            info           = 'The total backward water volume recorded by this meter.'
            vif_scaling    = Auto
            dif_signedness = Signed
            match {
                difvifkey = 04933C
            }
        }
    }
    tests {
        test {
            args     = 'Water ultrimis 95969798 NOKEY'
            telegram = 2E4401069897969501167A4B0320052F2F_0413320C000003FD1700000044132109000004933C000000002F2F2F2F2F
            json     = '{"_":"telegram","media":"cold water","meter":"ultrimis","name":"Water","id":"95969798","total_m3":3.122,"target_m3":2.337,"current_status":"OK","total_backward_flow_m3":0,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Water;95969798;3.122;2.337;OK;0;1111-11-11 11:11.11'
        }
        test {
            args     = 'Water ultrimis 95969798 NOKEY'
            telegram = 2E4401069897969501167A4B0320052F2F_0413320C000003FD1700000044132109000004933C000000002F2F2F2F2F
            json     = '{"_":"telegram","media":"cold water","meter":"ultrimis","name":"Water","id":"95969798","total_m3":3.122,"target_m3":2.337,"current_status":"OK","total_backward_flow_m3":0,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Water;95969798;3.122;2.337;OK;0;1111-11-11 11:11.11'
        }
    }
}