I figured it out. First, there is a bug in the driver code. Since I'm installing for the first time, there was no version number recorded. So it was defaulting to 0, and therefore not using the code for the newer firmware version. I changed the lines in the refresh and sendCommand functions to default to 323 instead of 0 when no version found, and that allowed it to communicate. Once I made this change, I was able to click "Refresh" on the virtual device and it was then able to query the status of the garage door (and version number then showed up on device page).
This is the line I changed (same line in refresh and sendCommand methods):
def currentVersion = device.currentState('version')?.value ? device.currentState('version')?.value.replace(".","").toInteger() : 323
Then I had to figure out my UUID. That was a pain. I tried that Charles Proxy sniffer on my iOS, but when enabled the Meross app would not work, and it would not capture the request being sent. But I was able to modify the code and execute the code below in the same chrome inspect window where I copied/pasted the script from GITHUB (https://github.com/ithinkdancan/hubitat-meross/blob/main/login.js) to get the key info. Then I executed this method (below), replacing "TOKEN" with the token value received from the previous call. This gave me a list of my devices with their UUIDs. I then plugged that UUID into the device settings, and it worked!
(async function test(token) {
var nonce = randomString(16);
var unix_time = Math.floor(new Date().getTime() / 1000);
var param = "e30=";
var encoded_param = param;
concat_sign = ["23x17ahWarFH6w29", unix_time, nonce, encoded_param].join("");
var sign = md5(concat_sign);
var data = {
params: encoded_param,
sign: sign,
timestamp: parseInt(unix_time, 10),
nonce: nonce,
};
try {
const response = await fetch("https://iot.meross.com/v1/Device/devList", {
headers: {
"Content-Type": "application/json",
"Authorization": "Basic " + token
},
method: "POST",
body: JSON.stringify(data),
});
const result = await response.json();
console.log(result);
} catch (error) {
console.log({ error });
}
})(“TOKEN”);
Sharing this so anyone else who wants to use this can get it working correctly. I'd suggest updating the code and eliminate the check for version and the extra settings, since I don't think you need to support the older firmware versions anymore (plus, no reason to enter message ID and sign and other fields when they are auto-generated by the code for the newer firmware version anyway).