diff --git a/src/components/UiButton.vue b/src/components/UiButton.vue new file mode 100644 index 0000000..0b771b9 --- /dev/null +++ b/src/components/UiButton.vue @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/src/main.js b/src/main.js index 1b81eab..d559199 100644 --- a/src/main.js +++ b/src/main.js @@ -21,6 +21,7 @@ import OpPrivs from './components/OpPrivs.vue' import OcsAgentHeader from './components/OcsAgentHeader.vue' import OcsLightLine from './components/OcsLightLine.vue' import OcsLight from './components/OcsLight.vue' +import UiButton from './components/UiButton.vue' app .component('AgentPanelBase', AgentPanelBase) @@ -38,6 +39,7 @@ app .component('OcsAgentHeader', OcsAgentHeader) .component('OcsLightLine', OcsLightLine) .component('OcsLight', OcsLight) + .component('UiButton', UiButton) ; // Font/icon stuff. diff --git a/src/panels/ACUAgent.vue b/src/panels/ACUAgent.vue index c03d07a..7a2509e 100644 --- a/src/panels/ACUAgent.vue +++ b/src/panels/ACUAgent.vue @@ -383,6 +383,81 @@ + + + + + {{ item.name }} + + On + Off + + + + + + Update + + + + + + + Set All + + On + Off + + + + + {{ item.name }} + + On + Off + + + + + + Update + + + + + + + Set All + + On + Off + + + + + {{ item.name }} + + On + Off + + + + @@ -697,7 +772,7 @@ ["Dataset"], ], tabs: ['Main', 'Dataset'], - detailTab: "Main", + detailTab: 'Main', motion_types_all: [ ["const_el", "Constant el scan"], ["goto", "Go to position"], @@ -710,6 +785,9 @@ hvac_views: [ "Summary", "Temperature Detail", + "Set Fans", + "Set Boosters", + "Set Heaters", ], motion_types: ['?', {}], motion_control: { @@ -728,6 +806,7 @@ goto_target_stop: true, hvac_view: "Summary", + hvac_setpoints: {}, }, start_types: ["end", "mid"], speed_modes: ["high", "low"], @@ -1160,8 +1239,43 @@ return null; return Date.UTC(detail.Year) / 1000 + (Number(detail.Time) - 1) * 86400; }, - hvacAction(target, op, val) { - console.log('HVAC', target, op, val); + hvacAction(target, op, item) { + let target_list = null; + let values = op; + + if (op == 'on' || op == 'off') { + switch (target) { + case 'fans': + target_list = item.filter((a) => (a.fan)).map((a) => 'Fan ' + a.full_name); + break; + case 'boosters': + target_list = item.filter((a) => (a.booster)).map((a) => 'Booster ' + a.full_name); + break; + case 'fan': + target_list = ['Fan ' + item.full_name]; + break; + case 'booster': + target_list = ['Booster ' + item.full_name]; + break; + case 'heater': + target_list = ['Heater']; + break; + } + } else if (op == 'setpoint') { + values = this.motion_control.hvac_setpoints[item.full_name]; + switch (target) { + case 'fan': + target_list = ['Fan ' + item.full_name]; + break; + case 'heater': + target_list = [item.full_name]; + break; + } + } + if (target_list) + window.ocs_bundle.ui_run_task( + this.address, 'set_hvac', + {'targets': target_list, 'values': values}); }, }, computed: { @@ -1491,7 +1605,9 @@ for (const [place, v] of Object.entries(devs)) { apply_status(v, v.setpoint, dest_key); if (!Object.hasOwn(places, place)) - places[place] = {name: place, metric: [1, 1, 1, 1, place]}; + places[place] = {name: place, + full_name: place, + metric: [1, 1, 1, 1, place]}; places[place][dest_key] = v; places[place].metric[metric_idx] = 0; } @@ -1512,6 +1628,13 @@ }) }); + // Make sure we have a place to store setpoints... + let setpoints = this.motion_control.hvac_setpoints; + ordered.filter((item) => (item.fan || item.heater)).forEach((item) => { + if (!Object.hasOwn(setpoints, item.full_name)) + setpoints[item.full_name] = null; + }); + // And finally, filter out heaters as separate list. const non_heaters_then_heaters = ordered.reduce((accs, item) => { accs[item.heater ? 1 : 0].push(item);