Skip to content

Commit 842ce15

Browse files
committed
Switches: add "Function" dropdown option to allow user to set output function
Add a "Function" to switchable output that defines the function of the output. Only display function dropdown when the valid functions have options other than manual. The list of valid functions from the settings is used to allow user selection. Add various examples to smartswitch. Fixes #2731
1 parent 6222ebb commit 842ce15

File tree

12 files changed

+192
-48
lines changed

12 files changed

+192
-48
lines changed

data/mock/conf/services/smartswitch.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"/SwitchableOutput/0/Settings/ShowUIControl": 1,
3737
"/SwitchableOutput/0/Settings/Type": 0,
3838
"/SwitchableOutput/0/Settings/ValidTypes": 7,
39+
"/SwitchableOutput/0/Settings/Function": 0,
40+
"/SwitchableOutput/0/Settings/ValidFunctions": 255,
3941
"/SwitchableOutput/0/State": 0,
4042
"/SwitchableOutput/0/Status": 0,
4143
"/SwitchableOutput/0/Temperature": 28.330608367919922,
@@ -49,6 +51,8 @@
4951
"/SwitchableOutput/1/Settings/ShowUIControl": 1,
5052
"/SwitchableOutput/1/Settings/Type": 2,
5153
"/SwitchableOutput/1/Settings/ValidTypes": 7,
54+
"/SwitchableOutput/1/Settings/Function": 3,
55+
"/SwitchableOutput/1/Settings/ValidFunctions": 175,
5256
"/SwitchableOutput/1/State": 0,
5357
"/SwitchableOutput/1/Status": 0,
5458
"/SwitchableOutput/1/Temperature": 28.654977798461914,
@@ -62,6 +66,8 @@
6266
"/SwitchableOutput/2/Settings/ShowUIControl": 1,
6367
"/SwitchableOutput/2/Settings/Type": 1,
6468
"/SwitchableOutput/2/Settings/ValidTypes": 7,
69+
"/SwitchableOutput/2/Settings/Function": 8,
70+
"/SwitchableOutput/2/Settings/ValidFunctions": 79,
6571
"/SwitchableOutput/2/State": 1,
6672
"/SwitchableOutput/2/Status": 9,
6773
"/SwitchableOutput/2/Temperature": 29.42300033569336,
@@ -75,6 +81,8 @@
7581
"/SwitchableOutput/3/Settings/ShowUIControl": 1,
7682
"/SwitchableOutput/3/Settings/Type": 1,
7783
"/SwitchableOutput/3/Settings/ValidTypes": 7,
84+
"/SwitchableOutput/3/Settings/Function": 3,
85+
"/SwitchableOutput/3/Settings/ValidFunctions": 4,
7886
"/SwitchableOutput/3/State": 0,
7987
"/SwitchableOutput/3/Status": 9,
8088
"/SwitchableOutput/3/Temperature": 29.693782806396484,

pages/settings/PageSettingsRelay.qml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ Page {
1111

1212
function notifyRelayFunctionChange(relayFunction) {
1313
switch (relayFunction) {
14-
case VenusOS.Relay_Function_GeneratorStartStop:
14+
case VenusOS.SwitchableOutput_Function_GeneratorStartStop:
1515
//% "The Genset can now be found in the devices list"
1616
Global.showToastNotification(VenusOS.Notification_Info, qsTrId("settings_relay_genset_can_now_be_found"), 5000)
1717
break
18-
case VenusOS.Relay_Function_Tank_Pump:
18+
case VenusOS.SwitchableOutput_Function_Tank_Pump:
1919
//% "The Tank Pump can now be found in the devices list"
2020
Global.showToastNotification(VenusOS.Notification_Info, qsTrId("settings_relay_tank_pump_can_now_be_found"), 5000)
2121
break
22-
case VenusOS.Relay_Function_Manual:
22+
case VenusOS.SwitchableOutput_Function_Manual:
2323
//% "The Relay can now be found in the devices list"
2424
Global.showToastNotification(VenusOS.Notification_Info, qsTrId("settings_relay_manual_can_now_be_found"), 5000)
2525
break
@@ -51,18 +51,18 @@ Page {
5151
dataItem.uid: Global.systemSettings.serviceUid + "/Settings/Relay/Function"
5252
optionModel: [
5353
//% "Disabled"
54-
{ display: qsTrId("settings_relay_disabled"), value: VenusOS.Relay_Function_Disabled },
54+
{ display: qsTrId("settings_relay_disabled"), value: VenusOS.SwitchableOutput_Function_Disabled },
5555
//% "Alarm relay"
56-
{ display: qsTrId("settings_relay_alarm_relay"), value: VenusOS.Relay_Function_Alarm },
56+
{ display: qsTrId("settings_relay_alarm_relay"), value: VenusOS.SwitchableOutput_Function_Alarm },
5757
//% "Genset start/stop"
58-
{ display: qsTrId("settings_relay_genset_start_stop"), value: VenusOS.Relay_Function_GeneratorStartStop },
58+
{ display: qsTrId("settings_relay_genset_start_stop"), value: VenusOS.SwitchableOutput_Function_GeneratorStartStop },
5959
//% "Connected genset helper relay"
60-
{ display: qsTrId("settings_relay_genset_helper_relay"), value: VenusOS.Relay_Function_GensetHelperRelay },
60+
{ display: qsTrId("settings_relay_genset_helper_relay"), value: VenusOS.SwitchableOutput_Function_GensetHelperRelay },
6161
//% "Tank pump"
62-
{ display: qsTrId("settings_relay_tank_pump"), value: VenusOS.Relay_Function_Tank_Pump },
62+
{ display: qsTrId("settings_relay_tank_pump"), value: VenusOS.SwitchableOutput_Function_Tank_Pump },
6363
//% "Manual"
64-
{ display: qsTrId("settings_relay_manual"), value: VenusOS.Relay_Function_Manual },
65-
{ display: CommonWords.temperature, value: VenusOS.Relay_Function_Temperature },
64+
{ display: qsTrId("settings_relay_manual"), value: VenusOS.SwitchableOutput_Function_Manual },
65+
{ display: CommonWords.temperature, value: VenusOS.SwitchableOutput_Function_Temperature },
6666
]
6767
onOptionClicked: function(index) {
6868
root.notifyRelayFunctionChange(optionModel[index].value)
@@ -77,7 +77,7 @@ Page {
7777
//% "Polarity"
7878
: qsTrId("settings_relay_polarity")
7979
dataItem.uid: Global.systemSettings.serviceUid + "/Settings/Relay/Polarity"
80-
preferredVisible: [VenusOS.Relay_Function_Alarm, VenusOS.Relay_Function_Manual].indexOf(relayFunction.currentValue) >= 0
80+
preferredVisible: [VenusOS.SwitchableOutput_Function_Alarm, VenusOS.SwitchableOutput_Function_Manual].indexOf(relayFunction.currentValue) >= 0
8181
optionModel: [
8282
//% "Normally open"
8383
{ display: qsTrId("settings_relay_normally_open"), value: 0 },
@@ -95,10 +95,10 @@ Page {
9595
preferredVisible: relay1State.seen
9696
optionModel: [
9797
//% "Disabled"
98-
{ display: qsTrId("settings_relay_disabled"), value: VenusOS.Relay_Function_Disabled },
98+
{ display: qsTrId("settings_relay_disabled"), value: VenusOS.SwitchableOutput_Function_Disabled },
9999
//% "Manual"
100-
{ display: qsTrId("settings_relay_manual"), value: VenusOS.Relay_Function_Manual },
101-
{ display: CommonWords.temperature, value: VenusOS.Relay_Function_Temperature },
100+
{ display: qsTrId("settings_relay_manual"), value: VenusOS.SwitchableOutput_Function_Manual },
101+
{ display: CommonWords.temperature, value: VenusOS.SwitchableOutput_Function_Temperature },
102102
]
103103
onOptionClicked: function(index) {
104104
root.notifyRelayFunctionChange(optionModel[index].value)
@@ -110,15 +110,15 @@ Page {
110110
//% "Polarity (Relay 2)"
111111
text: qsTrId("settings_relay_polarity_relay2")
112112
dataItem.uid: Global.systemSettings.serviceUid + "/Settings/Relay/1/Polarity"
113-
preferredVisible: relay1Function.currentValue === VenusOS.Relay_Function_Manual
113+
preferredVisible: relay1Function.currentValue === VenusOS.SwitchableOutput_Function_Manual
114114
optionModel: relayPolaritySwitch.optionModel
115115
}
116116

117117
ListNavigation {
118118
//% "Temperature control rules"
119119
text: qsTrId("settings_relay_temp_control_rules")
120-
preferredVisible: relayFunction.currentValue === VenusOS.Relay_Function_Temperature
121-
|| relay1Function.currentValue === VenusOS.Relay_Function_Temperature
120+
preferredVisible: relayFunction.currentValue === VenusOS.SwitchableOutput_Function_Temperature
121+
|| relay1Function.currentValue === VenusOS.SwitchableOutput_Function_Temperature
122122
onClicked: {
123123
Global.pageManager.pushPage("/pages/settings/PageSettingsRelayTempSensors.qml", { title: text })
124124
}

pages/settings/PageSettingsRelayTempSensors.qml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ Page {
7373
Page {
7474
function _hasInvalidRelayTempConfig(relayNr) {
7575
if (relayNr === 0) {
76-
return relay0FunctionItem.value !== VenusOS.Relay_Function_Temperature
76+
return relay0FunctionItem.value !== VenusOS.SwitchableOutput_Function_Temperature
7777
} else if (relayNr === 1) {
78-
return relay1FunctionItem.value !== VenusOS.Relay_Function_Temperature
78+
return relay1FunctionItem.value !== VenusOS.SwitchableOutput_Function_Temperature
7979
}
8080
return false
8181
}
@@ -93,7 +93,7 @@ Page {
9393
}
9494

9595
GradientListView {
96-
model: relay0FunctionItem.value === VenusOS.Relay_Function_Temperature || relay1FunctionItem.value === VenusOS.Relay_Function_Temperature
96+
model: relay0FunctionItem.value === VenusOS.SwitchableOutput_Function_Temperature || relay1FunctionItem.value === VenusOS.SwitchableOutput_Function_Temperature
9797
? tempRelayModel
9898
: disabledModel
9999

pages/settings/PageSettingsTankPump.qml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Page {
2222

2323
model: relayFunction.value === undefined
2424
? startStopModel
25-
: relayFunction.value === VenusOS.Relay_Function_Tank_Pump ? startStopModel : disabledModel
25+
: relayFunction.value === VenusOS.SwitchableOutput_Function_Tank_Pump ? startStopModel : disabledModel
2626

2727
VeQuickItem {
2828
id: relayFunction

pages/settings/devicelist/DeviceListPage.qml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ Page {
102102
id: gensetMenu
103103
//% "Genset"
104104
text: qsTrId("devicelistpage_genset")
105-
preferredVisible: relay0.valid && relayFunction.valid && relayFunction.value === VenusOS.Relay_Function_GeneratorStartStop
105+
preferredVisible: relay0.valid && relayFunction.valid && relayFunction.value === VenusOS.SwitchableOutput_Function_GeneratorStartStop
106106
onClicked: Global.pageManager.pushPage("/pages/settings/PageRelayGenerator.qml", {"title": text})
107107

108108
VeQuickItem {
@@ -113,7 +113,7 @@ Page {
113113

114114
ListNavigation {
115115
id: tankPumpMenu
116-
preferredVisible: relayFunction.valid && relayFunction.value === VenusOS.Relay_Function_Tank_Pump
116+
preferredVisible: relayFunction.valid && relayFunction.value === VenusOS.SwitchableOutput_Function_Tank_Pump
117117
//% "Tank pump"
118118
text: qsTrId("settings_tank_pump")
119119
onClicked: Global.pageManager.pushPage("/pages/settings/PageSettingsTankPump.qml", {"title": text})

pages/settings/devicelist/switchable-outputs/PageSwitchableOutput.qml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@ Page {
110110
defaultSecondaryText: VenusOS.switchableOutput_typeToText(root.switchableOutput.type, root.switchableOutput.outputId)
111111
}
112112

113+
ListRadioButtonGroup {
114+
//% "Function"
115+
text: qsTrId("page_switchable_output_function")
116+
dataItem.uid: root.switchableOutput.uid + "/Settings/Function"
117+
preferredVisible: dataItem.valid
118+
&& (root.switchableOutput.validFunctions !== (1 << VenusOS.SwitchableOutput_Function_Manual))
119+
secondaryLabel.color: root.switchableOutput.hasValidFunction ? Theme.color_listItem_secondaryText : Theme.color_critical
120+
optionModel: {
121+
let options = []
122+
for (let i = 0; i <= VenusOS.SwitchableOutput_Function_MaxSupportedType; i++) {
123+
if (root.switchableOutput.validFunctions & (1 << i)) {
124+
options.push({ display: VenusOS.switchableOutput_functionToText(i), value: i })
125+
}
126+
}
127+
return options
128+
}
129+
interactive: optionModel.length > 1 || !root.switchableOutput.hasValidFunction
130+
131+
// Set the fallback text explicitly, in case the output Function is not supported by its
132+
// ValidFunctions, which means the current Function is not one of the listed options and
133+
// thus cannot be displayed by ListRadioButtonGroup.
134+
defaultSecondaryText: VenusOS.switchableOutput_functionToText(root.switchableOutput.function)
135+
}
136+
113137
ListRadioButtonGroup {
114138
//: Whether UI controls should be shown for this output
115139
//% "Show controls"

src/enums.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,39 @@ QString Enums::switchableOutput_typeToText(SwitchableOutput_Type value, const QS
461461
}
462462
}
463463

464+
QString Enums::switchableOutput_functionToText(SwitchableOutput_Function value) const
465+
{
466+
switch (value) {
467+
case SwitchableOutput_Function_Disabled:
468+
//% "Disabled"
469+
return qtTrId("switchable_output_function_disabled");
470+
case SwitchableOutput_Function_Alarm:
471+
//% "Alarm"
472+
return qtTrId("switchable_output_function_alarm");
473+
case SwitchableOutput_Function_GeneratorStartStop:
474+
//% "Generator start/stop"
475+
return qtTrId("switchable_output_function_generator_startstop");
476+
case SwitchableOutput_Function_Manual:
477+
//% "Manual"
478+
return qtTrId("switchable_output_function_manual");
479+
case SwitchableOutput_Function_Tank_Pump:
480+
//% "Tank pump"
481+
return qtTrId("switchable_output_function_tankpump");
482+
case SwitchableOutput_Function_Temperature:
483+
//% "Temperature"
484+
return qtTrId("switchable_output_function_temperature");
485+
case SwitchableOutput_Function_GensetHelperRelay:
486+
//% "Genset Helper"
487+
return qtTrId("switchable_output_function_genset_helper");
488+
case SwitchableOutput_Function_OpportunityLoad:
489+
//% "Opportunity load"
490+
return qtTrId("switchable_output_function_opportunity_load");
491+
default:
492+
//% "Unsupported type: %1"
493+
return qtTrId("switchable_output_unsupported").arg(value);
494+
}
495+
}
496+
464497
QString Enums::switchableOutput_statusToText(SwitchableOutput_Status value, SwitchableOutput_Type type) const
465498
{
466499
switch (value) {

src/enums.h

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,21 @@ class Enums : public QObject
530530
};
531531
Q_ENUM(SwitchableOutput_Type)
532532

533+
enum SwitchableOutput_Function {
534+
SwitchableOutput_Function_Disabled = -1,
535+
SwitchableOutput_Function_Alarm = 0,
536+
SwitchableOutput_Function_GeneratorStartStop,
537+
SwitchableOutput_Function_Manual,
538+
SwitchableOutput_Function_Tank_Pump,
539+
SwitchableOutput_Function_Temperature,
540+
SwitchableOutput_Function_GensetHelperRelay,
541+
SwitchableOutput_Function_OpportunityLoad,
542+
543+
SwitchableOutput_Function_MaxSupportedType = SwitchableOutput_Function_OpportunityLoad
544+
};
545+
Q_ENUM(SwitchableOutput_Function)
546+
547+
533548
enum SwitchableOutput_Status {
534549
SwitchableOutput_Status_Off = 0x00,
535550
SwitchableOutput_Status_Powered = 0x01,
@@ -604,17 +619,6 @@ class Enums : public QObject
604619
};
605620
Q_ENUM(CanBusConfig_Type)
606621

607-
enum Relay_Function {
608-
Relay_Function_Disabled = -1,
609-
Relay_Function_Alarm = 0,
610-
Relay_Function_GeneratorStartStop,
611-
Relay_Function_Manual,
612-
Relay_Function_Tank_Pump,
613-
Relay_Function_Temperature,
614-
Relay_Function_GensetHelperRelay
615-
};
616-
Q_ENUM(Relay_Function)
617-
618622
enum Temperature_DeviceType {
619623
Temperature_DeviceType_Battery = 0,
620624
Temperature_DeviceType_Fridge,
@@ -980,6 +984,7 @@ class Enums : public QObject
980984

981985
Q_INVOKABLE QString switch_deviceStateToText(Switch_DeviceState value) const;
982986
Q_INVOKABLE QString switchableOutput_typeToText(SwitchableOutput_Type value, const QString &channelId = QString()) const;
987+
Q_INVOKABLE QString switchableOutput_functionToText(SwitchableOutput_Function value) const;
983988
Q_INVOKABLE QString switchableOutput_statusToText(SwitchableOutput_Status value, SwitchableOutput_Type type) const;
984989

985990
Q_INVOKABLE QString microgridModeToText(MicrogridMode mode) const;

0 commit comments

Comments
 (0)