Skip to content

Commit f708865

Browse files
committed
fix(matter): suggested changes in pr review
1 parent 60d674b commit f708865

File tree

4 files changed

+97
-106
lines changed

4 files changed

+97
-106
lines changed

Diff for: libraries/Matter/examples/MatterThermostat/MatterThermostat.ino

+43-53
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const uint32_t decommissioningTimeout = 5000; // keep the button pressed for 5s
4343
float getSimulatedTemperature(bool isHeating, bool isCooling) {
4444
// read sensor temperature and apply heating/cooling
4545
float simulatedTempHWSensor = SimulatedThermostat.getLocalTemperature();
46-
46+
4747
if (isHeating) {
4848
// it will increase to simulate a heating system
4949
simulatedTempHWSensor = simulatedTempHWSensor + 0.5;
@@ -167,64 +167,54 @@ void loop() {
167167
SimulatedThermostat.setLocalTemperature(localTemperature); // publish the new temperature value
168168

169169
// Simulate the thermostat control system - User has 4 modes: OFF, HEAT, COOL, AUTO
170-
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_OFF) {
171-
// turn off the heating and cooling systems
172-
isHeating = false;
173-
isCooling = false;
174-
}
175-
// User APP has set the thermostat to AUTO mode -- keeping the tempeature between both setpoints
176-
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_AUTO) {
177-
// check if the heating system should be turned on or off
178-
if (localTemperature < SimulatedThermostat.getHeatingSetpoint() + SimulatedThermostat.getDeadBand()) {
179-
// turn on the heating system and turn off the cooling system
180-
isHeating = true;
181-
isCooling = false;
182-
}
183-
if (localTemperature > SimulatedThermostat.getCoolingSetpoint() - SimulatedThermostat.getDeadBand()) {
184-
// turn off the heating system and turn on the cooling system
185-
isHeating = false;
186-
isCooling = true;
187-
}
188-
}
189-
// User APP has set the thermostat to AUTO mode -- keeping the tempeature between both setpoints
190-
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_AUTO) {
191-
// check if the heating system should be turned on or off
192-
if (localTemperature < SimulatedThermostat.getHeatingSetpoint() + SimulatedThermostat.getDeadBand()) {
193-
// turn on the heating system and turn off the cooling system
194-
isHeating = true;
195-
isCooling = false;
196-
}
197-
if (localTemperature > SimulatedThermostat.getCoolingSetpoint() - SimulatedThermostat.getDeadBand()) {
198-
// turn off the heating system and turn on the cooling system
199-
isHeating = false;
200-
isCooling = true;
201-
}
202-
}
203-
// Simulate the heating system - User has turned the heating system ON
204-
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_HEAT) {
205-
isHeating = true;
206-
isCooling = false; // keep the cooling system off as it is in heating mode
207-
// when the heating system is in HEATING mode, it will be turned off as soon as the local temperature is above the setpoint
208-
if (localTemperature > SimulatedThermostat.getHeatingSetpoint()) {
209-
// turn off the heating system
170+
switch (SimulatedThermostat.getMode()) {
171+
case MatterThermostat::THERMOSTAT_MODE_OFF:
172+
// turn off the heating and cooling systems
210173
isHeating = false;
211-
}
212-
}
213-
// Simulate the cooling system - User has turned the cooling system ON
214-
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_COOL) {
215-
isCooling = true;
216-
isHeating = false; // keep the heating system off as it is in cooling mode
217-
// when the cooling system is in COOLING mode, it will be turned off as soon as the local temperature is bellow the setpoint
218-
if (localTemperature < SimulatedThermostat.getCoolingSetpoint()) {
219-
// turn off the cooling system
220174
isCooling = false;
221-
}
175+
break;
176+
case MatterThermostat::THERMOSTAT_MODE_AUTO:
177+
// User APP has set the thermostat to AUTO mode -- keeping the tempeature between both setpoints
178+
// check if the heating system should be turned on or off
179+
if (localTemperature < SimulatedThermostat.getHeatingSetpoint() + SimulatedThermostat.getDeadBand()) {
180+
// turn on the heating system and turn off the cooling system
181+
isHeating = true;
182+
isCooling = false;
183+
}
184+
if (localTemperature > SimulatedThermostat.getCoolingSetpoint() - SimulatedThermostat.getDeadBand()) {
185+
// turn off the heating system and turn on the cooling system
186+
isHeating = false;
187+
isCooling = true;
188+
}
189+
break;
190+
case MatterThermostat::THERMOSTAT_MODE_HEAT:
191+
// Simulate the heating system - User has turned the heating system ON
192+
isHeating = true;
193+
isCooling = false; // keep the cooling system off as it is in heating mode
194+
// when the heating system is in HEATING mode, it will be turned off as soon as the local temperature is above the setpoint
195+
if (localTemperature > SimulatedThermostat.getHeatingSetpoint()) {
196+
// turn off the heating system
197+
isHeating = false;
198+
}
199+
break;
200+
case MatterThermostat::THERMOSTAT_MODE_COOL:
201+
// Simulate the cooling system - User has turned the cooling system ON
202+
if (SimulatedThermostat.getMode() == MatterThermostat::THERMOSTAT_MODE_COOL) {
203+
isCooling = true;
204+
isHeating = false; // keep the heating system off as it is in cooling mode
205+
// when the cooling system is in COOLING mode, it will be turned off as soon as the local temperature is bellow the setpoint
206+
if (localTemperature < SimulatedThermostat.getCoolingSetpoint()) {
207+
// turn off the cooling system
208+
isCooling = false;
209+
}
210+
}
211+
break;
212+
default:
213+
log_e("Invalid Thermostat Mode %d", SimulatedThermostat.getMode());
222214
}
223-
224215
// Reporting Heating and Cooling status
225216
Serial.printf("\tThermostat Mode: %s >>> Heater is %s -- Cooler is %s\r\n", MatterThermostat::getThermostatModeString(SimulatedThermostat.getMode()), isHeating ? "ON" : "OFF", isCooling ? "ON" : "OFF");
226217
}
227-
228218
// Check if the button has been pressed
229219
if (digitalRead(buttonPin) == LOW && !button_state) {
230220
// deals with button debouncing

Diff for: libraries/Matter/keywords.txt

-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ EndPointSpeedCB KEYWORD1
3636
EndPointOnOffCB KEYWORD1
3737
EndPointBrightnessCB KEYWORD1
3838
EndPointRGBColorCB KEYWORD1
39-
EndPointTemperatureCB KEYWORD1
4039

4140
#######################################
4241
# Methods and Functions (KEYWORD2)

Diff for: libraries/Matter/src/MatterEndpoints/MatterThermostat.cpp

+53
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,57 @@ bool MatterThermostat::setRawTemperature(int16_t _rawTemperature, uint32_t attri
312312
return true;
313313
}
314314

315+
bool MatterThermostat::setCoolingHeatingSetpoints(double _setpointHeatingTemperature, double _setpointCollingTemperature) {
316+
// at least one of the setpoints must be valid
317+
bool settingCooling = _setpointCollingTemperature != (float)0xffff;
318+
bool settingHeating = _setpointHeatingTemperature != (float)0xffff;
319+
if (!settingCooling && !settingHeating) {
320+
log_e("Invalid Setpoints values. Set correctly at leat one of them in Celsius.");
321+
return false;
322+
}
323+
int16_t _rawHeatValue = static_cast<int16_t>(_setpointHeatingTemperature * 100.0f);
324+
int16_t _rawCoolValue = static_cast<int16_t>(_setpointCollingTemperature * 100.0f);
325+
326+
// check limits for the setpoints
327+
if (settingHeating && (_rawHeatValue < kDefaultMinHeatSetpointLimit || _rawHeatValue > kDefaultMaxHeatSetpointLimit)) {
328+
log_e("Invalid Heating Setpoint value: %.01fC - valid range %d..%d", _setpointHeatingTemperature, kDefaultMinHeatSetpointLimit / 100, kDefaultMaxHeatSetpointLimit / 100);
329+
return false;
330+
}
331+
if (settingCooling && (_rawCoolValue < kDefaultMinCoolSetpointLimit || _rawCoolValue > kDefaultMaxCoolSetpointLimit)) {
332+
log_e("Invalid Cooling Setpoint value: %.01fC - valid range %d..%d", _setpointCollingTemperature, kDefaultMinCoolSetpointLimit / 100, kDefaultMaxCoolSetpointLimit / 100);
333+
return false;
334+
}
335+
336+
// AUTO mode requires both setpoints to be valid to each other and respect the deadband
337+
if (currentMode == THERMOSTAT_MODE_AUTO) {
338+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR
339+
float deadband = getDeadBand();
340+
#endif
341+
// only setting Cooling Setpoint
342+
if (settingCooling && !settingHeating && _rawCoolValue < (heatingSetpointTemperature + (kDefaultDeadBand * 10))) {
343+
log_e("AutoMode :: Invalid Cooling Setpoint value: %.01fC - must be higher or equal than %.01fC", _setpointCollingTemperature, getHeatingSetpoint() + deadband);
344+
return false;
345+
}
346+
// only setting Heating Setpoint
347+
if (!settingCooling && settingHeating && _rawHeatValue > (coolingSetpointTemperature - (kDefaultDeadBand * 10))) {
348+
log_e("AutoMode :: Invalid Heating Setpoint value: %.01fC - must be lower or equal than %.01fC", _setpointHeatingTemperature, getCoolingSetpoint() - deadband);
349+
return false;
350+
}
351+
// setting both setpoints
352+
if (settingCooling && settingHeating && (_rawCoolValue <= _rawHeatValue || _rawCoolValue - _rawHeatValue < kDefaultDeadBand * 10.0)) {
353+
log_e("AutoMode :: Error - Heating Setpoint %.01fC must be lower than Cooling Setpoint %.01fC with a minimum difference of %0.1fC", _setpointHeatingTemperature, _setpointCollingTemperature, deadband);
354+
return false;
355+
}
356+
}
357+
358+
bool ret = true;
359+
if (settingCooling) {
360+
ret &= setRawTemperature(_rawCoolValue, Thermostat::Attributes::OccupiedCoolingSetpoint::Id, &coolingSetpointTemperature);
361+
}
362+
if (settingHeating) {
363+
ret &= setRawTemperature(_rawHeatValue, Thermostat::Attributes::OccupiedHeatingSetpoint::Id, &heatingSetpointTemperature);
364+
}
365+
return ret;
366+
}
367+
315368
#endif /* CONFIG_ESP_MATTER_ENABLE_DATA_MODEL */

Diff for: libraries/Matter/src/MatterEndpoints/MatterThermostat.h

+1-52
Original file line numberDiff line numberDiff line change
@@ -97,58 +97,7 @@ class MatterThermostat : public MatterEndPoint {
9797
// Heating Setpoint must be lower than Cooling Setpoint
9898
// When using AUTO mode the Cooling Setpoint must be higher than Heating Setpoint by at least the 2.5C (deadband)
9999
// Thermostat Matter Server will enforce those rules and the Max/Min setpoints limits as in the Matter Specification
100-
bool setCoolingHeatingSetpoints(double _setpointHeatingTemperature, double _setpointCollingTemperature) {
101-
// at least one of the setpoints must be valid
102-
bool settingCooling = _setpointCollingTemperature != (float)0xffff;
103-
bool settingHeating = _setpointHeatingTemperature != (float)0xffff;
104-
if (!settingCooling && !settingHeating) {
105-
log_e("Invalid Setpoints values. Set correctly at leat one of them in Celsius.");
106-
return false;
107-
}
108-
int16_t _rawHeatValue = static_cast<int16_t>(_setpointHeatingTemperature * 100.0f);
109-
int16_t _rawCoolValue = static_cast<int16_t>(_setpointCollingTemperature * 100.0f);
110-
111-
// check limits for the setpoints
112-
if (settingHeating && (_rawHeatValue < kDefaultMinHeatSetpointLimit || _rawHeatValue > kDefaultMaxHeatSetpointLimit)) {
113-
log_e("Invalid Heating Setpoint value: %.01fC - valid range %d..%d", _setpointHeatingTemperature, kDefaultMinHeatSetpointLimit / 100, kDefaultMaxHeatSetpointLimit / 100);
114-
return false;
115-
}
116-
if (settingCooling && (_rawCoolValue < kDefaultMinCoolSetpointLimit || _rawCoolValue > kDefaultMaxCoolSetpointLimit)) {
117-
log_e("Invalid Cooling Setpoint value: %.01fC - valid range %d..%d", _setpointCollingTemperature, kDefaultMinCoolSetpointLimit / 100, kDefaultMaxCoolSetpointLimit / 100);
118-
return false;
119-
}
120-
121-
// AUTO mode requires both setpoints to be valid to each other and respect the deadband
122-
if (currentMode == THERMOSTAT_MODE_AUTO) {
123-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR
124-
float deadband = getDeadBand();
125-
#endif
126-
// only setting Cooling Setpoint
127-
if (settingCooling && !settingHeating && _rawCoolValue < (heatingSetpointTemperature + (kDefaultDeadBand * 10))) {
128-
log_e("AutoMode :: Invalid Cooling Setpoint value: %.01fC - must be higher or equal than %.01fC", _setpointCollingTemperature, getHeatingSetpoint() + deadband);
129-
return false;
130-
}
131-
// only setting Heating Setpoint
132-
if (!settingCooling && settingHeating && _rawHeatValue > (coolingSetpointTemperature - (kDefaultDeadBand * 10))) {
133-
log_e("AutoMode :: Invalid Heating Setpoint value: %.01fC - must be lower or equal than %.01fC", _setpointHeatingTemperature, getCoolingSetpoint() - deadband);
134-
return false;
135-
}
136-
// setting both setpoints
137-
if (settingCooling && settingHeating && (_rawCoolValue <= _rawHeatValue || _rawCoolValue - _rawHeatValue < kDefaultDeadBand * 10.0)) {
138-
log_e("AutoMode :: Error - Heating Setpoint %.01fC must be lower than Cooling Setpoint %.01fC with a minimum difference of %0.1fC", _setpointHeatingTemperature, _setpointCollingTemperature, deadband);
139-
return false;
140-
}
141-
}
142-
143-
bool ret = true;
144-
if (settingCooling) {
145-
ret &= setRawTemperature(_rawCoolValue, Thermostat::Attributes::OccupiedCoolingSetpoint::Id, &coolingSetpointTemperature);
146-
}
147-
if (settingHeating) {
148-
ret &= setRawTemperature(_rawHeatValue, Thermostat::Attributes::OccupiedHeatingSetpoint::Id, &heatingSetpointTemperature);
149-
}
150-
return ret;
151-
}
100+
bool setCoolingHeatingSetpoints(double _setpointHeatingTemperature, double _setpointCollingTemperature);
152101

153102
// set the heating setpoint in 1/100th of a Celsio degree
154103
bool setHeatingSetpoint(double _setpointHeatingTemperature) {

0 commit comments

Comments
 (0)