/* Copyright (C) 2021 Olli Salonen (gpl-3.0-or-later)
   Copyright (C) 2022-2026 Fredrik Öhrström (gpl-3.0-or-later)
   Copyright (C) 2026 Hynek Moravec (gpl-3.0-or-later) */
driver {
    name           = minomess
    meter_type     = WaterMeter
    default_fields = name,id,status,total_m3,target_m3,timestamp
    detect {
        mvt = ZRI,00,07
        mvt = ZRI,01,16
        mvt = ZRI,01,06
    }
    mfct_tpl_status_bits {
        mask_bits       = 0xf8
        default_message = OK
        map {
            name  = PERMANENT_ERROR
            value = 0x08
            test  = Set
        }
        map {
            name  = TEMPORARY_ERROR
            value = 0x10
            test  = Set
        }
        map {
            name  = WAS_LEAKING
            value = 0x20
            test  = Set
        }
        map {
            name  = WAS_TAMPERED
            value = 0x40
            test  = Set
        }
        map {
            name  = WAS_REMOVED
            value = 0x80
            test  = Set
        }
    }
    library {
        use = total_m3
        use = meter_date
        use = meter_datetime
        use = fabrication_no
        use = operating_time_h
        use = on_time_h
        use = on_time_at_error_h
        use = total_backward_m3
        use = volume_flow_m3h
    }
    fields {
        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       = 8
            }
        }
        field {
            name         = target
            quantity     = PointInTime
            info         = 'Date when target water consumption was recorded.'
            display_unit = date
            match {
                measurement_type = Instantaneous
                vif_range        = Date
                storage_nr       = 8
            }
        }
        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         = target
            quantity     = PointInTime
            info         = 'Date when target water consumption was recorded.'
            display_unit = date
            match {
                measurement_type = Instantaneous
                vif_range        = Date
                storage_nr       = 1
            }
        }
        field {
            name       = status
            quantity   = Text
            info       = 'Status and error flags.'
            attributes = STATUS,INCLUDE_TPL_STATUS
            match {
                difvifkey = 02FD17
            }
            lookup {
                name            = ERROR_FLAGS
                map_type        = BitToString
                mask_bits       = 0xffff
                default_message = OK
                // Status byte B (high byte)
                map {
                    name  = BURSTING
                    value = 0x8000
                    test  = Set
                }
                map {
                    name  = REMOVED
                    value = 0x4000
                    test  = Set
                }
                map {
                    name  = LEAKING
                    value = 0x2000
                    test  = Set
                }
                map {
                    name  = WAS_BACKFLOWING
                    value = 0x1000
                    test  = Set
                }
                map {
                    name  = BACKFLOWING
                    value = 0x0800
                    test  = Set
                }
                map {
                    name  = WAS_BLOCKED
                    value = 0x0400
                    test  = Set
                }
                map {
                    name  = UNDERSIZED
                    value = 0x0200
                    test  = Set
                }
                map {
                    name  = OVERSIZED
                    value = 0x0100
                    test  = Set
                }
                // Status byte A (low byte)
                map {
                    name  = WAS_REMOVED
                    value = 0x0080
                    test  = Set
                }
                map {
                    name  = WAS_TAMPERED
                    value = 0x0040
                    test  = Set
                }
                map {
                    name  = WAS_LEAKING
                    value = 0x0020
                    test  = Set
                }
                map {
                    name  = TEMPORARY_ERROR
                    value = 0x0010
                    test  = Set
                }
                map {
                    name  = PERMANENT_ERROR
                    value = 0x0008
                    test  = Set
                }
                map {
                    name  = BATTERY_EOL
                    value = 0x0004
                    test  = Set
                }
                map {
                    name  = ABNORMAL_CONDITION
                    value = 0x0002
                    test  = Set
                }
            }
        }
    }
    tests {
        test {
            args     = 'Mino minomess 15503451 NOKEY'
            telegram = 6644496A1064035514377251345015496A0007EE0050052F2F_0C1359000000026CBE2B82046CA12B8C0413FFFFFFFF8D0493132CFBFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02FD1700002F2F
            json     = '{"_":"telegram","media":"water","meter":"minomess","name":"Mino","id":"15503451","meter_date":"2021-11-30","total_m3":0.059,"target_date":"2021-11-01","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Mino;15503451;OK;0.059;null;1111-11-11 11:11.11'
        }
        test {
            args     = 'Zenner_cold minomess 21314151 NOKEY'
            telegram = 6644496A4425155518377251413121496A0116360050052F2F_0C1355000000026CEC2182046CE1218C0413000000808D0493132C33FE00008000008000008000008000008000008000008000008000008000008000008000008000008000008002FD1700002F2F
            json     = '{"_":"telegram","media":"cold water","meter":"minomess","name":"Zenner_cold","id":"21314151","meter_date":"2023-01-12","total_m3":0.055,"target_m3":80000,"target_date":"2023-01-01","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Zenner_cold;21314151;OK;0.055;80000;1111-11-11 11:11.11'
        }
        test {
            args     = 'Zenner_warm minomess 51413121 NOKEY'
            telegram = 6644496A8753155518377221314151496A0106300050052F2F_0C1357000000026CEC2182046CE1218C0413000000808D0493132C33FE00008000008000008000008000008000008000008000008000008000008000008000008000008000008002FD1700002F2F
            json     = '{"_":"telegram","media":"warm water","meter":"minomess","name":"Zenner_warm","id":"51413121","meter_date":"2023-01-12","total_m3":0.057,"target_m3":80000,"target_date":"2023-01-01","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'Zenner_warm;51413121;OK;0.057;80000;1111-11-11 11:11.11'
        }
    }
}