@@ -57,10 +57,20 @@ void APB::WebServer::setup() {
5757 webserver.on (" /api/status" , HTTP_GET, std::bind (&WebServer::onGetStatus, this , _1));
5858 webserver.on (" /api/ambient" , HTTP_GET, std::bind (&WebServer::onGetAmbient, this , _1));
5959 webserver.on (" /api/heaters" , HTTP_GET, std::bind (&WebServer::onGetHeaters, this , _1));
60+ onJsonRequest (" /api/heater" , std::bind (&APB::WebServer::onPostSetHeater, this , _1, _2), HTTP_POST);
61+
62+ events.onConnect ([](AsyncEventSourceClient *client){
63+ Log.infoln (LOG_SCOPE " [SSE] Client connected: lastId=%d, %s" , client->lastId (), client->client ()->remoteIP ().toString ().c_str ());
64+ });
65+ events.onDisconnect ([](AsyncEventSourceClient *client){
66+ Log.infoln (LOG_SCOPE " [SSE] Client disconnected" );
67+ });
68+ webserver.addHandler (&events);
69+
6070 webserver.serveStatic (" /" , LittleFS, " /web/" ).setDefaultFile (" index.html" );
6171 webserver.serveStatic (" /static" , LittleFS, " /web/static" ).setDefaultFile (" index.html" );
62- webserver. addHandler (&events);
63- onJsonRequest ( " /api/heater " , std::bind (&APB::WebServer::onPostSetHeater, this , _1, _2), HTTP_POST);
72+
73+
6474
6575 Log.infoln (LOG_SCOPE " Setup finished" );
6676 webserver.begin ();
@@ -116,13 +126,6 @@ void APB::WebServer::onGetHistory(AsyncWebServerRequest *request) {
116126 request->send (response);
117127}
118128
119- void APB::WebServer::onNotFound (AsyncWebServerRequest *request) {
120- JsonResponse response (request, 404 );
121- response.root ()[" error" ] = " NotFound" ;
122- response.root ()[" url" ] = request->url ();
123- }
124-
125-
126129void APB::WebServer::onPostWriteConfig (AsyncWebServerRequest *request) {
127130 Settings::Instance.save ();
128131 onGetConfig (request);
@@ -141,7 +144,9 @@ void APB::WebServer::onGetAmbient(AsyncWebServerRequest *request) {
141144
142145void APB::WebServer::onGetHeaters (AsyncWebServerRequest *request) {
143146 JsonResponse response (request);
144- Heaters::toJson (response.root ().to <JsonArray>());
147+ Log.infoln (LOG_SCOPE " onGetHeaters: %d" , Heaters::Instance.size ());
148+ JsonArray responseArray = response.root ().to <JsonArray>();
149+ Heaters::toJson (responseArray);
145150}
146151
147152void APB::WebServer::onGetPower (AsyncWebServerRequest *request) {
@@ -251,15 +256,38 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
251256 .range (" index" , {0 }, {Heaters::Instance.size ()-1 })
252257 .range (" max_duty" , {0 }, {1 })
253258 .choice (" mode" , Heater::validModes ()).invalid ()) return ;
254- Heater &heater = Heaters::Instance[json[ " index " ]];
259+
255260 Heater::Mode mode = Heater::modeFromString (json[" mode" ]);
261+ if (mode != Heater::Mode::off) {
262+ if (validation.range (" max_duty" , {0 }, {1 }).required <float >(" max_duty" ).invalid ()) return ;
263+ if (mode == Heater::Mode::dewpoint) {
264+ if (validation
265+ .range (" dewpoint_offset" , {-30 }, {30 })
266+ .required <float >(" dewpoint_offset" )
267+ .range (" min_duty" , 0 , 1 )
268+ .range (" ramp_offset" , 0 , 20 )
269+ .invalid ()
270+ ) return ;
271+ }
272+ if (mode == Heater::Mode::target_temperature) {
273+ if (validation
274+ .range (" target_temperature" , {-50 }, {50 })
275+ .required <float >(" target_temperature" )
276+ .range (" min_duty" , 0 , 1 )
277+ .range (" ramp_offset" , 0 , 20 )
278+ .invalid ()
279+ ) return ;
280+ }
281+ }
282+
283+ Heater &heater = Heaters::Instance[json[" index" ]];
284+
256285 if (mode == Heater::Mode::off) {
257286 heater.setMaxDuty (0 );
258287 onGetHeaters (request);
259288 return ;
260289 }
261290
262- if (validation.range (" max_duty" , {0 }, {1 }).required <float >(" max_duty" ).invalid ()) return ;
263291 float duty = json[" max_duty" ];
264292 static const char *temperatureErrorMessage = " Unable to set target temperature. Heater probably doesn't have a temperature sensor." ;
265293 static const char *dewpointTemperatureErrorMessage = " Unable to set target temperature. Either the heater doesn't have a temperature sensor, or you're missing an ambient sensor." ;
@@ -268,13 +296,6 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
268296 heater.setMaxDuty (json[" max_duty" ]);
269297 }
270298 if (mode == Heater::Mode::dewpoint) {
271- if (validation
272- .range (" dewpoint_offset" , {-30 }, {30 })
273- .required <float >(" dewpoint_offset" )
274- .range (" min_duty" , 0 , 1 )
275- .range (" ramp_offset" , 0 , 20 )
276- .invalid ()
277- ) return ;
278299 float dewpointOffset = json[" dewpoint_offset" ];
279300 float minDuty = json[" min_duty" ].is <float >() ? json[" min_duty" ] : 0 .f ;
280301 float rampOffset = json[" ramp_offset" ].is <float >() ? json[" ramp_offset" ] : 0 .f ;
@@ -284,13 +305,6 @@ void APB::WebServer::onPostSetHeater(AsyncWebServerRequest *request, JsonVariant
284305 }
285306 }
286307 if (mode == Heater::Mode::target_temperature) {
287- if (validation
288- .range (" target_temperature" , {-50 }, {50 })
289- .required <float >(" target_temperature" )
290- .range (" min_duty" , 0 , 1 )
291- .range (" ramp_offset" , 0 , 20 )
292- .invalid ()
293- ) return ;
294308 float targetTemperature = json[" target_temperature" ];
295309 float rampOffset = json[" ramp_offset" ].is <float >() ? json[" ramp_offset" ] : 0 .f ;
296310 float minDuty = json[" min_duty" ].is <float >() ? json[" min_duty" ] : 0 .f ;
0 commit comments