diff --git a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue index f77385766..27200f665 100644 --- a/assets/js/components/Config/DeviceModal/DeviceModalBase.vue +++ b/assets/js/components/Config/DeviceModal/DeviceModalBase.vue @@ -352,6 +352,7 @@ export default defineComponent({ }, apiData(): ApiData { let data: ApiData = { + ...this.modbusDefaults, ...this.values, }; if (this.values.type === ConfigType.Template && this.templateName) { diff --git a/tests/config-param-service-modbus.spec.ts b/tests/config-param-service-modbus.spec.ts index 6216f84e1..006b425d9 100644 --- a/tests/config-param-service-modbus.spec.ts +++ b/tests/config-param-service-modbus.spec.ts @@ -64,4 +64,23 @@ test.describe("modbus service expansion", async () => { await meterModal.getByLabel("IP address or hostname").fill("192.168.1.1"); await expect(meterModal.getByLabel("Test value")).toHaveValue("100,id:2,tcp"); }); + + test("template defaults are included in validation request", async ({ page }) => { + const meterModal = await openMeterModal(page); + + // Fill required fields + await meterModal.getByLabel("Register address").fill("100"); + await meterModal.getByLabel("IP address or hostname").fill("192.168.1.1"); + await meterModal.getByLabel("Test value").fill("test"); + + // Intercept validation POST request + const requestPromise = page.waitForRequest( + (req) => req.url().includes("/api/config/test/meter") && req.method() === "POST" + ); + await meterModal.getByRole("button", { name: "Save" }).click(); + const body = (await requestPromise).postDataJSON(); + + // Template has id: 2 - verify it's included even though user didn't set it + expect(body.id).toBe(2); + }); });