Many libraries are installed, perhaps some are a consequence of the
   installation of other libraries or part of the Arduino world. This
   list shows libraries have been intentionally installed and
   that the library manager shows as installed.
   Built in libraries are not listed.
   Intentional
   installations in this list are listed with the library revision
   that was current at the historical point when the the library was
   added and/or the code was
   validated. Revision numbers in this list may not be current.
   Updates to these libraries are shown in the source control revision
   history below. Libraries installed but used only for
   other projects are listed in case there is an interaction.
   | Revision | Size | ZIP file | Changes | 
|---|
   
      | NextRelease | Not logged in | 
            Pending changes follow.
	  | 
   
      | 20220422 | Not logged in | 
	    Add parameter to determine if processor pins are used for
	    I/O or for SCL and SDA of the I2C bus. I2C devices now
	    report by counting if they are in use. The MS8607 must
	    decide if the pins are used for I/O because there is one
	    on the processor module. Otherwise if an I2C device is
	    present I2C is used an I/O pins are disabled.
	  
	    Pin counting is now performed with interrupts off as an
	    interlock.
	  
	    Improve warning when SensorTypeID_t does not fit in one
	    byte.
	  
	    Properly report VCNL404 messages (were reporting as
	    BME280).
	  
	    Do not try and start ranging when the VL53L1X is not
	    present.
	  
	    Reorder menu items into alphabetical order.	    
	  
	  
	  | 
   
      | 20211112 | Not logged in | 
	    Fix problems showing BME280 sensors that are not
	    present.
	  
	    Fix help for GAS command.
	  
	    Add distance report for VL53L1X, add SDdistance
	    datatype. Add this device to data reporting.
	  
	    Add SDuvIndex datatype for UV index. Disable some code for
	    the obsolete VEML6075. Complete and disable the output and
	    database entries for this device.
	  
	    Correct the output of the SDpresence datatype so all
	    format types work.
	  
	    Comment correction for ESP32 platform differences.
	  
	    Add a distance page and a UV index page.
	  
	  | 
   
      | 20211029 | Not logged in | 
	    Add 'Object Present' sensor using previously implemented VCNL4040
	    code for proximity, add SDpresence datatype and 
	    PROXIMITY_THRESHOLD parameter for it. 'Object Present' is now in
	    data history, associated graphs etc. New menu link and
	    associated HTML page name added
	    also.
	  
	    Update presentation for missing slave ID detection.
	  | 
   
      | 20211019 | Not logged in | 
	    Update comments in .H files for BME280 and CCS811 to
	    reflect that they now log values.
	  
	    Update comments in LOGGER.INO to reflect that OSAPI.H,
	    TWI.h and user_interface.h are properly left out. The
	    commented out lines will eventually be removed.
	  
	    In LOGGERWIFI.H note that using WiFi.h does not work for
	    the ESP8266 platform.
	  
	    Add VCNL4040 and VL5311 reads to performSensorReading.
	  
	    Update comments in SparkFunCCS811.cpp to discuss what is
	    added.
	  
	    Add code to support VCNL4040 using SparkFun Libraries.
	    Support for creating the sensor and logging values is not
	    added yet.
	  
	    Add empty service routine to read VL53L1X values. The
	    sensor is not created yet and real values are not read.
	  | 
   
      | 20210927 | Not logged in | 
	    Added Sparkfun VEML library 1.1.4.
	  
	    Adafruit GFX Library was 1.10.10 now 1.10.12.
	  
	    Database expanded to 256 bytes per sample, version 4. Old
	    version 3 still supported if it is found on an SD
	    card. Some support for version 2. The new version will be
	    created when a database is created.
	    Configuration header size increased to match element size.
	    A performance issue noted in the code no loger seems to
	    occur. Expansion of header and sensors is conditional on
	    database version. Report database version. Report that a
	    check is needed for too many pulse counters in new
	    database versions that might expand the number.
	  
	    When a database file does not have a complete sample at
	    the end treat it as a read error.
	  
	    Number of sensors expanded to 128.
	  
	    BME280 temperature/pressure/humidity added to database.
	    SparkFun library used to read values instead of private
	    code. Add SensorBME280
	    device.
	  
	    CCS811 CO2 and tVOC added to database. SparkFun ibrary
	    used to read values. Add SensorCCS811 device.
	  
	    MQTT publishes that the LOGGER is listening for commands.
	  
	    MQtt publish both a complete message as before and a latest
	    value message.
	  
	    MS8607 atmospheric pressure is never negative. Same for humidity.
	  
	    Turn debugging off in
	    parsing.cpp.
	  
	    Note that processor voltage might be better as unsigned,
	    but do not change it.
	  
	    Add datatypes for CO2 and tVOC.
	  
	    Report space available for additional sensors.
	  
	    Fix off by one bugs comparing sensorID to MAX_SENSORS.
	  
	    While dumping an element only do a loggerFastYield between
	    sensors. This caused a stack dump.
	  
	    Make several devices quiet when debugMessageLevel is low
	    and the device is not found. Disabled when debugging is on
	    in the module.
	  
	    Note that the VEML6075 is obsolete and should not be added
	    to the database. Use the SparkFun library to read the
	    values. There are conflicts between direct register reads
	    and using the library, notes added.
	  
	    Add menu items and web pages for gasses (CO2) and volatile compounds
	    (tVOC). Alphabetize sensor list in the menu.
	  | 
   
      | 20210905 | Not logged in | 
	    CCS811 library debugged on LOGGER, ESP32 Dev Module and
	    SparkFun ESP32 Thing platforms. Lots of issues resloved.
	    Notes in the SparkFunCCS811.cpp module.
          
	    SparkFun libraries distributed to SparkFun.
          | 
   
      | 20210913 | Not logged in | 
	    SparkFun modules posted to Github site.
          
	    Print more limited CCS811 data on reads for verification.
          
	    Improve DEBUG_LEVEL conditions on CCS811.
          
	    Mark CCS811 as missing each time ccs811Init is called.
	    Report more registers.
          
	    Report the platform in the STATUS command.
          
	    Add flash services dump to DATABASE command.
          
	    Handle ESP32 vs ESP8266 platform differences in file
	    system calls. Filenames must start with path on ESP32.
	    FILE_APPEND is missing on ESP8266. Establish pins that
	    work for SD card support on the ESP32. The
	    OLD_FLASH_SS_PIN is not used on the ESP32. Directory
	    listing is supported on ESP32.
          
	    Correct report of sample older than the start of the
	    database error.
          
	    Resolve platform differences related to the Wire
	    interface.
          
	    Rename platform detecting conditionals to use longer
	    ARDUINO_xxx names.
          
	    Repair calculation of temperature and humidity for the
	    MS8607.
          
	    Update pin initialization table to accomodate ESP32 pin
	    usage.
          | 
   
      | 20210902 | Not logged in | 
	    Library update to Adafruit Busio 1.9.1 was 1.9.0
          
	    ESP8266 board update to 3.0.2 FAILS still using 2.7.4. The
	    HTTPupdate interface is deprecated and removed. Need to
	    figure out how to replace it.
          
	    Major rework to SparkFun CCS811 libraries. Handle error
	    cases and required delays. Add dump services in the LOGGER
	    code that expose the issues and report problems.
          
	    Change style of I2C register setting to better support
	    arbitrary devices allowing registers to be set and read.
          
	    Some updates to PIN command controls to allow for more ESP32 pins
	    and better management of ON, OFF and input and pullup
	    cases.
          
	    ESP32 conditionals added to support environment changes on
	    that platform. Changes related to web server support,
	    which pins are used for I2C. Updates to I2C reset methods. 
          
	    I2C pin control changes to properly use pullups and never
	    drive the pin high. High is achieved by changing the pin
	    to an input. Add published busy test for hard coded I2C
	    support.
          More frequent watchdog feeds are required in startup and
	    other places related to ESP32 platform.
          
	    Properly report illegal or absent temperatures on dumps.
          
	    Use library code for the BME280. Use library code for the
	    CCS811 but the library needs major improvements so take a
	    private copy.
          
	    In TCA9539 first determine if the I2C address is a BME280
	    and do not configure the TCA9539 if so.
          
	    Make #if (DEBUG_LEVEL > 0) the pervasive style of testing.
	    Do not allow missing parens.
          
	    Make the update class name symbolic so a different name
	    can be used on the ESP32 platform.
          
	    Add reporting of ESP32 libraries to the copyright notices.
          | 
   
      | 20210820 | Not logged in | 
	    ESP32 platform builds and loads. It comes up and
	    talks to the serial port. It finds the network and gets an
	    IP address. The web browser does not bring up pages. Most
	    of the code is not tested. CCS811 is not found.
          
	    LED_BUILTIN is not available onthe ESP32. Set it to pin
	    34.
          
	    Wire.requestFrom expects slightly different data types on
	    ESP32.
          
	    Rework iotuplink.cpp to handle include file names and
	    arguments for ESP32.
          
	    Move watchdog services to a module and call them as
	    subroutines so ESP32 platform differences can be handled
	    in one place.
          
	    Rework reboot reason logic to handle ESP32 differences.
	    Add a normalized hardware reason to help use common code.
          
	    Create loggerwifi.h as a central place for ESP32
	    WiFi include file differences.
          
	    Disable WiFi sleep code for ESP32. The services are not
	    present.
          
	    Disabel deep sleep for ESP32.
          
	    Rework update.cpp to handle different ESP32 class names
	    and include file names. Disable callbacks on ESP32 because
	    they are not available.
          
	    Use hardware serial ports instead of software serial ports
	    for Modbus interface. Likely a different serial port than
	    0 must be used.
          
	    Many changes to SD card output. The ESP8266 supported
	    '.write' with String and pointer to char * arguments. The
	    ESP32 does not. New routines to write to File objects are
	    created and used pervasively. This needs more robut
	    testting on files written to the SD card to save
	    parameters, save Time status and many others.
	    This occurs in files: emailalerts.cpp, flashservices.cpp,
	    namehistory.cpp, parameters.cpp, timehistory.cpp,
	    usersensornames.cpp
          | 
   
      | 20210815 | Not logged in | 
	    Library update to Adafruit Busio 1.8.3 was 1.8.2
          
	    Update libraries, likely code from these is not in use.
	    RTClib may be used.
	    Adafruit LED Backpack Library was 1.1.9 now 1.1.10.
 Adafruit SleepyDog Library was 1.4.0 now 1.5.0.
 RTClib 1.14.1 was 1.13.0.
 Add ESP32 board, version 1.0.6 is used.
 
	    Annotae changes needed for expanding the LogElement_t
	    size. No changes made yet.
	  
	    Centralize the inclusion of WiFi.h so board dependancies
	    can be in one place.
	  
	    Move use of WiFiClientSecure.h to inside the
	    emailsender.cpp
	    module which uses it instead of the .h file.
	  
	    Deprecate the use of TWI.h, osapi.h and user_interface.h
	    these no longer seem necessary.
	  
	    Move inclusion of SoftwareSerial.h and HardwareSerial.h to
	    the .CPP file of wattnodertu instead of the .H.
	  
	    Added support (but not data storage) for VL53L1X, BME280
	    and CCS811.
	  
	    Rework CHANGER to expand the LogElement_t size to 256 and
	    to parse either the old or new format.
	  | 
   
      | 20210730 | Not logged in | 
	    PROXIMITY and UV commands added to support VEML6075
	    optical UV light and VCNL4040  UV light, White light and
	    Proximity sensors. These sensors are not yet added to the
	    database and can only be accessed by their commands.
          
	    MS5637 barometric pressure is now supported by updating
	    the MS8607 support. The new sensor is exactly the same
	    without the humidity.
	  
	    i2cWriteBlock is used by the new sensors. Long delay in
	    that code
	    appropriate for EEPROM writes is eliminated. Success is
	    now reported.
          
	    Clearing I2C devices by pushing multiple clocks is
	    improved. New devices do not assume that power cycles are
	    available. Sparcfun connections do not support power
	    cycling these
	    devices.
          
	    sensorLibrary debug messages improved and then turned off.
          
	    Sleeping headers on the configuration page added.
          
	    Sketch uses 551589 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50652 bytes (61%) of dynamic memory, leaving
	    31268 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210718 | Not logged in | 
	    Feature added to display Modbus SlaveID.
          
	    Modus version included.
	  
	    Expose wattNodeMeter as a global.
          
	    Sketch uses 552665 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50700 bytes (61%) of dynamic memory, leaving 31220 bytes for local variables. Maximum is 81920 bytes.	    31268 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210712 | Not logged in | 
	    MQTT subscribes to messages correctly.
          
	    MQTT support.
	  
	    Sketch uses 550961 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50708 bytes (61%) of dynamic memory, leaving
	    31212 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210709 | Not logged in | 
	    Library update to Adafruit Busio 1.8.2.
	    Library time update to 1.6.1
          
	    Basic integration with MQTT. Test code publishes a hello
	    world message and recieves an inTopic message. No user
	    interface or data services yet.
          
	    Sketch uses 548797 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50756 bytes (61%) of dynamic memory, leaving 31164 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210702 | Not logged in | 
	    Modus version included.
	  
	    Turn off dataservices debug code.
	  
	    Increase KWH sensor count for modbus build.
	  
	    Limit to Kwh sensor for Kwh pages.
	  
	    Do not put Kwh sensors in the generic sensor list, causes
	    confusion when the graphs do not work.
	  
	    Repair names of energy registers.
	  
	    Improve main menu naming.
	  
	    Sketch uses 544637 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50352 bytes (61%) of dynamic memory, leaving 31568 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210701 | Not logged in | 
	    Increase allowed jitter to 4.
	  
	    Rework some Sensor library code for better code sharing.
	  
	    Add some menu links to give direct access to Modbus setup and units
	    settings.
	  
	    Sketch uses 547069 bytes (57%) of program storage space. Maximum is 958448 bytes.
	    Global variables use 50360 bytes (61%) of dynamic memory, leaving 31560 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210618 | Not logged in | 
	    Convert modbus floating point values to use decimal places of the
	    wattnoderegisters.h table to convert floating point
	    numbers to internal fixed point numbers that go into the
	    database. Consider changing what is stored to store the
	    floating point number in all cases where 4 bytes are used.
	  
	    Add proper reporting of Meter type Kwh sensors as
	    different from pulse count type Kwh sensors.
	  
	    Better documentation of Modbus parallel tables of entries
	    and the tables that control which registers are logged.
	  
	    Add notes about the library bug related to 0 length
	    messages invoked indirectly from i2cservicesReadFromSlave.
	  
	    Rework the selector support to handle Meter and pulse
	    count Kwh sensors.
	  
	    Improve network status time reporting to include the time
	    of the report in human form.
	  
	    Improve time collection from the clock chip to report
	    debug information includeing human readable time.
	  
	    Use shared routines for some HEX and fixed point
	    printouts.
	  
	    Sketch uses 546973 bytes (57%) of program storage space. Maximum is 958448 bytes.
	    Global variables use 50360 bytes (61%) of dynamic memory, leaving
	    31560 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210608 | Not logged in | 
	    Fix library bug for TWI loop count of 0.
	  
	    Better handling of modbus kwh energy values. Pass them as
	    floating point results. Store them as floating point for
	    previous vs current cell of table and graph.
	  
	    Reduce intervals loop to 16 per cycle instead of 32. The
	    larger group took too long before letting other tasks go.
	  
	    Sketch uses 546081 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50032 bytes (61%) of dynamic memory, leaving 31888 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210531 | Not logged in | 
	    Modbus graphs work. More testing needed. Provide counting
	    of Kwh sensors. Add menu item for Kwh meter senors as
	    differentiated from pulse counters. Reduce number of
	    modbus registers in standard build so they fit in the
	    database block.
	  
	    Enhance ELEMENT command to take a unix time.
	  
	    Improve database and element dumps.
	  
	    Sketch uses 544333 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50032 bytes (61%) of dynamic memory, leaving
	    31888 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210526 | Not logged in | 
	    Add support for Modbus Kwh differences from one sample to
	    the next, similar to pulse counting.
	  
	    When ~DR interrupts occur at too high a rate postpone I/O
	    card reads so the processing does not become overwhelmed.
	  
	    Sketch uses 541137 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50040 bytes (61%) of dynamic
	    memory, leaving 31880 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210524 | Not logged in | 
	    Some updates to handling of unconfigured LAN.
	  
	    Improved time update reporting.
	  
	    Sketch uses 539909 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50032 bytes (61%) of dynamic memory, leaving 31888 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210521 | Not logged in | 
	    Turn off debugging code in many places. Leave it on in
	    networking. Make some places depend on debugMessageLevel that
	    used to depend on DEBUG_LEVEL of high numbers.
	  
	    Rework checks for LAN configuration. Turn off network
	    report if no LAN is configured.
	  
	    Add markers with ???? for places to add Modbus kwh support.
	  
	    Sketch uses 539053 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50028 bytes (61%) of dynamic memory, leaving 31892 bytes for local variables. Maximum is 81920 bytes.
 Global variables use 50036 bytes (61%) of dynamic memory, leaving 31884 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210516 | Not logged in | 
	    IoT support output value setting from a server. Cooperates with
	    web pages on the server to set output values on command.
	    An example of the usage is the Ventus2 Charger Control
	    system. 
	  
	    Elevate some debugging messages to debugMessageLevel 2 and
	    above.
	  
	    Fix bugs in network reconnect support. Improve debugging
	    messages in that module.
	  
	    Partial implementation of SDkwh. Goal is to have that data
	    type work like pulse conting for Kwh.
	  
	    Repair Boot time reports that sometimes had negative
	    values. Simplify the code using millis() to determine the
	    uptime.
	  
	    Comments in time services.
	  
	    Sketch uses 547609 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50036 bytes (61%) of dynamic memory, leaving 31884 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210510 | Not logged in | 
	    Change handling of MS8607 to suppress display of missing
	    sensors when modbus is present.
	  
	    Report MAC address on web page.
	  
	    Sketch uses 530796 bytes (50%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50004 bytes (61%) of dynamic memory, leaving 31916 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210509 | Not logged in | 
	    First Modbus release
	  
	    Updated modbus web page message.
	  
	    Improve debug messaging for WattNode sensor.
	  
	    Update report of SDseconds datatype. Frequency of modbus
	    1035 is floating point not integer output repaired.
	  
	    Sketch uses 530796 bytes (50%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50004 bytes (61%) of dynamic memory, leaving 31916 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210421 | Not logged in | 
	    Read Differential pressure prior to each web page display
	    to make the sensor update faster for web page display.
	  
	    Sketch uses 545265 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50024 bytes (61%) of dynamic memory, leaving 31896 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210418 | Not logged in | 
	    DEBUG control of reading ADC one at a timve vs 8 at a
	    time.
	  
	  | 
   
      | 20210416a | Not logged in | 
	    Allow writing of airflow permanent parameters.
	  
	    Sketch uses 545061 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50024 bytes (61%) of dynamic memory, leaving 31896 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210416 | Not logged in | 
	    Repair computation using area factor to get correct
	    result. Allow proper input of area factor.
	  
	    Move airflow parameter settings around to isolate them to
	    the airflow sensor currently in use.
	  
	    Add a (secret) method to erase all parameters: PARAMETER
	    ERASE ALL.
	  
	    Add CRLF to some error messages.
	  
	    Increase sixe of decimalPlaces to allow for 4 digit fixed
	    point fractions.
	  
	    Sketch uses 545065 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50024 bytes (61%) of dynamic memory, leaving 31896 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210414 | Not logged in | 
	    Complete airflow sensor support for HC210. Add range
	    setting. Add a web page for Airflow setup. Add automatic
	    refresh to airflow page.
	  
	    Add Airflow Sensor zeroing for all differential pressure
	    sensors.
	  
	    Correct serial number printout at startup.
	  
	    Parameter SET button on pages is now in same column as the
	    field.
	  
	    Convert to an array of Differential Pressure sensors allow
	    the sensor type to be automatically identified.
	  
	    Sketch uses 544665 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 50020 bytes (61%) of dynamic memory, leaving 31900 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210410 | Not logged in | 
	    Allow console serial number setting.
	  
	    Add Command to test Pressure sensor init.
	  
	    Add DLVR_INIT command. Improve SERIAL command to allow
	    setting serial number.
	  
	    Rework many hex print routines to use serialHEXxxx style
	    usage that saves space.
	  
	    Complete support for Superior Sensor Technology sensor.
	    Many I2C sensors can now be checked for at the same
	    address. Only one can exist.
	  
	    Sketch uses 543477 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49952 bytes (60%) of dynamic memory, leaving 31968 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210409 | Not logged in | 
	    Airflow page automatically refreshes. Provide for
	    dfferential pressure transducer zeroing. Remove special
	    pressure datatypes.
	  
	    Add Command to test Pressure sensor init.
	  
	    Rework many hex print routines to use serialHEXxxx style
	    usage that saves space.
	  
	    Complete support for Superior Sensor Technology sensor.
	    Many I2C sensors can now be checked for at the same
	    address. Only one can exist.
	  
	    Sketch uses 543477 bytes (52%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49952 bytes (60%) of dynamic memory, leaving 31968 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210407 | Not logged in | 
	    Add Superior Technology sensor to DLVR module.
	    Implementation of read is incomplete.
	  
	    Update Airflow display to get proper decimal places.
	  
	    Change names of DLVR routines to be non-vendor specific.
	  
	    MAX11615 improve documentation and setup of device.
	  
	    Move conversion of inches to FPM to be a service.
	  
	    Sketch uses 542097 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49924 bytes (60%) of dynamic memory, leaving
	    31996 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210404 | Not logged in | 
	    Add mimimalist airflow page in a new airflow.cpp module.
	  
	    Change Millivolts from a ration of 1024 to a ratio of
	    1000, the conversion from counts in 1024 ratio is moved
	    into the device reading code. Other voltage readers do
	    not have the same ratio. COde to support datatype
	    conversion is moved to one place.
	  
	    More instrumentation in MS11615 code. There is a bug
	    reading voltage on pins 1-7 not 0.
	  
	    Guage vs differential DLVR parameter added.
	  
	    Sketch uses 541292 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49868 bytes (60%) of dynamic memory, leaving 32052 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210328 | Not logged in | 
	    Update libraries, like code from these is not in use.
	    RTClib may be used.
	    Adafruit GFX Library was 1.10.6 now 1.10.7.
 
	    Some usage of printHEXnumber routines to save space. Create LN
	    versions of them.
	  
	    Allow pressure from DLVR to be 32 bits. Provide for
	    multiple DLVR sensors at different addresses each sensor
	    controls the number of decimal places and bits to store in
	    the database. Split the
	    sensor creation to allow for compatibility.
	    Provide a pressure range configuration variable for DLVR
	    sensors. Likely will need more than one, but this may
	    become part of the sensor address configuration. Rework
	    what prints in various debug modes. Compute pressure in 64
	    bits in anticipation of DHLR sensors which use 24 bit
	    shifts.
	  
	    Add units conversion for SDpressure types. FPM is
	    calculated by formula from inches w.g. 
	  
	    Move Modbus sensor creation to processorSensors. Still
	    needs to have conflict resolution dealt with.
	  
	    More debug output control in Modbus code.
	  
	    Add retries to MS8607 calibration reading. This is likely
	    not necessary the CRC errors that motivated it were caused
	    by having two sensors attached at once. Improve debug
	    reporting.
	  
	    Split settings page moving pulse counter rations to a new
	    page.
	  
	    Improve button action list to save appropriate variables
	    to permanent memory. Use variable setting feature in
	    several places in the list.
	  
	    Sketch uses 539676 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49788 bytes (60%) of dynamic memory, leaving 32132 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210327 | Not logged in | 
	    Change DLVR initialization to support seperate invocations
	    for each address. Add a second invocation. Change datatype
	    name to not mention the I2C address.
	  
	    The library core_esp8266_si2c.cpp lost the patch for 0
	    length Twi::readFrom call. Updated in the library.
	  
	    Better control of modbus debug messages.
	  
	    Fix finding ADC when modbus code is present. Better I2C
	    init is required.
	  
	    Remove M2X from menu. Support for the page remains.
	  | 
   
      | 20210325 | Not logged in | 
	    Isolate DLVR debugging code to DEBUG_LEVEL conditionals
	    and adjust which messages print with varying
	    debugMessageLevel.
	  
	    Perform a power cycle at DLVR startup. On Rev 3 hardware
	    startup worked. On Rev 4 hardware the device was not found
	    without the reset that happens in the I/O power ON cycle.
	  
	    Disable IOT uplink when the time is set to 0. Add a
	    message to the web page to indicate this.
	  
	    Record the start time for I/O power on. 
	  
	    Change pressure units description to inH2O.
	  | 
   
      | 20210324 | Not logged in | 
	    A number of string copies from PRGMEM storage were broken.
	    These were in the area of parameter storage and recovery.
	    Web pages associated with these parameter settings would
	    hang due to a processor crash when the parameter was set.
	    The FPSTR construct was missing in many of these places.
          
	    Logging of WattNode/Modbus registers is now defined by a
	    separate table from the table that defines the register
	    usage.
          
	    Reporting of unused Modbus methods is now only at hiher
	    DEBUG_LEVEL settings.
          
	    Reading sequences of Modbus registers now does retries on
	    failures or errors.
          
	    Handling readback of Modbus write operations is improved
	    or created.
          
	    Handling of Modbus replies is centralized and cleaned up.
          
	    Database overflow is reported if too many sensors are
	    created. Summary of database space is improved.
          
	    Code space is saved when DEBUG_LEVEL is 0 in the
	    parameters module.
          
	    MODBUS_EXCLUSIVE is turned off. New information is emitted
	    with the version number if it is on. When this is on many
	    sensors are not put in the database creating more space
	    for modbus registers. Turning it on saves code space for
	    those sensor creations.
	  
	    Sensor dumping no longer puts out two copies of the units.
	  
	    Units are now available in two forms, the abbreviation
	    used when a number is output and the name associated with
	    a description or column heading.
	  
	    A modbus address of 0xff is present when parameter memory
	    is not initialized. This is now treated as Modbus devices
	    not being present.
	  
	    Several new unit types are created associated with modbus
	    register reporting.
	  	    
	    The voltage units were split into DC volts typically from
	    an ADC and AC units typically from WattNode Modbus devices.
	    A new web page is created for presenting AC voltages.
	  	    
	    A combined printout of a number with leading space is
	    created. This can occasionally save space.
	  	    
	    Format for web emissions printed extra stuff because of
	    missing break; statements.
	  	    
	    A combined printout of number and hex number is created and used in
	    a number of places to save space.
	  
	    Several strings as arguments to printouts were missing the
	    F() construct to force those strings to program space.
	  
	    Samples newer than the database were incorrectly reported.
	  
	    Database catchup reported long code delays when it should
	    have allowed them.
	  
	    Some delays were too short and when debug code was turned
	    on reported loop too long messages.
	  
	    Names used for too long a time in service loops were
	    changed to show they are calls from the main loop.
	  
	    Sketch uses 535396 bytes (51%) of program storage space. Maximum is 1044464 bytes.
Global variables use 49672 bytes (60%) of dynamic memory, leaving 32248 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210322 | Not logged in | 
	    This is version 1(84).
          
	    Added AC volts units. There be issues with DC volt
	    presentations. Needs investigation.
	  
	    Added MODBUS_EXCLUSIVE switch that configures the sensors
	    to not create I2C sensors saving room in 128 bytes for
	    more Modbus sensors. Still not room for all. This also
	    saves code space.
	  
	    Sketch uses 521832 bytes (49%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49628 bytes (60%) of dynamic memory, leaving 32292 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210320 | Not logged in | 
	    Complete logging of Modbus registers. Only a limited
	    number are possible due to space restrictions competing
	    with other registers. I/O expander logging could be
	    disabled to expand the number of modbus registers.
	  
	    Report space required for all dynamic modbus registers.
	  
	    Sketch uses 535580 bytes (51%) of program storage space. Maximum is 1044464 bytes.
	    Global variables use 49664 bytes (60%) of dynamic memory, leaving 32256 bytes for local variables. Maximum is 81920 bytes.
 | 
   
      | 20210318 | Not logged in | 
	    Improve Modbus instructions.
	  
	    Consolidate function naming code saving space.
	  
	    Rename some subroutines for clarity on their purpose.
	  
	    Report unexpected functions for the WattNode meter.
	  
	    Handle Write responses only as packets are received.
	    Eliminate packet processing for those packets.
	  
	    Add sleep support to Modbus code.
	  | 
   
      | 20210317 | Not logged in | 
	    Fix problems setting values. Add hex input.
	  
	    Fix issues with modbux reads. Resolve some interference
	    issues. Add refresh button to modbus pages. Update
	    instructions.
	  | 
   
      | 20210316 | Not logged in | 
	    Add retries to sequenced Modbus reads.
	  | 
   
      | 20210314 | Not logged in | 
	    Modbus integrated with base logger. Some issues remain
	    with modbus and I2C interference. Modbus test
	    implementation is no longer in use and the code is out of
	    date. 
	  | 
   
      | 20210309 | Not logged in | 
	    No changes to base logger. Modbus test implementation now
	    included. Completed service routines adding CRC check on
	    returned packet from meter.
	  | 
   
      | 20210301 | Not logged in | 
	    Update libraries, likely code from these is not in use.
	    RTClib may be used.
	    Adafruit GFX Library was 1.10.2 now 1.10.6.
 Adafruit GPS was 1.5.2 now 1.5.4.
 Adafruit LET Backpack 1.1.9  (1.1.8 was used up to
	    1(88)).
 Adafruit SleepyDog Library was 1.3.2 now 1.4.0.
 Adafruit STMPE610 was 1.1.2 now 1.1.3.
 Adafruit TouchScreen was 1.1.0 now 1.1.1.
 RTClib 1.13.0 (was 1.12.0 then 1.12.5 up to 1(88)).
 | 
   
      | 20210227 | Not logged in | 
	    Improvements to time chip handling, mostly associated with
	    debug reporting enabled at DEBUG 1. When to update system
	    clock and when to update time chip is improved. Reports
	    now show how much drift has occured.
	  
	    Copyright and version updates.
	  | 
   
      | 20210223 | Not logged in | 
	    Fix error in onewire debug dump code.
	  
	    Improvements to MS8607 debug code. Add retries for failed
	    conversion starts. New modules seem to require this.
	  
	    Improvements to sensor reporting for IoT uplink. Sensors
	    can now be properly created in the loghistory.php service.
	  
	    Improvements to sensor counts and space reporting.
	  
	    Loaded this version in all new modules from Network PCB.
	  | 
   
      | 20210104 | Not logged in | 
	    First backup since the conversion to the Unix based
	    DRAGONNORTHserver.
	  
	    Improvements to IoT uplink code. Turn on Debugging. Turn
	    off link simulation. Better handling of desired output for
	    pins. Might be working. Emit URL for debugging purposes
	    when an uplink is done. Improvements and bug fixes in
	    loghistory.php.
	  
	    Improvements to sensor reporting for IoT uplink. Sensors
	    can now be properly created in the loghistory.php service.
	  
	    Error checking improvements in TCA9539 handling.
	  
	  
	    Repairs to Onewire handling of long delays. Bug fixes in timeout
	    handling. Prevents improper handling of onewire devices
	    when it takes too long. Onewire system now gets notified
	    to handle the problem properly.
	  | 
   
      | 20201017 | Not logged in | 
	    Uplink of native LOGGER sensors on the loggeriotsetup page
	    now works. The sensor is uplinked with a bogus sequence
	    number of the unix time stamp for the sample time.
	    Interactions to get historic sensor values filled in
	    remain.
	  | 
   
      | 20201016 | Not logged in | 
	    Complete iotuplink controls for I/O pins. The stubs
	    mentioned in the 20200927 submission are resolved. Parsing
	    $DESIRED-OUTPUT
	    <name> <value> in a page read by the LOGGER
	    tells the system to set the desired value of an I/O pin.
	    The pin is not changed to an output by this that must be
	    done by controlling the pin on the web pages. $END-STATUS
	    tells the LOGGER that all commands are complete. The
	    LOGGER IoT page Test IO Setting button causes a page read.
	    The page may contain commands. Reporting sensor
	    status will read pages as confirmation and will see these
	    commands. This confirmation is not completely implemented
	    yet.
	  
	    Add a requirement to type DESTROY in a new field when initializing the
	    database.
	  
	    Update database creation to require a safe (NTP) time when
	    creating a new database. Improve errors associated with
	    this.
	  
	    Add additional test button to IOT control page. Test is to
	    trigger pin output state updates. This is a test mechanism
	    only which tests the connectivity of the control
	    mechanisms to the page read from the server.
	  
	    Add code to handle desired output pin states. This is
	    supported only by stubs and not connected to the real
	    outputs yet.
	  
	    Parse two arguments from $keyword lines in IOT response.
	  | 
   
      | 20200908 | Not logged in | 
	    Upgrade to Arduino 1.8.13.
	  
	    Rework reboot for wraparound. Noticed a bug after a month
	    of operation. Did not check if the bug was still present,
	    that is hard to do. Force a reboot now if current millis
	    is greater than 2**31.
	  | 
   
      | 20200728 | Not logged in | 
	    LOGHISTORY.PHP CreateDatabase action works. AddSample action
	    works. CreateNode action is NIY and should be updated
	    to create sensors and associated datatypes on the node. CreateSensor action is NIY.
	    Trivial display of history works. 
	  | 
   
      | 20200728 | Not logged in | 
	    Added LOGHISTORY.PHP to the web page. This creates and
	    displays entries in a simple database in the cloud.
	    Eventually code will be added to the LOGGER to create
	    entries and display them much as M2X did. Nothing on the
	    LOGGER side yet and the tables are primative. Nodes and
	    sensor creation forms exist and do nothing. A few table
	    entries are displayed. A few samples are displayed. Mostly
	    created so code will be backed up.
	  | 
   
   
      | 20200809 | Not logged in | 
	    Added a LOGGER IoT server page that mirrors the M2X page.
	    Not all fields are available yet. Both pages are
	    operational. Instructions in the M2X page are updated to
	    reflect that AT&T has discontinued M2X support.
	  | 
   
      | 20200619 | Not logged in | 
	    Move millisecond time wraparound to services loop.
	    Integrate it with delayed reboot that allows a web request
	    to perform a task to get an ACK page displayed before the
	    reboot occurs. Move reboot notification after button
	    processing so ACK of button press shows the ACK message.
	    Delay reboots by REBOOT_DELAY in all cases.
	  
	    Rename webStartPage to webservicesStartPage. Make sure all
	    cases do alerts. Rename webEndPage to webservicesEndPage.
	  | 
   
      | 20200616 | Not logged in | 
	    Add ALERTS command to read a file of alert bindings. Add
	    the concept of a valid range for various sensor types. If
	    the sensor is out of range send an alert to the user
	    typically by email. Other alert types are proposed. The
	    entire history of alert bindings is kept in the file on
	    the SD card. As they are read the latest binding overrides
	    all previous bindings. The bindings are read at boot time.
	  
	    Change how ONEWIRE command works it now accepts the
	    conversion delay and not just a flag as an argument.
	    Increase normal conversion time to 1 second from 750 ms.
	    Looking for why Temperature_0 is always hot. Another
	    onewire device in the same location also shows hotter than
	    ambient. Add more messages when debugMessageLevel is high.
          
	    Rename the GETNTP command to NTPGETTIME.
          
	    Add PHISTORY command to read parameter history file. Save
	    parameter changes to a history file. If parameters are not
	    recovered from flash read the history file to set them.
          
	    Add the concept of user names for sensors. Save and
	    recover at boot these name
	    bindings in a file on the SD card.
          
	    Fix a bug in how the SD card is found on old cards. The
	    bug caused the SD card to be missing on every other boot.
	    Rework code to find the SD card on startup.
	    An automatic reboot may happen if the SD card is searched
	    on the old pins on a new board. This only happens after
	    errors or if the SD card ID code fails to find the card at
	    startup. (Possible if the card was missing last time.)
          
	    Rename the flag in the startup code that always turns on Access point
	    mode.
          
	    Update M2X comments now that it is missing.
          
	    Update device ID support for most devices to have a print
	    flag.
          
	    Rework the format of the parameter table.
          
	    Fix a bug in temperature conversion to degrees F in
	    graphs.
          
	    Convert some code to common subroutines in support of
	    changes to establish, save and restore a band of minimum
	    and maximum values for a sensor. Report those values as
	    part of the class. Add printout of min and max values to
	    the table dump of the sensor class. Add setting min and
	    max values to the class. Rework printout code to support
	    setting these values as part of the sensor settings.
          
	    Fix nameing of service to print fixed point numbers. Fix
	    stringToLong to work on 32 bit numbers. Expose fixed point
	    printing service and hex printing service.
          
	    Fix most web page header printouts to report issues and
	    errors.
          
	    Make tinme change reporting quieter unless
	    debugMessageLevel is higher.
          | 
   
      | 20200529 | Not logged in | 
	    Rework firmware update. Callbacks now available. Reporting
	    of sucess and failure is improved. Two version numbers are
	    created for testing other than the version number these
	    are the same code.
          
	    Reconfigure the chart area to get time axis headings to
	    display.
          
	    A history of parameter (permanent variable) settings is saved to a file as well as
	    to permament memory. Only the users variables are saved.
	    These will be recovered from the file if reading them from
	    memory fails. In this way the users configuration follows
	    the SD card if that card is moved to new hardware. This
	    also takes care of the intermittent failure to read the
	    parameters from memory.
          
	    Increase network timeout to 2000 in hope that will allow
	    code download on a lower quality link.
          | 
   
      | 20200522 | Not logged in | 
	    Completed email alert system. Time between emails is a new
	    field on several pages.
          
	    Add yields when reading files from the SD card. A yield is
	    performed after reading each line. Time history, name
	    history and alert history are all updated.
          
	    Add services to emit a sensor name and value to a string.
          
	    Suppress NTP time adjustment printout unless debugMessageLevel is
	    elevated.
          
	    Web page argument handling is centralized for application
	    specific page arguments and added to all
	    application specific pages. This is the same basic method
	    as has been used for page arguments that are handled by
	    the non-application specific webservices. User warnings
	    generated by webAlertIssues are added to a few pages that
	    did not have them (missing database etc.).
          | 
   
      | 20200520 | Not logged in | 
	    Install esp8266 version 2.7.1 replacing 2.6.3.
          
	    Add controls and web pages for setting alert ranges. Email
	    messages are not sent yet. This adds the ALERTS command.
	    Read the alert ranges (and eventually email configuration)
	    from a file at startup. Add upper and lower limit values
	    to sensors.
          
	    Improve initial temperature handling, especially how
	    onewire temperature is reported before the first sample is
	    completed.
	  
	    Add some services for reading and reporting HEX values.
	    Also for fixed point numbers.
	  
	    Improve control of Onewire debugging messages.
          
	    If a time adjustment can not be written to the history
	    file do not keep trying. The retry happens when the SD
	    card is missing.
          
	    Rename the GETNTPTIME command to NTPGETTIME.
          | 
   
      | 20200518 | Not logged in | 
	    Improve formating of STATUS command output.
          
	    Improve messages associated with not finding the SD card.
	    Change the checking protocol for finding the SD card to
	    automatically detect old vs new pinning and prevent
	    continuous crashes when old pinning is selected on
	    hardware with new pinning. Code that intereacts with the
	    SD card now quietly handles a system where the card is not
	    inserted.
          
	    Reporting of reboot reasons for software induced reboots
	    did not catch all cases of these and reported some as
	    reboots due to a bug or crash.
          
	    A failure to log a NTP clock time adjustment resulted in
	    continuous messages when the SD card was missing. This
	    message is now emitted only
	    once.
          
	    The XML history example is now a live link instead of
	    just simple text.
          | 
   
      | 20200516 | Not logged in | 
	    Add the concept of a user name for a sensor. These names
	    are logged in a side file on the SD card in a way that
	    post analysis could show what name was in use when a
	    sample was taken. The USER_NAME command is added to test
	    the internal support for this feature. The feature is seen
	    on the Sensor Configuration page.
          
	    A test command 'LED' to turn the built in LED on and off is
	    added.
          
	    Off by one errors that caused inaccurate sampling time
	    when not sleeping are fixed. The bug was introduced with
	    the sleep code.
	  
	    Reset of the I2C bus is integrated with the I2C code. A
	    bus reset function is added and used in the I2C code. The
	    reset must still be coordinated with the I/O power code
	    because powering on I2C chips without proper reset can
	    cause latchup. The code to support this is moved around,
	    but, it still works the same way. The I2C reset routine now calls
	    the power code. Other I2C code calls the reset code. The
	    power code must still always do an I2C reset.
	  
	    M2X code now aborts without putting data on web pages if
	    off. AT&T no longer supports M2X.
	  
	    Names of some networkservices routines now follow the
	    module naming convention.
	  
	    Security checks are updated to allow pages to display
	    differently when writing is not allowed (signature not
	    given). This is used on the Sensor Configuration page as
	    part of user names for a sensor.
	  
	    Table row framing is moved out of the low level Sensor
	    print code. The caller is now responsible for row framing.
	    The sensor print just puts out the TD fields of the row.
	  
	    Some disabled debug code is put under DEBUG_LEVEL control
	    rather than being completely turned off.
	  
	    The Access Point name is displayed on the system status
	    panel.
	  
	  
	  
	    The frequency of NTP time logs in the time history is
	    reduced. One occurs at each non-sleeping boot. Small
	    adjustments may not be logged.
	  | 
   
      | 20200511 | Not logged in | 
	    Log when time is set to keep a record that allows database
	    fixup. Setting time from the database is always logged.
	    Setting time from other sources is logged if the other
	    source is of high quality and a low quality log happened.
	    There is no need to log high quality times if one already
	    happened. The DB_TIME_SET command is added to test and
	    support this. A timehistory web page is added.
          
	    Fix bugs associated with multiple files to read/write and
	    improve logic to save space in the namehistory code.
          
	    Handle some fringe cases in taking samples and starting to
	    sleep where negative time in MS was not being compared
	    correctly and resulting in a failure to sleep.
	  
	    Reboot on MS timer wraparound. This is every 24 days.
	  
	    When entering deep sleep use the lowest power
	    RF_DISABLED wakeup mode.
	  
	    Improve messages for the DEBUG command.
	  | 
   
      | 20200510 | Not logged in | 
	    Some change in a prior release caused pulse counting pin
	    pulses to cause a crash. This is fixed by conditioning the
	    SCL and SDA pins to be input types in the ISR. The problem
	    caused a panic in a yield call, probably by the Wire code
	    fixing or handling an error condition.
	  
	    Fix DEBUG command so it can set level 0.
	  
	    Add support for dynamic adjustment of microsecond to
	    millisecond ratio. Reduce jitter allowed to 2 seconds.
	  
	    Repair formatting of pin changes messages.
	  
	    Allow longer delays in network setup and search for
	    networks.
	  
	    Improve reports associate with edge sensitive device
	    detection.
	  
	    Deep sleep for network startup checks hardware startup state
	    rather than the software shutdown flag.
	  | 
   
      | 20200508 | Not logged in | 
	    Add DEBUG command to control debugging output. Many
	    changes to control messages. This works in cooperation
	    with the DEBUG_LEVEL macros which now only enable and
	    disable code. Which outputs are emitted are now controlled
	    by the DEBUG command. The setting of the debugMessageLevel
	    is stored permanently. Remove the VERBOSE command, this
	    replaces that function.
          
	    Add DEEP_SLEEP command to test deep sleep mode.
	  
	    Control output pin state prior to deep sleep. Add code to
	    put pins in a low power state that can be used even if not
	    sleeping.
	  
	    Add reports for the status of the flash database. Control
	    them based on the DEBUG command.
	  
	    Improve handling of GPS sentences and how they report time
	    adjustments. GPS sentence parsing is lightly tested.
	  
	    Add reports of the previous I/O power status to the POWER
	    command.
	  
	    Change the database header to use tenth seconds to measure
	    time between samples. The old version used milliseconds
	    and stored the value in 16 bits. Both database type are
	    recognized and using an old database is safe. the
	    DATABASE_MINOR_VERSION is now 4.
	  
	    Add the capability of deep sleeping between samples. When
	    this is enable web access is no longer available. The
	    device must be power cycled to regain web access. NOTE:
	    pressing the reboot button does not look like a power
	    cycle to the software and will not regain access, this
	    looks the same as a wake from deep sleep to the software.
	    The network and associate web services are not turned on
	    after a deep sleep. If deep sleeping is on after a power
	    cycle the system will stay awake for a while so the user
	    can regain control via normal web activity. Two power
	    cycles may be required. NTP time services are not read
	    when waking from deep sleep, a clock chip is required.
	    Code download controls and prevents deep sleeping for an
	    extended interval.
	  
	    Completely restructure the dataservices module related to
	    how it decides to take the next sample. Taking samples
	    prior to knowing the time is no longer supported. These
	    changes are in support of the deep sleep capability.
	    Improved debug message handling is part of this change.
	  
	    Rename the DataBaseState_t enum DatabaseOldVersion to
	    DatabaseBadVersion. Update the debug messages related to
	    it.
	  
	    Update DEBUG message control for DLVR pressure.
	  
	    Update DEBUG message control for MAX11615.
	  
	    Update DEBUG message control for SI7006A20.
	  
	    Update DEBUG message control for TCA9539.
	  
	    Update DEBUG message control for MS8607.
	  
	    Update DEBUG message control for Onewire. Improve clock
	    chip support. Add retries for clock chip communication.
	  
	    Allow the USB flash device to be controlled by GPIO10 or
	    GPIO16 depending on the processor board version. Automatically detect
	    and remember the board type based on the presence of a
	    clock chip. Old boards can handle the presence of a clock
	    chip so long as the first time the processor board is started the
	    clock chip is not present. The processor notices and
	    remembers this in a permanent variable. If permanent
	    variables are cleared the value of FLASH_SS_PIN may have
	    to be reset manually, 16 for old boards 10 for new.
	  
	    Rename all flashservices global routines and variables to
	    have the complete prefix in their name.
	  
	    Record the time to boot (in milliseconds). This is used in
	    deep sleeping.
	  
	    Counts of unexpected reboots are improved. Deep sleep is
	    not counted as a reboot.
	  
	    Network startup code is moved to the network module in
	    anticipation of being able to start and stop these
	    services dynamically. That is not yet implemented.
	  
	    The loggerYield() functions at startup behave differently,
	    not forcing samples out so startup can complete properly.
	  
	    Add retries to reading permanent variables.
	  
	    Handle negative times when dumping amounts of time.
	  
	    Formatting in the version printout is improved.
	  
	    Web page controls for deep sleep are added. The methods of
	    controling and responding to buttons are improved and are
	    now used for sleeping ON/OFF and temperature units
	    selection. Button background color control is fixed and
	    allows for a selectable color when a button is emitted.
	  
	    Some potential bugs are fixed due to a failure to wake up
	    for a cycle when a web page controlled value is changed.
	    Wakeup is now set whenever a web page resets and reloads.
	    Performing this task is centralized.
	  
	    When the used gets a web page sleep is prevented for a
	    time. Currently set to 3 minutes.
	  
	    Update DS3232RTC to 1.2.12 from 1.2.9
          
	    Update library Adafruit Circuit Playground to 1.10.4 from
	    1.10.3.
	    Notice that the include of SD.H works properly if placed
	    at the top of the module. It also appears that a memory
	    leak when the NTP time server was probed is now fixed.
	  | 
   
      | 20200423 | Not logged in | 
	    Add testing of light and deep sleep.
	    Add support for clock chip periodic interrupts to allow
	    testing of a possible sleep methodology. Also add support
	    for deep sleep (from a web page button) and associated recovery by reboot of the
	    system. This support is still only for testing sleep
	    characteristics. In debug modes control an I/O card output pin as deep
	    sleep is entered for testing.
	  
	    Add support for the SD card FLASH_SS_PIN to be in
	    different places to free up GPIO16 for deep sleep
	    recovery.
	  
	    Improve time detection and reporting of test that turns network by holding
	    down the onewire data line.
	  
	    Increase the NTP time request interval to 4 hours from 1.
	    This is based on observations of how often a real change
	    is needed.
	  
	    Make some subroutines local to their module which helps
	    Doxygen warnings.
	  
	    Save some space in non-debug mode by turning off symbolic
	    names for pins.
	  
	    Add code to stand down the pin states when entering sleep.
	    This will also be a place to put code that stands down I/O
	    devices, but, there is no such code currently required.
	  
	    Many comment upgrades to reduce Doxygen errors and
	    warnings.
	  
	    Some additional files added to the backup.
	  | 
   
      | 20200417 | Not logged in | 
	    Upgrade to Arduino 1.8.12.
	  
	    Add CLOCK_INTERRUPTS command to
	    test clock chip periodic interrupts. This command and the
	    associated support is presently for testing only. It was
	    used to determing that clock chip interrupts can cause a
	    processor reboot which might support deep sleeping. Deep
	    sleep is more likely to be supported by use of ESP
	    features that involve connecting GPIO16 to RST and need
	    another I/O pin (GPIO10 on the ESP-12E).
	  
	    Improve discussion of element logging that is skipped
	    because time in the database is the same or newer than the
	    time of the element to be logged.
	  
	    Improve timeout handling for web sending interactions.
	    This eliminates an issue where distant or slow connections
	    got dropouts in pages being presented.
	  
	    Add pin definitions for GPIO9 and GPIO10. Improve notes
	    about FLASH_SS_PIN for planned change to use GPIO10 for
	    this purpose on the next hardware spin freeing GPIO16 for
	    sleep wakeup code that reboots the processor by connecting
	    GPIO16 to the processor RST pin.
	  
	    Improve handling of ~DR signals. Most of changes relate to
	    improved error handling and reporting when an additional
	    cycle is required because ~DR stayed on after the first
	    pass. Some cases get postponed until the next cycle with
	    flags set to improve reporting of why postponement
	    happened. An extra read is done to see if the ~DR signal
	    clears on the first cycle or is a real indication of new
	    processing required. Which device address saw changes is
	    reported when pin changes are checked so high level code
	    can take appropriate action and do better logging.
	  
	    Watch the onewire signal to see if switch SW1 is held
	    down. This is (will be) used as an indication that networking should
	    be turned on for an interval. Incomplete battery handling
	    related to turning on the network and turning it off so
	    sleeping can occur is added. Some battery operation support is
	    added but this support is largely incomplete.
	  
	    Save a modest amount of code space by keeping pin names
	    in a data table only when debugging is turned on.
	  
	    Add discussion of sleep modes.
	    Improve discussion of sleep strategy.
	    Add debugging feature that
	    sets I/O pin 16 when shallow sleeping should occur.  Add
	    more sleep testing features. Sleep implementation is not
	    complete.
	  
	    The pins on the AC card used to detect which card is
	    present need a pullup. Drive them high to save
	    power when the pullup is in place. This also prevents multiple
	    ~DR interrupts when the pins are left floating.
	  
	    Make NTP time services quieter unless debugging is turned
	    on. Improve messages when delta to NTP report is 0.
	  
	    Change menu to have an Exports section currently populated
	    by the XML page.
	  
	 Code space report:
	 
 Sketch uses 459024 bytes (43%) of program storage space.
 Maximum is 1044464 bytes.
 
 Global variables use 44100 bytes (53%) of dynamic memory, leaving
	 37820 bytes for local variables.
 Maximum is 81920 bytes.
 
	    	    Same as 1x67 with different version number to test
	    downloads.
	  
	    	    Revet timeout on WiFiClient to 1000 after parsing header.
	    The short timeout is requred to allow command lines to
	    operate promptly. If the timeout is left short fragments
	    of the web page are lost on slower clients or distant
	    network connections.
	  
	    	    Increase handleClient delay to 1500.
	  
	    Break up some long lines is number INPUT on web pages.
	  
	    Report code update errors in some cases.
	  
	    Add additional yields to sensor reads. Do not do flush of
	    web streams at each yield.
	  | 
   
      | 20200306a | Not logged in | 
	    Add loggerFastYield and call it wherever loggerYield is
	    done wvery N times.
	  | 
   
      | 20200306 | Not logged in | 
	    Change loggerYield to not do a flush.
	  | 
   
      | 20200304 | Not logged in | 
	    Better reporting of NOT_DATA_READY.
          
	    Improve sequencing of the OneWire sampling and other uses
	    of the OneWire pin. (for WiFi on period trigger).
          
	    Add support for triggering a WiFi network on period. The
	    network is still always on, just the trigger of the on
	    period is implemented.
          
	    Shrink the size of some blocks of web page data to
	    the network.
          
          
	    Add additional DEBUG reporting of pin state and pin on periods.
          | 
   
      | 20200207 | Not logged in | 
	    Install esp8266 version 2.6.3 replacing 2.6.2.
          
	    Rework buffering sending partial content to the server.
	    The old method could have gotten errors when only a
	    partial string remained depending on exactly how
	    Stirng.substring worked.
          
	    Reformat command table.
          
	    Add Data Map page to display the map of the datastructure saved at
	    each sample interval. Move some definitions to independent
	    modules that can be shared with the CHANGER code.
          
	    Some space savings in static string allocations.
          
	    Make last temperature a signed number.
          
	    Better checking if humidity and pressure devices are both
	    present at address 0x40. Add a warning to the user.
          
	    Add the concept of named periods.
          
	    Add the concept of boolean permanent variables. Use it to
	    add display in degrees F vs degrees C.
          | 
   
      | 20191226 | Not logged in | 
	    Resolve a number of minor compiler warnings, removes some
	    arguments and some routines. Enable more compiler
	    warnings.
          
	    Provide for boolean permanent variables. This still needs
	    to display the choices as a selection of YES or NO as values
	    instead of numbers.
          
	    Allow Names for Periods to contain spaces.
          
	    Add background colors to Named Period columns.
          
	    Move parameter setting from page arguments to a central
	    subroutine. Call page starting routines more uniformly
	    providing for security and button handling. Fixes some
	    non-working REBOOT buttons. Add the concept of parameters
	    resolution that is only allowed when writing is allowed to
	    permit these support routines to be more general.
          
	    Provide for content in the EMAIL_TEST command.
          
 	   Add temperature units of F vs C. Remove a table of unit
	   names in favor of code that emits the name. This allows the
	   names to adjust for the units that change (C vs F).
          | 
   
      | 20191222 | Not logged in | 
	    Remove use of time.h in favor of timelib.h.
          
	    Add Named Periods services and web page. Allowing user to
	    establish a name for a data set.
          
	    Add support for the MAX31826 temperature reading. The
	    EEPROM is not supported.
          | 
   
      | 20191220 | Not logged in | 
	    Recognize the DS28EA000 and treat it as a simple
	    temperature device. Recognize the DS28E07 and properly
	    ignore it as an unrecognized device.
          
	    Fix bug in Firmware reload page that ignored the button.
          
	    Recognize and ignore several additonal onewire device types.
          
	    Convert to non-secure email sending. Now operational and
	    turned on. No alerts configured yet to send messages.
          
	    SMTP configuration parameters for email reporting added.
	    Service routine updated to simpler interface.
          
	    Rework storage of permanent variable names so they do not
	    consume dynamic data storage.
          
	    Secure SMTP sending class removed. It did not work
	    probably due to space conflicts.
          
	    Save space in RAM by better String and F() usage. Make
	    command list into a macro. Make pararmeter list into a
	    macro.
          
	    Move getField to general purpose services. 
          
	    Normalize include file names. Fix capitalization.
          
	    Install Servo by Michael Margolois 1.1.6 replacing 1.1.5.
          | 
   
      | 20191216 | Not logged in | 
	    Install Arduino AVR version 1.8.2 replacing 1.8.1.
          
	    Install esp8266 version 2.6.2 replacing 2.6.1.
          
	    Install Time by Michael Margolois 1.5.0 replacing 1.4.0.
          
	    Add test code for sending email. There are issuse with
	    space and security. This test currently disables normal
	    processing it is currently turned off.
          
	    Improve use of F() and associated String calls to save
	    space.
          | 
   
      | 20191213 | Not logged in | 
	    Add web page for reload of firmware.
          
	    Many space saving updates by eliminating conversions to
	    String types before calls to subroutines. Some of these
	    improve performance by eliminating the free storage
	    allocation of creating strings. More such optimizations
	    remain.
          | 
   
      | 20191209 | Not logged in | 
	    Add HANG commmand for testing watchdog reboots.
          
	    Formating updates for output.
          
	    Rework checking for delays to use more common code, use
	    more static string arguments and to disable more cases
	    unless debugging is turned on.
          
	    Add support for the DS2417 and DS2415 time chips. Accept
	    time from a time chip
	    when it is available on startup. Rework onewire code to
	    allow for chips that do not supply a CRC with their data.
	    (This code is now tested.)
          
	    Add user visible reports of too many onewire devices seen.
          
	    Report changes in stored parameters only when there is a
	    differnce.
          
	    Detect reboot causes better. Note reboots due to system power up and count unexpected
	    reboots independently from power on reboots our update
	    reboots. Report more
	    reboot type information.
	  
	    Remove underline decorations from menu items. Rework some
	    menu formatting.
	  
          
	    Add UPDATE command to update from a Binary file on the
	    Dragonnorth server. Web page support not yet available.
          
	    Install Adafruit Circuit Playground version 1.10.3.
	    replacing 1.10.2.
          | 
   
      | 20191121 | Not logged in | 
	    Install Adafruit Circuit Playground version 1.10.2
	    replacing 1.10.1. Install esp8266 board version 2.6.1
	    replacing 2.5.2.
          
	    Update routines that check for delay to use constant ROM
	    string arguments. Rename a number of these routines to use
	    different names based on argument type. Find a bug with
	    the inclusion of the SD.h library that caused conversion
	    to dynamic strings at the call to the time routines.
          
	    Change web page output to include CR LF after each block
	    of HTML. This makes automatic formatting work when the
	    source HTML is captured from the browser and placed in an
	    editor.
          
	    Improve comments associated with ISRs, sleeping and locking.
          
	    Add code to support onewire clock chips DS2417 and DS2415.
	    Add detection and reporting of a number of other onewire sensors without
	    support for those sensors. Set time from these chips at
	    boot and store time in them as time is set by other means.
	    One of the chips is selected to use for this purpose. The
	    same chip will always be selected in a static hardware
	    configuration.
	    This code is untested.
	    Rename some routines and variables
	    in anticipation of adding onewire sensors other than
	    temperature.
 | 
   
      | 20191114 | Not logged in | 
	    Provide menu items for more sensor types.
          
	    Move all javascript to the head portion of the web page.
          
	    Improve timeservices debug reporting.
          
	    Fix bug reporting time since boot when time is not yet
	    set.
	  
	    GPM and LPM implementation completed.
          
	    Change the ESP command to be a CPU command.
          
	    Isolate time checks from loggerYield.
          
	    Testing and status code added to espserver.cpp.
          
	    Proper recovery of pin types at boot.
          
	    Convert time checks for delay to use constant string
	    arguments.
          
	    Improve some time checks. Remove a few unnecessary checks.
	    Isolate what the checks apply to so reporting will be
	    better.
          
	    Resolve issues passing F() arguments to subroutines that
	    were quietly converting arguments of ROM strings to String
	    type.
	  | 
   
      | 20191104 | Not logged in | 
	    Correct errors in production of web pages that resulted in
	    non-matching blocks. This causes some devices to look like
	    they had lost data.
	  | 
   
      | 20191030 | Not logged in | 
            Add loggerYield calls in web services support code to
	    ensure data is logged while waiting for web services.
          | 
   
      | 20191028 | Not logged in | 
	    Also built as 1(47)-127.
          
	    When a line from a WiFi client and the line is not
	    terminated with a LF wait a little while (10ms) to see if
	    more characters show up. This resolves issues where
	    clicking on a button seemed to lose the arguments that
	    were used to display the current page.
	  
	    Find and partially repair issues in client handling that resulted in
	    poor performance when the LOGGER satisfied a request for a
	    web page. The original code was
	    stuck in handleClient() until the web client terminiated
	    (or a related timeout occured). This failure improved by
	    limiting the retry activity to 550 ms.
	    The handleClient() routine was called
	    frequently (this is now required). The new timeout limits
	    how long waiting can be.
          
	    Handle parameters to a web page that use only LF to end a
	    line. CR LF pairs are still what is normally expected. A
	    lone CR is never expected. This prevented long hangs when
	    the lone LF occured.
          
	    Initialize pins to be inputs by default. Improve pin
	    status initialization related to recovering pin status at
	    startup. Do not recover pin status for pins that control
	    edge detection hardware.
          
	    Rework menu to improve clarity, seperate items derived
	    from pulses from actual sensors. Expose Temperature,
	    Humidity and voltage directly.
          
	    Improve delay checking. Adjust some allowed delay times to larger
	    numbers.
	  
	    Improve some comment formatting to support DOXYGEN.
          
	    Improve reporting of NTP time updated when no time
	    difference is noticed.
          
	    Make I/O expander pin configurations and desired outputs part of the
	    data saved across reboots.
          | 
   
      | 20191023 | Not logged in | 
	    Add table to get liters per minute from pulses. Gallons
	    per minute are computed internally from liters per minute
	    units.
          
	    Add humidity page. Rework menu to identify sensors and pin
	    types.
          
	    Change default home page.
          
	    Add Voltages to the menu. Make selection of sensor types
	    more generic.
          
	    In handleClient go back to looping until the client is
	    available or disconnects.
          | 
   
      | 20191021 | Not logged in | 
            Some changes prior to 20191009 are reported here.
          
	    Report timing and status in espserver.cpp. This helps find
	    a bug in web page header parsing where lines formed
	    without CR LF pairs wait for a timeout. The timeout is
	    reduced but the bug is not really repaired.
          
	   Update comment format for improved DOXYGEN parsing. 
          
	    Change the network up test timing so it uses 13 minutes
	    instead of 10. This helps determing what the cause of a
	    reboot is.
          
	    Add the ICACHE_RAM_ATTR attribute to ISR routines so the
	    latest version of the locator will place them properly.
          
	    Add flow services for LPM based on a counter. The ratios
	    are hard coded and need to be updated. A parallel set of
	    pages for GPM should also be implemented using the same
	    set of ratios and a known ratio between liters and
	    gallons.
          
	    When running as an access point do not go to the WAN for
	    time.
          
	    Improve messages printed when an NTP time update shows no
	    delta.
          
	    Update copyright and version notices.
          
	    Add direct menu support for presenting temperature pages.
          
	   Add additional reporting of long delays with
	   timeservicesCheckForDelay calls.
          
	    Remove license grants to Airborne Sensors.
          | 
   
      | 20191009 | Not logged in | 
	    Convert to Arduino 1.8.10 and update libraries to the
	    latest versions.
          
	    Rework as needed for Windows 10 and winzip 24. Repair some
	    zip operations to include more things in the release.
          | 
   
      | 20171224 | Not logged in | 
	    Allow "" for the value of a parameter to clear the value
	    in the PARAMETER_SET command.
          
	    Add a page to report average RPM in an interval based on
	    the pulse count inputs.
          
	    Do a better job of limiting to pulse counting pins. Used
	    for new RPM page and on the Kilowatt hours page.
          
	    Repair some off by 1 issues in the number of columns in a
	    graph and lines in a table of values. Also update the
	    start and end times of the graph so the first and last
	    bars are not partially obscured.
          
	    Initialze the map of pulse counting pins to sensorID. This
	    fixes a latent bug if the map was ever used with some
	    cells uninitialized. This also allows the RPM and Kwh
	    pages to skip pins that are not pulse counting pins. The
	    old code worked because the pulse counting pins were
	    always in a group at the beginning of the list of pins.
          
	    Add a test to see if a sensor ID is a pulse counting pin.
          
	    Fix error reports for non-existant parameter name to
	    include an EOL.
          | 
   
      | 20171030 | Not logged in | 
	    Report cause of reboots.
          
	    Report count of reboots.
          
	    Detect software reboots and report that as the cause of a
	    reboot. A software reload followed by a reset button push
	    will report a cause of UNKNOWN.
          
	    Add SLEEP command support for making the network sleep.
	    This is only for power consumption testing during a
	    controlled sleep.
          | 
   
      | 20171008 | Not logged in | 
	    Repaired reboot reason so it is reset after each boot. It
	    should now say the reboot reason is unknown if a crash
	    occured. Add a count of the number of reboots.
          
	    Report the array of bits that marks if a variable should
	    be uploaded to the M2X cloud as a numeric value instead of
	    a string.
          
	    Turn on reporting of database start and end times and
	    indexes.
          | 
   
      | 20170913 | Not logged in | 
	    Added GPS fix parsing commands. They only look at the time
	    and are largely untested. If a $GPZDA message is recieved
	    on the serial port the time is set. Time services are
	    updated to log that the time setting came from a GPS
	    message.
          
	    Added the concept of a read transaction to flash
	    processing. This eliminates the need to open and close the
	    file for each sample that is read and dramatically
	    improves the speed of displaying a large number of points.
          | 
   
      | 20170903 | Not logged in | 
	    Added Sleep command for testing low power processor sleep
	    modes. The implementation is incomplete.
          
	    Report the last reboot cause in a number of places.
          
	    Fix format of MAC address reporting.
          
	    Fix reporting of numeric permament variables.
          
	    Provide a link to the security setting page in the main
	    menu.
          | 
   
      | 20170615 | Not logged in | 
	    Rename all public i2cservices routines to start with the full
	    prefix 'i2cservices'.
          
	    Update some ??? comments to improve the discussions. Make
	    some into @@@ comments.
          
	    Proper humidity reporting from the MS8607
	    pressure/temperature/humidity device. More complete
	    temperature compensation as well.
          
	    Add 10 minutes as an allowed interval for the time between
	    samples. Add a quarter of the year as an allowed time
	    period in the choices of web presentations.
          | 
   
      | 20170522 | Not logged in | 
	    DNS now works. The Time server is first tried via DNS
	    lookup. If that fails there is a static IP coded that may
	    work.	
          
	    Fix a bug in the detection of the AC module. The module
	    will now only operate if the jumper above left of R82 is
	    shorted. the 1(32) version would never detect an AC
	    module.
          
	    The calculation of the MS8607 pressure and temperature now
	    do the second order adjustment specified in the data
	    sheet. This is a complex change to the calculation with
	    two inflection points one at 20C and the other at -15C.
          
	    I/O expander pins are renamed IOx_P00 - IOx_P17.
          | 
   
      | 20170521 | Not logged in | 
	    When a reboot occurs if time is not available use the
	    latest time in the database.
          
	    Improve DNS code, but, using it hangs when it tries to
	    translate the name of the time server. Update the static
	    IP of the default time server.
          
	    Add more debugging printouts to the onewire code.
          
	    Add Atmospheric Pressure datatype and use it to report
	    MS8607 pressure in millibars.
          
	    Add automatic detection of I/O module type. Report if an
	    unexpected type is at any address. Allowing 4 I/O modules
	    of arbitrary type is possible but the database would then
	    need to handle configurations differently or pre-allocate
	    all possible types.
          
	    Rename the DVLR table of I2C addresses.
          | 
   
      | 20170514 | Not logged in | 
	    Update MS8607 code to properly read an convert pressure
	    and temperature values. Humidity still has no response,
	    does not seem to be a hardware issue, several modules fail
	    in the same way. Lots of
	    issues and inefficient time to read remain to be resolved.
          
	    Report the hardware serial number in web pages and version
	    printouts.
          
	    Update parameter reporting to have number, string and HEX
	    types. This makes reports of Onewire devices better. There
	    is no support for the HEX type to be a settable
	    parameter.
          | 
   
      | 20170430 | Not logged in | 
            Released as 1(30)-100
          
            Prevent early error about how long onewire waits for the
            first result.
          
            Report I2C errors more cleanly.
          
	    Add SerialNumber parameter to allow a Logger hardware
	    serial number to be set and reported. The software only
	    allows it to be set once.
          
            Repair temperature sensor creation for placeholder
            temperature sensors.
          
            Improved MS8607 support still does not properly detect and
            initialize the component. Add sensor types to support
            MS8607.
          
            Initialize onewire sensors in a better place so
            temperature sensors will always be in the same place in
            the database structure.
          
            Change AC detector bit order of the I/O chip to match the
            production layout as built by AMI.
          
            Report Serial number on the web pages.
          | 
   
      | 20170424 | Not logged in | 
            Updates to recognize different types of I/O cards that
            occur at the same I2C address.
          
            Add MS8607 pressure device. Add I2C support for a read
            operation without reading data.
          
            Add a hardware version that is stored as a permanent
            variable. Currently not needed to ID hardware.
          
            Update onewire testing to give new parts found a unique
            new Temperature_xxx name. Realize that 8 temperature parts
            should always be created, but, not done yet.
          
            Fix some outputting formating.
          | 
   
      | 20170327 | Not logged in | 
            Emit uints as part of sensor information on sensors page.
          
            Add controls to emit hours, minutes and seconds fields as
            part of an ammount of time output. Emit the hours and
            seconds in a few places where that makes the interface
            more understandable.
          
            Add a new control to set number of columns as an amount of time
            which computes the count based on the current time span.
          
            Make calculation of interval a part of the start and end times central
            function. This fixes bugs in setting the interval and
            presenting it properly.
          
            Update the chart boilerplate. This may improve the
            emission of time labels at the bottom of the chart.
          
            Improve some Doxygen comments.
          
            Fix bug in calculation of average amps in an interval.
          | 
   
      | 20170315 | Not logged in | 
            Set a more sensible DEFAULT_INTERVAL.
          
            Report system status in menu panel.
          
            Rework formatting of version numbers on version page and
            in footer.
          
            Rework time capture for all interval reporting pages per
            suggestions from David.
          
            Limit heap space reports at startup.
          
            Turn off M2X debugging. Turn off network debugging.
          
            Improve reporting of sensors in use, use report in menu
            status.
          
            Improve and correct reporting of amount of time to show
            leading 0s. Same for emitting a number. Control leading 0s
            when emitting a number to supply them or not as
            appropriate.
          
            Report time since logging started.
          
            Fix area of graph to allow more digits in column units.
          | 
   
      | 20170309 | Not logged in | 
            Record when logging started and present up time.
          
            Print a list of networks at startup. This seems to clear
            up a number of hangs and bad presentations when the LAN
            network can not be found.
          
            Isolate database declarations so they can be used in a PC
            application.
          
            Enable M2X debugging reports.
          
            Increase columns in the graph.
          | 
   
      | 20170216 | Not logged in | 
            Increase delay that triggers console reports of long
            usage.
          
            Add buttons to move forward/back by Minute, Hour, Day,
            Week, Month and Year. Change misspelled names of selector
            subroutines.
          
             Update size of numeric input fields to match real number
             sizes.
          
            When pulse counting pins are not available report that KW
            and Pulse count pages are not available.
          
            Improve time delay reporting at the start of web page
            display.
          | 
   
      | 20170213 | Not logged in | 
            Improve the reporting in the STATUS command.
          
            Add a CONNECT command to force a network reconnect. Add
            logic to the network module that allows users of the
            network to report sucess or failure on usage. If a bunch
            of failures happen in a row try to reconnect to the
            network.
          
            Improve handling of the sensors that need to call a
            pre-read function a while before taking a sample. Make
            sure that a failure in wait for completion of the pre-read
            routines prior to taking a sample does not prevent the
            system from taking the next sample.
          
            Rework pulse pin handling to do the counting in ISRs. When
            the I2C system is busy during the ISR then postpone the
            count for the main loop. This prevents missed counts due
            to long operation times in the main loop.
          
            Improve yield reporting for excessive time taken in the main loop
            routines.
          
            Add control of which sensors are supposed to uplink to
            M2X. (Cloud logging.)
          
            Improve onewire reporting of errors. Add retries when a
            CRC error occurs on a read. Add improvements to make sure
            parasitic reads will work properly. Test parasitic reads
            (two sensors are OK).
          
            Fix a number of places that should have used SensorID_t
            datatype.
          
            Reconcile a number of ??? comments.
          
            Once we know the time never decide that time is invalid.
            Invalid time can prevent logging in the database.
          | 
   
      | 20170210 | Not logged in | 
            Convert pulse sensing to an ISR so pulses will not get
            missed when there are long intervals in the main loop. Add
            ISR read support to the I2C module. Postpone the pulse
            counting if the interrupt occurs during some other I2C
            read. Read all pins as a single word to reduce the I2C
            traffic. Handle cases where the pins are scatterd among
            many I2C modules.
          
            Rename i2cXXX routines to be i2cservicesXXX.
          
            Add a watchdog test command. Try to ensure that the
            watchdog is on and will fire if code does not run. There
            still appear to be system hangs that do not fire the
            watchdog.
          
            Print the Sensor ID to the console when verbose printing
            the sensor info.
          
            Eliminate loggerYield with no indication of what code
            wants to yield.
          
            Make checking for unexpected delays the responsibility of
            the routines called out of the main loop. The main loop
            retains one check for 500ms. Any delay that makes a major
            contribution to that must be checked in the service code.
          
            Report the reason for the last reboot.
          | 
   
      | 20170207 | Not logged in | 
            Fix a bug where changing the start and end times did
            not update the graph until the next page load.
          
            Add the ESP command to dump processor characteristics
            and space.
          
            Add M2X reports of all sensors in an element as one
            HTTP message. Previous code did these one at a time.
            Change reporting of sensor names to report the C string
            version of the name.
          
            Add reports of heap storage usage. Reboot if heap storage
            gets low. Add a report variable that logs in permanent
            memory the reason for the last reboot.
          | 
   
      | 20170205 | Not logged in | 
            Report lists of sensors on lines of a table instead of
            as lines with line breaks.
          
            Integrage M2X. Add a configuration page for M2X. Report
            periodically to M2X. Add the concept of fetching a
            floating point value for a SensorIR in an element.
          
            Improve checking for maximum expected delays to allow
            for long delays that are expected. The previous code
            had a fixed maximum.
          | 
   
      | 20170202 | Not logged in | 
            Prevent divide by 0 if the number of intervals is
            small.
          
            Fix several bugs in the calculation of intervals and
            the presentation of intervals that msde the table and
            graph different from each other and had the endpoints
            different from the declared time span.
          
            Fix a bug where the table at the end of a page was not
            closed properly.
          | 
   
      | 20170131 | Not logged in | 
            Add loggerYield() and call it in many places to allow
            database sampling and logging to go on in the face of
            other task activity. Report long time delays.
          
            Add checks for long task delays.
          
            Fix a bug where a blank line intended for the web
            output was being printed to the console.
          
            Fix a bug in the counting of disabled sensors.
          
            Add a discussion of how pin counting should be moved to
            an ISR. This is not implemented yet.
          
            Add fractional amount of time printing services. Use
            these services to print the length of intervals being
            graphed and the total time presented in the graph.
          | 
   
      | 20170129 | Not logged in | 
            Fix I/O pin control page so a sensible pin of an I/O
            module that is present is always
            selected and displayed as the default pin. (Previously
            tried to display a pin of a missing module.)
          
            Prevent a divide by 0 error in calculating temperature
            when bad data is returned from a onewire device (all
            0s were probably observed).
          
            Fix a bug in calculation of pulses over all time and in
            calculation of total pulses. Old code got too few
            counts and the all time calculation stopped at the end
            of the interval being inspected.
          
            Add support for reporting Watt Hours, similar to
            reporting pulses but adjusting units and adjusting for
            the ratio of pulses to milliwatt hours. Add 8 permanent
            variables to manage the adjustment. As defaults Pulse_0
            and Pulse_1 are set up for 15 amp CTs. Pulse_2-5 are
            set up for 100 amp CTs and Pulse6-7 are set up for 400
            amp CTs.
          
            Clean up naming of subroutines that read earliest sample time
            and newest sample time.
          
            Improve handling and reporting of onewire devices that
            as a result of read errors get bad values for counts
            per degree C.
          
            Fix selection of I/O pins to restrict selection to only
            pins of I/O modules that are present.
          
            Try to put time markers on the graphs X axis. Not working
            correctly yet.
          
            Save RAM at web page registration by using
            String(F("")) construct.
          | 
   
      | 20170125a | Not logged in | 
            Additional improvement to database catchup.
          
            XML control page implemented. Menu updated to go to
            that page which invokes the original XML download with
            user supplied arguments. Some documentation on the page
            for the XML download.
          
            Onewire devices now convert temperature in parallel
            reducing the total time to less than 1 second. Sampling
            1 per second should now work.
          | 
   
      | 20170125 | Not logged in | 
            Much faster database catchup.
          | 
   
      | 20170123a | Not logged in | 
            Fix a bug in XML output where the closing tags were
            lost.
          | 
   
      | 20170123 | Not logged in | 
            Rename menu items. Create Sensors page with only the
            values. Create Sensor configuration page with all
            sensor details.
          | 
   
      | 20170122 | Not logged in | 
            Fix a bug in graphing when illegal values are present
            in the database. Those values must get a placeholder in
            the array of elements being graphed or the graph will
            not display.
          
            Truncate the DLVR_Temp sensor name so it fits in the
            available space in the internal table of names.
          
            Rework the naming in the menu, changes the names of
            some pages. Use History and Sensors for the new names.
            Sensors now does a simple list of all sensors.
          
            Use 'Columns in the Graph' and 'Lines in the table'
            instead of 'Samples'.
          
            Change the name of the Sensors page to Current Sensor
            Values have it emit the non-verbose form. Add a Sensor
            Configurations page with the verbose sensor output.
          
            Fix discussion of adding Temperature sensors to wait in
            the right places.
          
            Add verbose printout to sensor printing, this changes
            how XML is emitted by not emitting the units field for
            sensor printout.
          
            Add verbose/non-verbose dump to the SENSORS command.
          | 
   
      | 20170121 | Not logged in | 
            Handle cases where there are no points to graph. Give a
            sensible user depiction.
          
            Better reporting of database existence and creation.
            Report database issues on web pages. Sequence the
            database up so retries are handled nicely and the
            system is quiet if the database is missing from a
            missing card.
          
            Improve handling and reporting of time between samples.
            Report times that are too long to read all
            temperatures.
          
            Repair time triggers to work off the millis() counter
            rather than the Unix clock. This resolves issues if the
            clock jumps due to time setting.
          
            Resolve issues where sensor reading might need more time to complete befor a
            sample is logged.
          
            Improve debugging printout to use the DEBUG_LEVEL
            symbol pervasively. Better control what is printed in
            cases where the level is set to 1.
          
            Improve the naming of sensors to hide the I2C address
            in most cases while still keeping sensor names unique.
          
            Improve some internal subroutine calls to accept String
            arguments and use the F("") structure to reduce the RAM
            footprint.
          
            Add a reboot button to the network configuration page.
          
            Keep track of number of sensors displayed so web pages
            can produduce errors or sensible messages when there is
            no underlying data. Print a sensible message instead of
            a chart with an obscure message.
          
            Improve reporting of Si7006 configuration and state.
            Improve knowlege of when the device is present because
            serial number read errors occur with high processor
            voltage.
          
            Make date and time reporting for web pages part of the
            timeservices module
          
            Report the I2C address used when reporting the sensor
            details.
          | 
   
      | 20170117 | Not logged in | 
            Put hacks in core_esp8266_si2c.c library to better
            identify why writes fail. Include bug fix for 0 length
            reads.
          
            Fix minor compilation problems in SMALL_CONSOLE build.
          
            Fix problems in output conversion of DLVR sensor.
            Disable DEBUG_PRINT outputs.
          
            Fix problems in determining if a humidity sensor is
            present. Fix problems reading the user register and the
            heater configuration, report these values. Attempt to
            fix reading the serial number but that does not seem to
            work. Code around the issue. Add commands to better
            debug I2C issues.
          
            Add reset support to i2cservices. Add commands to pulse
            the SDA and SCL lines. Turn off DEBUG_OUTPUT in I2C reporting.
          
            Fix compilation warnings for initialization order in
            espserver.cpp. Fix compilation warnings for unused
            arguments in several modules.
          
            Rework I/O card power on sequence and reset the I2C
            support when power is turned on.
          
            Clean up presentation of Access point and Network to
            join. Add setting sample reading frequency.
          
            Clean up reporting of illegal temperatures and of
            temperatures that take on the initial value in flash.
          | 
   
      | 20170113 | Not logged in | 
            Version 1(8)-52.
          
            Improve ISCAN to do single address on request.
          
            Allow disabling of EXPERT mode.
          
            Change default bytes of address for IREAD command.
          
            Resolve a number of compile time warnings related to
            comparing different data types.
          
            Add DEBUG_OUTPUT to I2C reporting so it can be turned
            off.
          
            Change some menu item names. Add Version to the menu.
            Print copyright notices for Lesser GPL libraries.
          
            Fix a bug in reporting of missing I/O pins so it
            reports NO PINS when the board is missing.
          
            Fix a bug in triggering time updates from the web
            pages. Report if time is not set.
          
            Make use of GMT obvious.
          | 
   
      | 20170110 | Not logged in | 
            Add a web page to manage the database. Add a mechanisim
            to erase the database. Add a reboot button.
          
            Add a web page to manage the onewire history. Add a
            mechanism to erase the onewire history. Add a reboot
            button. Move the onewire history list to this page.
            Change the names of the sensors in the list to
            Temperature_xx from ONEWIRE_xx.
          
            Complete the DLVR pressure sensor services.
          
            Rework use of constant strings to store them in flash.
            Make more service subroutines accept strings instead of
            constant pointers because a quoted string is actually
            stored in RAM. Use the F("") structure to force strings
            to flash. Use println instead of \n.
            Review consoleio, security, sensorlibrary, services,
            tca9539, timeservices, webservices, webpages and
            xmlservices modules.
          
            Use service routines to test argument presence so F("")
            can be used as arguments instead of simple quoted
            strings.
          
            Repair elapsed time comparisons in i2cservices to avoid
            wraparound bugs. Fix handling in i2cReadFromSlave to
            not use write operations.
          
            No longer use a delay in the search for networks. It is
            not needed.
          
            Normalize the language that discusses permanent
            variables to call them parameters in user facing
            locations. 
          
            Update usage of "" to be F("") where possible.
          
            Add services to support empty string detection and
            indentation printout.
          
            Add indentation control in sensor printout. Fix
            indentation of the XML file output. 
          | 
   
      | 20170107 | Not logged in | 
            Fix a bug where a disabled sensor could be emitted.
          
            Fix a bug in the code that prevents creation of
            duplicate uniqueIDs. Handle creation of a duplicate
            correctly, turn the sensor on when identified.
          
            Find and repair a number of prints of single characters
            that put the character in a string instead of emitting
            it directly.
          
            Report totals sensors and bits used in SENSOR summary.
          
            Store onewire sensors found in permanent variables. For
            all of the sensors read from permanent variables create
            a sensor and disable the sensor. As the sensors are
            detected enable them. This ensures that the
            temperatures will have the same name and location in
            the database and thus that sensor data reported against
            a single unique ID will always come from the same
            sensor. Improve reporting of sensors found and the
            associated IDs.
          
            Add the concept of reporting a string of HEX digits to
            permanent paramters, this is used for onwire IDs.
          
            Tickle the watchdog more places in initialization.
          
            Use symbolic program name for access point SSID creation.
          
            Code around missing TimeLib.h in older Arduino
            versions.
          
            Report element storage time in microseconds rather than
            milliseconds.
          
            Update printout of Version and copyright at startup.
          
            Rework a number of printout services to have dump
            styles which return a String and print styles to emit a
            string.
          
            Improve clarity of database version reporting.
          
            Update pressure sensor initialization and humidity
            sensor initialization to always create
            the sensors and to disable the sensors if not present.
          
            Decommit non-blocking flash services support.
          
            Rework I2C console messages to improve clarity of
            the printout showing what is an I2C address.
          
            Rework use of setTime to report time differences and
            use proper units as arguments to prevent compile time
            errors.
          | 
   
      | 20170105 | Not logged in | 
            Released as 1(4)-43
          
            Add onewire historical sensor setup to keep sensor ID
            and order in the face of sensor removal and addition.
          
            Rename consoleioLoop to avoid a conflict with a new
            library.
          | 
   
      | 20170104 | Not logged in | 
            Improved startup reporting. Improved version reporting.
            Improved onewire dumping. Improve formatting of network
            status output.
          
            Fix Onewire temperature error reporting to properly
            emit ILLEGAL_TEMPERATURE value and to properly hide any
            data reports with that value.
          
            Handle onewire temperature reads in sequence by
            creating onewireservicesLoop(). Manage
            type S parts and non-type S parts better and with less
            special code.
          
            Create a
            generic mechanism to preread sensors that require long
            setup times N
            seconds before a sample is logged.
          
            Tickle the watchdog more places during startup. Add
            yield() calls in places to allow better networking
            behavior.
          
            Improve EEPROM writing to avoid writes that do not
            change the value.
          
            Increase allowed command lengths in console I/O.
          
            Added DLVR support including PRESSURE command. (Device
            reading is not working.)
          
            Rework I2C conversions to run in the background.
          
            When saving a parameter to the EEPROM skip the write if
            the value is unchanged.
          
            Update format of I2C address output to include leading
            0s.
          
            Pervasive change to string constants to use the F()
            mechanism and reduce the dynamic memory used for
            strings by 25K bytes.
          | 
   
      | 20170101 | Not logged in | 
            Add time measurement to the STATUS command.
          
            Perform better WiFi initialization to make power cycles
            more reliable.
          
            Review all ??? comments. Trigger time update from the
            web on button press.
          | 
      
         | 20161230 | Not logged in | 
               Limit output to a single sensor works. Sensors all will
               configure to the same place in the 128 byte block.
               Improve interval totals.
             | 
      
         | 20161224 | Not logged in | 
               Major restructure of sensor creation and reporting.
               Trying to reinit sensors with the same uniqueIDs and
               failing.
             | 
      
         | 20161220 | Not logged in | 
               Number of sensors increased. Number of pulse counters
               increased. Output order on web page changed
               to newest first. 
             | 
      
         | 20161219 | Not logged in | 
               Humidity sensor works.
             | 
      
         | 20161205 | Not logged in | 
               ADC pin sensing works. Latches do not.
             | 
      
         | 20161129 | Not logged in | 
               Update ADC input. Partly working.
             | 
      
         | 20161116 | Not logged in | 
               Rework release and build mechanisms.
             
               Update ONEWIRE command to read all devices present.
             
               Fix reading method of PIN command to properly get the
               port address. Still crashes if used.
             | 
      
         | 20161113 | Not logged in | 
               Addition of NETWORK command to display network status
               on the console.
             | 
      
         | 20160328 | Not logged in | 
               Addition of security model. Addition of DOXYGEN
               documentation.
             | 
      
         | 20160323 | Not logged in | 
               XML file creation.
             | 
      
         | 20160322 | Not logged in | 
               Manual time setting on a web page.
             | 
      
         | 20160320 | Not logged in | 
               Pulse counting removed from processor and moved to
               TCA9539 sensor module.
             | 
      
         | 20160315 | Not logged in | 
               Major rework for common code with ESPcamera.
             | 
      
         | 20160311 | Not logged in | 
               Chip select for SD card was on GPIO 15, when the small
               PJRC adapter is used this causes a problem when
               booting, the device boot to the boot loader all the
               time. This control has been moved to GPIO 16 to avoid
               this issue.
             | 
      
         | 20160311 | Not logged in | 
               TCA9539 I/O Control from web page is complete.
             
               Update formatting of Sensor output. Update naming of
               some controls.
             
               Rework Sensor configuration to work a bit at a time.
               Configure individual processor pins and individual pins
               of the TCA9539. Interval counting is disabled.
             
               Integration of TCA9539 works for input and output.
               Output controlled only from console commands. Input
               integrated with web pages.
             | 
      
         | 20160307 | Not logged in | 
               Mode reporting updated. Format of samples repaired.
             | 
      
         | 20160226 | Not logged in | 
               I2C reading and identify is working. Not yet doing
               anything with the I2C parts. Currently recognize an I/O
               expander and a Pressure sensor.
             | 
      
         | 20160224 | Not logged in | 
               Accept manual time setting as OK for database use.
             | 
      
         | 20160223 | Not logged in | 
               Better logic at startup for AP mode choices.
               Better error reporting for network issues. Stay in AP
               startup mode if we don't know what network to join.
             | 
      
         | 20160222a | Not logged in | 
               Added a restriction of data types for display.
             | 
      
         | 20160222 | Not logged in | 
               Issues with adding Frequency1 were an alignment fault
               trying to read a 4 byte value on a 2 byte boundary.
               These issues are now resolved.             
             | 
      
         | 20160221 | Not logged in | 
               Pulse counting back on. I2C off.
               Frequency1 off. Frequency2 on.
               Graphing improvements.
             | 
      
         | 20160215a | Not logged in | 
               Rework to use new log format which supports dynamic
               variable creation. Lots of formatting changes. Rework
               I/O to use the virtual print class to enable better
               sharing.
             
               Added OneWire support. Added automatic configuration.
               Added new element format, dumps and associated support
               but not yet using it for logging. Added sensors page
               that lists sensors detected. Added IP address to
               network page.
             |