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 <noreply@anthropic.com>
This commit is contained in:
dohertj2
2026-02-22 05:10:13 -05:00
parent 577ef85dbc
commit 4a4dd016d8
2 changed files with 30 additions and 12 deletions

View File

@@ -4,7 +4,7 @@
"parameters": { "parameters": {
"OpcDevice": { "OpcDevice": {
"dataType": "String", "dataType": "String",
"value": "ns\u003d1;s\u003d[WaterSystemPLC]" "value": "ns=1;s=[WaterSystemPLC]"
}, },
"OpcServer": { "OpcServer": {
"dataType": "String", "dataType": "String",
@@ -178,7 +178,7 @@
{ {
"valueSource": "expr", "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\")))))", "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", "dataType": "String",
"name": "PrimaryValveClosedMsg", "name": "PrimaryValveClosedMsg",
"tagType": "AtomicTag", "tagType": "AtomicTag",
@@ -254,7 +254,7 @@
{ {
"valueSource": "expr", "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\"))))", "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", "dataType": "String",
"name": "PumpStatusMsg", "name": "PumpStatusMsg",
"tagType": "AtomicTag", "tagType": "AtomicTag",
@@ -346,7 +346,7 @@
{ {
"valueSource": "expr", "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\"))))", "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", "dataType": "String",
"name": "SedimentFilterValveOpenStatusMsg", "name": "SedimentFilterValveOpenStatusMsg",
"tagType": "AtomicTag", "tagType": "AtomicTag",
@@ -370,6 +370,24 @@
"bindType": "parameter", "bindType": "parameter",
"binding": "{OpcServer}" "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"
} }
] ]
} }

View File

@@ -116,7 +116,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -185,7 +185,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -550,7 +550,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -619,7 +619,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -912,7 +912,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -981,7 +981,7 @@
"dom": { "dom": {
"onClick": { "onClick": {
"config": { "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", "scope": "G",
"type": "script" "type": "script"
@@ -1277,7 +1277,7 @@
"props.text": { "props.text": {
"binding": { "binding": {
"config": { "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" "type": "expr"
} }
@@ -1351,7 +1351,7 @@
"props.text": { "props.text": {
"binding": { "binding": {
"config": { "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" "type": "expr"
} }