Add Webserial (#444)

* Webserial

* Webserial
This commit is contained in:
iranl
2024-08-09 11:35:42 +02:00
committed by GitHub
parent 44b5f71b40
commit 43ac62a22d
86 changed files with 1846 additions and 1192 deletions

View File

@@ -3,7 +3,6 @@
#define MQTT_LOGGER_GLOBAL
#include "MqttLogger.h"
#include "WebSerial.h"
extern Print* Log;
#endif

View File

@@ -3838,4 +3838,9 @@ void NukiNetwork::disableMqtt()
_device->disableMqtt();
_mqttEnabled = false;
}
String NukiNetwork::localIP()
{
return _device->localIP();
}
#endif

View File

@@ -54,6 +54,7 @@ public:
#endif
void disableAutoRestarts(); // disable on OTA start
void disableMqtt();
String localIP();
void subscribe(const char* prefix, const char* path);
void initTopic(const char* prefix, const char* path, const char* value);

View File

@@ -14,6 +14,7 @@
#define preference_mqtt_user (char*)"mqttuser"
#define preference_mqtt_password (char*)"mqttpass"
#define preference_mqtt_log_enabled (char*)"mqttlog"
#define preference_webserial_enabled (char*)"weblog"
#define preference_webserver_enabled (char*)"websrvena"
#define preference_lock_enabled (char*)"lockena"
#define preference_lock_pin_status (char*)"lockpin"
@@ -251,7 +252,7 @@ private:
preference_official_hybrid, preference_query_interval_hybrid_lockstate, preference_official_hybrid_actions, preference_official_hybrid_retry, preference_has_mac_saved,
preference_has_mac_byte_0, preference_has_mac_byte_1, preference_has_mac_byte_2, preference_latest_version, preference_task_size_network, preference_task_size_nuki,
preference_authlog_max_entries, preference_keypad_max_entries, preference_timecontrol_max_entries, preference_update_from_mqtt, preference_show_secrets,
preference_ble_tx_power, preference_recon_netw_on_mqtt_discon
preference_ble_tx_power, preference_recon_netw_on_mqtt_discon, preference_webserial_enabled
};
std::vector<char*> _redact =
{
@@ -266,7 +267,7 @@ private:
preference_timecontrol_control_enabled, preference_timecontrol_info_enabled, preference_register_as_app, preference_register_opener_as_app, preference_ip_dhcp_enabled,
preference_publish_authdata, preference_has_mac_saved, preference_publish_debug_info, preference_network_wifi_fallback_disabled, preference_official_hybrid,
preference_official_hybrid_actions, preference_official_hybrid_retry, preference_conf_info_enabled, preference_disable_non_json, preference_update_from_mqtt,
preference_recon_netw_on_mqtt_discon
preference_recon_netw_on_mqtt_discon, preference_webserial_enabled
};
std::vector<char*> _bytePrefs =
{

View File

@@ -299,6 +299,10 @@ void WebCfgServer::initialize()
waitAndProcess(true, 1000);
restartEsp(RestartReason::ConfigurationUpdated);
});
_server.on("/webserial", [&]() {
_server.sendHeader("Location", (String)"http://" + _network->localIP() + ":81/webserial");
_server.send(302, "text/plain", "");
});
#endif
_server.on("/ota", [&]() {
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
@@ -1026,6 +1030,11 @@ bool WebCfgServer::processArgs(String& message)
_preferences->putBool(preference_mqtt_log_enabled, (value == "1"));
configChanged = true;
}
else if(key == "WEBLOG")
{
_preferences->putBool(preference_webserial_enabled, (value == "1"));
configChanged = true;
}
else if(key == "CHECKUPDATE")
{
_preferences->putBool(preference_check_updates, (value == "1"));
@@ -2061,6 +2070,11 @@ void WebCfgServer::buildHtml(String& response)
{
buildNavigationMenuEntry(response, "Advanced Configuration", "/advanced");
}
if(_preferences->getBool(preference_webserial_enabled, false))
{
buildNavigationMenuEntry(response, "Open Webserial", "/webserial");
}
if(_allowRestartToPortal)
{
@@ -2177,6 +2191,7 @@ void WebCfgServer::buildMqttConfigHtml(String &response)
printCheckBox(response, "RSTDISC", "Restart on disconnect", _preferences->getBool(preference_restart_on_disconnect), "");
printCheckBox(response, "RECNWTMQTTDIS", "Reconnect network on MQTT connection failure", _preferences->getBool(preference_recon_netw_on_mqtt_discon), "");
printCheckBox(response, "MQTTLOG", "Enable MQTT logging", _preferences->getBool(preference_mqtt_log_enabled), "");
printCheckBox(response, "WEBLOG", "Enable WebSerial logging", _preferences->getBool(preference_webserial_enabled), "");
printCheckBox(response, "CHECKUPDATE", "Check for Firmware Updates every 24h", _preferences->getBool(preference_check_updates), "");
printCheckBox(response, "UPDATEMQTT", "Allow updating using MQTT", _preferences->getBool(preference_update_from_mqtt), "");
printCheckBox(response, "DISNONJSON", "Disable some extraneous non-JSON topics", _preferences->getBool(preference_disable_non_json), "");

View File

@@ -22,6 +22,14 @@
#include "Logger.h"
#include "PreferencesKeys.h"
#include "RestartReason.h"
#include <AsyncTCP.h>
#include <DNSServer.h>
#include <ESPAsyncWebServer.h>
#include <WString.h>
#include <MycilaWebSerial.h>
AsyncWebServer webserialserver(81);
char log_print_buffer[1024];
NukiNetworkLock* networkLock = nullptr;
NukiNetworkOpener* networkOpener = nullptr;
@@ -64,17 +72,57 @@ RTC_NOINIT_ATTR bool rebuildGpioRequested;
RTC_NOINIT_ATTR uint64_t bootloopValidDetect;
RTC_NOINIT_ATTR int8_t bootloopCounter;
bool restartReason_isValid;
RestartReason currentRestartReason = RestartReason::NotApplicable;
TaskHandle_t otaTaskHandle = nullptr;
TaskHandle_t networkTaskHandle = nullptr;
#ifndef NUKI_HUB_UPDATER
ssize_t write_fn(void* cookie, const char* buf, ssize_t size)
{
Log->write((uint8_t *)buf, (size_t)size);
return size;
}
void ets_putc_handler(char c)
{
static char buf[1024];
static size_t buf_pos = 0;
buf[buf_pos] = c;
buf_pos++;
if (c == '\n' || buf_pos == sizeof(buf)) {
write_fn(NULL, buf, buf_pos);
buf_pos = 0;
}
}
int _log_vprintf(const char *fmt, va_list args) {
int ret = vsnprintf(log_print_buffer, sizeof(log_print_buffer), fmt, args);
if (ret >= 0){
Log->write((uint8_t *)log_print_buffer, (size_t)ret);
}
return 0; //return vprintf(fmt, args);
}
void setReroute(){
esp_log_set_vprintf(_log_vprintf);
if(preferences->getBool(preference_mqtt_log_enabled)) esp_log_level_set("*", ESP_LOG_INFO);
else
{
esp_log_level_set("*", ESP_LOG_DEBUG);
esp_log_level_set("nvs", ESP_LOG_INFO);
esp_log_level_set("wifi", ESP_LOG_INFO);
}
}
#endif
void networkTask(void *pvParameters)
{
int64_t networkLoopTs = 0;
bool secrets = preferences->getBool(preference_show_secrets);
bool reroute = true;
while(true)
{
@@ -92,15 +140,15 @@ void networkTask(void *pvParameters)
bool connected = network->update();
#ifndef NUKI_HUB_UPDATER
if(connected && openerEnabled)
#ifdef DEBUG_NUKIHUB
if(connected && reroute)
{
networkOpener->update();
}
if(preferences->getBool(preference_webserver_enabled, true))
{
webCfgServer->update();
reroute = false;
setReroute();
}
#endif
if(connected && openerEnabled) networkOpener->update();
if(preferences->getBool(preference_webserver_enabled, true)) webCfgServer->update();
#else
webCfgServer->update();
#endif
@@ -337,10 +385,9 @@ void initEthServer(const NetworkDeviceType device)
}
}
void setup()
{
esp_log_level_set("*", ESP_LOG_ERROR);
Serial.begin(115200);
Log = &Serial;
@@ -397,13 +444,13 @@ void setup()
bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0);
#if PRESENCE_DETECTION_ENABLED
#if PRESENCE_DETECTION_ENABLED
if(preferences->getInt(preference_presence_detection_timeout) >= 0)
{
presenceDetection = new PresenceDetection(preferences, bleScanner, CharBuffer::get(), buffer_size);
presenceDetection->initialize();
}
#endif
#endif
lockEnabled = preferences->getBool(preference_lock_enabled);
openerEnabled = preferences->getBool(preference_opener_enabled);
@@ -443,6 +490,12 @@ void setup()
webCfgServer = new WebCfgServer(nuki, nukiOpener, network, gpio, ethServer, preferences, network->networkDeviceType() == NetworkDeviceType::WiFi, partitionType);
webCfgServer->initialize();
}
WebSerial.setAuthentication(preferences->getString(preference_cred_user), preferences->getString(preference_cred_password));
WebSerial.begin(&webserialserver);
WebSerial.setBuffer(1024);
webserialserver.onNotFound([](AsyncWebServerRequest* request) { request->redirect("/webserial"); });
webserialserver.begin();
#endif
if((partitionType==1 && preferences->getString(preference_ota_updater_url).length() > 0) || (partitionType==2 && preferences->getString(preference_ota_main_url).length() > 0)) setupTasks(true);

View File

@@ -52,15 +52,21 @@ EthLan8720Device::EthLan8720Device(const String& hostname, Preferences* preferen
_mqttClient = new espMqttClient(espMqttClientTypes::UseInternalTask::NO);
}
if(preferences->getBool(preference_mqtt_log_enabled))
if(preferences->getBool(preference_mqtt_log_enabled, false) || preferences->getBool(preference_webserial_enabled, false))
{
MqttLoggerMode mode;
if(preferences->getBool(preference_mqtt_log_enabled, false) && preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::MqttAndSerialAndWeb;
else if (preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::SerialAndWeb;
else mode = MqttLoggerMode::MqttAndSerial;
_path = new char[200];
memset(_path, 0, sizeof(_path));
String pathStr = preferences->getString(preference_mqtt_lock_path);
pathStr.concat(mqtt_topic_log);
strcpy(_path, pathStr.c_str());
Log = new MqttLogger(*getMqttClient(), _path, MqttLoggerMode::MqttAndSerial);
Log = new MqttLogger(*getMqttClient(), _path, mode);
}
#endif
}

View File

@@ -65,14 +65,20 @@ void W5500Device::initialize()
}
#ifndef NUKI_HUB_UPDATER
if(_preferences->getBool(preference_mqtt_log_enabled))
if(_preferences->getBool(preference_mqtt_log_enabled, false) || _preferences->getBool(preference_webserial_enabled, false))
{
MqttLoggerMode mode;
if(_preferences->getBool(preference_mqtt_log_enabled, false) && _preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::MqttAndSerialAndWeb;
else if (_preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::SerialAndWeb;
else mode = MqttLoggerMode::MqttAndSerial;
String pathStr = _preferences->getString(preference_mqtt_lock_path);
pathStr.concat(mqtt_topic_log);
_path = new char[pathStr.length() + 1];
memset(_path, 0, sizeof(_path));
strcpy(_path, pathStr.c_str());
Log = new MqttLogger(*getMqttClient(), _path, MqttLoggerMode::MqttAndSerial);
Log = new MqttLogger(*getMqttClient(), _path, mode);
}
#endif

View File

@@ -46,15 +46,21 @@ WifiDevice::WifiDevice(const String& hostname, Preferences* preferences, const I
_mqttClient = new espMqttClient(espMqttClientTypes::UseInternalTask::NO);
}
if(preferences->getBool(preference_mqtt_log_enabled))
if(preferences->getBool(preference_mqtt_log_enabled, false) || preferences->getBool(preference_webserial_enabled, false))
{
MqttLoggerMode mode;
if(preferences->getBool(preference_mqtt_log_enabled, false) && preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::MqttAndSerialAndWeb;
else if (preferences->getBool(preference_webserial_enabled, false)) mode = MqttLoggerMode::SerialAndWeb;
else mode = MqttLoggerMode::MqttAndSerial;
_path = new char[200];
memset(_path, 0, sizeof(_path));
String pathStr = preferences->getString(preference_mqtt_lock_path);
pathStr.concat(mqtt_topic_log);
strcpy(_path, pathStr.c_str());
Log = new MqttLogger(*getMqttClient(), _path, MqttLoggerMode::MqttAndSerial);
Log = new MqttLogger(*getMqttClient(), _path, mode);
}
#endif
}