Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/energypreferences #30244

Merged
merged 65 commits into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from 64 commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
a049a1a
Adding the Energy Preferences XML
drempelg Oct 25, 2023
11b12c0
Merge branch 'project-chip:master' into feature/energypreferences
drempelg Dec 11, 2023
af64d8b
Added just the xml and regenerated. No implementations yet as
drempelg Dec 11, 2023
ca5bf2c
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 11, 2023
245acd0
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 13, 2023
4b017cd
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 14, 2023
135cfdd
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 14, 2023
09c7c06
regen
drempelg Dec 14, 2023
53883db
Merge branch 'master' into feature/energypreferences
drempelg Dec 14, 2023
39bcac0
Merge branch 'feature/energypreferences-xml' into feature/energyprefe…
drempelg Dec 14, 2023
99c8a68
put the cluster back into all-clusters after merge.
drempelg Dec 14, 2023
2bf0159
Apply suggestions from code review
drempelg Dec 18, 2023
51a5018
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 18, 2023
d9cd2c9
regenerate
drempelg Dec 18, 2023
aa37c05
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 18, 2023
a5a62db
Merge branch 'master' into feature/energypreferences-xml
drempelg Dec 19, 2023
9357e4a
Merge branch 'feature/energypreferences-xml' into feature/energyprefe…
drempelg Dec 19, 2023
c660978
Merge branch 'master' into feature/energypreferences
drempelg Jan 8, 2024
f2088df
Merge branch 'master' into feature/energypreferences
drempelg Jan 8, 2024
67fb16a
Merge branch 'project-chip:master' into feature/energypreferences
drempelg Jan 12, 2024
9258bb3
Finished up impl for energy-preferences
drempelg Jan 13, 2024
1dfa2b0
Merge branch 'project-chip:master' into feature/energypreferences
drempelg Jan 13, 2024
480ce86
Added some error checking for features, and constraint checking.
drempelg Jan 13, 2024
86affa4
Restyled by whitespace
restyled-commits Jan 13, 2024
459b58e
Restyled by clang-format
restyled-commits Jan 13, 2024
1f272c6
Fixed copy paste bug
drempelg Jan 13, 2024
2f51705
Removed some unecessary changes and a comment.
drempelg Jan 13, 2024
2369426
initialize the delegate pointer
drempelg Jan 13, 2024
377b3af
Merge branch 'master' into feature/energypreferences
drempelg Jan 17, 2024
8e931fe
Merge branch 'master' into feature/energypreferences
drempelg Jan 17, 2024
1ee1d5d
Merge branch 'master' into feature/energypreferences
drempelg Jan 19, 2024
f43c872
Merge branch 'feature/energypreferences' of https://github.com/drempe…
drempelg Jan 22, 2024
66e24ad
Put the cluster back in the all-clusters app after the merge
drempelg Jan 22, 2024
3848b7d
Fixed minor issues from review
drempelg Jan 22, 2024
91f18ad
Restyled by whitespace
restyled-commits Jan 22, 2024
94ef83b
Merge branch 'master' into feature/energypreferences
drempelg Jan 23, 2024
1d9d83b
Merge branch 'master' into feature/energypreferences
drempelg Jan 23, 2024
bfc06e1
Merge branch 'master' into feature/energypreferences
drempelg Jan 25, 2024
e4bb1c7
Addressing some review concerns
drempelg Jan 25, 2024
fd39d44
Some more comments resolved
drempelg Jan 25, 2024
d0bca83
Merge branch 'master' into feature/energypreferences
drempelg Feb 9, 2024
a228f2d
Better documentation, a set of braces I missed last time around, and
drempelg Feb 9, 2024
219be43
Merge branch 'master' into feature/energypreferences
drempelg Feb 12, 2024
235d005
Merge branch 'master' into feature/energypreferences
drempelg Feb 13, 2024
2212c8e
fix build error after merge
drempelg Feb 13, 2024
da27500
Restyled by whitespace
restyled-commits Feb 13, 2024
9c2a8cc
Restyled by clang-format
restyled-commits Feb 13, 2024
b2ab365
Update src/app/clusters/energy-preference-server/energy-preference-se…
robszewczyk Feb 15, 2024
61be1e5
Implement proposed API changes with clearer delineation of storage
robszewczyk Feb 15, 2024
024b0ca
Restyled by clang-format
restyled-commits Feb 15, 2024
48ed0f5
Typo
robszewczyk Feb 15, 2024
17efda7
Merge branch 'master' into feature/energypreferences
robszewczyk Feb 15, 2024
3c4c635
Regen zap, update code to reflect the updated return from Feature::Get
robszewczyk Feb 15, 2024
cd5f3c6
Merge branch 'master' into feature/energypreferences
robszewczyk Feb 16, 2024
985477c
ZAP regen, to fix merge errors
robszewczyk Feb 16, 2024
e8d0e29
Apply suggestions from code review
robszewczyk Feb 16, 2024
4dc866e
Address suggestion re: optionality conversion
robszewczyk Feb 16, 2024
2667aeb
Fix one more omission
robszewczyk Feb 16, 2024
b84b03b
another small fix
robszewczyk Feb 17, 2024
88ad2a9
Fix up copyright headers
robszewczyk Feb 17, 2024
cdfca87
Restyled by clang-format
restyled-commits Feb 17, 2024
064f3a1
Reinitialize storage objects on every iteration
robszewczyk Feb 20, 2024
81e3b1c
fix typo
robszewczyk Feb 20, 2024
a9ea997
Restyled by clang-format
restyled-commits Feb 20, 2024
310dc4c
Apply suggestions from code review
robszewczyk Feb 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4455,6 +4455,40 @@ provisional cluster EnergyEvse = 153 {
timed command ClearTargets(): DefaultSuccess = 7;
}

/** This cluster provides an interface to specify preferences for how devices should consume energy. */
provisional cluster EnergyPreference = 155 {
revision 1;

enum EnergyPriorityEnum : enum8 {
kComfort = 0;
kSpeed = 1;
kEfficiency = 2;
kWaterConsumption = 3;
}

bitmap Feature : bitmap32 {
kEnergyBalance = 0x1;
kLowPowerModeSensitivity = 0x2;
}

struct BalanceStruct {
percent step = 0;
optional char_string<64> label = 1;
}

readonly attribute optional BalanceStruct energyBalances[] = 0;
attribute optional int8u currentEnergyBalance = 1;
readonly attribute optional EnergyPriorityEnum energyPriorities[] = 2;
readonly attribute optional BalanceStruct lowPowerModeSensitivities[] = 3;
attribute optional int8u currentLowPowerModeSensitivity = 4;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
}

/** The Power Topology Cluster provides a mechanism for expressing how power is flowing between endpoints. */
provisional cluster PowerTopology = 156 {
revision 1;
Expand Down Expand Up @@ -8361,6 +8395,20 @@ endpoint 1 {
handle command ClearTargets;
}

server cluster EnergyPreference {
callback attribute energyBalances;
ram attribute currentEnergyBalance;
callback attribute energyPriorities;
callback attribute lowPowerModeSensitivities;
ram attribute currentLowPowerModeSensitivity;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 3;
ram attribute clusterRevision default = 1;
}

server cluster PowerTopology {
callback attribute availableEndpoints;
callback attribute activeEndpoints;
Expand Down
186 changes: 186 additions & 0 deletions examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
drempelg marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -14692,6 +14692,192 @@
}
]
},
{
"name": "Energy Preference",
"code": 155,
"mfgCode": null,
"define": "ENERGY_PREFERENCE_CLUSTER",
"side": "server",
"enabled": 1,
"attributes": [
{
"name": "EnergyBalances",
"code": 0,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "CurrentEnergyBalance",
"code": 1,
"mfgCode": null,
"side": "server",
"type": "int8u",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
"defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "EnergyPriorities",
"code": 2,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "LowPowerModeSensitivities",
"code": 3,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "CurrentLowPowerModeSensitivity",
"code": 4,
"mfgCode": null,
"side": "server",
"type": "int8u",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
"defaultValue": "",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "GeneratedCommandList",
"code": 65528,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "AcceptedCommandList",
"code": 65529,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "EventList",
"code": 65530,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "AttributeList",
"code": 65531,
"mfgCode": null,
"side": "server",
"type": "array",
"included": 1,
"storageOption": "External",
"singleton": 0,
"bounded": 0,
"defaultValue": null,
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "FeatureMap",
"code": 65532,
"mfgCode": null,
"side": "server",
"type": "bitmap32",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
"defaultValue": "3",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
"reportableChange": 0
},
{
"name": "ClusterRevision",
"code": 65533,
"mfgCode": null,
"side": "server",
"type": "int16u",
"included": 1,
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
"defaultValue": "1",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
"reportableChange": 0
}
]
},
{
"name": "Window Covering",
"code": 258,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*
*
* Copyright (c) 2024 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include <app/clusters/energy-preference-server/energy-preference-server.h>

using namespace chip;
using namespace chip::app::Clusters::EnergyPreference;
using namespace chip::app::Clusters::EnergyPreference::Structs;

static BalanceStruct::Type gsEnergyBalances[] = {
{ .step = 0, .label = Optional<chip::CharSpan>("Efficient"_span) },
{ .step = 50, .label = Optional<chip::CharSpan>() },
{ .step = 100, .label = Optional<chip::CharSpan>("Comfort"_span) },
};

static BalanceStruct::Type gsPowerBalances[] = {
{ .step = 0, .label = Optional<chip::CharSpan>("1 Minute"_span) },
{ .step = 12, .label = Optional<chip::CharSpan>("5 Minutes"_span) },
{ .step = 24, .label = Optional<chip::CharSpan>("10 Minutes"_span) },
{ .step = 36, .label = Optional<chip::CharSpan>("15 Minutes"_span) },
{ .step = 48, .label = Optional<chip::CharSpan>("20 Minutes"_span) },
{ .step = 60, .label = Optional<chip::CharSpan>("25 Minutes"_span) },
{ .step = 70, .label = Optional<chip::CharSpan>("30 Minutes"_span) },
{ .step = 80, .label = Optional<chip::CharSpan>("60 Minutes"_span) },
{ .step = 90, .label = Optional<chip::CharSpan>("120 Minutes"_span) },
{ .step = 100, .label = Optional<chip::CharSpan>("Never"_span) },
};

// assumes it'll be the only delegate for it's lifetime.
struct EPrefDelegate : public Delegate
{
EPrefDelegate();
virtual ~EPrefDelegate();

CHIP_ERROR GetEnergyBalanceAtIndex(chip::EndpointId aEndpoint, size_t aIndex, chip::Percent & aOutStep,
chip::Optional<chip::MutableCharSpan> & aOutLabel) override;
CHIP_ERROR GetEnergyPriorityAtIndex(chip::EndpointId aEndpoint, size_t aIndex, EnergyPriorityEnum & priority) override;
CHIP_ERROR GetLowPowerModeSensitivityAtIndex(chip::EndpointId aEndpoint, size_t aIndex, chip::Percent & aOutStep,
chip::Optional<chip::MutableCharSpan> & aOutLabel) override;

size_t GetNumEnergyBalances(chip::EndpointId aEndpoint) override;
size_t GetNumLowPowerModeSensitivities(chip::EndpointId aEndpoint) override;
};

EPrefDelegate::EPrefDelegate() : Delegate()
{
VerifyOrDie(GetDelegate() == nullptr);
SetDelegate(this);
}

EPrefDelegate::~EPrefDelegate()
{
VerifyOrDie(GetDelegate() == this);
SetDelegate(nullptr);
}

size_t EPrefDelegate::GetNumEnergyBalances(chip::EndpointId aEndpoint)
{
return (ArraySize(gsEnergyBalances));
}

size_t EPrefDelegate::GetNumLowPowerModeSensitivities(chip::EndpointId aEndpoint)
{
return (ArraySize(gsEnergyBalances));
}

CHIP_ERROR
EPrefDelegate::GetEnergyBalanceAtIndex(chip::EndpointId aEndpoint, size_t aIndex, chip::Percent & aOutStep,
chip::Optional<chip::MutableCharSpan> & aOutLabel)
{
if (aIndex < GetNumEnergyBalances(aEndpoint))
{
aOutStep = gsEnergyBalances[aIndex].step;
if (gsEnergyBalances[aIndex].label.HasValue())
{
chip::CopyCharSpanToMutableCharSpan(gsEnergyBalances[aIndex].label.Value(), aOutLabel.Value());
}
else
{
aOutLabel.ClearValue();
}
return CHIP_NO_ERROR;
}
return CHIP_ERROR_NOT_FOUND;
}

CHIP_ERROR
EPrefDelegate::GetEnergyPriorityAtIndex(chip::EndpointId aEndpoint, size_t aIndex, EnergyPriorityEnum & priority)
{
static EnergyPriorityEnum priorities[] = { EnergyPriorityEnum::kEfficiency, EnergyPriorityEnum::kComfort };

if (aIndex < ArraySize(priorities))
{
priority = priorities[aIndex];
return CHIP_NO_ERROR;
}

return CHIP_ERROR_NOT_FOUND;
}

CHIP_ERROR
EPrefDelegate::GetLowPowerModeSensitivityAtIndex(chip::EndpointId aEndpoint, size_t aIndex, chip::Percent & aOutStep,
chip::Optional<chip::MutableCharSpan> & aOutLabel)
{
if (aIndex < GetNumLowPowerModeSensitivities(aEndpoint))
{
aOutStep = gsPowerBalances[aIndex].step;
if (gsPowerBalances[aIndex].label.HasValue())
{
chip::CopyCharSpanToMutableCharSpan(gsPowerBalances[aIndex].label.Value(), aOutLabel.Value());
}
else
{
aOutLabel.ClearValue();
}
return CHIP_NO_ERROR;
}

return CHIP_ERROR_NOT_FOUND;
}

static EPrefDelegate gsDelegate;
Loading
Loading