diff --git a/include/main.h b/include/main.h index d987af8..b17c237 100644 --- a/include/main.h +++ b/include/main.h @@ -39,6 +39,7 @@ #define ADC_PIN 35 #define CONV_FACTOR 1.7 #define READS 20 +const long gmtOffset_sec = 3600; void setupMQTT(const char *address, int port); void setupWIFI(const char *wifi_name, const char *password); diff --git a/lib/NTPClient-master/.codespellrc b/lib/NTPClient-master/.codespellrc new file mode 100644 index 0000000..101edae --- /dev/null +++ b/lib/NTPClient-master/.codespellrc @@ -0,0 +1,7 @@ +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = , +check-filenames = +check-hidden = +skip = ./.git diff --git a/lib/NTPClient-master/.github/dependabot.yml b/lib/NTPClient-master/.github/dependabot.yml new file mode 100644 index 0000000..03600dd --- /dev/null +++ b/lib/NTPClient-master/.github/dependabot.yml @@ -0,0 +1,10 @@ +# See: https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#about-the-dependabotyml-file +version: 2 + +updates: + # Configure check for outdated GitHub Actions actions in workflows. + # See: https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-dependabot + - package-ecosystem: github-actions + directory: / # Check the repository's workflows under /.github/workflows/ + schedule: + interval: daily diff --git a/lib/NTPClient-master/.github/workflows/check-arduino.yml b/lib/NTPClient-master/.github/workflows/check-arduino.yml new file mode 100644 index 0000000..3e0d26c --- /dev/null +++ b/lib/NTPClient-master/.github/workflows/check-arduino.yml @@ -0,0 +1,28 @@ +name: Check Arduino + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by new rules added to Arduino Lint. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Arduino Lint + uses: arduino/arduino-lint-action@v1 + with: + compliance: specification + library-manager: update + # Always use this setting for official repositories. Remove for 3rd party projects. + official: true + project-type: library diff --git a/lib/NTPClient-master/.github/workflows/compile-examples.yml b/lib/NTPClient-master/.github/workflows/compile-examples.yml new file mode 100644 index 0000000..c9f68fc --- /dev/null +++ b/lib/NTPClient-master/.github/workflows/compile-examples.yml @@ -0,0 +1,70 @@ +name: Compile Examples + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/compile-examples.yml" + - "examples/**" + - "**.c" + - "**.cpp" + - "**.h" + - "*.S" + pull_request: + paths: + - ".github/workflows/compile-examples.yml" + - "examples/**" + - "**.c" + - "**.cpp" + - "**.h" + - "*.S" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to external resources (libraries, platforms). + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + build: + name: ${{ matrix.board.fqbn }} + runs-on: ubuntu-latest + + env: + SKETCHES_REPORTS_PATH: sketches-reports + + strategy: + fail-fast: false + + matrix: + board: + - fqbn: esp8266:esp8266:huzzah + platforms: | + - name: esp8266:esp8266 + source-url: https://arduino.esp8266.com/stable/package_esp8266com_index.json + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Compile examples + uses: arduino/compile-sketches@v1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + fqbn: ${{ matrix.board.fqbn }} + platforms: ${{ matrix.board.platforms }} + libraries: | + # Install the library from the local path. + - source-path: ./ + # Additional library dependencies can be listed here. + # See: https://github.com/arduino/compile-sketches#libraries + sketch-paths: | + - examples + enable-deltas-report: true + sketches-report-path: ${{ env.SKETCHES_REPORTS_PATH }} + + - name: Save sketches report as workflow artifact + uses: actions/upload-artifact@v3 + with: + if-no-files-found: error + path: ${{ env.SKETCHES_REPORTS_PATH }} + name: ${{ env.SKETCHES_REPORTS_PATH }} diff --git a/lib/NTPClient-master/.github/workflows/report-size-deltas.yml b/lib/NTPClient-master/.github/workflows/report-size-deltas.yml new file mode 100644 index 0000000..652be5d --- /dev/null +++ b/lib/NTPClient-master/.github/workflows/report-size-deltas.yml @@ -0,0 +1,24 @@ +name: Report Size Deltas + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/report-size-deltas.yml" + schedule: + # Run at the minimum interval allowed by GitHub Actions. + # Note: GitHub Actions periodically has outages which result in workflow failures. + # In this event, the workflows will start passing again once the service recovers. + - cron: "*/5 * * * *" + workflow_dispatch: + repository_dispatch: + +jobs: + report: + runs-on: ubuntu-latest + steps: + - name: Comment size deltas reports to PRs + uses: arduino/report-size-deltas@v1 + with: + # The name of the workflow artifact created by the sketch compilation workflow + sketches-reports-source: sketches-reports diff --git a/lib/NTPClient-master/.github/workflows/spell-check.yml b/lib/NTPClient-master/.github/workflows/spell-check.yml new file mode 100644 index 0000000..3f6b03f --- /dev/null +++ b/lib/NTPClient-master/.github/workflows/spell-check.yml @@ -0,0 +1,22 @@ +name: Spell Check + +# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/events-that-trigger-workflows +on: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch new misspelling detections resulting from dictionary updates. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + spellcheck: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Spell check + uses: codespell-project/actions-codespell@master diff --git a/lib/NTPClient-master/.github/workflows/sync-labels.yml b/lib/NTPClient-master/.github/workflows/sync-labels.yml new file mode 100644 index 0000000..986bda6 --- /dev/null +++ b/lib/NTPClient-master/.github/workflows/sync-labels.yml @@ -0,0 +1,138 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels.md +name: Sync Labels + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/sync-labels.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + pull_request: + paths: + - ".github/workflows/sync-labels.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + schedule: + # Run daily at 8 AM UTC to sync with changes to shared label configurations. + - cron: "0 8 * * *" + workflow_dispatch: + repository_dispatch: + +env: + CONFIGURATIONS_FOLDER: .github/label-configuration-files + CONFIGURATIONS_ARTIFACT: label-configuration-files + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Download JSON schema for labels configuration file + id: download-schema + uses: carlosperate/download-file-action@v1 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json + location: ${{ runner.temp }}/label-configuration-schema + + - name: Install JSON schema validator + run: | + sudo npm install \ + --global \ + ajv-cli \ + ajv-formats + + - name: Validate local labels configuration + run: | + # See: https://github.com/ajv-validator/ajv-cli#readme + ajv validate \ + --all-errors \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}" + + download: + needs: check + runs-on: ubuntu-latest + + strategy: + matrix: + filename: + # Filenames of the shared configurations to apply to the repository in addition to the local configuration. + # https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/sync-labels + - universal.yml + + steps: + - name: Download + uses: carlosperate/download-file-action@v1 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} + + - name: Pass configuration files to next job via workflow artifact + uses: actions/upload-artifact@v3 + with: + path: | + *.yaml + *.yml + if-no-files-found: error + name: ${{ env.CONFIGURATIONS_ARTIFACT }} + + sync: + needs: download + runs-on: ubuntu-latest + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable + echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV" + + - name: Determine whether to dry run + id: dry-run + if: > + github.event_name == 'pull_request' || + ( + ( + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' + ) && + github.ref != format('refs/heads/{0}', github.event.repository.default_branch) + ) + run: | + # Use of this flag in the github-label-sync command will cause it to only check the validity of the + # configuration. + echo "::set-output name=flag::--dry-run" + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Download configuration files artifact + uses: actions/download-artifact@v3 + with: + name: ${{ env.CONFIGURATIONS_ARTIFACT }} + path: ${{ env.CONFIGURATIONS_FOLDER }} + + - name: Remove unneeded artifact + uses: geekyeggo/delete-artifact@v1 + with: + name: ${{ env.CONFIGURATIONS_ARTIFACT }} + + - name: Merge label configuration files + run: | + # Merge all configuration files + shopt -s extglob + cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}" + + - name: Install github-label-sync + run: sudo npm install --global github-label-sync + + - name: Sync labels + env: + GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # See: https://github.com/Financial-Times/github-label-sync + github-label-sync \ + --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \ + ${{ steps.dry-run.outputs.flag }} \ + ${{ github.repository }} diff --git a/lib/NTPClient-master/.travis.yml b/lib/NTPClient-master/.travis.yml deleted file mode 100644 index fa09d0f..0000000 --- a/lib/NTPClient-master/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: c -sudo: false -before_install: - - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh) -script: - - build_platform esp8266 -notifications: - email: - on_success: change - on_failure: change diff --git a/lib/NTPClient-master/NTPClient.cpp b/lib/NTPClient-master/NTPClient.cpp old mode 100644 new mode 100755 index 6f6a4cd..b435855 --- a/lib/NTPClient-master/NTPClient.cpp +++ b/lib/NTPClient-master/NTPClient.cpp @@ -25,7 +25,7 @@ NTPClient::NTPClient(UDP& udp) { this->_udp = &udp; } -NTPClient::NTPClient(UDP& udp, int timeOffset) { +NTPClient::NTPClient(UDP& udp, long timeOffset) { this->_udp = &udp; this->_timeOffset = timeOffset; } @@ -35,24 +35,45 @@ NTPClient::NTPClient(UDP& udp, const char* poolServerName) { this->_poolServerName = poolServerName; } -NTPClient::NTPClient(UDP& udp, const char* poolServerName, int timeOffset) { +NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP) { + this->_udp = &udp; + this->_poolServerIP = poolServerIP; + this->_poolServerName = NULL; +} + +NTPClient::NTPClient(UDP& udp, const char* poolServerName, long timeOffset) { this->_udp = &udp; this->_timeOffset = timeOffset; this->_poolServerName = poolServerName; } -NTPClient::NTPClient(UDP& udp, const char* poolServerName, int timeOffset, unsigned long updateInterval) { +NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset){ + this->_udp = &udp; + this->_timeOffset = timeOffset; + this->_poolServerIP = poolServerIP; + this->_poolServerName = NULL; +} + +NTPClient::NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval) { this->_udp = &udp; this->_timeOffset = timeOffset; this->_poolServerName = poolServerName; this->_updateInterval = updateInterval; } +NTPClient::NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset, unsigned long updateInterval) { + this->_udp = &udp; + this->_timeOffset = timeOffset; + this->_poolServerIP = poolServerIP; + this->_poolServerName = NULL; + this->_updateInterval = updateInterval; +} + void NTPClient::begin() { this->begin(NTP_DEFAULT_LOCAL_PORT); } -void NTPClient::begin(int port) { +void NTPClient::begin(unsigned int port) { this->_port = port; this->_udp->begin(this->_port); @@ -60,37 +81,15 @@ void NTPClient::begin(int port) { this->_udpSetup = true; } -bool NTPClient::isValid(byte * ntpPacket) -{ - //Perform a few validity checks on the packet - if((ntpPacket[0] & 0b11000000) == 0b11000000) //Check for LI=UNSYNC - return false; - - if((ntpPacket[0] & 0b00111000) >> 3 < 0b100) //Check for Version >= 4 - return false; - - if((ntpPacket[0] & 0b00000111) != 0b100) //Check for Mode == Server - return false; - - if((ntpPacket[1] < 1) || (ntpPacket[1] > 15)) //Check for valid Stratum - return false; - - if( ntpPacket[16] == 0 && ntpPacket[17] == 0 && - ntpPacket[18] == 0 && ntpPacket[19] == 0 && - ntpPacket[20] == 0 && ntpPacket[21] == 0 && - ntpPacket[22] == 0 && ntpPacket[22] == 0) //Check for ReferenceTimestamp != 0 - return false; - - return true; -} - bool NTPClient::forceUpdate() { #ifdef DEBUG_NTPClient Serial.println("Update from NTP Server"); #endif + // flush any existing packets while(this->_udp->parsePacket() != 0) this->_udp->flush(); + this->sendNTPPacket(); // Wait till data is there or timeout... @@ -99,20 +98,14 @@ bool NTPClient::forceUpdate() { do { delay ( 10 ); cb = this->_udp->parsePacket(); - - if(cb > 0) - { - this->_udp->read(this->_packetBuffer, NTP_PACKET_SIZE); - if(!this->isValid(this->_packetBuffer)) - cb = 0; - } - if (timeout > 100) return false; // timeout after 1000 ms timeout++; } while (cb == 0); this->_lastUpdate = millis() - (10 * (timeout + 1)); // Account for delay in reading the time + this->_udp->read(this->_packetBuffer, NTP_PACKET_SIZE); + unsigned long highWord = word(this->_packetBuffer[40], this->_packetBuffer[41]); unsigned long lowWord = word(this->_packetBuffer[42], this->_packetBuffer[43]); // combine the four bytes (two words) into a long integer @@ -121,39 +114,43 @@ bool NTPClient::forceUpdate() { this->_currentEpoc = secsSince1900 - SEVENZYYEARS; - return true; + return true; // return true after successful update } bool NTPClient::update() { if ((millis() - this->_lastUpdate >= this->_updateInterval) // Update after _updateInterval || this->_lastUpdate == 0) { // Update if there was no update yet. - if (!this->_udpSetup) this->begin(); // setup the UDP client if needed + if (!this->_udpSetup || this->_port != NTP_DEFAULT_LOCAL_PORT) this->begin(this->_port); // setup the UDP client if needed return this->forceUpdate(); } - return true; + return false; // return false if update does not occur } -unsigned long NTPClient::getEpochTime() { +bool NTPClient::isTimeSet() const { + return (this->_lastUpdate != 0); // returns true if the time has been set, else false +} + +unsigned long NTPClient::getEpochTime() const { return this->_timeOffset + // User offset - this->_currentEpoc + // Epoc returned by the NTP server + this->_currentEpoc + // Epoch returned by the NTP server ((millis() - this->_lastUpdate) / 1000); // Time since last update } -int NTPClient::getDay() { +int NTPClient::getDay() const { return (((this->getEpochTime() / 86400L) + 4 ) % 7); //0 is Sunday } -int NTPClient::getHours() { +int NTPClient::getHours() const { return ((this->getEpochTime() % 86400L) / 3600); } -int NTPClient::getMinutes() { +int NTPClient::getMinutes() const { return ((this->getEpochTime() % 3600) / 60); } -int NTPClient::getSeconds() { +int NTPClient::getSeconds() const { return (this->getEpochTime() % 60); } -String NTPClient::getFormattedTime(unsigned long secs) { - unsigned long rawTime = secs ? secs : this->getEpochTime(); +String NTPClient::getFormattedTime() const { + unsigned long rawTime = this->getEpochTime(); unsigned long hours = (rawTime % 86400L) / 3600; String hoursStr = hours < 10 ? "0" + String(hours) : String(hours); @@ -166,33 +163,6 @@ String NTPClient::getFormattedTime(unsigned long secs) { return hoursStr + ":" + minuteStr + ":" + secondStr; } -// Based on https://github.com/PaulStoffregen/Time/blob/master/Time.cpp -// currently assumes UTC timezone, instead of using this->_timeOffset -String NTPClient::getFormattedDate(unsigned long secs) { - unsigned long rawTime = (secs ? secs : this->getEpochTime()) / 86400L; // in days - unsigned long days = 0, year = 1970; - uint8_t month; - static const uint8_t monthDays[]={31,28,31,30,31,30,31,31,30,31,30,31}; - - while((days += (LEAP_YEAR(year) ? 366 : 365)) <= rawTime) - year++; - rawTime -= days - (LEAP_YEAR(year) ? 366 : 365); // now it is days in this year, starting at 0 - days=0; - for (month=0; month<12; month++) { - uint8_t monthLength; - if (month==1) { // february - monthLength = LEAP_YEAR(year) ? 29 : 28; - } else { - monthLength = monthDays[month]; - } - if (rawTime < monthLength) break; - rawTime -= monthLength; - } - String monthStr = ++month < 10 ? "0" + String(month) : String(month); // jan is month 1 - String dayStr = ++rawTime < 10 ? "0" + String(rawTime) : String(rawTime); // day of month - return String(year) + "-" + monthStr + "-" + dayStr + "T" + this->getFormattedTime(secs ? secs : 0) + "Z"; -} - void NTPClient::end() { this->_udp->stop(); @@ -207,28 +177,36 @@ void NTPClient::setUpdateInterval(unsigned long updateInterval) { this->_updateInterval = updateInterval; } +void NTPClient::setPoolServerName(const char* poolServerName) { + this->_poolServerName = poolServerName; +} + void NTPClient::sendNTPPacket() { // set all bytes in the buffer to 0 memset(this->_packetBuffer, 0, NTP_PACKET_SIZE); // Initialize values needed to form NTP request - // (see URL above for details on the packets) this->_packetBuffer[0] = 0b11100011; // LI, Version, Mode this->_packetBuffer[1] = 0; // Stratum, or type of clock this->_packetBuffer[2] = 6; // Polling Interval this->_packetBuffer[3] = 0xEC; // Peer Clock Precision // 8 bytes of zero for Root Delay & Root Dispersion - this->_packetBuffer[12] = 0x49; + this->_packetBuffer[12] = 49; this->_packetBuffer[13] = 0x4E; - this->_packetBuffer[14] = 0x49; - this->_packetBuffer[15] = 0x52; + this->_packetBuffer[14] = 49; + this->_packetBuffer[15] = 52; // all NTP fields have been given values, now // you can send a packet requesting a timestamp: - this->_udp->beginPacket(this->_poolServerName, 123); //NTP requests are to port 123 + if (this->_poolServerName) { + this->_udp->beginPacket(this->_poolServerName, 123); + } else { + this->_udp->beginPacket(this->_poolServerIP, 123); + } this->_udp->write(this->_packetBuffer, NTP_PACKET_SIZE); this->_udp->endPacket(); } -void NTPClient::setEpochTime(unsigned long secs) { - this->_currentEpoc = secs; +void NTPClient::setRandomPort(unsigned int minValue, unsigned int maxValue) { + randomSeed(analogRead(0)); + this->_port = random(minValue, maxValue); } diff --git a/lib/NTPClient-master/NTPClient.h b/lib/NTPClient-master/NTPClient.h old mode 100644 new mode 100755 index ad45070..a31d32f --- a/lib/NTPClient-master/NTPClient.h +++ b/lib/NTPClient-master/NTPClient.h @@ -7,8 +7,6 @@ #define SEVENZYYEARS 2208988800UL #define NTP_PACKET_SIZE 48 #define NTP_DEFAULT_LOCAL_PORT 1337 -#define LEAP_YEAR(Y) ( (Y>0) && !(Y%4) && ( (Y%100) || !(Y%400) ) ) - class NTPClient { private: @@ -16,8 +14,9 @@ class NTPClient { bool _udpSetup = false; const char* _poolServerName = "pool.ntp.org"; // Default time server - int _port = NTP_DEFAULT_LOCAL_PORT; - int _timeOffset = 0; + IPAddress _poolServerIP; + unsigned int _port = NTP_DEFAULT_LOCAL_PORT; + long _timeOffset = 0; unsigned long _updateInterval = 60000; // In ms @@ -27,14 +26,28 @@ class NTPClient { byte _packetBuffer[NTP_PACKET_SIZE]; void sendNTPPacket(); - bool isValid(byte * ntpPacket); public: NTPClient(UDP& udp); - NTPClient(UDP& udp, int timeOffset); + NTPClient(UDP& udp, long timeOffset); NTPClient(UDP& udp, const char* poolServerName); - NTPClient(UDP& udp, const char* poolServerName, int timeOffset); - NTPClient(UDP& udp, const char* poolServerName, int timeOffset, unsigned long updateInterval); + NTPClient(UDP& udp, const char* poolServerName, long timeOffset); + NTPClient(UDP& udp, const char* poolServerName, long timeOffset, unsigned long updateInterval); + NTPClient(UDP& udp, IPAddress poolServerIP); + NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset); + NTPClient(UDP& udp, IPAddress poolServerIP, long timeOffset, unsigned long updateInterval); + + /** + * Set time server name + * + * @param poolServerName + */ + void setPoolServerName(const char* poolServerName); + + /** + * Set random local port + */ + void setRandomPort(unsigned int minValue = 49152, unsigned int maxValue = 65535); /** * Starts the underlying UDP client with the default local port @@ -44,7 +57,7 @@ class NTPClient { /** * Starts the underlying UDP client with the specified local port */ - void begin(int port); + void begin(unsigned int port); /** * This should be called in the main loop of your application. By default an update from the NTP Server is only @@ -61,10 +74,17 @@ class NTPClient { */ bool forceUpdate(); - int getDay(); - int getHours(); - int getMinutes(); - int getSeconds(); + /** + * This allows to check if the NTPClient successfully received a NTP packet and set the time. + * + * @return true if time has been set, else false + */ + bool isTimeSet() const; + + int getDay() const; + int getHours() const; + int getMinutes() const; + int getSeconds() const; /** * Changes the time offset. Useful for changing timezones dynamically @@ -78,28 +98,17 @@ class NTPClient { void setUpdateInterval(unsigned long updateInterval); /** - * @return secs argument (or 0 for current time) formatted like `hh:mm:ss` - */ - String getFormattedTime(unsigned long secs = 0); + * @return time formatted like `hh:mm:ss` + */ + String getFormattedTime() const; /** * @return time in seconds since Jan. 1, 1970 */ - unsigned long getEpochTime(); - - /** - * @return secs argument (or 0 for current date) formatted to ISO 8601 - * like `2004-02-12T15:19:21+00:00` - */ - String getFormattedDate(unsigned long secs = 0); + unsigned long getEpochTime() const; /** * Stops the underlying UDP client */ void end(); - - /** - * Replace the NTP-fetched time with seconds since Jan. 1, 1970 - */ - void setEpochTime(unsigned long secs); }; diff --git a/lib/NTPClient-master/README.md b/lib/NTPClient-master/README.md index 6c8c07a..f83882c 100644 --- a/lib/NTPClient-master/README.md +++ b/lib/NTPClient-master/README.md @@ -1,6 +1,8 @@ # NTPClient -[![Build Status](https://travis-ci.org/arduino-libraries/NTPClient.svg?branch=master)](https://travis-ci.org/arduino-libraries/NTPClient) +[![Check Arduino status](https://github.com/arduino-libraries/NTPClient/actions/workflows/check-arduino.yml/badge.svg)](https://github.com/arduino-libraries/NTPClient/actions/workflows/check-arduino.yml) +[![Compile Examples status](https://github.com/arduino-libraries/NTPClient/actions/workflows/compile-examples.yml/badge.svg)](https://github.com/arduino-libraries/NTPClient/actions/workflows/compile-examples.yml) +[![Spell Check status](https://github.com/arduino-libraries/NTPClient/actions/workflows/spell-check.yml/badge.svg)](https://github.com/arduino-libraries/NTPClient/actions/workflows/spell-check.yml) Connect to a NTP server, here is how: @@ -22,7 +24,7 @@ WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); // You can specify the time server pool and the offset, (in seconds) -// additionaly you can specify the update interval (in milliseconds). +// additionally you can specify the update interval (in milliseconds). // NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); void setup(){ @@ -45,3 +47,6 @@ void loop() { delay(1000); } ``` + +## Function documentation +`getEpochTime` returns the Unix epoch, which are the seconds elapsed since 00:00:00 UTC on 1 January 1970 (leap seconds are ignored, every day is treated as having 86400 seconds). **Attention**: If you have set a time offset this time offset will be added to your epoch timestamp. diff --git a/lib/NTPClient-master/examples/Advanced/Advanced.ino b/lib/NTPClient-master/examples/Advanced/Advanced.ino index 2559508..18a6a97 100644 --- a/lib/NTPClient-master/examples/Advanced/Advanced.ino +++ b/lib/NTPClient-master/examples/Advanced/Advanced.ino @@ -11,7 +11,7 @@ const char *password = ""; WiFiUDP ntpUDP; // You can specify the time server pool and the offset (in seconds, can be -// changed later with setTimeOffset() ). Additionaly you can specify the +// changed later with setTimeOffset() ). Additionally you can specify the // update interval (in milliseconds, can be changed using setUpdateInterval() ). NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000); diff --git a/lib/NTPClient-master/examples/IsTimeSet/IsTimeSet.ino b/lib/NTPClient-master/examples/IsTimeSet/IsTimeSet.ino new file mode 100644 index 0000000..619bfde --- /dev/null +++ b/lib/NTPClient-master/examples/IsTimeSet/IsTimeSet.ino @@ -0,0 +1,53 @@ +#include +// change next line to use with another board/shield +#include +//#include // for WiFi shield +//#include // for WiFi 101 shield or MKR1000 +#include + +const char *ssid = ""; +const char *password = ""; + +WiFiUDP ntpUDP; +// initialized to a time offset of 10 hours +NTPClient timeClient(ntpUDP,"pool.ntp.org", 36000, 60000); +// HH:MM:SS +// timeClient initializes to 10:00:00 if it does not receive an NTP packet +// before the 100ms timeout. +// without isTimeSet() the LED would be switched on, although the time +// was not yet set correctly. + +// blue LED on ESP-12F +const int led = 2; +const int hour = 10; +const int minute = 0; + +void setup(){ + Serial.begin(115200); + + pinMode(led, OUTPUT); + // led is off when pin is high + digitalWrite(led, 1); + + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay (500); + Serial.print ("."); + } + + timeClient.begin(); +} + +void loop() { + timeClient.update(); + + Serial.println(timeClient.getFormattedTime()); + if(timeClient.isTimeSet()) { + if (hour == timeClient.getHours() && minute == timeClient.getMinutes()) { + digitalWrite(led, 0); + } + } + + delay(1000); +} diff --git a/lib/NTPClient-master/keywords.txt b/lib/NTPClient-master/keywords.txt index 1430d04..edce989 100644 --- a/lib/NTPClient-master/keywords.txt +++ b/lib/NTPClient-master/keywords.txt @@ -12,9 +12,13 @@ begin KEYWORD2 end KEYWORD2 update KEYWORD2 forceUpdate KEYWORD2 +isTimeSet KEYWORD2 getDay KEYWORD2 getHours KEYWORD2 getMinutes KEYWORD2 getSeconds KEYWORD2 getFormattedTime KEYWORD2 getEpochTime KEYWORD2 +setTimeOffset KEYWORD2 +setUpdateInterval KEYWORD2 +setPoolServerName KEYWORD2 diff --git a/lib/NTPClient-master/library.json b/lib/NTPClient-master/library.json deleted file mode 100644 index d6249c1..0000000 --- a/lib/NTPClient-master/library.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "NTPClient", - "keywords": "ntp, client, time", - "description": "A NTPClient to connect to a time server", - "authors": - [ - { - "name": "Fabrice Weinberg", - "email": "fabrice@weinberg.me" - }, - { - "name": "Sandeep Mistry", - "email": "s.mistry@arduino.cc" - } - ], - "repository": - { - "type": "git", - "url": "https://github.com/arduino-libraries/NTPClient.git" - }, - "version": "3.1.0", - "frameworks": "arduino", - "platforms": "espressif" -} diff --git a/lib/NTPClient-master/library.properties b/lib/NTPClient-master/library.properties index d4908ca..abdd80d 100644 --- a/lib/NTPClient-master/library.properties +++ b/lib/NTPClient-master/library.properties @@ -1,5 +1,5 @@ name=NTPClient -version=3.1.0 +version=3.2.1 author=Fabrice Weinberg maintainer=Fabrice Weinberg sentence=An NTPClient to connect to a time server diff --git a/src/main.cpp b/src/main.cpp index 87656dc..cd64668 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,12 @@ #include "main.h" +#include "NTPClient.h" +#include #include #include #include +//extern "C" void f(int); // one way + using namespace std; DHT sensors[SENSORS_NUMBER] = {DHT(04, DHT22), DHT(18, DHT22), DHT(05, DHT22), DHT(17, DHT22), DHT(16, DHT22)}; @@ -88,13 +92,18 @@ void sleep() //exemple d'une triple utilisation de valeur pour une fonction utilise pour la date std::tuple getDate() { + struct timeval synctime; + TimeClient.forceUpdate(); time_t rawtime = TimeClient.getEpochTime(); + synctime.tv_sec = rawtime; + synctime.tv_usec = 0; + if(settimeofday(&synctime,NULL) != 0) std::cout << "error\n" ; + struct tm *ti; ti = localtime(&rawtime); int year = ti->tm_year + 1900; int month = (ti->tm_mon + 1) < 10 ? 0 + (ti->tm_mon + 1) : (ti->tm_mon + 1); int day = (ti->tm_mday) < 10 ? 0 + (ti->tm_mday) : (ti->tm_mday); - return std::make_tuple(year, month, day); } @@ -116,6 +125,8 @@ void writeMessage(char *txt, float *temp, float *hum, int number) int chargelvl = Battery.getBatteryChargeLevel(); //float homeValue = 3.3 * analogRead(ADC_PIN) / 2048; for test measurement //float homeValue1 = 1.7 * analogRead(ADC_PIN) / 1000; + time_t rawtime = TimeClient.getEpochTime(); + switch (number) { case 1: @@ -131,7 +142,7 @@ void writeMessage(char *txt, float *temp, float *hum, int number) sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f", CLUSTER, temp[0], temp[1], temp[2], temp[3], hum[0], hum[1], hum[2], hum[3]); break; case 5: - sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f|%d|%f|%f", CLUSTER, temp[0], temp[1], temp[2], temp[3], temp[4], hum[0], hum[1], hum[2], hum[3], hum[4], chargelvl, homeValue, homeValue1); + sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f|%d|%lu|%lu", CLUSTER, temp[0], temp[1], temp[2], temp[3], temp[4], hum[0], hum[1], hum[2], hum[3], hum[4], chargelvl, getTime(), rawtime); break; case 6: sprintf(txt, "|%s|%0.2f %0.2f %0.2f %0.2f %0.2f %0.2f|%0.2f %0.2f %0.2f %0.2f %0.2f %0.2f", CLUSTER, temp[0], temp[1], temp[2], temp[3], temp[4], temp[5], hum[0], hum[1], hum[2], hum[3], hum[4], hum[5]); @@ -151,8 +162,11 @@ void setup() setupMQTT(MQTT_ADDRESS, MQTT_PORT); initSensors(sensors, SENSORS_NUMBER); TimeClient.begin(); + TimeClient.forceUpdate(); } + + //-------------------- Boucle principale --------------------// void loop()