Meross MS605MAT not working with default driver

Just a head's-up for other users, the Meross MS605MAT is not working correctly in Hubitat with the built-in "Generic Matter Motion Sersor" driver. Only the battery state is found, motion is not.

The MS600 sensors work like a charm with the same driver.

The MS605MAT does seem to work fine in Homekit & Alexa Matter enviroment.

MS605 works very well in Home Assistant. I did not try to pair it with hubitat directly over matter because I am using HADB. For the driver try to use the Advanced Matter Bridge.

2 Likes

Tried kkossev's matter bridge driver, but that's also not working.
It seems stable in Homekit, Alexa and my Tuya hub.

Just in case I tried @kkossev Matter Advanced Bridge driver. Unfirtunately you are correct, it does not work (i.e. nothing was discovered):
image

It looks like something is not quite right with Matter over Thread impementation.
My device was comisioned with Home Assistant and it works just fine in HA.
Gladly I can share it with HE via HADB. But maybe Kasimir can fix/update his driver at some point. Just in case here is a log (portion):

And one more:

UPDATE.

Just in case, cleared everything by temporary assigning DEVICE driver and that tried Matter Advanced Driver one mor time. Surprisingly this (second) time everything worked as expected:
image

Four Chils Devices were created (Lux and 3 MS):
image

and they are 100% functional.
So, everything looks good on a second try. Who knows why it did not work on a firs try.

1 Like

The problem with the Matter Advanced Bridge is that it was designed and tested to work with mains-powered Matter devices, and its timeouts are sometimes too short for the slow response times of some battery-powered Matter devices.

@vitaliy_kh - Why don't you try asking ChatGPT to generate a simple driver for the MS605MAT? You can provide ChatGPT with the device fingerprints and, optionally, a link to a sample motion driver as an example (like this one made for the IKEA motion sensor). ChatGPT should be able to create a working driver within seconds! :slight_smile:

Update: I created a WiKi post below - a placeholder for the code ..

1 Like

Placeholder for ChatGPT driver - a WiKi post that can be edited by anyone.

ChatGPT code
/*
 * Meross MS605 Matter Presence Sensor (Motion + Presence + Lux + Battery)
 *
 * HOLD logic:
 * - Any occupied -> Motion ACTIVE immediately, Presence PRESENT immediately.
 * - When all clear -> schedule Motion INACTIVE after motionHoldSeconds
 *                 -> schedule Presence NOT PRESENT after presenceHoldSeconds
 * - If occupancy returns before timers expire -> pending clears are cancelled.
 *
 * EP01: 0003,001D,0028,002F,0400  (Illuminance + Power Source/Battery)
 * EP02-04: 0003,001D,0028,0406    (Occupancy)
 *
 * Last edited: 2026-01-04
 */

import hubitat.device.HubAction
import hubitat.device.Protocol
import groovy.transform.Field

@Field static final Integer EP_LUX_BAT = 0x01
@Field static final List<Integer> EP_OCC = [0x02, 0x03, 0x04]

metadata {
    definition(name: "Meross MS605 Matter Presence+Lux+Battery", namespace: "community", author: "iEnam + ChatGPT") {
        fingerprint endpointId:"01", inClusters:"0003,001D,0028,002F,0400", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"02", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"03", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"04", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"

        capability "Sensor"
        capability "Initialize"
        capability "Refresh"
        capability "MotionSensor"
        capability "PresenceSensor"
        capability "IlluminanceMeasurement"
        capability "Battery"
    }

    preferences {
        input name: "txtEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: true
        input name: "logEnable", type: "bool", title: "Enable debug logging", defaultValue: false

        input name: "luxDivisor", type: "number",
                title: "Lux divisor (100 for lux*100, 1 for raw lux)",
                defaultValue: 100, range: "1..1000"

        // Requested tighter ranges:
        input name: "motionHoldSeconds", type: "number",
                title: "Motion hold time (seconds) after clear (0 = immediate)",
                defaultValue: 10, range: "0..120"

        input name: "presenceHoldSeconds", type: "number",
                title: "Presence hold time (seconds) after clear",
                defaultValue: 30, range: "5..120"

        // Optional failsafe for devices that never send inactive
        input name: "autoClearSeconds", type: "number",
                title: "Failsafe auto-clear after N seconds from occupied (0 = disabled)",
                defaultValue: 0, range: "0..3600"
    }
}

void installed() { if (logEnable) log.debug "installed()"; initialize() }

void updated() {
    if (logEnable) log.debug "updated()"
    if (logEnable) runIn(1800, "logsOff")
    initialize()
}

void logsOff() {
    device.updateSetting("logEnable", [value: "false", type: "bool"])
    log.warn "Debug logging disabled"
}

void initialize() {
    if (logEnable) log.debug "initialize()"
    subscribeToAttributes()
    refresh()
}

void refresh() {
    if (logEnable) log.debug "refresh()"

    List<Map<String, String>> paths = []
    paths.add(matter.attributePath(EP_LUX_BAT, 0x0400, 0x0000)) // lux
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x000C)) // battery %
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x0000)) // power source status

    EP_OCC.each { ep ->
        paths.add(matter.attributePath(ep, 0x0406, 0x0000)) // occupancy
    }

    sendHubCommand(new HubAction(matter.readAttributes(paths), Protocol.MATTER))
}

private void subscribeToAttributes() {
    if (logEnable) log.debug "subscribeToAttributes()"

    List<Map<String, String>> paths = []
    paths.add(matter.attributePath(EP_LUX_BAT, 0x0400, 0x0000))
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x000C))
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x0000))

    EP_OCC.each { ep ->
        paths.add(matter.attributePath(ep, 0x0406, 0x0000))
    }

    sendHubCommand(new HubAction(matter.cleanSubscribe(1, 0xFFFF, paths), Protocol.MATTER))
    if (txtEnable) log.info "Subscribed to MS605 occupancy + lux + battery"
}

def parse(String description) {
    if (logEnable) log.debug "parse: ${description}"

    Map msg = matter.parseDescriptionAsMap(description)
    if (!msg) return

    Integer ep     = safeHexToInt(msg.endpoint)
    Integer clus   = safeHexToInt(msg.cluster)
    Integer attrId = safeHexToInt(msg.attrId)
    String  value  = msg.value?.toString()

    if (ep == null || clus == null || attrId == null) return

    // Illuminance
    if (ep == EP_LUX_BAT && clus == 0x0400 && attrId == 0x0000) {
        Integer raw = extractMatterInt(value)
        if (raw != null) {
            Integer div = ((settings?.luxDivisor ?: 100) as Integer)
            Integer lux = (div > 1) ? (raw / div) as Integer : raw

            if (device.currentValue("illuminance")?.toString() != lux.toString()) {
                String descText = "Illuminance is ${lux} lx"
                sendEvent(name: "illuminance", value: lux, unit: "lx", descriptionText: txtEnable ? descText : null)
                if (txtEnable) log.info descText
            }
        }
        return
    }

    // Battery %
    if (ep == EP_LUX_BAT && clus == 0x002F && attrId == 0x000C) {
        Integer raw = extractMatterInt(value) // 04C8 -> C8 (200)
        if (raw != null) {
            Integer pct = (raw > 100) ? (raw / 2) : raw
            pct = Math.max(0, Math.min(100, pct))

            if (device.currentValue("battery")?.toString() != pct.toString()) {
                String descText = "Battery is ${pct}%"
                sendEvent(name: "battery", value: pct, unit: "%", descriptionText: txtEnable ? descText : null)
                if (txtEnable) log.info "${descText} (raw:${toHexByte(raw)})"
            } else if (logEnable) {
                log.debug "Battery unchanged: ${pct}% (raw:${toHexByte(raw)})"
            }
        }
        return
    }

    // Power Source status (deduped)
    if (ep == EP_LUX_BAT && clus == 0x002F && attrId == 0x0000) {
        Integer raw = extractMatterInt(value)
        if (raw != null) {
            if (state.lastPowerSource != raw) {
                state.lastPowerSource = raw
                if (txtEnable) log.info "Power source status is ${raw == 1 ? 'active' : 'unknown'} (raw:${toHexByte(raw)})"
            } else if (logEnable) {
                log.debug "Power source unchanged (raw:${toHexByte(raw)})"
            }
        }
        return
    }

    // Occupancy
    if (EP_OCC.contains(ep) && clus == 0x0406 && attrId == 0x0000) {
        Integer occ = extractMatterInt(value) // 0401->01, 0400->00
        if (occ != null) {
            boolean occupied = ((occ & 0x01) != 0)
            state["occ_${ep}"] = occupied

            if (occupied) {
                unschedule("clearMotionIfStillClear")
                unschedule("clearPresenceIfStillClear")
                setMotion(true)
                setPresence(true)

                Integer failsafe = (settings?.autoClearSeconds ?: 0) as Integer
                if (failsafe > 0) runIn(failsafe, "forceClear")
            } else {
                scheduleClearsIfAllClear()
            }
        }
        return
    }

    if (logEnable && !(clus == 0x001D && attrId == 0x0003)) {
        log.debug "Unhandled Matter report: ${msg}"
    }
}

/* ----------------- HOLD LOGIC ----------------- */

private void scheduleClearsIfAllClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return

    Integer mHold = (settings?.motionHoldSeconds ?: 0) as Integer
    Integer pHold = (settings?.presenceHoldSeconds ?: 5) as Integer  // min 5

    if (mHold <= 0) {
        setMotion(false)
    } else {
        runIn(mHold, "clearMotionIfStillClear")
    }

    if (pHold <= 0) {
        setPresence(false)
    } else {
        runIn(pHold, "clearPresenceIfStillClear")
    }
}

void clearMotionIfStillClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return
    setMotion(false)
}

void clearPresenceIfStillClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return
    setPresence(false)
}

private void setMotion(boolean active) {
    if (state.motionState == active) return
    state.motionState = active

    String motionVal = active ? "active" : "inactive"
    String mTxt = "Motion is ${motionVal}"
    sendEvent(name: "motion", value: motionVal, descriptionText: txtEnable ? mTxt : null)
    if (txtEnable) log.info mTxt
}

private void setPresence(boolean present) {
    if (state.presenceState == present) return
    state.presenceState = present

    String presVal = present ? "present" : "not present"
    String pTxt = "Presence is ${presVal}"
    sendEvent(name: "presence", value: presVal, descriptionText: txtEnable ? pTxt : null)
    if (txtEnable) log.info pTxt
}

/* ----------------- MANUAL / FAILSAFE CLEAR ----------------- */

void forceClear() {
    EP_OCC.each { ep -> state.remove("occ_${ep}") }
    unschedule("clearMotionIfStillClear")
    unschedule("clearPresenceIfStillClear")
    setMotion(false)
    setPresence(false)
}

/* ----------------- HELPERS ----------------- */

private Integer extractMatterInt(String v) {
    if (!v) return null
    String s = v.trim()
            .replace("0x", "").replace("0X", "")
            .replaceAll(/[^0-9A-Fa-f]/, "")

    if (s.size() == 0) return null

    if (s.size() == 4) {
        String last2 = s[-2..-1]
        try { return Integer.parseUnsignedInt(last2, 16) } catch (ignored) { return null }
    }

    if (s.size() > 4) {
        String last4 = s[-4..-1]
        try { return Integer.parseUnsignedInt(last4, 16) } catch (ignored) {}
        String last2 = s[-2..-1]
        try { return Integer.parseUnsignedInt(last2, 16) } catch (ignored) { return null }
    }

    try { return Integer.parseUnsignedInt(s, 16) } catch (ignored) { return null }
}

private Integer safeHexToInt(Object hex) {
    if (hex == null) return null
    String s = hex.toString().trim()
    if (s.startsWith("0x") || s.startsWith("0X")) s = s.substring(2)
    if (s == "") return null
    try { return Integer.parseUnsignedInt(s, 16) } catch (Exception ignored) { return null }
}

private static String toHexByte(Integer v) {
    if (v == null) return "??"
    return String.format("%02X", (v & 0xFF))
}


Thanks for the feedback @kkossev.
I recently received the MS605 and it is very promising.

Not played with it much, I have placed it in the shower, and so far it has been great (tested with Aqara M3 hub automations).

I could not get the Matter Advanced Bridge driver to work properly due to the timeout issues that you describe.

Anyway, I've had a go at ChatGPT just now, see test driver below (note: illuminance is not working).

/*
 * Meross MS605 Matter Presence Sensor (Motion + Presence + Lux + Battery)
 *
 * HOLD logic:
 * - Any occupied -> Motion ACTIVE immediately, Presence PRESENT immediately.
 * - When all clear -> schedule Motion INACTIVE after motionHoldSeconds
 *                 -> schedule Presence NOT PRESENT after presenceHoldSeconds
 * - If occupancy returns before timers expire -> pending clears are cancelled.
 *
 * EP01: 0003,001D,0028,002F,0400  (Illuminance + Power Source/Battery)
 * EP02-04: 0003,001D,0028,0406    (Occupancy)
 *
 * Last edited: 2026-01-04
 */

import hubitat.device.HubAction
import hubitat.device.Protocol
import groovy.transform.Field

@Field static final Integer EP_LUX_BAT = 0x01
@Field static final List<Integer> EP_OCC = [0x02, 0x03, 0x04]

metadata {
    definition(name: "Meross MS605 Matter Presence+Lux+Battery", namespace: "community", author: "iEnam + ChatGPT") {
        fingerprint endpointId:"01", inClusters:"0003,001D,0028,002F,0400", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"02", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"03", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"
        fingerprint endpointId:"04", inClusters:"0003,001D,0028,0406", outClusters:"", model:"Smart Presence Sensor", manufacturer:"Meross", controllerType:"MAT"

        capability "Sensor"
        capability "Initialize"
        capability "Refresh"
        capability "MotionSensor"
        capability "PresenceSensor"
        capability "IlluminanceMeasurement"
        capability "Battery"
    }

    preferences {
        input name: "txtEnable", type: "bool", title: "Enable descriptionText logging", defaultValue: true
        input name: "logEnable", type: "bool", title: "Enable debug logging", defaultValue: false

        input name: "luxDivisor", type: "number",
                title: "Lux divisor (100 for lux*100, 1 for raw lux)",
                defaultValue: 100, range: "1..1000"

        // Requested tighter ranges:
        input name: "motionHoldSeconds", type: "number",
                title: "Motion hold time (seconds) after clear (0 = immediate)",
                defaultValue: 10, range: "0..120"

        input name: "presenceHoldSeconds", type: "number",
                title: "Presence hold time (seconds) after clear",
                defaultValue: 30, range: "5..120"

        // Optional failsafe for devices that never send inactive
        input name: "autoClearSeconds", type: "number",
                title: "Failsafe auto-clear after N seconds from occupied (0 = disabled)",
                defaultValue: 0, range: "0..3600"
    }
}

void installed() { if (logEnable) log.debug "installed()"; initialize() }

void updated() {
    if (logEnable) log.debug "updated()"
    if (logEnable) runIn(1800, "logsOff")
    initialize()
}

void logsOff() {
    device.updateSetting("logEnable", [value: "false", type: "bool"])
    log.warn "Debug logging disabled"
}

void initialize() {
    if (logEnable) log.debug "initialize()"
    subscribeToAttributes()
    refresh()
}

void refresh() {
    if (logEnable) log.debug "refresh()"

    List<Map<String, String>> paths = []
    paths.add(matter.attributePath(EP_LUX_BAT, 0x0400, 0x0000)) // lux
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x000C)) // battery %
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x0000)) // power source status

    EP_OCC.each { ep ->
        paths.add(matter.attributePath(ep, 0x0406, 0x0000)) // occupancy
    }

    sendHubCommand(new HubAction(matter.readAttributes(paths), Protocol.MATTER))
}

private void subscribeToAttributes() {
    if (logEnable) log.debug "subscribeToAttributes()"

    List<Map<String, String>> paths = []
    paths.add(matter.attributePath(EP_LUX_BAT, 0x0400, 0x0000))
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x000C))
    paths.add(matter.attributePath(EP_LUX_BAT, 0x002F, 0x0000))

    EP_OCC.each { ep ->
        paths.add(matter.attributePath(ep, 0x0406, 0x0000))
    }

    sendHubCommand(new HubAction(matter.cleanSubscribe(1, 0xFFFF, paths), Protocol.MATTER))
    if (txtEnable) log.info "Subscribed to MS605 occupancy + lux + battery"
}

def parse(String description) {
    if (logEnable) log.debug "parse: ${description}"

    Map msg = matter.parseDescriptionAsMap(description)
    if (!msg) return

    Integer ep     = safeHexToInt(msg.endpoint)
    Integer clus   = safeHexToInt(msg.cluster)
    Integer attrId = safeHexToInt(msg.attrId)
    String  value  = msg.value?.toString()

    if (ep == null || clus == null || attrId == null) return

    // Illuminance
    if (ep == EP_LUX_BAT && clus == 0x0400 && attrId == 0x0000) {
        Integer raw = extractMatterInt(value)
        if (raw != null) {
            Integer div = ((settings?.luxDivisor ?: 100) as Integer)
            Integer lux = (div > 1) ? (raw / div) as Integer : raw

            if (device.currentValue("illuminance")?.toString() != lux.toString()) {
                String descText = "Illuminance is ${lux} lx"
                sendEvent(name: "illuminance", value: lux, unit: "lx", descriptionText: txtEnable ? descText : null)
                if (txtEnable) log.info descText
            }
        }
        return
    }

    // Battery %
    if (ep == EP_LUX_BAT && clus == 0x002F && attrId == 0x000C) {
        Integer raw = extractMatterInt(value) // 04C8 -> C8 (200)
        if (raw != null) {
            Integer pct = (raw > 100) ? (raw / 2) : raw
            pct = Math.max(0, Math.min(100, pct))

            if (device.currentValue("battery")?.toString() != pct.toString()) {
                String descText = "Battery is ${pct}%"
                sendEvent(name: "battery", value: pct, unit: "%", descriptionText: txtEnable ? descText : null)
                if (txtEnable) log.info "${descText} (raw:${toHexByte(raw)})"
            } else if (logEnable) {
                log.debug "Battery unchanged: ${pct}% (raw:${toHexByte(raw)})"
            }
        }
        return
    }

    // Power Source status (deduped)
    if (ep == EP_LUX_BAT && clus == 0x002F && attrId == 0x0000) {
        Integer raw = extractMatterInt(value)
        if (raw != null) {
            if (state.lastPowerSource != raw) {
                state.lastPowerSource = raw
                if (txtEnable) log.info "Power source status is ${raw == 1 ? 'active' : 'unknown'} (raw:${toHexByte(raw)})"
            } else if (logEnable) {
                log.debug "Power source unchanged (raw:${toHexByte(raw)})"
            }
        }
        return
    }

    // Occupancy
    if (EP_OCC.contains(ep) && clus == 0x0406 && attrId == 0x0000) {
        Integer occ = extractMatterInt(value) // 0401->01, 0400->00
        if (occ != null) {
            boolean occupied = ((occ & 0x01) != 0)
            state["occ_${ep}"] = occupied

            if (occupied) {
                unschedule("clearMotionIfStillClear")
                unschedule("clearPresenceIfStillClear")
                setMotion(true)
                setPresence(true)

                Integer failsafe = (settings?.autoClearSeconds ?: 0) as Integer
                if (failsafe > 0) runIn(failsafe, "forceClear")
            } else {
                scheduleClearsIfAllClear()
            }
        }
        return
    }

    if (logEnable && !(clus == 0x001D && attrId == 0x0003)) {
        log.debug "Unhandled Matter report: ${msg}"
    }
}

/* ----------------- HOLD LOGIC ----------------- */

private void scheduleClearsIfAllClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return

    Integer mHold = (settings?.motionHoldSeconds ?: 0) as Integer
    Integer pHold = (settings?.presenceHoldSeconds ?: 5) as Integer  // min 5

    if (mHold <= 0) {
        setMotion(false)
    } else {
        runIn(mHold, "clearMotionIfStillClear")
    }

    if (pHold <= 0) {
        setPresence(false)
    } else {
        runIn(pHold, "clearPresenceIfStillClear")
    }
}

void clearMotionIfStillClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return
    setMotion(false)
}

void clearPresenceIfStillClear() {
    boolean anyOccupied = EP_OCC.any { ep -> state["occ_${ep}"] == true }
    if (anyOccupied) return
    setPresence(false)
}

private void setMotion(boolean active) {
    if (state.motionState == active) return
    state.motionState = active

    String motionVal = active ? "active" : "inactive"
    String mTxt = "Motion is ${motionVal}"
    sendEvent(name: "motion", value: motionVal, descriptionText: txtEnable ? mTxt : null)
    if (txtEnable) log.info mTxt
}

private void setPresence(boolean present) {
    if (state.presenceState == present) return
    state.presenceState = present

    String presVal = present ? "present" : "not present"
    String pTxt = "Presence is ${presVal}"
    sendEvent(name: "presence", value: presVal, descriptionText: txtEnable ? pTxt : null)
    if (txtEnable) log.info pTxt
}

/* ----------------- MANUAL / FAILSAFE CLEAR ----------------- */

void forceClear() {
    EP_OCC.each { ep -> state.remove("occ_${ep}") }
    unschedule("clearMotionIfStillClear")
    unschedule("clearPresenceIfStillClear")
    setMotion(false)
    setPresence(false)
}

/* ----------------- HELPERS ----------------- */

private Integer extractMatterInt(String v) {
    if (!v) return null
    String s = v.trim()
            .replace("0x", "").replace("0X", "")
            .replaceAll(/[^0-9A-Fa-f]/, "")

    if (s.size() == 0) return null

    if (s.size() == 4) {
        String last2 = s[-2..-1]
        try { return Integer.parseUnsignedInt(last2, 16) } catch (ignored) { return null }
    }

    if (s.size() > 4) {
        String last4 = s[-4..-1]
        try { return Integer.parseUnsignedInt(last4, 16) } catch (ignored) {}
        String last2 = s[-2..-1]
        try { return Integer.parseUnsignedInt(last2, 16) } catch (ignored) { return null }
    }

    try { return Integer.parseUnsignedInt(s, 16) } catch (ignored) { return null }
}

private Integer safeHexToInt(Object hex) {
    if (hex == null) return null
    String s = hex.toString().trim()
    if (s.startsWith("0x") || s.startsWith("0X")) s = s.substring(2)
    if (s == "") return null
    try { return Integer.parseUnsignedInt(s, 16) } catch (Exception ignored) { return null }
}

private static String toHexByte(Integer v) {
    if (v == null) return "??"
    return String.format("%02X", (v & 0xFF))
}

1 Like

Thank you for the contribution, @iEnam !
I’ve edited the wiki post and wrapped the code in “Preformatted text” block for better readability.
image

1 Like

So, why not to tweak/fix the Matter Advanced Bridge driver? Adjusting a Timeout should be easy fix unless there is athother architectural problem on top of the Timeout. My goog guess, this Timeout affecting all Matter over Thread devices (because battery powered Matter devices definitely will use a Thread transport).

Talking about ChatGPT. My experience with this toy is not good. It usually creates non working code even with a lot of syntax errors. And than spiroling around with different errors. I.e. attempt to fix one error creates another error(s). And so on. After few ittereations it says the limit is reached, update or come back later (wait 36+ hours).
From the other side Copilot from Microsoft did created a working code near instantly. After few itterations code was polished according to my comments. And it never complained about any limits. I tryed Copilot very successfully for creating a Driver for the Shelly RGBW PM device wich has 3 different modes for LED Control and 4 inputs which could be Digital or Analog. Driver created by Copilot handles nicelly everything.

Finally, MS605 was comitioned by Home Assistant (this is the only one TBR I have in my setup). Since I already using HADB for bringing all HA devices to the HE. So, I don't need a Matter. I tied only because few people who have MS605 tried it to pair with HE unsuccefully. In my case first attempt failed but second was successful.
What is interesting - after pairing whith HE the divice became UNAVAILBALE in HA after few hours and now I cannot get it back on line even after rebooting HA few times. I am not sure what does it mean.

1 Like

It is now a work-in-progress :
image

4 Likes

Perfect, Thank You!
Is it already ready to try or should I wait a bit?

Configuring the timeout is already done, but I’ll publish the update on Saturday since I’m also working on adding Matter button support — and that part is not easy… :frowning:

2 Likes