-
-
Notifications
You must be signed in to change notification settings - Fork 3
Configuration
Understanding how configuration and settings management works in ksIotFrameworkLib.
The framework provides a flexible configuration system that handles:
- WiFi credentials storage
- MQTT broker settings
- Application-specific parameters
- Persistent configuration across reboots
Configuration is stored in the device's file system (SPIFFS/LittleFS) and managed through provider components.
Configuration files are stored in the device's flash memory:
/ (LittleFS/SPIFFS root)
βββ config.json # Main configuration file
βββ (application files)
JSON format provides human-readable and editable configuration:
{
"wifi": {
"ssid": "MyNetwork",
"password": "wifi_password"
},
"mqtt": {
"broker": "192.168.1.100",
"port": 1883,
"username": "",
"password": "",
"client_id": "MyDevice"
}
}Base class for all configuration management.
Location: src/ksf/comp/ksConfigProvider.h
Key Methods:
// Load configuration from file
bool load()
// Save configuration to file
bool save()
// Get parameter value
String getParam(const char* key)
// Set parameter value
void setParam(const char* key, const char* value)
// Check if parameter exists
bool hasParam(const char* key)Usage Pattern:
class MyApp : public ksApplication {
protected:
bool init() override {
// Create config provider
addComponent<ksConfigProvider>();
return true;
}
bool postInit() override {
auto config = findComponent<ksConfigProvider>();
// Load existing config
if (config->load()) {
String value = config->getParam("mySetting");
}
return true;
}
};Manages WiFi network credentials.
Stored Parameters:
-
ssidβ WiFi network name -
passwordβ WiFi network password -
static_ipβ (optional) Static IP address -
static_gatewayβ (optional) Gateway address -
static_subnetβ (optional) Subnet mask
Configuration Methods:
Method 1: Via WiFi Configurator (Recommended)
// In config application
addComponent<ksWifiConfigurator>();
// Device creates AP
// User configures via web interface
// Credentials saved automaticallyMethod 2: Programmatically
auto wifiConfig = findComponent<ksWifiConfigProvider>();
wifiConfig->setParam("ssid", "MyNetwork");
wifiConfig->setParam("password", "SecurePassword");
wifiConfig->save();Method 3: Via Device Portal
1. Access Device Portal: http://device-ip
2. Navigate to WiFi settings
3. Enter credentials
4. Click Save
class MainApp : public ksApplication {
protected:
bool init() override {
auto wifiConfig = findComponent<ksWifiConfigProvider>();
// Check if configured
if (!wifiConfig->hasParam("ssid")) {
return false; // Go to config app
}
// Load credentials
wifiConfig->load();
// Add WiFi connector
addComponent<ksWifiConnector>("MyDevice");
return true;
}
};Manages MQTT broker connection settings.
Stored Parameters:
-
brokerβ MQTT broker address/IP -
portβ Broker port (default: 1883) -
usernameβ (optional) Authentication username -
passwordβ (optional) Authentication password -
client_idβ MQTT client identifier
Configuration Methods:
Method 1: Via Device Portal (Recommended)
1. Access Device Portal
2. Navigate to MQTT settings
3. Enter broker details
4. Click Save
5. Device reconnects with new settings
Method 2: Programmatically
auto mqttConfig = findComponent<ksMqttConfigProvider>();
mqttConfig->setParam("broker", "192.168.1.100");
mqttConfig->setParam("port", "1883");
mqttConfig->setParam("username", "device_user");
mqttConfig->setParam("password", "device_pass");
mqttConfig->save();Method 3: Application-Specific
bool init() override {
// Set default MQTT config
auto mqttConfig = addComponent<ksMqttConfigProvider>();
if (!mqttConfig->hasParam("broker")) {
mqttConfig->setParam("broker", "homeassistant.local");
mqttConfig->setParam("port", "1883");
mqttConfig->save();
}
return true;
}bool postInit() override {
auto mqttConfig = findComponent<ksMqttConfigProvider>();
if (mqttConfig->hasParam("broker")) {
mqttConfig->load();
// MQTT connector will use this config
addComponent<ksMqttConnector>();
}
return true;
}Create application-specific configuration:
class MyAppConfig : public ksConfigProvider
{
public:
// Application settings
String getSensorInterval() {
return getParam("sensor_interval");
}
void setSensorInterval(const String& interval) {
setParam("sensor_interval", interval.c_str());
}
bool getDebugMode() {
return getParam("debug_mode") == "true";
}
void setDebugMode(bool enabled) {
setParam("debug_mode", enabled ? "true" : "false");
}
// Load with defaults
bool loadWithDefaults() {
if (!load()) {
// Set defaults
setSensorInterval("5000");
setDebugMode(false);
save();
}
return true;
}
};Usage:
bool init() override {
auto config = addComponent<MyAppConfig>();
config->loadWithDefaults();
return true;
}
bool loop() override {
auto config = findComponent<MyAppConfig>();
unsigned long interval = config->getSensorInterval().toInt();
if (millis() - lastRead > interval) {
readSensor();
lastRead = millis();
}
return true;
}class ConfigurableApp : public ksApplication
{
protected:
bool init() override {
auto wifiConfig = findComponent<ksWifiConfigProvider>();
// Require WiFi config
if (!wifiConfig || !wifiConfig->hasParam("ssid")) {
return false; // Go to setup
}
wifiConfig->load();
addComponent<ksWifiConnector>("MyDevice");
return true;
}
};class MyApp : public ksApplication
{
protected:
bool init() override {
auto config = addComponent<MyAppConfig>();
// Load or create defaults
if (!config->load()) {
config->setParam("interval", "5000");
config->setParam("enabled", "true");
config->save();
}
return true;
}
};bool loop() override {
auto mqtt = findComponent<ksMqttConnector>();
mqtt->onMessage([this](auto topic, auto payload) {
if (strcmp(topic, "device/config") == 0) {
// Update configuration
auto config = findComponent<MyAppConfig>();
config->setParam("interval", payload);
config->save();
}
});
return true;
}What's Stored:
- WiFi passwords
- MQTT credentials
- API keys
Protection:
- File system on device (not in code)
- Never logged or transmitted
- Accessible only via local network
Best Practices:
// β Bad - Hardcoded credentials
String ssid = "MyNetwork";
String password = "password123";
// β
Good - From configuration
auto config = findComponent<ksWifiConfigProvider>();
String ssid = config->getParam("ssid");
String password = config->getParam("password");First Boot
β
βΌ
No Config File
β
βββΊ WiFi Configurator (AP mode)
β βββΊ User configures WiFi
β
βββΊ Device Portal
β βββΊ User configures MQTT
β
βΌ
Config Saved
β
βΌ
Device Reboots
β
βΌ
Config Loaded
β
βββΊ ksWifiConnector uses WiFi config
βββΊ ksMqttConnector uses MQTT config
β
βΌ
Normal Operation
Web-based configuration interface:
http://device-ip
βββΊ WiFi Configuration
βββΊ MQTT Configuration
βββΊ Application Settings
View configuration via serial output:
[ksWifiConfig] Loaded: SSID=MyNetwork
[ksMqttConfig] Loaded: Broker=192.168.1.100
Find device on network:
# On Linux/Mac
avahi-browse _http._tcp
# On Windows
# Device shows as "MyDevice.local"class IoTDevice : public ksApplication
{
protected:
bool init() override {
auto wifiConfig = addComponent<ksWifiConfigProvider>();
auto mqttConfig = addComponent<ksMqttConfigProvider>();
// Check configuration
if (!wifiConfig->hasParam("ssid") ||
!mqttConfig->hasParam("broker")) {
return false; // Go to config app
}
// Load configuration
wifiConfig->load();
mqttConfig->load();
// Add components with config
addComponent<ksWifiConnector>("IoTDevice");
addComponent<ksMqttConnector>();
addComponent<ksDevicePortal>();
addComponent<ksLed>(LED_BUILTIN);
return true;
}
};
class ConfigApp : public ksApplication
{
protected:
bool init() override {
// Configuration mode
addComponent<ksWifiConfigurator>();
addComponent<ksDevicePortal>();
addComponent<ksLed>(LED_BUILTIN);
return true;
}
bool loop() override {
auto wifiConfig = findComponent<ksWifiConfigProvider>();
// Check if configuration complete
if (wifiConfig->hasParam("ssid")) {
return false; // Back to main app
}
return true;
}
};class SensorApp : public ksApplication
{
protected:
bool init() override {
auto appConfig = addComponent<SensorAppConfig>();
// Load or create defaults
if (!appConfig->load()) {
appConfig->setParam("interval", "10000");
appConfig->setParam("enabled", "true");
appConfig->save();
}
addComponent<ksWifiConnector>("Sensor");
addComponent<ksMqttConnector>();
addComponent<ksDevStatMqttReporter>();
return true;
}
};// β Bad
addComponent<ksMqttConnector>();
mqtt->connect("192.168.1.100", 1883);// β Bad
config->setParam("value", "123");
// Forgot: config->save();// β Bad
config->load(); // Ignore result
String value = config->getParam("missing"); // Undefined- Components-Reference β Configuration provider components
- Device-Portal β Web-based configuration interface
- App-Rotator β Config application pattern
π€ This wiki is automatically generated and may contain errors.
Please report any issues here:
π https://github.com/cziter15/ksIotFrameworkLib/issues