Commit 0294e540145afba74c5e5242c75dcb9a218aaf3d

Authored by Jojo-1000
Committed by Moritz Wirger
1 parent 9db7c1ab

Add scheduleScene to Group so scenes can be scheduled.

Needed because setScene is not available in StateTransaction.
include/hueplusplus/APICache.h
@@ -74,6 +74,8 @@ public: @@ -74,6 +74,8 @@ public:
74 74
75 //! \brief Get HueCommandAPI used for requests 75 //! \brief Get HueCommandAPI used for requests
76 HueCommandAPI& getCommandAPI(); 76 HueCommandAPI& getCommandAPI();
  77 + //! \brief Get HueCommandAPI used for requests
  78 + const HueCommandAPI& getCommandAPI() const;
77 79
78 //! \brief Get path the cache is refreshed from 80 //! \brief Get path the cache is refreshed from
79 //! \returns Request path as passed to HueCommandAPI::GETRequest 81 //! \returns Request path as passed to HueCommandAPI::GETRequest
include/hueplusplus/Group.h
@@ -264,6 +264,13 @@ public: @@ -264,6 +264,13 @@ public:
264 //! \param scene Scene name. 264 //! \param scene Scene name.
265 void setScene(const std::string& scene); 265 void setScene(const std::string& scene);
266 266
  267 + //! \brief Get ScheduleCommand to set scene
  268 + //! \param scene Scene name
  269 + //! \returns A ScheduleCommand that can be used to set the scene on a Schedule
  270 + //!
  271 + //! To set other light properties in a scene, use transaction().
  272 + ScheduleCommand scheduleScene(const std::string& scene) const;
  273 +
267 ///@} 274 ///@}
268 275
269 protected: 276 protected:
include/hueplusplus/HueCommandAPI.h
@@ -62,7 +62,7 @@ public: @@ -62,7 +62,7 @@ public:
62 62
63 //! \brief Sends a HTTP PUT request to the bridge and returns the response 63 //! \brief Sends a HTTP PUT request to the bridge and returns the response
64 //! 64 //!
65 - //! This function will block until at least \ref minDelay has passed to any previous request 65 + //! This function will block until at least Config::getBridgeRequestDelay() has passed to any previous request
66 //! \param path API request path (appended after /api/{username}) 66 //! \param path API request path (appended after /api/{username})
67 //! \param request Request to the api, may be empty 67 //! \param request Request to the api, may be empty
68 //! \param fileInfo File information for thrown exceptions. 68 //! \param fileInfo File information for thrown exceptions.
@@ -76,7 +76,7 @@ public: @@ -76,7 +76,7 @@ public:
76 76
77 //! \brief Sends a HTTP GET request to the bridge and returns the response 77 //! \brief Sends a HTTP GET request to the bridge and returns the response
78 //! 78 //!
79 - //! This function will block until at least \ref minDelay has passed to any previous request 79 + //! This function will block until at least Config::getBridgeRequestDelay() has passed to any previous request
80 //! \param path API request path (appended after /api/{username}) 80 //! \param path API request path (appended after /api/{username})
81 //! \param request Request to the api, may be empty 81 //! \param request Request to the api, may be empty
82 //! \param fileInfo File information for thrown exceptions. 82 //! \param fileInfo File information for thrown exceptions.
@@ -91,7 +91,7 @@ public: @@ -91,7 +91,7 @@ public:
91 91
92 //! \brief Sends a HTTP DELETE request to the bridge and returns the response 92 //! \brief Sends a HTTP DELETE request to the bridge and returns the response
93 //! 93 //!
94 - //! This function will block until at least \ref minDelay has passed to any previous request 94 + //! This function will block until at least Config::getBridgeRequestDelay() has passed to any previous request
95 //! \param path API request path (appended after /api/{username}) 95 //! \param path API request path (appended after /api/{username})
96 //! \param request Request to the api, may be empty 96 //! \param request Request to the api, may be empty
97 //! \param fileInfo File information for thrown exceptions. 97 //! \param fileInfo File information for thrown exceptions.
@@ -106,7 +106,7 @@ public: @@ -106,7 +106,7 @@ public:
106 106
107 //! \brief Sends a HTTP POST request to the bridge and returns the response 107 //! \brief Sends a HTTP POST request to the bridge and returns the response
108 //! 108 //!
109 - //! This function will block until at least \ref minDelay has passed to any previous request 109 + //! This function will block until at least Config::getBridgeRequestDelay() has passed to any previous request
110 //! \param path API request path (appended after /api/{username}) 110 //! \param path API request path (appended after /api/{username})
111 //! \param request Request to the api, may be empty 111 //! \param request Request to the api, may be empty
112 //! \param fileInfo File information for thrown exceptions. 112 //! \param fileInfo File information for thrown exceptions.
src/APICache.cpp
@@ -118,6 +118,11 @@ HueCommandAPI& APICache::getCommandAPI() @@ -118,6 +118,11 @@ HueCommandAPI& APICache::getCommandAPI()
118 return commands; 118 return commands;
119 } 119 }
120 120
  121 +const HueCommandAPI& APICache::getCommandAPI() const
  122 +{
  123 + return commands;
  124 +}
  125 +
121 bool APICache::needsRefresh() 126 bool APICache::needsRefresh()
122 { 127 {
123 using clock = std::chrono::steady_clock; 128 using clock = std::chrono::steady_clock;
src/Group.cpp
@@ -141,7 +141,8 @@ std::string Group::getActionColorMode() const @@ -141,7 +141,8 @@ std::string Group::getActionColorMode() const
141 StateTransaction Group::transaction() 141 StateTransaction Group::transaction()
142 { 142 {
143 // Do not pass state, because it is not the state of ALL lights in the group 143 // Do not pass state, because it is not the state of ALL lights in the group
144 - return StateTransaction(state.getCommandAPI(), "/groups/" + std::to_string(id) + "/action", nlohmann::json::object()); 144 + return StateTransaction(
  145 + state.getCommandAPI(), "/groups/" + std::to_string(id) + "/action", nlohmann::json::object());
145 } 146 }
146 147
147 void Group::setOn(bool on, uint8_t transition) 148 void Group::setOn(bool on, uint8_t transition)
@@ -179,6 +180,14 @@ void Group::setScene(const std::string& scene) @@ -179,6 +180,14 @@ void Group::setScene(const std::string& scene)
179 sendPutRequest({{"scene", scene}}, "/action", CURRENT_FILE_INFO); 180 sendPutRequest({{"scene", scene}}, "/action", CURRENT_FILE_INFO);
180 } 181 }
181 182
  183 +ScheduleCommand Group::scheduleScene(const std::string& scene) const
  184 +{
  185 + const nlohmann::json command {{"method", "PUT"},
  186 + {"address", state.getCommandAPI().combinedPath("/groups/" + std::to_string(id) + "/action")},
  187 + {"body", {{"scene", scene}}}};
  188 + return ScheduleCommand(command);
  189 +}
  190 +
182 nlohmann::json Group::sendPutRequest(const nlohmann::json& request, const std::string& subPath, FileInfo fileInfo) 191 nlohmann::json Group::sendPutRequest(const nlohmann::json& request, const std::string& subPath, FileInfo fileInfo)
183 { 192 {
184 return state.getCommandAPI().PUTRequest("/groups/" + std::to_string(id) + subPath, request, std::move(fileInfo)); 193 return state.getCommandAPI().PUTRequest("/groups/" + std::to_string(id) + subPath, request, std::move(fileInfo));
test/test_Group.cpp
@@ -253,6 +253,19 @@ TEST_F(GroupTest, setScene) @@ -253,6 +253,19 @@ TEST_F(GroupTest, setScene)
253 group.setScene(scene); 253 group.setScene(scene);
254 } 254 }
255 255
  256 +TEST_F(GroupTest, scheduleScene)
  257 +{
  258 + const int id = 1;
  259 + expectGetState(id);
  260 + const Group group(id, commands, std::chrono::steady_clock::duration::max());
  261 + const std::string scene = "testScene";
  262 + nlohmann::json request = { {"scene", scene} };
  263 + ScheduleCommand command = group.scheduleScene(scene);
  264 + EXPECT_EQ(ScheduleCommand::Method::put, command.getMethod());
  265 + EXPECT_EQ("/api/" + getBridgeUsername() + "/groups/1/action", command.getAddress());
  266 + EXPECT_EQ(request, command.getBody());
  267 +}
  268 +
256 TEST(CreateGroup, LightGroup) 269 TEST(CreateGroup, LightGroup)
257 { 270 {
258 EXPECT_EQ(nlohmann::json({{"lights", {"1"}}, {"type", "LightGroup"}, {"name", "Name"}}), 271 EXPECT_EQ(nlohmann::json({{"lights", {"1"}}, {"type", "LightGroup"}, {"name", "Name"}}),