// Copyright (C) 2021 Fredrik Öhrström (gpl-3.0-or-later)
driver {
    name           = qsmoke
    meter_type     = SmokeDetector
    default_fields = name,id,status,last_alarm_date,alarm_counter,timestamp
    detect {
        mvt = QDS,21,1a
        mvt = QDS,23,1a
        mvt = LSE,21,1a
        mvt = LSE,23,1a
    }
    fields {
        field {
            name       = status
            quantity   = Text
            info       = 'Meter error flags. IMPORTANT! Smoke alarm is probably NOT reported here! You MUST check last alarm date and counter!'
            attributes = STATUS,INCLUDE_TPL_STATUS
            match {
                measurement_type = Instantaneous
                vif_range        = ErrorFlags
            }
            lookup {
                name            = ERROR_FLAGS
                name            = ERROR_FLAGS
                map_type        = BitToString
                mask_bits       = 0xffff
                default_message = OK
                // Help wanted! Missing understanding of bits
            }
        }
        field {
            name         = last_alarm
            quantity     = PointInTime
            info         = 'Date when the smoke alarm last triggered.'
            display_unit = DateLT
            match {
                measurement_type = Instantaneous
                vif_range        = Date
                storage_nr       = 6
            }
        }
        field {
            name     = alarm
            quantity = Dimensionless
            info     = 'Number of times the smoke alarm has triggered.'
            match {
                difvifkey = 81037C034C4123
            }
        }
        field {
            name     = message
            quantity = PointInTime
            info     = 'Device date time.'
            match {
                measurement_type = Instantaneous
                vif_range        = DateTime
            }
        }
        field {
            name         = test_button_last
            quantity     = PointInTime
            info         = 'Date when test button was last pressed.'
            display_unit = DateLT
            match {
                measurement_type = Instantaneous
                vif_range        = Date
                storage_nr       = 4
            }
        }
        field {
            name     = test_button
            quantity = Dimensionless
            info     = 'Number of times the test button has been pressed.'
            match {
                difvifkey = 81027C03495523
            }
        }
        field {
            name           = transmission
            quantity       = Dimensionless
            info           = 'Transmission counter?'
            dif_signedness = Unsigned
            match {
                measurement_type = Instantaneous
                vif_range        = AccessNumber
            }
        }
        field {
            name         = at_error
            quantity     = PointInTime
            info         = 'Date when the device entered an error state.'
            display_unit = DateLT
            match {
                measurement_type = AtError
                vif_range        = Date
            }
        }
        field {
            name     = some_sort_of_duration
            quantity = Time
            info     = 'What does this mean'
            match {
                difvifkey = 02FDAC7E
            }
        }
    }
    tests {
        test {
            args     = 'QSmokeo qsmoke 45797086 NOKEY'
            telegram = 3E44934486707945211A7801FD08F081027C034955230082026CFFFF81037C034C41230082036CFFFF03FD17000000326CFFFF046D0F0ABC2B02FDAC7E1100
            json     = '{"_":"telegram","media":"smoke detector","meter":"qsmoke","name":"QSmokeo","id":"45797086","status":"OK","last_alarm_date":"2128-03-31","alarm_counter":0,"message_datetime":"2021-11-28 10:15","test_button_last_date":"2128-03-31","test_button_counter":0,"transmission_counter":240,"at_error_date":"2128-03-31","some_sort_of_duration_h":0.004722,"timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'QSmokeo;45797086;OK;2128-03-31;0;1111-11-11 11:11.11'
        }
        test {
            args     = 'QSmokep qsmoke 48128850 NOKEY'
            telegram = 3744934450881248231A7A5C00002081027C034955230082026CFFFF81037C034C41230082036CFFFF02FD170000326CFFFF046D2514BC2B
            json     = '{"_":"telegram","media":"smoke detector","meter":"qsmoke","name":"QSmokep","id":"48128850","status":"OK","last_alarm_date":"2128-03-31","alarm_counter":0,"message_datetime":"2021-11-28 20:37","test_button_last_date":"2128-03-31","test_button_counter":0,"at_error_date":"2128-03-31","timestamp":"1111-11-11T11:11:11Z"}'
            fields   = 'QSmokep;48128850;OK;2128-03-31;0;1111-11-11 11:11.11'
        }
    }
}