Browse Source

* improved mqtt settings

pull/157/head
lumapu 2 years ago
parent
commit
f1b19bccfe
  1. 31
      tools/esp8266/app.cpp
  2. 34
      tools/esp8266/app.h
  3. 38
      tools/esp8266/defines.h
  4. 59
      tools/esp8266/mqtt.h

31
tools/esp8266/app.cpp

@ -240,21 +240,14 @@ void app::setup(uint32_t timeout) {
// TODO set ntpAddr & ntpPort in main // TODO set ntpAddr & ntpPort in main
// mqtt // mqtt
uint16_t mqttPort; mEep->read(ADDR_MQTT_ADDR, config.mqtt.broker, MQTT_ADDR_LEN);
char mqttAddr[MQTT_ADDR_LEN]; mEep->read(ADDR_MQTT_USER, config.mqtt.user, MQTT_USER_LEN);
char mqttUser[MQTT_USER_LEN]; mEep->read(ADDR_MQTT_PWD, config.mqtt.pwd, MQTT_PWD_LEN);
char mqttPwd[MQTT_PWD_LEN]; mEep->read(ADDR_MQTT_TOPIC, config.mqtt.topic, MQTT_TOPIC_LEN);
char mqttTopic[MQTT_TOPIC_LEN]; mEep->read(ADDR_MQTT_PORT, &config.mqtt.port);
char mqttDevName[DEVNAME_LEN];
mEep->read(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN);
mEep->read(ADDR_MQTT_USER, mqttUser, MQTT_USER_LEN);
mEep->read(ADDR_MQTT_PWD, mqttPwd, MQTT_PWD_LEN);
mEep->read(ADDR_MQTT_TOPIC, mqttTopic, MQTT_TOPIC_LEN);
mEep->read(ADDR_DEVNAME, mqttDevName, DEVNAME_LEN);
//mEep->read(ADDR_MQTT_INTERVAL, &mMqttInterval); //mEep->read(ADDR_MQTT_INTERVAL, &mMqttInterval);
mEep->read(ADDR_MQTT_PORT, &mqttPort);
if(mqttAddr[0] > 0) { if(config.mqtt.broker[0] > 0) {
mMqttActive = true; mMqttActive = true;
if(mMqttInterval < MIN_MQTT_INTERVAL) if(mMqttInterval < MIN_MQTT_INTERVAL)
mMqttInterval = MIN_MQTT_INTERVAL; mMqttInterval = MIN_MQTT_INTERVAL;
@ -262,10 +255,10 @@ void app::setup(uint32_t timeout) {
else else
mMqttInterval = 0xffff; mMqttInterval = 0xffff;
if(0 == mqttPort) if(0 == config.mqtt.port)
mqttPort = 1883; config.mqtt.port = 1883;
mMqtt.setup(mqttAddr, mqttTopic, mqttUser, mqttPwd, mqttDevName, mqttPort); mMqtt.setup(&config.mqtt, config.deviceName);
mMqtt.setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); mMqtt.setCallback(std::bind(&app::cbMqtt, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
mMqttTicker = 0; mMqttTicker = 0;
@ -275,9 +268,9 @@ void app::setup(uint32_t timeout) {
#endif #endif
mSerialTicker = 0; mSerialTicker = 0;
if(mqttAddr[0] > 0) { if(config.mqtt.broker[0] > 0) {
char topic[30]; char topic[30];
mMqtt.sendMsg("device", mqttDevName); mMqtt.sendMsg("device", config.deviceName);
mMqtt.sendMsg("version", config.version); mMqtt.sendMsg("version", config.version);
for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) {
iv = mSys->getInverterByPos(i); iv = mSys->getInverterByPos(i);
@ -1109,7 +1102,7 @@ void app::sendMqttDiscoveryConfig(void) {
} else { } else {
snprintf(name, 32, "%s CH%d %s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); snprintf(name, 32, "%s CH%d %s", iv->name, iv->assign[i].ch, iv->getFieldName(i));
} }
snprintf(stateTopic, 64, "%s/%s/ch%d/%s", mMqtt.getTopic(), iv->name, iv->assign[i].ch, iv->getFieldName(i)); snprintf(stateTopic, 64, "%s/%s/ch%d/%s", config.mqtt.topic, iv->name, iv->assign[i].ch, iv->getFieldName(i));
snprintf(discoveryTopic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->name, iv->assign[i].ch, iv->getFieldName(i)); snprintf(discoveryTopic, 64, "%s/sensor/%s/ch%d_%s/config", MQTT_DISCOVERY_PREFIX, iv->name, iv->assign[i].ch, iv->getFieldName(i));
snprintf(uniq_id, 32, "ch%d_%s", iv->assign[i].ch, iv->getFieldName(i)); snprintf(uniq_id, 32, "ch%d_%s", iv->assign[i].ch, iv->getFieldName(i));
const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId); const char* devCls = getFieldDeviceClass(iv->assign[i].fieldId);

34
tools/esp8266/app.h

@ -68,40 +68,6 @@ const byte mDnsPort = 53;
#define NTP_PACKET_SIZE 48 #define NTP_PACKET_SIZE 48
#define TIMEZONE 1 // Central European time +1 #define TIMEZONE 1 // Central European time +1
typedef struct {
char broker[MQTT_ADDR_LEN];
uint16_t port;
char user[MQTT_USER_LEN];
char pwd[MQTT_PWD_LEN];
char topic[MQTT_TOPIC_LEN];
char devName[DEVNAME_LEN];
} mqttConfig_t;
typedef struct {
char version[12];
char deviceName[DEVNAME_LEN];
// wifi
char stationSsid[SSID_LEN];
char stationPwd[PWD_LEN];
bool apActive;
// nrf24
uint16_t sendInterval;
uint8_t maxRetransPerPyld;
// ntp
char ntpAddr[NTP_ADDR_LEN];
uint16_t ntpPort;
// mqtt
mqttConfig_t mqtt;
// serial
uint16_t serialInterval;
bool serialShowIv;
bool serialDebug;
} config_t;
#define SAVE_SSID 0x00000001 #define SAVE_SSID 0x00000001

38
tools/esp8266/defines.h

@ -24,6 +24,7 @@
#define VERSION_PATCH 10 #define VERSION_PATCH 10
//------------------------------------- //-------------------------------------
typedef struct { typedef struct {
uint8_t rxCh; uint8_t rxCh;
@ -157,4 +158,41 @@ typedef enum {
#pragma error "Configure less inverters? (MAX_NUM_INVERTERS=" + MAX_NUM_INVERTERS +")" #pragma error "Configure less inverters? (MAX_NUM_INVERTERS=" + MAX_NUM_INVERTERS +")"
#endif #endif
//-------------------------------------
typedef struct {
char broker[MQTT_ADDR_LEN];
uint16_t port;
char user[MQTT_USER_LEN];
char pwd[MQTT_PWD_LEN];
char topic[MQTT_TOPIC_LEN];
} mqttConfig_t;
typedef struct {
char version[12];
char deviceName[DEVNAME_LEN];
// wifi
char stationSsid[SSID_LEN];
char stationPwd[PWD_LEN];
bool apActive;
// nrf24
uint16_t sendInterval;
uint8_t maxRetransPerPyld;
// ntp
char ntpAddr[NTP_ADDR_LEN];
uint16_t ntpPort;
// mqtt
mqttConfig_t mqtt;
// serial
uint16_t serialInterval;
bool serialShowIv;
bool serialDebug;
} config_t;
#endif /*__DEFINES_H__*/ #endif /*__DEFINES_H__*/

59
tools/esp8266/mqtt.h

@ -16,27 +16,19 @@ class mqtt {
mClient = new PubSubClient(mEspClient); mClient = new PubSubClient(mEspClient);
mAddressSet = false; mAddressSet = false;
memset(mBroker, 0, MQTT_ADDR_LEN);
memset(mUser, 0, MQTT_USER_LEN);
memset(mPwd, 0, MQTT_PWD_LEN);
memset(mTopic, 0, MQTT_TOPIC_LEN);
memset(mDevName, 0, DEVNAME_LEN); memset(mDevName, 0, DEVNAME_LEN);
} }
~mqtt() { } ~mqtt() { }
void setup(const char *broker, const char *topic, const char *user, const char *pwd, const char *devname, uint16_t port) { void setup(mqttConfig_t *cfg, const char *devname) {
DPRINTLN(DBG_VERBOSE, F("mqtt.h:setup")); DPRINTLN(DBG_VERBOSE, F("mqtt.h:setup"));
mAddressSet = true; mAddressSet = true;
mPort = port; mCfg = cfg;
snprintf(mBroker, MQTT_ADDR_LEN, "%s", broker);
snprintf(mUser, MQTT_USER_LEN, "%s", user);
snprintf(mPwd, MQTT_PWD_LEN, "%s", pwd);
snprintf(mTopic, MQTT_TOPIC_LEN, "%s", topic);
snprintf(mDevName, DEVNAME_LEN, "%s", devname); snprintf(mDevName, DEVNAME_LEN, "%s", devname);
mClient->setServer(mBroker, mPort); mClient->setServer(mCfg->broker, mCfg->port);
mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); mClient->setBufferSize(MQTT_MAX_PACKET_SIZE);
} }
@ -47,7 +39,7 @@ class mqtt {
void sendMsg(const char *topic, const char *msg) { void sendMsg(const char *topic, const char *msg) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:sendMsg")); //DPRINTLN(DBG_VERBOSE, F("mqtt.h:sendMsg"));
char top[64]; char top[64];
snprintf(top, 64, "%s/%s", mTopic, topic); snprintf(top, 64, "%s/%s", mCfg->topic, topic);
sendMsg2(top, msg, false); sendMsg2(top, msg, false);
} }
@ -67,35 +59,6 @@ class mqtt {
return mClient->connected(); return mClient->connected();
} }
char *getBroker(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getBroker"));
return mBroker;
}
char *getUser(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getUser"));
return mUser;
}
char *getPwd(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getPwd"));
return mPwd;
}
char *getTopic(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getTopic"));
return mTopic;
}
char *getDevName(void) {
//DPRINTLN(DBG_VERBOSE, F("mqtt.h:getDevName"));
return mDevName;
}
uint16_t getPort(void) {
return mPort;
}
void loop() { void loop() {
//DPRINT(F("m")); //DPRINT(F("m"));
if(!mClient->connected()) if(!mClient->connected())
@ -112,17 +75,17 @@ class mqtt {
if(strlen(mDevName) > 0) { if(strlen(mDevName) > 0) {
// der Server und der Port müssen neu gesetzt werden, // der Server und der Port müssen neu gesetzt werden,
// da ein MQTT_CONNECTION_LOST -3 die Werte zerstört hat. // da ein MQTT_CONNECTION_LOST -3 die Werte zerstört hat.
mClient->setServer(mBroker, mPort); mClient->setServer(mCfg->broker, mCfg->port);
mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); mClient->setBufferSize(MQTT_MAX_PACKET_SIZE);
if((strlen(mUser) > 0) && (strlen(mPwd) > 0)) if((strlen(mCfg->user) > 0) && (strlen(mCfg->pwd) > 0))
mClient->connect(mDevName, mUser, mPwd); mClient->connect(mDevName, mCfg->user, mCfg->pwd);
else else
mClient->connect(mDevName); mClient->connect(mDevName);
} }
// ein Subscribe ist nur nach einem connect notwendig // ein Subscribe ist nur nach einem connect notwendig
char topic[MQTT_TOPIC_LEN + 13 ]; // "/devcontrol/#" --> + 6 byte char topic[MQTT_TOPIC_LEN + 13 ]; // "/devcontrol/#" --> + 6 byte
// ToDo: "/devcontrol/#" is hardcoded // ToDo: "/devcontrol/#" is hardcoded
snprintf(topic, MQTT_TOPIC_LEN + 13, "%s/devcontrol/#", mTopic); snprintf(topic, MQTT_TOPIC_LEN + 13, "%s/devcontrol/#", mCfg->topic);
DPRINTLN(DBG_INFO, F("subscribe to ") + String(topic)); DPRINTLN(DBG_INFO, F("subscribe to ") + String(topic));
mClient->subscribe(topic); // subscribe to mTopic + "/devcontrol/#" mClient->subscribe(topic); // subscribe to mTopic + "/devcontrol/#"
} }
@ -132,11 +95,7 @@ class mqtt {
PubSubClient *mClient; PubSubClient *mClient;
bool mAddressSet; bool mAddressSet;
uint16_t mPort; mqttConfig_t *mCfg;
char mBroker[MQTT_ADDR_LEN];
char mUser[MQTT_USER_LEN];
char mPwd[MQTT_PWD_LEN];
char mTopic[MQTT_TOPIC_LEN];
char mDevName[DEVNAME_LEN]; char mDevName[DEVNAME_LEN];
}; };

Loading…
Cancel
Save