diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index c1c3d78c..ebf5142d 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -124,17 +124,19 @@ void app::setup(uint32_t timeout) { // mqtt - char mqttAddr[MQTT_ADDR_LEN]; uint16_t mqttPort; + char mqttAddr[MQTT_ADDR_LEN]; char mqttUser[MQTT_USER_LEN]; char mqttPwd[MQTT_PWD_LEN]; char mqttTopic[MQTT_TOPIC_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); + 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_PORT, &mqttPort); + mEep->read(ADDR_MQTT_PORT, &mqttPort); if(mqttAddr[0] > 0) { mMqttActive = true; @@ -147,13 +149,14 @@ void app::setup(uint32_t timeout) { if(0 == mqttPort) mqttPort = 1883; - mMqtt.setup(mqttAddr, mqttTopic, mqttUser, mqttPwd, mqttPort); + mMqtt.setup(mqttAddr, mqttTopic, mqttUser, mqttPwd, mqttDevName, mqttPort); mMqttTicker = 0; mSerialTicker = 0; if(mqttAddr[0] > 0) { char topic[30]; + mMqtt.sendMsg("device", mqttDevName); mMqtt.sendMsg("version", mVersion); for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { iv = mSys->getInverterByPos(i); @@ -209,9 +212,9 @@ void app::loop(void) { yield(); if(checkTicker(&mRxTicker, 5)) { - DPRINTLN(DBG_DEBUG, F("app_loops =") + String(app_loops)); + //DPRINTLN(DBG_VERBOSE, F("app_loops =") + String(app_loops)); app_loops=0; - DPRINT(DBG_DEBUG, F("a")); + DPRINT(DBG_VERBOSE, F("a")); bool rxRdy = mSys->Radio.switchRxCh(); @@ -222,7 +225,8 @@ void app::loop(void) { if(mSys->Radio.checkPaketCrc(p->packet, &len, p->rxCh)) { // process buffer only on first occurrence if(mSerialDebug) { - DPRINT(DBG_DEBUG, "Received " + String(len) + " bytes channel " + String(p->rxCh) + ": "); + DPRINT(DBG_INFO, "RX " + String(len) + "B Ch" + String(p->rxCh) + " | "); + mSys->Radio.dumpBuf(NULL, p->packet, len); } mFrameCnt++; @@ -295,6 +299,7 @@ void app::loop(void) { Inverter<> *iv = mSys->getInverterByPos(id); if(NULL != iv) { if(iv->isAvailable(mTimestamp)) { + DPRINTLN(DBG_INFO, "Inverter: " + String(id)); for(uint8_t i = 0; i < iv->listLen; i++) { if(0.0f != iv->getValue(i)) { snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); @@ -303,6 +308,7 @@ void app::loop(void) { } yield(); } + DPRINTLN(DBG_INFO, ""); } } } diff --git a/tools/esp8266/hmRadio.h b/tools/esp8266/hmRadio.h index 18058e76..ebc6dcae 100644 --- a/tools/esp8266/hmRadio.h +++ b/tools/esp8266/hmRadio.h @@ -19,8 +19,8 @@ #define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) #define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) -#define RX_CHANNELS 5 -#define RX_LOOP_CNT 300 +#define RF_CHANNELS 5 +#define RF_LOOP_CNT 300 const char* const rf24AmpPower[] = {"MIN", "LOW", "HIGH", "MAX"}; @@ -56,18 +56,18 @@ class HmRadio { public: HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) { DPRINTLN(DBG_VERBOSE, F("hmRadio.h : HmRadio():mNrf24(CE_PIN: ") + String(CE_PIN) + F(", CS_PIN: ") + String(CS_PIN) + F(", SPI_SPEED: ") + String(SPI_SPEED) + ")"); - mTxChLst[0] = 40; - //mTxChIdx = 1; // Depending on the program, the module can work on 2403, 2423, 2440, 2461 or 2475MHz. // Channel List 2403, 2423, 2440, 2461, 2475MHz - mRxChLst[0] = 03; - mRxChLst[1] = 23; - mRxChLst[2] = 40; - mRxChLst[3] = 61; - mRxChLst[4] = 75; - mRxChIdx = 0; - mRxLoopCnt = RX_LOOP_CNT; + mRfChLst[0] = 03; + mRfChLst[1] = 23; + mRfChLst[2] = 40; + mRfChLst[3] = 61; + mRfChLst[4] = 75; + + mTxChIdx = 2; // Start TX with 40 + mRxChIdx = 0; // Start RX with 03 + mRxLoopCnt = RF_LOOP_CNT; pinCs = CS_PIN; pinCe = CE_PIN; @@ -109,7 +109,7 @@ class HmRadio { DPRINTLN(DBG_INFO, F("Radio Config:")); mNrf24.printPrettyDetails(); - mTxCh = getDefaultChannel(); + mTxCh = setDefaultChannels(); if(!mNrf24.isChipConnected()) { DPRINTLN(DBG_WARN, F("WARNING! your NRF24 module can't be reached, check the wiring")); @@ -128,7 +128,7 @@ class HmRadio { while(mNrf24.available(&pipe)) { if(!mBufCtrl->full()) { p = mBufCtrl->getFront(); - p->rxCh = mRxChLst[mRxChIdx]; + p->rxCh = mRfChLst[mRxChIdx]; len = mNrf24.getPayloadSize(); if(len > MAX_RF_PAYLOAD_SIZE) len = MAX_RF_PAYLOAD_SIZE; @@ -152,20 +152,13 @@ class HmRadio { mIrqRcvd = true; } - uint8_t getDefaultChannel(void) { - //DPRINTLN(DBG_VERBOSE, F("hmRadio.h:getDefaultChannel")); - return mTxChLst[0]; - } - /*uint8_t getLastChannel(void) { - return mTxChLst[mTxChIdx]; + uint8_t setDefaultChannels(void) { + //DPRINTLN(DBG_VERBOSE, F("hmRadio.h:setDefaultChannels")); + mTxChIdx = 2; // Start TX with 40 + mRxChIdx = 0; // Start RX with 03 + return mRfChLst[mTxChIdx]; } - uint8_t getNxtChannel(void) { - if(++mTxChIdx >= 4) - mTxChIdx = 0; - return mTxChLst[mTxChIdx]; - }*/ - void sendTimePacket(uint64_t invId, uint32_t ts) { //DPRINTLN(DBG_VERBOSE, F("hmRadio.h:sendTimePacket")); sendCmdPacket(invId, 0x15, 0x80, false); @@ -257,7 +250,7 @@ class HmRadio { //DPRINTLN(DBG_VERBOSE, "sent packet: #" + String(mSendCnt)); //dumpBuf("SEN ", buf, len); if(mSerialDebug) { - DPRINT(DBG_INFO, "Transmit " + String(len) + " | "); + DPRINT(DBG_INFO, "TX " + String(len) + "B Ch" + String(mRfChLst[mTxChIdx]) + " | "); dumpBuf(NULL, buf, len); } @@ -265,10 +258,10 @@ class HmRadio { mNrf24.stopListening(); if(clear) - mRxLoopCnt = RX_LOOP_CNT; + mRxLoopCnt = RF_LOOP_CNT; - mTxCh = getDefaultChannel(); - mNrf24.setChannel(mTxCh); + mNrf24.setChannel(mRfChLst[mTxChIdx]); + mTxCh = getTxNxtChannel(); // switch channel for next packet mNrf24.openWritingPipe(invId); // TODO: deprecated mNrf24.setCRCLength(RF24_CRC_16); mNrf24.enableDynamicPayloads(); @@ -279,7 +272,7 @@ class HmRadio { // Try to avoid zero payload acks (has no effect) mNrf24.openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id?, deprecated mRxChIdx = 0; - mNrf24.setChannel(mRxChLst[mRxChIdx]); + mNrf24.setChannel(mRfChLst[mRxChIdx]); mNrf24.setAutoAck(false); mNrf24.setRetries(0, 0); mNrf24.disableDynamicPayloads(); @@ -290,19 +283,25 @@ class HmRadio { mSendCnt++; } + uint8_t getTxNxtChannel(void) { + + if(++mTxChIdx >= RF_CHANNELS) + mTxChIdx = 0; + return mRfChLst[mTxChIdx]; + } + uint8_t getRxNxtChannel(void) { - if(++mRxChIdx >= RX_CHANNELS) + if(++mRxChIdx >= RF_CHANNELS) mRxChIdx = 0; - return mRxChLst[mRxChIdx]; + return mRfChLst[mRxChIdx]; } uint8_t mTxCh; - uint8_t mTxChLst[1]; - //uint8_t mTxChIdx; - - uint8_t mRxChLst[RX_CHANNELS]; + uint8_t mTxChIdx; + uint8_t mRfChLst[RF_CHANNELS]; + uint8_t mRxChIdx; uint16_t mRxLoopCnt; diff --git a/tools/esp8266/mqtt.h b/tools/esp8266/mqtt.h index 89570344..4a9d3509 100644 --- a/tools/esp8266/mqtt.h +++ b/tools/esp8266/mqtt.h @@ -16,23 +16,28 @@ class mqtt { mClient = new PubSubClient(mEspClient); mAddressSet = false; - memset(mUser, 0, MQTT_USER_LEN); - memset(mPwd, 0, MQTT_PWD_LEN); - memset(mTopic, 0, MQTT_TOPIC_LEN); + 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); } ~mqtt() { } - void setup(const char *broker, const char *topic, const char *user, const char *pwd, uint16_t port) { + void setup(const char *broker, const char *topic, const char *user, const char *pwd, const char *devname, uint16_t port) { DPRINTLN(DBG_VERBOSE, F("mqtt.h:setup")); mAddressSet = true; - mClient->setServer(broker, port); - mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); mPort = port; - snprintf(mUser, MQTT_USER_LEN, "%s", user); - snprintf(mPwd, MQTT_PWD_LEN, "%s", pwd); - snprintf(mTopic, MQTT_TOPIC_LEN, "%s", topic); + 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); + + mClient->setServer(mBroker, mPort); + mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); } void sendMsg(const char *topic, const char *msg) { @@ -58,6 +63,11 @@ class mqtt { 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; @@ -73,6 +83,11 @@ class mqtt { return mTopic; } + char *getDevName(void) { + //DPRINTLN(DBG_VERBOSE, F("mqtt.h:getDevName")); + return mDevName; + } + uint16_t getPort(void) { return mPort; } @@ -86,13 +101,23 @@ class mqtt { private: void reconnect(void) { - //DPRINTLN(DBG_VERBOSE, F("mqtt.h:reconnect")); + DPRINTLN(DBG_DEBUG, F("mqtt.h:reconnect")); + DPRINTLN(DBG_DEBUG, F("MQTT mClient->_state ") + String(mClient->state()) ); + DPRINTLN(DBG_DEBUG, F("WIFI mEspClient.status ") + String(mEspClient.status()) ); if(!mClient->connected()) { - if((strlen(mUser) > 0) && (strlen(mPwd) > 0)) - mClient->connect(DEF_DEVICE_NAME, mUser, mPwd); - else - mClient->connect(DEF_DEVICE_NAME); + if(strlen(mDevName) > 0) { + // der Server und der Port müssen neu gesetzt werden, + // da ein MQTT_CONNECTION_LOST -3 die Werte zerstört hat. + mClient->setServer(mBroker, mPort); + mClient->setBufferSize(MQTT_MAX_PACKET_SIZE); + if((strlen(mUser) > 0) && (strlen(mPwd) > 0)) + mClient->connect(mDevName, mUser, mPwd); + else + mClient->connect(mDevName); + } } + DPRINTLN(DBG_DEBUG, F("MQTT mClient->_state ") + String(mClient->state()) ); + DPRINTLN(DBG_DEBUG, F("WIFI mEspClient.status ") + String(mEspClient.status()) ); } WiFiClient mEspClient; @@ -100,9 +125,11 @@ class mqtt { bool mAddressSet; uint16_t mPort; + char mBroker[MQTT_ADDR_LEN]; char mUser[MQTT_USER_LEN]; char mPwd[MQTT_PWD_LEN]; char mTopic[MQTT_TOPIC_LEN]; + char mDevName[DEVNAME_LEN]; }; #endif /*__MQTT_H_*/ diff --git a/tools/esp8266/platformio.ini b/tools/esp8266/platformio.ini index 0728ec47..b9def408 100644 --- a/tools/esp8266/platformio.ini +++ b/tools/esp8266/platformio.ini @@ -1,3 +1,13 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + [platformio] src_dir = . @@ -5,33 +15,67 @@ src_dir = . platform = espressif8266 framework = arduino board = d1_mini -monitor_speed = 115200 board_build.f_cpu = 80000000L + +; ;;;;; Possible Debug options ;;;;;; +; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level ;build_flags = -DDEBUG_ESP_PORT=Serial + ;-DDEBUG_ESP_CORE + ;-DDEBUG_ESP_WIFI + ;-DDEBUG_ESP_HTTP_CLIENT + ;-DDEBUG_ESP_HTTP_SERVER + ;-DDEBUG_ESP_OOM + +monitor_speed = 115200 +monitor_filters = + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line + ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory -lib_deps = - nrf24/RF24@1.4.2 +lib_deps = + nrf24/RF24@1.4.2 paulstoffregen/Time@^1.6.1 knolleary/PubSubClient@^2.8 - bblanchon/ArduinoJson@^6.19.4 - ;esp8266/DNSServer@1.1.0 - ;esp8266/EEPROM@^1.0 - ;esp8266/ESP8266HTTPUpdateServer@^1.0 - ;esp8266/ESP8266WebServer@^1.0 - ;esp8266/ESP8266WiFi@^1.0 - ;esp8266/SPI@1.0 - ;esp8266/Ticker@^1.0 + bblanchon/ArduinoJson@^6.19.4 + ;esp8266/DNSServer@1.1.0 + ;esp8266/EEPROM@^1.0 + ;esp8266/ESP8266HTTPUpdateServer@^1.0 + ;esp8266/ESP8266WebServer@^1.0 + ;esp8266/ESP8266WiFi@^1.0 + ;esp8266/SPI@1.0 + ;esp8266/Ticker@^1.0 [env:node_mcu_v2] platform = espressif8266 framework = arduino board = nodemcuv2 -monitor_speed = 115200 board_build.f_cpu = 80000000L + +; ;;;;; Possible Debug options ;;;;;; +; https://docs.platformio.org/en/latest/platforms/espressif8266.html#debug-level +;build_flags = -DDEBUG_ESP_PORT=Serial + ;-DDEBUG_ESP_CORE + ;-DDEBUG_ESP_WIFI + ;-DDEBUG_ESP_HTTP_CLIENT + ;-DDEBUG_ESP_HTTP_SERVER + ;-DDEBUG_ESP_OOM + +monitor_speed = 115200 +monitor_filters = + ;default ; Remove typical terminal control codes from input + time ; Add timestamp with milliseconds for each new line + ;log2file ; Log data to a file “platformio-device-monitor-*.log” located in the current working directory upload_port = /dev/ttyUSB0 -lib_deps = - nrf24/RF24@1.4.2 +lib_deps = + nrf24/RF24@1.4.2 paulstoffregen/Time@^1.6.1 knolleary/PubSubClient@^2.8 - bblanchon/ArduinoJson@^6.19.4 + bblanchon/ArduinoJson@^6.19.4 + ;esp8266/DNSServer@1.1.0 + ;esp8266/EEPROM@^1.0 + ;esp8266/ESP8266HTTPUpdateServer@^1.0 + ;esp8266/ESP8266WebServer@^1.0 + ;esp8266/ESP8266WiFi@^1.0 + ;esp8266/SPI@1.0 + ;esp8266/Ticker@^1.0