// Copyright (C) 2026 Fredrik Öhrström (gpl-3.0-or-later)
driver {
    name           = kadenwater
    meter_type     = WaterMeter
    default_fields = name,id,status,total_m3,timestamp
    manufacturer   = Ecomess
    detect {
        mvt = KDN,01,07
        mvt = VIP,01,07
    }
    // Water-leak alarm is carried in the unencrypted TPL status byte
    // (per the Kaden/Ecomess wM-Bus OMS spec, shared with the Picoflux AiR):
    //   bits 0+1 (value 3) -> permanent water-leak alarm (decoded as ALARM by the
    //                         standard OMS bits)
    //   bit 5 (0x20) -> during the leak the flow stayed below 100 l/h
    //   bit 6 (0x40) -> during the leak the flow exceeded 100 l/h
    // (bits 5 and 6 may both be set if the flow varied across the limit)
    mfct_tpl_status_bits {
        mask_bits       = 0xe0
        default_message = OK
        map {
            name  = LEAK_FLOW_LOW
            value = 0x20
            test  = set
        }
        map {
            name  = LEAK_FLOW_HIGH
            value = 0x40
            test  = set
        }
    }
    library {
        use = total_m3
        use = volume_flow_m3h
        use = actuality_duration_s
        use = meter_datetime
        use = fabrication_no
    }
    fields {
        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       = 0xffff
                default_message = OK
                // Help needed. The meaning of the individual error flag bits
                // is not documented for the Kaden type 07 water meter.
            }
        }
        field {
            name     = max_flow
            quantity = Flow
            info     = 'The maximum media volume flow recorded during the measuring period.'
            match {
                measurement_type = Maximum
                vif_range        = VolumeFlow
            }
        }
        field {
            name     = volume_b
            quantity = Volume
            info     = 'Second volume register reported after the total. Purpose is not documented for the Kaden type 07 water meter. Help needed.'
            match {
                measurement_type = Instantaneous
                vif_range        = Volume
                index_nr         = 2
            }
        }
        field {
            name         = duration_b
            quantity     = Time
            display_unit = s
            info         = 'Second actuality duration register (04 74 #2). Purpose is not documented for the Kaden type 07 water meter. Help needed.'
            match {
                measurement_type = Instantaneous
                vif_range        = ActualityDuration
                index_nr         = 2
            }
        }
    }
    tests {
        test {
            args     = 'MyWater kadenwater 19228217 82B0551191F51D66EFCDAB8967452301'
            comment  = 'Ecomess/Kaden type 07 water meter (81.0976 m3)'
            telegram = 4e448e2c1782221901077ab5004005339341ab7927f9337cd2175b2f0d121d9a56cbf3fcfcbf0d8ca57d0c6741a03a666d99467924a6dbf4de305960917afde729ac19d62a789dce1c66a323cc29cd
            json     = '{"_":"telegram","media":"water","meter":"kadenwater","name":"MyWater","id":"19228217","actuality_duration_s":0,"duration_b_s":0,"max_flow_m3h":1.715,"total_m3":81.0976,"volume_b_m3":0.0096,"volume_flow_m3h":0,"fabrication_no":"19228217","meter_datetime":"2026-06-13 19:36","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'MyWater;19228217;OK;81.0976;1111-11-11 11:11.11'
        }
        test {
            args     = 'MyWater kadenwater 19227961 82B0551191F51D66EFCDAB8967452301'
            comment  = 'Ecomess/Kaden type 07 water meter (22.761 m3)'
            telegram = 4e448e2c6179221901077ab50040054d008a1ad5270d9cf92952500bd3938ea37fcac71a45d4349fb13c89cfa4aaebd6ecf9caaf1c0710c1d6b4d98f23109cef5fa6fec93fd6a148730ea51102dbcc
            json     = '{"_":"telegram","media":"water","meter":"kadenwater","name":"MyWater","id":"19227961","actuality_duration_s":0,"duration_b_s":0,"max_flow_m3h":1.496,"total_m3":22.761,"volume_b_m3":0.0013,"volume_flow_m3h":0,"fabrication_no":"19227961","meter_datetime":"2026-06-13 19:36","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'MyWater;19227961;OK;22.761;1111-11-11 11:11.11'
        }
        test {
            args     = 'MyWater kadenwater 19221000 82B0551191F51D66EFCDAB8967452301'
            comment  = 'Same water meter under the Kaden VIP manufacturer code (VIP,01,07) instead of KDN,01,07'
            telegram = 4e4430590010221901077a71004005f8c0d59e1536f306ffcd58075fda84b6f21fc0f33df92c8cf5fcab599bd1fe73b0db2e5d9e6d8a2e3363d67db2cdaf16c26d57886b70ee0f77fc116753809bb5
            json     = '{"_":"telegram","media":"water","meter":"kadenwater","name":"MyWater","id":"19221000","actuality_duration_s":0,"duration_b_s":0,"max_flow_m3h":0.859,"total_m3":94.6123,"volume_b_m3":0.0088,"volume_flow_m3h":0,"fabrication_no":"19221000","meter_datetime":"2026-06-30 12:39","status":"OK","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'MyWater;19221000;OK;94.6123;1111-11-11 11:11.11'
        }
        test {
            comment  = 'Water-leak alarm: TPL status byte set to 0x63 (synthetic, from the VIP 94.6123 m3 telegram) = leak with flow both below and above the 100 l/h limit'
            args     = 'MyWater kadenwater 19221000 82B0551191F51D66EFCDAB8967452301'
            telegram = 4e4430590010221901077a71634005f8c0d59e1536f306ffcd58075fda84b6f21fc0f33df92c8cf5fcab599bd1fe73b0db2e5d9e6d8a2e3363d67db2cdaf16c26d57886b70ee0f77fc116753809bb5
            json     = '{"_":"telegram","media":"water","meter":"kadenwater","name":"MyWater","id":"19221000","actuality_duration_s":0,"duration_b_s":0,"max_flow_m3h":0.859,"total_m3":94.6123,"volume_b_m3":0.0088,"volume_flow_m3h":0,"fabrication_no":"19221000","meter_datetime":"2026-06-30 12:39","status":"ALARM LEAK_FLOW_HIGH LEAK_FLOW_LOW","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'MyWater;19221000;ALARM LEAK_FLOW_HIGH LEAK_FLOW_LOW;94.6123;1111-11-11 11:11.11'
        }
    }
}