web_config.cpp 13.8 KB
Newer Older
1
2
#include "web_config.h"

Eric Duminil's avatar
Eric Duminil committed
3
#define STRING_LEN 33 // Should be enough for ip, addresses, passwords...
Eric Duminil's avatar
Eric Duminil committed
4

5
6
7
#define STRING(x) #x
#define STRINGIFY(x) STRING(x) // Allows to call STRINGIFY(SOME_MACRO) and convert the value of SOME_MACRO to string

Eric Duminil's avatar
Eric Duminil committed
8
#include "config.h"
9
#ifndef MQTT_TOPIC_PREFIX
Eric Duminil's avatar
Eric Duminil committed
10
#  error Missing config.h file. Please copy config.public.h to config.h.
Eric Duminil's avatar
Eric Duminil committed
11
#  warning config.h has a new structure (e.g. AMPEL_WIFI should be set to true or false)
12
13
#endif

Eric Duminil's avatar
Eric Duminil committed
14
15
#include "util.h"
#include "sensor_console.h"
Eric Duminil's avatar
Eric Duminil committed
16

Eric Duminil's avatar
Eric Duminil committed
17
18
19
#include "src/lib/IotWebConf/src/IotWebConf.h"
#include "src/lib/IotWebConf/src/IotWebConfTParameter.h"
#include "src/lib/IotWebConf/src/IotWebConfOptionalGroup.h"
Eric Duminil's avatar
Eric Duminil committed
20

21
//TODO: Convert all strings to F-strings
Eric Duminil's avatar
Notes    
Eric Duminil committed
22

23
24
25
26
27
28
29
namespace web_config {
#if defined(ESP8266)
  ESP8266WebServer http(80); // Create a webserver object that listens for HTTP request on port 80
#elif defined(ESP32)
  WebServer http(80);
#endif

Eric Duminil's avatar
Eric Duminil committed
30
  DNSServer dnsServer; //TODO: Check if needed
31
32
33

  IotWebConf *iotWebConf;

Eric Duminil's avatar
Eric Duminil committed
34
  const char config_version[IOTWEBCONF_CONFIG_VERSION_LENGTH] = AMPEL_CONFIG_VERSION; // -- Configuration specific key. The value should be modified if config structure was changed.
35
  using namespace iotwebconf;
36
37
  std::function<void()> _wifiConnectingCallback = nullptr;
  std::function<void()> _apModeCallback= nullptr;
38

Eric Duminil's avatar
Eric Duminil committed
39
  /**
Eric Duminil's avatar
Eric Duminil committed
40
   * WiFi params
Eric Duminil's avatar
Eric Duminil committed
41
   */
42
43
  CheckboxTParameter ampelWifiParam =
      Builder<CheckboxTParameter>("WiFi").label("WiFi?").defaultValue(AMPEL_WIFI).build();
Eric Duminil's avatar
Eric Duminil committed
44
45
46
  IntTParameter<uint16_t> wifiTimeoutParam =
      Builder<IntTParameter<uint16_t>>("wifi_timeout").label("WiFi timeout").defaultValue(WIFI_TIMEOUT).min(0).placeholder(
          "[s]").build();
Eric Duminil's avatar
Eric Duminil committed
47

Eric Duminil's avatar
Eric Duminil committed
48
49
50
51
  //TODO: Distribute to corresponding classes, possibly with callbacks?
  /**
   * CO2 sensor
   */
Eric Duminil's avatar
Done    
Eric Duminil committed
52
  ParameterGroup co2Params = ParameterGroup("co2", "CO2 Sensor");
Eric Duminil's avatar
Eric Duminil committed
53

Eric Duminil's avatar
Eric Duminil committed
54
55
  IntTParameter<uint16_t> timestepParam =
      Builder<IntTParameter<uint16_t>>("timestep").label("Measurement timestep").defaultValue(MEASUREMENT_TIMESTEP).min(
Eric Duminil's avatar
Eric Duminil committed
56
          2).max(1800).placeholder("[s]").build();
Eric Duminil's avatar
Eric Duminil committed
57

Eric Duminil's avatar
Eric Duminil committed
58
  CheckboxTParameter autoCalibrateParam = Builder<CheckboxTParameter>("asc").label("Auto-calibration?").defaultValue(
Eric Duminil's avatar
Eric Duminil committed
59
  AUTO_CALIBRATE_SENSOR).build();
Eric Duminil's avatar
Eric Duminil committed
60

Eric Duminil's avatar
Eric Duminil committed
61
62
63
  /**
   * LED
   */
Eric Duminil's avatar
Eric Duminil committed
64
  //NOTE: Could also be optional : for LED 0 / 1
Eric Duminil's avatar
Eric Duminil committed
65
66
67
68
69
70
71
72
  ParameterGroup ledParams = ParameterGroup("LED", "LED");

  IntTParameter<uint8_t> maxBrightnessParam =
      Builder<IntTParameter<uint8_t>>("max_brightness").label("Max Brightness").defaultValue(MAX_BRIGHTNESS).min(0).max(
          255).build();
  IntTParameter<uint8_t> minBrightnessParam =
      Builder<IntTParameter<uint8_t>>("min_brightness").label("Min Brightness").defaultValue(MIN_BRIGHTNESS).min(0).max(
          255).build();
73
  IntTParameter<uint16_t> ledCountParam = Builder<IntTParameter<uint16_t>>("led_count").label("LED ring").defaultValue(
Eric Duminil's avatar
Eric Duminil committed
74
75
  LED_COUNT).min(12).max(16).step(4).build();

Eric Duminil's avatar
Eric Duminil committed
76
77
78
  /**
   * CSV
   */
79
  OptionalParameterGroup csvParams = OptionalParameterGroup("CSV", "CSV", AMPEL_CSV);
Eric Duminil's avatar
Eric Duminil committed
80

81
82
  IntTParameter<uint16_t> csvIntervalParam =
      Builder<IntTParameter<uint16_t>>("csv_interval").label("CSV interval").defaultValue(CSV_INTERVAL).min(0).step(1).placeholder(
Eric Duminil's avatar
Eric Duminil committed
83
          "[s]").build();
Eric Duminil's avatar
Eric Duminil committed
84
85
86
87

  /**
   * MQTT
   */
88
  OptionalParameterGroup mqttParams = OptionalParameterGroup("MQTT", "MQTT", AMPEL_MQTT);
Eric Duminil's avatar
Eric Duminil committed
89

90
  IntTParameter<uint16_t> mqttIntervalParam =
Eric Duminil's avatar
Eric Duminil committed
91
92
      Builder<IntTParameter<uint16_t>>("mqtt_interval").label("MQTT interval").defaultValue(MQTT_SENDING_INTERVAL).min(
          0).step(1).defaultValue(300).placeholder("[s]").build();
Eric Duminil's avatar
Eric Duminil committed
93

Eric Duminil's avatar
Eric Duminil committed
94
95
96
  CheckboxTParameter mqttEncryptionParam =
      Builder<CheckboxTParameter>("mqtt_encryption").label("Encrypt MQTT?").defaultValue(MQTT_ENCRYPTED).build();

Eric Duminil's avatar
Eric Duminil committed
97
  CheckboxTParameter mqttCommandsParam =
Eric Duminil's avatar
Eric Duminil committed
98
      Builder<CheckboxTParameter>("mqtt_commands").label("Allow MQTT commands?").defaultValue(ALLOW_MQTT_COMMANDS).build();
Eric Duminil's avatar
Eric Duminil committed
99

Eric Duminil's avatar
Eric Duminil committed
100
101
  TextTParameter<STRING_LEN> mqttServerParam =
      Builder<TextTParameter<STRING_LEN>>("mqtt_server").label("MQTT Server").defaultValue(MQTT_SERVER).build();
Eric Duminil's avatar
Eric Duminil committed
102

Eric Duminil's avatar
Eric Duminil committed
103
104
  IntTParameter<uint16_t> mqttPortParam = Builder<IntTParameter<uint16_t>>("mqtt_port").label("MQTT Port").defaultValue(
  MQTT_PORT).build();
Eric Duminil's avatar
Eric Duminil committed
105

Eric Duminil's avatar
Eric Duminil committed
106
107
  TextTParameter<STRING_LEN> mqttUserParam =
      Builder<TextTParameter<STRING_LEN>>("mqtt_user").label("MQTT User").defaultValue(MQTT_USER).build();
Eric Duminil's avatar
Eric Duminil committed
108

Eric Duminil's avatar
Eric Duminil committed
109
  PasswordTParameter<STRING_LEN> mqttPasswordParam = Builder<PasswordTParameter<STRING_LEN>>("mqtt_password").label(
Eric Duminil's avatar
Eric Duminil committed
110
      "MQTT password").defaultValue(MQTT_PASSWORD).build();
Eric Duminil's avatar
Eric Duminil committed
111

112
113
  TextTParameter<STRING_LEN> mqttTopicPrefixParam =
      Builder<TextTParameter<STRING_LEN>>("mqtt_topic").label("MQTT Topic prefix").defaultValue(MQTT_TOPIC_PREFIX).build();
Eric Duminil's avatar
Eric Duminil committed
114
115
116
  /**
   * NTP Time
   */
Eric Duminil's avatar
Eric Duminil committed
117

Eric Duminil's avatar
Eric Duminil committed
118
  ParameterGroup timeParams = ParameterGroup("NTP", "Time server");
Eric Duminil's avatar
Eric Duminil committed
119
  TextTParameter<STRING_LEN> ntpServerParam =
Eric Duminil's avatar
Eric Duminil committed
120
      Builder<TextTParameter<STRING_LEN>>("ntp_server").label("NTP Server").defaultValue(NTP_SERVER).build();
Eric Duminil's avatar
Eric Duminil committed
121
  IntTParameter<int16_t> timeOffsetParam = Builder<IntTParameter<int16_t>>("timezone").label("Timezone").defaultValue(
Eric Duminil's avatar
Done    
Eric Duminil committed
122
  UTC_OFFSET).min(-23).max(23).step(1).placeholder("[h]").build();
Eric Duminil's avatar
Eric Duminil committed
123
  CheckboxTParameter dstParam = Builder<CheckboxTParameter>("dst").label("Daylight Saving Time?").defaultValue(
Eric Duminil's avatar
Done    
Eric Duminil committed
124
  DAYLIGHT_SAVING_TIME).build();
125

Eric Duminil's avatar
Eric Duminil committed
126
  /**
Eric Duminil's avatar
TODO    
Eric Duminil committed
127
   * LoRaWAN
Eric Duminil's avatar
Eric Duminil committed
128
   */
Eric Duminil's avatar
Eric Duminil committed
129
#if defined(ESP32)
130
  OptionalParameterGroup loraParams = OptionalParameterGroup("LoRaWan", "LoRaWan", AMPEL_LORAWAN);
131
  IntTParameter<uint16_t> loraIntervalParam =
Eric Duminil's avatar
Eric Duminil committed
132
133
      Builder<IntTParameter<uint16_t>>("lora_interval").label("LoRa interval").defaultValue(LORAWAN_SENDING_INTERVAL).min(
          0).step(1).defaultValue(300).placeholder("[s]").build();
Eric Duminil's avatar
Eric Duminil committed
134

135
136
137
138
  TextTParameter<17> deviceEUIParam = Builder<TextTParameter<17>>("device_eui").label("Device EUI (MSB)").defaultValue(
  LORAWAN_DEVICE_EUI).build();
  TextTParameter<17> appEUIParam = Builder<TextTParameter<17>>("app_eui").label("App EUI (MSB)").defaultValue(
  LORAWAN_APPLICATION_EUI).build();
Eric Duminil's avatar
Eric Duminil committed
139
  PasswordTParameter<33> appKeyParam = Builder<PasswordTParameter<33>>("app_key").label("App key (MSB)").defaultValue(
140
  LORAWAN_APPLICATION_KEY).build();
Eric Duminil's avatar
Eric Duminil committed
141
#endif
142

Eric Duminil's avatar
Eric Duminil committed
143
  OptionalGroupHtmlFormatProvider optionalGroupHtmlFormatProvider;
144
145
146
147
148

  void update() {
    iotWebConf->doLoop(); // Listen for HTTP requests from clients
  }

Eric Duminil's avatar
Eric Duminil committed
149
150
  void setWifiConnectionCallback(void (*success_function)()) {
    iotWebConf->setWifiConnectionCallback(success_function);
Eric Duminil's avatar
Eric Duminil committed
151
152
  }

153
154
155
156
157
158
159
160
  void setWifiConnectingCallback(void (*fn)()) {
    _wifiConnectingCallback = fn;
  }

  void setApModeCallback(void (*fn)()) {
    _apModeCallback = fn;
  }

Eric Duminil's avatar
Eric Duminil committed
161
162
163
164
165
166
  void setWifiFailCallback(void (*fail_function)()) {
    std::function<WifiAuthInfo* ()> fail_and_return_null = [fail_function]() {
      fail_function();
      return nullptr;
    };
    iotWebConf->setWifiConnectionFailedHandler(fail_and_return_null);
Eric Duminil's avatar
Eric Duminil committed
167
168
  }

169
  void defineStructure() {
170
171
172
    iotWebConf->setHtmlFormatProvider(&optionalGroupHtmlFormatProvider);

    iotWebConf->addSystemParameter(&ampelWifiParam);
Eric Duminil's avatar
Eric Duminil committed
173
174
    // Somehow, making ampelWifi invisible set it to 0 :-/
    //    ampelWifiParam.visible = false; // To avoid users getting locked out. In order to set WiFi on/off, console commands can be used.
Eric Duminil's avatar
Eric Duminil committed
175
    iotWebConf->addSystemParameter(&wifiTimeoutParam);
Eric Duminil's avatar
Eric Duminil committed
176

Eric Duminil's avatar
Eric Duminil committed
177
178
    iotWebConf->getThingNameParameter()->label = "Ampel name";
    iotWebConf->getApPasswordParameter()->label = "Ampel password (user : 'admin')";
179
180
    iotWebConf->getApTimeoutParameter()->label = "Access Point timeout";
    iotWebConf->getApTimeoutParameter()->visible = true;
Eric Duminil's avatar
Eric Duminil committed
181

Eric Duminil's avatar
Done    
Eric Duminil committed
182
183
184
    iotWebConf->getApPasswordParameter()->defaultValue = AMPEL_PASSWORD;
    iotWebConf->getWifiSsidParameter()->defaultValue = WIFI_SSID;
    iotWebConf->getWifiPasswordParameter()->defaultValue = WIFI_PASSWORD;
185
    iotWebConf->getApTimeoutParameter()->defaultValue = STRINGIFY(ACCESS_POINT_TIMEOUT); // Defined as number in config.h but stored as string in webconf.
Eric Duminil's avatar
Done    
Eric Duminil committed
186

Eric Duminil's avatar
Eric Duminil committed
187
    co2Params.addItem(&timestepParam);
Eric Duminil's avatar
Eric Duminil committed
188
    co2Params.addItem(&autoCalibrateParam);
Eric Duminil's avatar
Eric Duminil committed
189

Eric Duminil's avatar
Eric Duminil committed
190
    ledParams.addItem(&minBrightnessParam);
Eric Duminil's avatar
Eric Duminil committed
191
    ledParams.addItem(&maxBrightnessParam);
Eric Duminil's avatar
Eric Duminil committed
192
193
    ledParams.addItem(&ledCountParam);

Eric Duminil's avatar
Eric Duminil committed
194
    timeParams.addItem(&ntpServerParam);
195
196
197
    timeParams.addItem(&timeOffsetParam);
    timeParams.addItem(&dstParam);

198
    csvParams.addItem(&csvIntervalParam);
Eric Duminil's avatar
Eric Duminil committed
199

200
    mqttParams.addItem(&mqttIntervalParam);
Eric Duminil's avatar
Eric Duminil committed
201
202
203
204
    mqttParams.addItem(&mqttServerParam);
    mqttParams.addItem(&mqttPortParam);
    mqttParams.addItem(&mqttUserParam);
    mqttParams.addItem(&mqttPasswordParam);
205
    mqttParams.addItem(&mqttTopicPrefixParam);
Eric Duminil's avatar
Eric Duminil committed
206
207
    mqttParams.addItem(&mqttEncryptionParam);
    mqttParams.addItem(&mqttCommandsParam);
Eric Duminil's avatar
Eric Duminil committed
208

Eric Duminil's avatar
Eric Duminil committed
209
#if defined(ESP32)
210
    loraParams.addItem(&loraIntervalParam);
Eric Duminil's avatar
Eric Duminil committed
211
212
213
    loraParams.addItem(&deviceEUIParam);
    loraParams.addItem(&appEUIParam);
    loraParams.addItem(&appKeyParam);
Eric Duminil's avatar
Eric Duminil committed
214
#endif
215

Eric Duminil's avatar
Eric Duminil committed
216
    iotWebConf->addParameterGroup(&co2Params);
Eric Duminil's avatar
Eric Duminil committed
217
    iotWebConf->addParameterGroup(&ledParams);
218
    iotWebConf->addParameterGroup(&timeParams);
Eric Duminil's avatar
Eric Duminil committed
219
220
    iotWebConf->addParameterGroup(&csvParams);
    iotWebConf->addParameterGroup(&mqttParams);
Eric Duminil's avatar
Eric Duminil committed
221
#if defined(ESP32)
222
    iotWebConf->addParameterGroup(&loraParams);
Eric Duminil's avatar
Eric Duminil committed
223
#endif
224
  }
Eric Duminil's avatar
Eric Duminil committed
225

226
  void defineCommands() {
Eric Duminil's avatar
Eric Duminil committed
227
228
    sensor_console::defineCommand("save_config", config::save, F("(Saves the config to EEPROM)"));

Eric Duminil's avatar
Eric Duminil committed
229
230
    sensor_console::defineCommand("reset_config", []() {
      Serial.println(F("Resetting config..."));
Eric Duminil's avatar
Eric Duminil committed
231
      iotWebConf->getRootParameterGroup()->applyDefaultValue();
Eric Duminil's avatar
Eric Duminil committed
232
233
      iotWebConf->saveConfig();
      Serial.println(F("Done!"));
Eric Duminil's avatar
Eric Duminil committed
234
    }, F("(Resets the complete IotWeb config)"));
Eric Duminil's avatar
Eric Duminil committed
235

236
237
238
    sensor_console::defineStringCommand("ssid", [](char *ssid) {
      Serial.print(F("Setting WiFi ssid to "));
      Serial.println(ssid);
Eric Duminil's avatar
Eric Duminil committed
239
      strlcpy(iotWebConf->getWifiSsidParameter()->valueBuffer, ssid, iotWebConf->getWifiSsidParameter()->getLength());
240
      iotWebConf->saveConfig();
Eric Duminil's avatar
Eric Duminil committed
241
    },   F("name (Sets SSID to name)"));
242
243
244
245

    sensor_console::defineStringCommand("pwd", [](char *ssid) {
      Serial.print(F("Setting WiFi password to "));
      Serial.println(ssid);
Eric Duminil's avatar
Eric Duminil committed
246
      strlcpy(iotWebConf->getWifiPasswordParameter()->valueBuffer, ssid, iotWebConf->getWifiPasswordParameter()->getLength());
247
      iotWebConf->saveConfig();
Eric Duminil's avatar
Eric Duminil committed
248
    }, F("abc (Sets WiFi password to abc)"));
249

Eric Duminil's avatar
Eric Duminil committed
250
    sensor_console::defineIntCommand("wifi", [](int32_t onOff) {
Eric Duminil's avatar
Eric Duminil committed
251
      config::is_wifi_on = onOff;
Eric Duminil's avatar
Eric Duminil committed
252
253
254
      iotWebConf->saveConfig();
      Serial.print(F("WiFi - "));
      Serial.println(onOff ? F("On!") : F("Off!"));
Eric Duminil's avatar
Eric Duminil committed
255
    }, F("0/1 (Turns Wifi on/off)"));
256
257
258
259
260
261
262
263
264
  }

  void initialize() {
    iotWebConf = new IotWebConf(strlen(AMPEL_NAME) == 0 ? ampel.sensorId : AMPEL_NAME, &dnsServer, &http, "",
        config_version);

    defineStructure();

    defineCommands();
Eric Duminil's avatar
Eric Duminil committed
265

Eric Duminil's avatar
Eric Duminil committed
266
    iotWebConf->loadConfig();
Eric Duminil's avatar
Eric Duminil committed
267

Eric Duminil's avatar
Eric Duminil committed
268
    if (!config::is_wifi_on) {
Eric Duminil's avatar
Eric Duminil committed
269
270
271
      Serial.println(F("Wifi is off : no access point or connection. Use 'wifi 1' to turn on again!"));
      return;
    }
Eric Duminil's avatar
Eric Duminil committed
272

273
    //NOTE: Can only work if wifi is on.
Eric Duminil's avatar
ap 0/1    
Eric Duminil committed
274
275
276
277
278
279
280
281
282
    sensor_console::defineIntCommand("ap", [](int onOff) {
      if (onOff) {
        Serial.print(F("Enable "));
      } else {
        Serial.print(F("Disable "));
      }
      Serial.println(F("AP mode!"));
      iotWebConf->forceApMode(onOff);
    }, F("0/1 (Enables/disables access point)"));
283

284
285
286
287
288
289
290
291
292
    iotWebConf->setStateChangedCallback([](NetworkState in, NetworkState out){
      if (out == NetworkState::Connecting && _wifiConnectingCallback != nullptr){
        _wifiConnectingCallback();
      } else if (out == NetworkState::ApMode && _apModeCallback != nullptr){
        _apModeCallback();
      }
    });


Eric Duminil's avatar
Eric Duminil committed
293
    iotWebConf->setWifiConnectionTimeoutMs(1000UL * config::wifi_timeout);
294
295
296
297
298
299
300
301

    iotWebConf->skipApStartup();

    iotWebConf->init();

    http.on("/config", [] {
      iotWebConf->handleConfig();
    });
Eric Duminil's avatar
Eric Duminil committed
302

303
304
305
306
307
    http.onNotFound([]() {
      iotWebConf->handleNotFound();
    });
  }
}
Eric Duminil's avatar
Eric Duminil committed
308

Eric Duminil's avatar
Eric Duminil committed
309
310
311
/***
 * Define all the corresponding config values as reference, so that they can be updated.
 */
Eric Duminil's avatar
Eric Duminil committed
312
namespace config {
Eric Duminil's avatar
Eric Duminil committed
313

Eric Duminil's avatar
Eric Duminil committed
314
315
316
317
  char* ampel_name() {
    return web_config::iotWebConf->getThingName();
  }

Eric Duminil's avatar
Rename    
Eric Duminil committed
318
  char* selected_ssid() {
Eric Duminil's avatar
Eric Duminil committed
319
320
321
    return web_config::iotWebConf->getWifiSsidParameter()->valueBuffer;
  }

Eric Duminil's avatar
Eric Duminil committed
322
  char* ampel_password() {
Eric Duminil's avatar
Eric Duminil committed
323
324
325
    return web_config::iotWebConf->getApPasswordParameter()->valueBuffer;
  }

Eric Duminil's avatar
Eric Duminil committed
326
  // Sensor
Eric Duminil's avatar
Eric Duminil committed
327
  uint16_t &measurement_timestep = web_config::timestepParam.value(); // [s] Measurement happen every 4s anyway on S8. How often should the values be displayed?
328
329
  bool &auto_calibrate_sensor = web_config::autoCalibrateParam.value(); // [true / false]

Eric Duminil's avatar
Eric Duminil committed
330
  bool &is_wifi_on = web_config::ampelWifiParam.value();
Eric Duminil's avatar
Eric Duminil committed
331
  uint16_t &wifi_timeout = web_config::wifiTimeoutParam.value();
Eric Duminil's avatar
Eric Duminil committed
332
333
334
  void save() {
    web_config::iotWebConf->saveConfig();
  }
Eric Duminil's avatar
Eric Duminil committed
335

Eric Duminil's avatar
Eric Duminil committed
336
  // LEDs
337
338
339
  uint8_t &max_brightness = web_config::maxBrightnessParam.value();
  uint8_t &min_brightness = web_config::minBrightnessParam.value();
  uint16_t &led_count = web_config::ledCountParam.value();
Eric Duminil's avatar
Eric Duminil committed
340

Eric Duminil's avatar
Eric Duminil committed
341
342
  // Time server
  char *ntp_server = web_config::ntpServerParam.value();
Eric Duminil's avatar
Eric Duminil committed
343
  int16_t &time_zone = web_config::timeOffsetParam.value();
Eric Duminil's avatar
Eric Duminil committed
344
345
  bool &daylight_saving_time = web_config::dstParam.value();

Eric Duminil's avatar
Eric Duminil committed
346
  // CSV
Eric Duminil's avatar
Eric Duminil committed
347
  bool is_csv_active() {
348
349
    return web_config::csvParams.isActive();
  }
350
  uint16_t &csv_interval = web_config::csvIntervalParam.value();
Eric Duminil's avatar
Eric Duminil committed
351

352
  // MQTT
Eric Duminil's avatar
Eric Duminil committed
353
  bool is_mqtt_active() {
Eric Duminil's avatar
Eric Duminil committed
354
355
    return web_config::mqttParams.isActive();
  }
Eric Duminil's avatar
Eric Duminil committed
356
357
358
  char *mqtt_server = web_config::mqttServerParam.value();
  char *mqtt_user = web_config::mqttUserParam.value();
  char *mqtt_password = web_config::mqttPasswordParam.value();
359
  char *mqtt_topic_prefix = web_config::mqttTopicPrefixParam.value();
Eric Duminil's avatar
Eric Duminil committed
360
  uint16_t &mqtt_port = web_config::mqttPortParam.value();
361
  uint16_t &mqtt_sending_interval = web_config::mqttIntervalParam.value();
Eric Duminil's avatar
Eric Duminil committed
362
  bool &mqtt_encryption = web_config::mqttEncryptionParam.value();
Eric Duminil's avatar
Eric Duminil committed
363
  bool &allow_mqtt_commands = web_config::mqttCommandsParam.value();
Eric Duminil's avatar
Eric Duminil committed
364

365
// LORAWAN
Eric Duminil's avatar
Eric Duminil committed
366
#if defined(ESP32)
Eric Duminil's avatar
Eric Duminil committed
367
  bool is_lorawan_active() {
Eric Duminil's avatar
Eric Duminil committed
368
369
    return web_config::loraParams.isActive();
  }
370
  uint16_t &lorawan_sending_interval = web_config::loraIntervalParam.value();
Eric Duminil's avatar
Eric Duminil committed
371
372
373
  char *lorawan_device_eui = web_config::deviceEUIParam.value();
  char *lorawan_app_key = web_config::appKeyParam.value();
  char *lorawan_app_eui = web_config::appEUIParam.value();
Eric Duminil's avatar
Eric Duminil committed
374
#endif
Eric Duminil's avatar
Eric Duminil committed
375
}