fix: aqara/lumi enforce modelId meta (#986)

Co-authored-by: Koen Kanters <koenkanters94@gmail.com>
This commit is contained in:
Nerivec
2025-12-30 14:38:12 +01:00
committed by GitHub
parent b705265a74
commit ee8505577c
8 changed files with 60 additions and 40 deletions

View File

@@ -2349,17 +2349,6 @@
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.curtain.hagl07"
},
{
"fileName": "20211124154453_OTA_lumi.switch.n1aeu1_0.0.0_1123_20211110.ota",
"fileVersion": 2839,
"fileSize": 294136,
"url": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Lumi/20211124154453_OTA_lumi.switch.n1aeu1_0.0.0_1123_20211110.ota",
"imageType": 5404,
"manufacturerCode": 4447,
"sha512": "140be0a40f40f84fcb1878ba623ad5830bfab2049f489ee7acf8ae22c1db1e4991fbf39832482a55fee2fc5b20681d9ab5592d457d1e5bf705b0c75af45eff1f",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.switch.n1aeu1"
},
{
"fileName": "20211228121851_OTA_lumi.switch.b1nacn02_0.0.0_0065_20211223_EB5B32.ota",
"fileVersion": 65,
@@ -2580,17 +2569,6 @@
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.airm.fhac01"
},
{
"fileName": "20221009111923_OTA_lumi.curtain.acn002_0.0.0_1530_20221009_6C9C3D.ota",
"fileVersion": 3870,
"fileSize": 296304,
"url": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Lumi/20221009111923_OTA_lumi.curtain.acn002_0.0.0_1530_20221009_6C9C3D.ota",
"imageType": 14976,
"manufacturerCode": 4447,
"sha512": "2436508af75c9b0139d304f8b62ce5579ad721fffec74967db7256bb030f47f8172a2b2ef2003eede1c868410b007ac6c89b3936dd44dffd07fdff155bcb7451",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.curtain.acn002"
},
{
"fileName": "20221123140517_OTA_lumi.remote.b1acn02_0.0.0_0031_20221010_8D956D.ota",
"fileVersion": 31,
@@ -6322,7 +6300,8 @@
"imageType": 5404,
"manufacturerCode": 4447,
"sha512": "04d1359fecdd69d13d167d05b3f3bedae5b11250b6cbc79016568c3a37b9b708be0e62b519a8d13a9fbeeea0bf1a3eb36e94e1faa29da2f1264729c9c0d7af1f",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000"
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.switch.n1aeu1"
},
{
"fileName": "20240726111850_OTA_lumi.switch.n2aeu1_0.0.0_0025_20240725_4EABF3.ota",
@@ -6332,7 +6311,8 @@
"imageType": 5532,
"manufacturerCode": 4447,
"sha512": "8887e3192c9bf2464f02930235c054a5cf7a801b91d43b355dfbd93f15391c965c767fd310ca4c7c985f0c5143484a99d26b73b7cbb8f0aa3c2c06ef0eee67be",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000"
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.switch.n2aeu1"
},
{
"fileName": "20240624144545_OTA_lumi.curtain.acn002_0.0.0_1532_20240528_438A0E.ota",
@@ -6342,7 +6322,8 @@
"imageType": 14976,
"manufacturerCode": 4447,
"sha512": "8e4a84798920a32e6ff992eb7438d9db2665353295a27963ee3cd25c6bbdaa160a4ab13e640d46e5b459f6aa8c89c25e081e11760b8b7997abb3b9e80f919ea8",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000"
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.curtain.acn002"
},
{
"fileName": "TRTL_ThermalSensor_PROD_OTA_V40_v1.00.40.ota",

View File

@@ -2859,6 +2859,28 @@
"Slacky-DIY"
]
},
{
"fileName": "20211124154453_OTA_lumi.switch.n1aeu1_0.0.0_1123_20211110.ota",
"fileVersion": 2839,
"fileSize": 294136,
"url": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images/Lumi/20211124154453_OTA_lumi.switch.n1aeu1_0.0.0_1123_20211110.ota",
"imageType": 5404,
"manufacturerCode": 4447,
"sha512": "140be0a40f40f84fcb1878ba623ad5830bfab2049f489ee7acf8ae22c1db1e4991fbf39832482a55fee2fc5b20681d9ab5592d457d1e5bf705b0c75af45eff1f",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.switch.n1aeu1"
},
{
"fileName": "20221009111923_OTA_lumi.curtain.acn002_0.0.0_1530_20221009_6C9C3D.ota",
"fileVersion": 3870,
"fileSize": 296304,
"url": "https://raw.githubusercontent.com/Koenkk/zigbee-OTA/master/images1/Lumi/20221009111923_OTA_lumi.curtain.acn002_0.0.0_1530_20221009_6C9C3D.ota",
"imageType": 14976,
"manufacturerCode": 4447,
"sha512": "2436508af75c9b0139d304f8b62ce5579ad721fffec74967db7256bb030f47f8172a2b2ef2003eede1c868410b007ac6c89b3936dd44dffd07fdff155bcb7451",
"otaHeaderString": "ROUTERX-----JN5180--ENCRYPTED000",
"modelId": "lumi.curtain.acn002"
},
{
"fileName": "100B-0111-01001A00-ConfLight-ModuLum-EFR32MG13.zigbee",
"fileVersion": 16783872,

View File

@@ -22,6 +22,7 @@ import type {ExtraMetas, GHExtraMetas, RepoImageMeta} from "./types.js";
const GLEDOPTO_MANUFACTURER_CODE = 4687;
const TUYA_MANUFACTURER_CODE_1 = 4098;
const TUYA_MANUFACTURER_CODE_2 = 4417;
const LUMI_UNITED_TECHOLOGY_LTD_SHENZHEN = 4447;
const EXTRA_METAS_PR_BODY_START_TAG = "```json";
const EXTRA_METAS_PR_BODY_END_TAG = "```";
@@ -149,21 +150,33 @@ export async function processOtaFiles(
const statusToBase = getParsedImageStatus(parsedImage, baseMatch);
// Manufacturer specific checks
if (
parsedImage.manufacturerCode === GLEDOPTO_MANUFACTURER_CODE &&
!fileExtraMetas.modelId &&
(fileExtraMetas.manufacturerName == null || fileExtraMetas.manufacturerName.some((name) => name.toLowerCase().includes("gledopto")))
) {
// Gledopto uses the same imageType for every device, force modelId to be present.
// https://github.com/Koenkk/zigbee-OTA/pull/864
throw new Error("Gledopto image requires extra `modelId` metadata");
}
if (
(TUYA_MANUFACTURER_CODE_1 === parsedImage.manufacturerCode || TUYA_MANUFACTURER_CODE_2 === parsedImage.manufacturerCode) &&
!fileExtraMetas.manufacturerName
) {
// Tuya uses the same imageType for every device, force manufacturerName to be present.
throw new Error("Tuya image requires extra `manufacturerName` metadata");
switch (parsedImage.manufacturerCode) {
case GLEDOPTO_MANUFACTURER_CODE: {
if (
!fileExtraMetas.modelId &&
(fileExtraMetas.manufacturerName == null ||
fileExtraMetas.manufacturerName.some((name) => name.toLowerCase().includes("gledopto")))
) {
// Gledopto uses the same imageType for every device, force modelId to be present.
// https://github.com/Koenkk/zigbee-OTA/pull/864
throw new Error("Gledopto image requires extra `modelId` metadata");
}
break;
}
case TUYA_MANUFACTURER_CODE_1:
case TUYA_MANUFACTURER_CODE_2: {
if (!fileExtraMetas.manufacturerName) {
// Tuya uses the same imageType for every device, force manufacturerName to be present.
throw new Error("Tuya image requires extra `manufacturerName` metadata");
}
break;
}
case LUMI_UNITED_TECHOLOGY_LTD_SHENZHEN: {
if (!fileExtraMetas.modelId) {
throw new Error("Lumi/Aqara image requires extra `modelId` metadata");
}
break;
}
}
switch (statusToBase) {

View File

@@ -11,6 +11,7 @@ import {it} from "vitest";
import * as common from "../src/common";
import type {ExtraMetas, RepoImageMeta} from "../src/types";
export const IMAGE_LUMI = "20240726111155_OTA_lumi.switch.n1aeu1_0.0.0_0025_20240725_8F4299.ota";
export const IMAGE_GLEDOPTO = "GL-B-008P_V17A1_OTAV7.ota";
export const IMAGE_TUYA = "1662693814-oem_mg21_zg_nh_win_cover_relay_OTA_1.0.7.bin";
export const IMAGE_V14_1 = "ZLinky_router_v14.ota";

View File

@@ -12,6 +12,7 @@ import {
getAdjustedContent,
IMAGE_GLEDOPTO,
IMAGE_INVALID,
IMAGE_LUMI,
IMAGE_TUYA,
IMAGE_V12_1,
IMAGE_V12_1_METAS,
@@ -688,6 +689,8 @@ Text after end tag`);
["", IMAGE_TUYA, "Tuya image requires extra `manufacturerName` metadata"],
['"modelId": "GL-C-008"', IMAGE_GLEDOPTO, undefined],
["", IMAGE_GLEDOPTO, "Gledopto image requires extra `modelId` metadata"],
['"modelId": "lumi.switch.n1aeu1"', IMAGE_LUMI, undefined],
["", IMAGE_LUMI, "Lumi/Aqara image requires extra `modelId` metadata"],
['"manufacturerName": ["GleDopto"]', IMAGE_GLEDOPTO, "Gledopto image requires extra `modelId` metadata"],
['"manufacturerName": ["OtherManuf"]', IMAGE_GLEDOPTO, undefined],
])("manufacturer specific checks", async (body: string, image: string, error: string | undefined) => {