From 4a4dd016d88ceeb07e961b90e6e1ee6e6dbaefda Mon Sep 17 00:00:00 2001 From: dohertj2 Date: Sun, 22 Feb 2026 05:10:13 -0500 Subject: [PATCH] Add PrefilterFlowRate and PrefilterDailyUsage to WaterMeterUDT Bridge MQTT Engine flow rate and daily usage tags into the default provider via expression-based UDT members with CoreDB history enabled. Update Perspective Home view bindings to use [default]WaterMeter/ paths. Co-Authored-By: Claude Opus 4.6 --- .../tag-type-definition/default/udts.json | 26 ++++++++++++++++--- .../views/Home/view.json | 16 ++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/config/resources/core/ignition/tag-type-definition/default/udts.json b/config/resources/core/ignition/tag-type-definition/default/udts.json index 375f937..844073d 100644 --- a/config/resources/core/ignition/tag-type-definition/default/udts.json +++ b/config/resources/core/ignition/tag-type-definition/default/udts.json @@ -4,7 +4,7 @@ "parameters": { "OpcDevice": { "dataType": "String", - "value": "ns\u003d1;s\u003d[WaterSystemPLC]" + "value": "ns=1;s=[WaterSystemPLC]" }, "OpcServer": { "dataType": "String", @@ -178,7 +178,7 @@ { "valueSource": "expr", "expression": "if({[.]PrimaryValveCloseOverrideOff},\"Closed - Override\",\n\tif({[.]PrimaryValveCloseOverrideOn},\"Open - Override\",\n\t\tif({[.]PrimaryValveClosedBTN},\"Closed - Button\",\n\t\t\tif({[.]LeakSensor1},\"Closed - Leak Sensor 1\",\n\t\t\t\tif({[.]LeakSensor2},\"Closed - Leak Sensor 2\",\n\t\t\t\t\t\"Open\")))))", - "opcItemPath": "ns\u003d1;s\u003dPrimaryValveCloseStatusMsg", + "opcItemPath": "ns=1;s=PrimaryValveCloseStatusMsg", "dataType": "String", "name": "PrimaryValveClosedMsg", "tagType": "AtomicTag", @@ -254,7 +254,7 @@ { "valueSource": "expr", "expression": "if({[.]PumpOverrideOff},\"Off - Override\",\n\tif({[.]PumpOverrideOn},\"On - Override\",\n\t\tif({[.]PumpBTN},\"On - Button\",\n\t\t\tif({[.]FloatSwitch},\"On - Level Switch\",\n\t\t\t\t\"Off\"))))", - "opcItemPath": "ns\u003d1;s\u003dPumpStatusMsg", + "opcItemPath": "ns=1;s=PumpStatusMsg", "dataType": "String", "name": "PumpStatusMsg", "tagType": "AtomicTag", @@ -346,7 +346,7 @@ { "valueSource": "expr", "expression": "if({[.]SedimentFilterValueOpenOverrideOff},\"Closed - Override\",\n\tif({[.]SedimentFilterValueOpenOverrideOn},\"Open - Override\",\n\t\tif({[.]SedimentFilterValveOpenBTN},\"Open - Button\",\n\t\t\tif({[.]SedimentFilterTimer},\"Open - Timer\",\n\t\t\t\t\"Closed\"))))", - "opcItemPath": "ns\u003d1;s\u003dSedimentFilterValueOpenStatusMsg", + "opcItemPath": "ns=1;s=SedimentFilterValueOpenStatusMsg", "dataType": "String", "name": "SedimentFilterValveOpenStatusMsg", "tagType": "AtomicTag", @@ -370,6 +370,24 @@ "bindType": "parameter", "binding": "{OpcServer}" } + }, + { + "valueSource": "expr", + "expression": "{[MQTT Engine]Home Assistant/homeassistant/sensor/droplet_prefilter_flow_rate/state/PrefilterFlowRate/state}", + "dataType": "Float8", + "historyProvider": "CoreDB", + "name": "PrefilterFlowRate", + "historyEnabled": true, + "tagType": "AtomicTag" + }, + { + "valueSource": "expr", + "expression": "{[MQTT Engine]Home Assistant/homeassistant/sensor/droplet_daily_water_usage/state/PrefilterDailyUsage/state}", + "dataType": "Float8", + "historyProvider": "CoreDB", + "name": "PrefilterDailyUsage", + "historyEnabled": true, + "tagType": "AtomicTag" } ] } diff --git a/projects/watermeter/com.inductiveautomation.perspective/views/Home/view.json b/projects/watermeter/com.inductiveautomation.perspective/views/Home/view.json index 4bb5eff..2ca3eff 100644 --- a/projects/watermeter/com.inductiveautomation.perspective/views/Home/view.json +++ b/projects/watermeter/com.inductiveautomation.perspective/views/Home/view.json @@ -116,7 +116,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\"])[0].value\n\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\", \"[default]WaterMeter/PrimaryValveCloseOverrideOff\"], [True, False])\t\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\"])[0].value\n\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOn\", \"[default]WaterMeter/PrimaryValveCloseOverrideOff\"], [True, False])\t\t" }, "scope": "G", "type": "script" @@ -185,7 +185,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\"])[0].value\n\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\", \"[default]WaterMeter/PrimaryValveCloseOverrideOn\"], [True, False])\t\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\"])[0].value\n\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PrimaryValveCloseOverrideOff\", \"[default]WaterMeter/PrimaryValveCloseOverrideOn\"], [True, False])\t\t" }, "scope": "G", "type": "script" @@ -550,7 +550,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"])[0].value\n\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\", \"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"], [True, False])\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"])[0].value\n\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\", \"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"], [True, False])\t" }, "scope": "G", "type": "script" @@ -619,7 +619,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"])[0].value\n\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\", \"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"], [True, False])\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"])[0].value\n\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/SedimentFilterValueOpenOverrideOff\", \"[default]WaterMeter/SedimentFilterValueOpenOverrideOn\"], [True, False])\t" }, "scope": "G", "type": "script" @@ -912,7 +912,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/PumpOverrideOn\"])[0].value\n\t\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOn\", \"[default]WaterMeter/PumpOverrideOff\"], [True, False])\t\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/PumpOverrideOn\"])[0].value\n\t\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOn\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOn\", \"[default]WaterMeter/PumpOverrideOff\"], [True, False])\t\t" }, "scope": "G", "type": "script" @@ -981,7 +981,7 @@ "dom": { "onClick": { "config": { - "script": "\tvalue \u003d system.tag.readBlocking([\"[default]WaterMeter/PumpOverrideOff\"])[0].value\n\t\t\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOff\", \"[default]WaterMeter/PumpOverrideOn\"], [True, False])\t" + "script": "\tvalue = system.tag.readBlocking([\"[default]WaterMeter/PumpOverrideOff\"])[0].value\n\t\t\t\n\tif value:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOff\"], [False])\n\telse:\n\t\tsystem.tag.writeAsync([\"[default]WaterMeter/PumpOverrideOff\", \"[default]WaterMeter/PumpOverrideOn\"], [True, False])\t" }, "scope": "G", "type": "script" @@ -1277,7 +1277,7 @@ "props.text": { "binding": { "config": { - "expression": "toString(round({[MQTT Engine]Home Assistant/homeassistant/sensor/droplet_prefilter_flow_rate/state/PrefilterFlowRate/state},2))+\" GPM\"" + "expression": "toString(round({[default]WaterMeter/PrefilterFlowRate},2))+\" GPM\"" }, "type": "expr" } @@ -1351,7 +1351,7 @@ "props.text": { "binding": { "config": { - "expression": "toString(round({[MQTT Engine]Home Assistant/homeassistant/sensor/droplet_daily_water_usage/state/PrefilterDailyUsage/state},1))+\" GALLONS\"" + "expression": "toString(round({[default]WaterMeter/PrefilterDailyUsage},1))+\" GALLONS\"" }, "type": "expr" }