Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ It's an alternative to the original HmIP-FALMOT-C12 hardware.
My intention was to create a cheap solution to operate my 18 valves (floor heating + radiators).
I wanted a pure offline system (no cloud connection) and to be free of the constraint to use further components like CCU2/CCU3.

**Hardware for VdMot_Controller is available at Tindie: https://www.tindie.com/products/lenti/vdmot_controller/**
**Hardware for VdMot_Controller is available via mail. Please write to vdmot@storbecknet.de. **

![-](./hardware/c2-sample_pcb_soldered.jpg "C2 sample PCB with soldered components")

Expand Down Expand Up @@ -69,5 +69,8 @@ For details please see [software.md](./software.md)
Latest Software can be found here :
https://github.com/SurfGargano/VdMot_Controller/releases/latest

Hardware can be found here:
**Hardware for VdMot_Controller is available via mail. Please write to vdmot@storbecknet.de. **

## License
This project is licensed under the terms of the GNU General Public License v3.0 license.
Binary file added releases/WTH32/1.4.12_Dev/ESP32_firmware.bin
Binary file not shown.
12 changes: 12 additions & 0 deletions software_esp32/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@ All notable changes to this project will be documented in this file.

## [Unreleased] - Development

## [1.4.12]
### Added
- Webui : Show wifi ssid scan
additional input for timeout to reset if network reconnect failed
refactoring and change layout of buttons
dock-menu (drag-n-drop)
- Network : wifi ssid scan added
### Fixed
- network : reconnect network if dhcp server is not working at reset from vdmot
timeout for reset if network reconnect failed (power on behaviour)
- update WTH : reset delay after update to show website correct (seen with wifi connection)

## [1.4.10]
### Added
- Webui : Show information if stm failed
Expand Down
2 changes: 2 additions & 0 deletions software_esp32/include/VdmConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ typedef struct {
uint8_t syslogLevel;
uint32_t syslogIp;
uint32_t syslogPort;
uint8_t timeOutNetConnection;
} VDM_NETWORK_CONFIG;

typedef struct {
Expand Down Expand Up @@ -299,6 +300,7 @@ typedef struct {
#define nvsNetSysLogEnable "syslogEnable"
#define nvsNetSysLogIp "sysLogIp"
#define nvsNetSysLogPort "sysLogPort"
#define nvsNetConnectionTO "netConnTO"

#define nvsTZCfg "tZCfg"
#define nvsTZ "tZ"
Expand Down
26 changes: 19 additions & 7 deletions software_esp32/include/VdmNet.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@
#define currentInterfaceIsEth 0
#define currentInterfaceIsWifi 1

#define ssidDefaultString "{}" //"{\"scanSSID\":[]}";


enum TWifiState {wifiIdle,wifiIsStarting,wifiConnected,wifiDisabled};
enum TEthState {ethIdle,ethIsStarting,ethConnected,ethDisabled};

enum TWifiState {wifiIdle,wifiConfig,wifiIsStarting,wifiStarted,wifiIsRunning,wifiDisabled};
enum TEthState {ethIdle,ethBegin,ethConfig,ethIsStarting,ethStarted,ethIsRunning,ethDisabled};
enum TWifiScanState {wifiScanIdle,wifiScanStarted,wifiScanWaitForScanFinished,wifiScanFinished};

typedef struct {
uint8_t interfaceType;
Expand All @@ -98,25 +98,37 @@ class CVdmNet
void setup();
void setupEth();
void setupWifi();
void getWifi(int16_t thisNoOfNetworks);
void scanWifiTask();
void setupNtp();
void checkNet();
void checkWifi();
void checkNetConnected();
void reconnect();
void startBroker();
void mqttBroker();
void startSysLog();
void configTzTime(const char* tz, const char* server1, const char* server2=NULL, const char* server3=NULL);
bool checkSntpReachable();

TWifiState wifiState;
TEthState ethState;
TWifiState wifiState = wifiIdle;
TEthState ethState = ethIdle;
TWifiScanState wifiScanState = wifiScanIdle;
uint8_t scanRepeatWifi=0;
VDM_NETWORK_INFO networkInfo;
bool serverIsStarted;
bool dataBrokerIsStarted;
struct tm startTimeinfo;
bool syslogStarted;
bool sntpActive;
bool sntpReachable;
String netWorksSSID=ssidDefaultString;
private :
uint8_t checkIPCounter=0;
uint8_t wifiResetCounter=0;
uint8_t checkETHCounter=0;
uint8_t ethResetCounter=0;
uint8_t checkScanWifi=0;
int16_t noOfNetworks;
};

extern CVdmNet VdmNet;
Expand Down
4 changes: 3 additions & 1 deletion software_esp32/include/VdmTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,11 @@ class CVdmTask
public:
CVdmTask();
void init();
void deleteTask(taskid_t taskId);
void deleteTask(taskid_t* taskId);
void disOrEnableTask (taskid_t taskId,bool enabled);
bool taskExists (taskid_t taskId);
void yieldTask (uint16_t ms);
void startScanWifi();
void startMqtt(uint32_t interval);
void startApp();
void startStm32Ota(uint8_t command,String thisFileName);
Expand All @@ -70,6 +71,7 @@ class CVdmTask
void startGetFS();

taskid_t taskIdCheckNet;
taskid_t taskIdScanWiFi;
taskid_t taskIdMqtt;
taskid_t taskIdApp;
taskid_t taskIdStm32Ota;
Expand Down
4 changes: 2 additions & 2 deletions software_esp32/include/compile_time.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,12 @@

#define __TIME_UNIX__ ((__TIME_YEARS__-UNIX_START_YEAR)*SEC_PER_YEAR+ \
GET_LEAP_DAYS*SEC_PER_DAY+ \
SEC_PER_DAY+ \
GET_MONTH2DAYS(__TIME_MONTH__)*SEC_PER_DAY+ \
__TIME_DAYS__*SEC_PER_DAY-SEC_PER_DAY+ \
__TIME_HOURS__*SEC_PER_HOUR+ \
__TIME_MINUTES__*SEC_PER_MIN+ \
__TIME_SECONDS__)

/* SEC_PER_DAY+ \*/
#endif /* COMPILE_TIME_H_ */


1 change: 1 addition & 0 deletions software_esp32/include/mqtt.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ typedef struct {
uint32_t closeCount;
int32_t deadzoneCount;
uint32_t movements;
bool tTargetMqttReceived;
} LASTVALVEVALUES;

typedef struct {
Expand Down
1 change: 1 addition & 0 deletions software_esp32/include/web.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class CWeb
String getVoltsStatus(VDM_VOLTS_CONFIG voltsConfig);
String getNetInfo(VDM_NETWORK_INFO networkInfo);
String getNetConfig (VDM_NETWORK_CONFIG netConfig);
String getSSIDInfo();
String getProtConfig (VDM_PROTOCOL_CONFIG protConfig);
String getValvesConfig (VDM_VALVES_CONFIG valvesConfig);
String getMotorConfig (MOTOR_CHARS motorConfig);
Expand Down
7 changes: 4 additions & 3 deletions software_esp32/platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
; https://docs.platformio.org/page/projectconf.html

[common]
firmware_version = '"1.4.10"'
firmware_version_dev = '"1.4.10_Dev"'
firmware_version = '"1.4.12"'
firmware_version_dev = '"1.4.12_Dev"'
minFirmwareSTMRequired = '"1.4.0"'

[env]
Expand Down Expand Up @@ -45,7 +45,8 @@ build_flags =
-O2
-DFIRMWARE_VERSION=${common.firmware_version_dev}
-DFIRMWARE_BUILD
-DnetDebug
;-DnetDebug
;-DnetDebugWIFI
-DOTADebug
;-DAppDebug
;-DnetUseMDNS
Expand Down
6 changes: 4 additions & 2 deletions software_esp32/src/PushOver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
#include <map>
#include "globals.h"
#include "VdmTask.h"


/*
const char *PUSHOVER_ROOT_CA = "-----BEGIN CERTIFICATE-----\n"
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"
Expand Down Expand Up @@ -152,7 +154,7 @@ int CPushover::send(CPushoverMessage newMessage)
beginResult = myClient.begin(client,PUSHOVER_API_URL);
myClient.addHeader("Content-Type", "application/json");
myClient.addHeader("Connection","close");
StaticJsonDocument<512> doc;
DynamicJsonDocument doc(1024);
std::map<const char *, const char *>::iterator it = messageData.begin();
while(it!=messageData.end()){
doc[it->first] = it->second;
Expand All @@ -166,7 +168,7 @@ int CPushover::send(CPushoverMessage newMessage)
}
responseCode = myClient.POST(postmessage);
myClient.end();

doc.clear();
return responseCode;
}

Expand Down
25 changes: 23 additions & 2 deletions software_esp32/src/ServerServices.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,21 @@ void mqttReconnect (JsonObject doc)
Mqtt.disconnect();
}

void scanWifi (JsonObject doc)
{
#ifdef netDebugWIFI
UART_DBG.println("server servíces cmd : scan wifi "+String(VdmTask.taskIdScanWiFi));
#endif
VdmNet.wifiScanState = wifiScanIdle;
VdmNet.scanRepeatWifi = 0;
if (VdmTask.taskIdScanWiFi==TASKMGR_INVALIDID) {
#ifdef netDebugWIFI
UART_DBG.println("server servíces cmd : Start scan wifi task");
#endif
VdmTask.startScanWifi();
}
}

void sysLogSave (JsonObject doc)
{
VdmConfig.writeSysLogValues();
Expand Down Expand Up @@ -327,6 +342,11 @@ void handleNetInfo(AsyncWebServerRequest *request)
request->send(200,aj,Web.getNetInfo(VdmNet.networkInfo));
}

void handleSSIDInfo(AsyncWebServerRequest *request)
{
request->send(200,aj,Web.getSSIDInfo());
}

void handleNetConfig(AsyncWebServerRequest *request)
{
request->send(200,aj,Web.getNetConfig(VdmConfig.configFlash.netConfig));
Expand Down Expand Up @@ -413,10 +433,10 @@ bool handleCmd(JsonObject doc)
{
typedef void (*fp)(JsonObject doc);
fp fpList[] = {&restart,&writeConfig,&resetConfig,&restoreConfig,&fileDelete,&setGetFS,
&setClearFS,&scanTSensors,&valvesCalibration,&valvesAssembly,&valvesDetect,&writeValvesControl,&mqttReconnect,&sysLogSave,&discoveryHA} ;
&setClearFS,&scanTSensors,&valvesCalibration,&valvesAssembly,&valvesDetect,&writeValvesControl,&mqttReconnect,&sysLogSave,&discoveryHA,&scanWifi} ;

char const *names[]= {"reboot", "saveCfg","resetCfg","restoreCfg","fDelete","getFS",
"clearFS","scanTempSensors","vCalib","vAssembly","valvesDetect","vCtrlSave","mqttReconnect","sysLogSave","discoveryHA",NULL};
"clearFS","scanTempSensors","vCalib","vAssembly","valvesDetect","vCtrlSave","mqttReconnect","sysLogSave","discoveryHA","scanWifi",NULL};
char const **p;
bool found = false;

Expand Down Expand Up @@ -502,6 +522,7 @@ void CServerServices::initServer()
server.on("/temps",HTTP_GET,[](AsyncWebServerRequest * request) {handleTemps(request);});
server.on("/volts",HTTP_GET,[](AsyncWebServerRequest * request) {handleVolts(request);});
server.on("/netinfo",HTTP_GET,[](AsyncWebServerRequest * request) {handleNetInfo(request);});
server.on("/ssidinfo",HTTP_GET,[](AsyncWebServerRequest * request) {handleSSIDInfo(request);});
server.on("/netconfig",HTTP_GET,[](AsyncWebServerRequest * request) {handleNetConfig(request);});
server.on("/protconfig",HTTP_GET,[](AsyncWebServerRequest * request) {handleProtConfig(request);});
server.on("/valvesconfig",HTTP_GET,[](AsyncWebServerRequest * request) {handleValvesConfig(request);});
Expand Down
17 changes: 8 additions & 9 deletions software_esp32/src/Services.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,14 @@ void CServices::checkGetNtp()
#ifdef EnvDevelop
UART_DBG.println("checkGetNtp : "+String(VdmNet.sntpReachable));
#endif
if (VdmNet.sntpReachable) {
if (VdmSystem.getLocalTime(&VdmNet.startTimeinfo)) {
if ((VdmNet.startTimeinfo.tm_hour==getNtpHour) && (VdmNet.startTimeinfo.tm_min==getNtpMin)) {
VdmNet.setupNtp();
}

if (VdmSystem.getLocalTime(&VdmNet.startTimeinfo)) {
if ((VdmNet.startTimeinfo.tm_hour==getNtpHour) && (VdmNet.startTimeinfo.tm_min==getNtpMin)) {
if (!VdmNet.sntpReachable) VdmNet.reconnect();
VdmNet.setupNtp();
}
}
else
{
if (!VdmNet.sntpReachable) {
VdmNet.setupNtp();
}
}
Expand All @@ -155,7 +154,7 @@ void CServices::servicesLoop()
{
checkServiceValves();
checkGetNtp();
VdmNet.checkWifi();
VdmNet.checkNetConnected();
checkDS18();
}

Expand Down Expand Up @@ -227,7 +226,7 @@ void CServices::restartSystem(bool waitQueueFinished) {
VdmTask.taskIdResetSystem = taskManager.scheduleOnce(3000, [] {
ESP.restart();
});
VdmTask.deleteTask(VdmTask.taskIdwaitForFinishQueue);
VdmTask.deleteTask(&VdmTask.taskIdwaitForFinishQueue);
}
});
} else {
Expand Down
4 changes: 4 additions & 0 deletions software_esp32/src/VdmConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ void CVdmConfig::setDefault()
memset (configFlash.netConfig.userPwd,0,sizeof(configFlash.netConfig.userPwd));
memset (configFlash.timeZoneConfig.tz,0,sizeof(configFlash.timeZoneConfig.tz));
memset (configFlash.timeZoneConfig.tzCode,0,sizeof(configFlash.timeZoneConfig.tzCode));
configFlash.netConfig.timeOutNetConnection=5;
clearConfig();
}

Expand Down Expand Up @@ -212,6 +213,7 @@ void CVdmConfig::readConfig()
prefs.getString(nvsNetSsid,(char*) configFlash.netConfig.ssid,sizeof(configFlash.netConfig.ssid));
if (prefs.isKey(nvsNetPwd))
prefs.getString(nvsNetPwd,(char*) configFlash.netConfig.pwd,sizeof(configFlash.netConfig.pwd));
configFlash.netConfig.timeOutNetConnection=prefs.getUShort(nvsNetConnectionTO,5);
if (prefs.isKey(nvsNetUserName))
prefs.getString(nvsNetUserName,(char*) configFlash.netConfig.userName,sizeof(configFlash.netConfig.userName));
if (prefs.isKey(nvsNetUserPwd))
Expand Down Expand Up @@ -357,6 +359,7 @@ void CVdmConfig::writeConfig(bool reboot)
prefs.putUChar(nvsNetSysLogEnable,configFlash.netConfig.syslogLevel);
prefs.putULong(nvsNetSysLogIp,configFlash.netConfig.syslogIp);
prefs.putUShort(nvsNetSysLogPort,configFlash.netConfig.syslogPort);
prefs.putUShort(nvsNetConnectionTO,configFlash.netConfig.timeOutNetConnection);
prefs.end();

prefs.begin(nvsProtCfg,false);
Expand Down Expand Up @@ -483,6 +486,7 @@ void CVdmConfig::postNetCfg (JsonObject doc)
if (!doc["dns"].isNull()) configFlash.netConfig.dnsIp=doc2IPAddress(doc["dns"]);
if (!doc["ssid"].isNull()) strncpy(configFlash.netConfig.ssid,doc["ssid"].as<const char*>(),sizeof(configFlash.netConfig.ssid));
if (!doc["pwd"].isNull()) strncpy(configFlash.netConfig.pwd,doc["pwd"].as<const char*>(),sizeof(configFlash.netConfig.pwd));
if (!doc["netCT"].isNull()) configFlash.netConfig.timeOutNetConnection=doc["netCT"];
if (!doc["userName"].isNull()) strncpy(configFlash.netConfig.userName,doc["userName"].as<const char*>(),sizeof(configFlash.netConfig.userName));
if (!doc["userPwd"].isNull()) strncpy(configFlash.netConfig.userPwd,doc["userPwd"].as<const char*>(),sizeof(configFlash.netConfig.userPwd));
if (!doc["timeServer"].isNull()) strncpy(configFlash.netConfig.timeServer,doc["timeServer"].as<const char*>(),sizeof(configFlash.netConfig.timeServer));
Expand Down
Loading