ImportCumulusFile

Name: ImportCumulusFile
Type: PHP
Author: David A Jamieson / Mark Crossley
Contact: 'DAJ' / 'mcrossley' via the forum
Last update: 04 May 2020
Version: 4.0

This is a PHP script designed to run on your webserver and import Cumulus log files into a MySQL database on your server.

Requirements

The web server must have..

  • PHP
  • MySQL
  • A My SQL database, username and password
  • a Cumulus Log already uploaded

IMPORTANT NOTE FOR VERSION 4.0+

Version 4.0 changes the SQL table structures from version 2 & 3. If you are currently using version 2 or 3 and wish to upgrade, then you should DROP the existing tables and let the version 4 script recreate them, or alter the table structures to add the new columns.

IMPORTANT NOTE FOR VERSION 2.0+

Version 2.0 changes the SQL table structures from version 1.x. If you are currently using version 1.x and wish to upgrade, then you should DROP the existing tables and let the version 2 script recreate them. If this is unacceptable DO NOT UPGRADE, stay with version 1.x

The new table formats use a combined date/time field instead of separate, this makes constructing queries much simpler, it is worth making the change.

Of course if you do change, then any existing queries you are using will also have to be rewritten - take this into account. It may be possible to create VIEWs of the new tables that mimic the old table format, and for you to use those views with your existing queries, that is an exercise for you!

You could of course run 1.x and 2.x in parallel whilst you made the switch over gradually. Just alter the table names in v2 of the script slightly to avoid name collisions.

Schema for version 4.0 and later

Dayfile table

The database table that mirrors dayfile.txt (as at version 3.6.0) has the following schema (column names and their format):

'LogDate',        'date NOT NULL'
'HighWindGust',   'decimal(4,1) NOT NULL'
'HWindGBear',     'smallint(3) unsigned zerofill NOT NULL'
'THWindG',        'varchar(5) NOT NULL'
'MinTemp',        'decimal(5,1) NOT NULL'
'TMinTemp',       'varchar(5) NOT NULL'
'MaxTemp',        'decimal(5,1) NOT NULL'
'TMaxTemp',       'varchar(5) NOT NULL'
'MinPress',       'decimal(6,2) NOT NULL'),                   // 8
'TMinPress',      'varchar(5) NOT NULL'
'MaxPress',       'decimal(6,2) NOT NULL'
'TMaxPress',      'varchar(5) NOT NULL'
'MaxRainRate',    "decimal(4,$rainDec) NOT NULL"  /* Note the number of decimal places is a variable, set to what suits you */
'TMaxRR',         'varchar(5) NOT NULL'
'TotRainFall',    "decimal(6,$rainDec) NOT NULL"  /* Note the number of decimal places is a variable, set to what suits you */
'AvgTemp',        'decimal(4,2) NOT NULL'
'TotWindRun',     'decimal(5,1) NOT NULL'
'HighAvgWSpeed',  'decimal(3,1)'
'THAvgWSpeed',    'varchar(5)'
'LowHum',         'decimal(4,1)'
'TLowHum',        'varchar(5)'
'HighHum',        'decimal(4,1)'
'THighHum',       'varchar(5)'
'TotalEvap',      "decimal(5,$rainDec)" /* Note the number of decimal places is a variable, set to what suits you */
'HoursSun',       'decimal(3,1)'
'HighHeatInd',    'decimal(4,1)'
'THighHeatInd',   'varchar(5)'
'HighAppTemp',    'decimal(4,1)'
'THighAppTemp',   'varchar(5)'
'LowAppTemp',     'decimal(4,1)'
'TLowAppTemp',    'varchar(5)'
'HighHourRain',   "decimal(4,$rainDec)" /* Note the number of decimal places is a variable, set to what suits you */
'THighHourRain',  'varchar(5)'
'LowWindChill',   'decimal(4,1)'
'TLowWindChill',  'varchar(5)'
'HighDewPoint',   'decimal(4,1)'
'THighDewPoint',  'varchar(5)'
'LowDewPoint',    'decimal(4,1)'
'TLowDewPoint',   'varchar(5)'
'DomWindDir',     'smallint(3) unsigned zerofill'
'HeatDegDays',    'decimal(4,1)'
'CoolDegDays',    'decimal(4,1)'
'HighSolarRad',   'decimal(5,1)'
'THighSolarRad',  'varchar(5)'
'HighUV',         'decimal(3,1)'
'THighUV',        'varchar(5)'
'HWindGBearSym',  'varchar(3)'
'DomWindDirSym',  'varchar(3)'
'MaxFeelsLike',   'decimal(4,1)'   /* New in v4.0 */
'TMaxFeelsLike',  'varchar(5)'     /* New in v4.0 */
'MinFeelsLike',   'decimal(4,1)'   /* New in v4.0 */
'TMinFeelsLike',  'varchar(5)'     /* New in v4.0 */

Monthly table

'LogDateTime',        'DATETIME NOT NULL'
'Temp',               'decimal(4,1) NOT NULL'
'Humidity',           'decimal(4,1) NOT NULL'
'Dewpoint',           'decimal(4,1) NOT NULL'
'Windspeed',          'decimal(4,1) NOT NULL'
'Windgust',           'decimal(4,1) NOT NULL'
'Windbearing'         'smallint(3) unsigned zerofill NOT NULL'
'RainRate',           'decimal(4,$rainDec) NOT NULL'
'TodayRainSoFar',     'decimal(4,$rainDec) NOT NULL'
'Pressure',           'decimal(6,2) NOT NULL'
'Raincounter',        'decimal(6,2) NOT NULL'
'InsideTemp',         'decimal(4,1) NOT NULL'
'InsideHumidity',     'decimal(4,1) NOT NULL'
'LatestWindGust',     'decimal(5,1) NOT NULL'
'WindChill',          'decimal(4,1) NOT NULL'
'HeatIndex',          'decimal(4,1) NOT NULL'
'UVindex',            'decimal(4,1)'
'SolarRad',           'decimal(5,1)'
'Evapotrans',         'decimal(4,1)'
'AnnualEvapTran',     'decimal(5,1)'
'ApparentTemp',       'decimal(4,1)'
'MaxSolarRad',        'decimal(5,1)'
'HrsSunShine',        'decimal(3,1)'
'CurrWindBearing',    'varchar(3)'
'RG11rain',           'decimal(4,1)'
'RainSinceMidnight',  'decimal(4,1)'
'WindbearingSym',     'varchar(3)'
'CurrWindBearingSym', 'varchar(3)'
'FeelsLike',          'decimal(4,1)'   /* New in 4.0 */

Realtime table

'LogDateTime',        'DATETIME NOT NULL'
'temp',               'decimal(4,1) NOT NULL'
'hum',                'decimal(4,1) NOT NULL'
'dew',                'decimal(4,1) NOT NULL'
'wspeed',             'decimal(4,1) NOT NULL'
'wlatest',            'decimal(4,1) NOT NULL'
'bearing',            'smallint(3) zerofill unsigned NOT NULL'
'rrate',              'decimal(4,$rainDec) NOT NULL'
'rfall',              'decimal(4,$rainDec) NOT NULL'
'press',              'decimal(6,2) NOT NULL'
'currentwdir',        'varchar(3) NOT NULL'
'beaufortnumber',     'varchar(2) NOT NULL'
'windunit',           'varchar(4) NOT NULL'
'tempunitnodeg',      'varchar(1) NOT NULL'
'pressunit',          'varchar(3) NOT NULL'
'rainunit',           'varchar(2) NOT NULL'
'windrun',            'decimal(4,1) NOT NULL'
'presstrendval',      'varchar(6) NOT NULL'
'rmonth',             'decimal(4,$rainDec) NOT NULL'
'ryear',              'decimal(4,$rainDec) NOT NULL'
'rfallY',             'decimal(4,$rainDec) NOT NULL'
'intemp',             'decimal(4,1) NOT NULL'
'inhum',              'decimal(4,1) NOT NULL'
'wchill',             'decimal(4,1) NOT NULL'
'temptrend',          'varchar(5) NOT NULL'
'tempTH',             'decimal(4,1) NOT NULL'
'TtempTH',            'varchar(5) NOT NULL'
'tempTL',             'decimal(4,1) NOT NULL'
'TtempTL',            'varchar(5) NOT NULL'
'windTM',             'decimal(4,1) NOT NULL'
'TwindTM',            'varchar(5) NOT NULL'
'wgustTM',            'decimal(4,1) NOT NULL'
'TwgustTM',           'varchar(5) NOT NULL'
'pressTH',            'decimal(6,2) NOT NULL'
'TpressTH',           'varchar(5) NOT NULL'
'pressTL',            'decimal(6,2) NOT NULL'
'TpressTL',           'varchar(5) NOT NULL'
'version',            'varchar(8) NOT NULL'
'build',              'varchar(5) NOT NULL'
'wgust',              'decimal(4,1) NOT NULL'
'heatindex',          'decimal(4,1) NOT NULL'
'humidex',            'decimal(4,1) NOT NULL'
'UV',                 'decimal(3,1) NOT NULL'
'ET',                 'decimal(4,$rainDec) NOT NULL'
'SolarRad',           'decimal(5,1) NOT NULL'
'avgbearing',         'smallint(3) zerofill unsigned NOT NULL'
'rhour',              'decimal(4,$rainDec) NOT NULL'
'forecastnumber',     'tinyint(2) unsigned NOT NULL'
'isdaylight',         'tinyint(1) unsigned NOT NULL'
'SensorContactLost',  'tinyint(1) unsigned NOT NULL'
'wdir',               'varchar(3) NOT NULL'
'cloudbasevalue',     'int NOT NULL'
'cloudbaseunit',      'varchar(2) NOT NULL'
'apptemp',            'decimal(4,1) NOT NULL'
'SunshineHours',      'decimal(3,1) NOT NULL'
'CurrentSolarMax',    'decimal(5,1) NOT NULL'
'IsSunny',            'tinyint(1) unsigned NOT NULL'
'FeelsLike',          'decimal(4,1)'                       /* New in 4.0 */


Schema for version 3.0

Dayfile table

The database table that mirrors dayfile.txt (as at version 1.9.4) has the following schema (column names and their format):

'LogDate',        'date NOT NULL'
'HighWindGust',   'decimal(4,1) NOT NULL'
'HWindGBear',     'smallint(3) unsigned zerofill NOT NULL'
'THWindG',        'varchar(5) NOT NULL'
'MinTemp',        'decimal(5,1) NOT NULL'
'TMinTemp',       'varchar(5) NOT NULL'
'MaxTemp',        'decimal(5,1) NOT NULL'
'TMaxTemp',       'varchar(5) NOT NULL'
'MinPress',       'decimal(6,2) NOT NULL'),                   // 8
'TMinPress',      'varchar(5) NOT NULL'
'MaxPress',       'decimal(6,2) NOT NULL'
'TMaxPress',      'varchar(5) NOT NULL'
'MaxRainRate',    "decimal(4,$rainDec) NOT NULL"  /* Note the number of decimal places is a variable, set to what suits you */
'TMaxRR',         'varchar(5) NOT NULL'
'TotRainFall',    "decimal(6,$rainDec) NOT NULL"  /* Note the number of decimal places is a variable, set to what suits you */
'AvgTemp',        'decimal(4,2) NOT NULL'
'TotWindRun',     'decimal(5,1) NOT NULL'
'HighAvgWSpeed',  'decimal(3,1)'
'THAvgWSpeed',    'varchar(5)'
'LowHum',         'decimal(4,1)'
'TLowHum',        'varchar(5)'
'HighHum',        'decimal(4,1)'
'THighHum',       'varchar(5)'
'TotalEvap',      "decimal(5,$rainDec)" /* Note the number of decimal places is a variable, set to what suits you */
'HoursSun',       'decimal(3,1)'
'HighHeatInd',    'decimal(4,1)'
'THighHeatInd',   'varchar(5)'
'HighAppTemp',    'decimal(4,1)'
'THighAppTemp',   'varchar(5)'
'LowAppTemp',     'decimal(4,1)'
'TLowAppTemp',    'varchar(5)'
'HighHourRain',   "decimal(4,$rainDec)" /* Note the number of decimal places is a variable, set to what suits you */
'THighHourRain',  'varchar(5)'
'LowWindChill',   'decimal(4,1)'
'TLowWindChill',  'varchar(5)'
'HighDewPoint',   'decimal(4,1)'
'THighDewPoint',  'varchar(5)'
'LowDewPoint',    'decimal(4,1)'
'TLowDewPoint',   'varchar(5)'
'DomWindDir',     'smallint(3) unsigned zerofill'
'HeatDegDays',    'decimal(4,1)'
'CoolDegDays',    'decimal(4,1)'
'HighSolarRad',   'decimal(5,1)'
'THighSolarRad',  'varchar(5)'
'HighUV',         'decimal(3,1)'
'THighUV',        'varchar(5)'
'HWindGBearSym',  'varchar(3)'
'DomWindDirSym',  'varchar(3)'


Installation

  • Download the PHP script ... (right click, Save as) and then rename the .txt to .php
  • Save the file and edit it using a text editor -- there are five entries to be edited
servername, username, password, database and security key
these are documented in the file at the top.
There are three further variables to consider and may require editing. Look at the text file you are importing. How is each field separated/delimited? How is the date delimited? How is a decimal number shown? In the UK there is nothing else needs changed. If for example your delimiter is a semi-colon and a dash then change the lines $field_delimiter and $date_delimiter accordingly.
if your decimal separator is a comma this also needs to be changed in the file using the $decimal_separator variable
  • save the file as ImportCumulusFile.php or whatever name you prefer and upload it to your webserver.

Using the script

Currently you can import two file types from Cumulus -- the dayfile and the Monthly log files.


Firstly decide the table to be populated in your SQL database. If the table does not exist the script will create it. Typically you have one table for the dayfile, and one or more for the Monthly Logs. You could import every monthly log file into one large SQL table.

If you re-import existing data the script will update the data in the table so you can run the import every day on the same file, dayfile, for example


You must pass several options with your URL... (They can be in any order but the first one must start with ? other with &)

  • type=xxxx
this must be either the phrase dayfile, monthly or realtime
  • file=xxxxx
the location on your webserver, relative to this script location, of your Cumulus File
example file=dayfile.txt or file=../data/Jan10log.txt
  • table=xxxx
the table within SQL to import the data. If it does not exist the script will create it
  • key=xxxxx
A security key, unique to you, to pass as part of the URL. This stops others from running the script on your server if the do not know the key.


An example URL...

http://www.myserver.com/ImportCumulusFile.php?type=dayfile&key=letmein&file=./data/dayfile.txt

The result

If all goes well it will create or update the table with the relevant data and report back the word "Done". If the script fails there are a number of outputs it could return to explain the problem.


Further automation

Using the above script, in combination with the Toolbox you could set an automated FTP rule to upload the dayfile.txt from Cumulus each day at 00:15 and then run an HTTP remote command (this script) to import it into the SQL database

Version 2.0 of the script can also be invoked from a command line. So for example importing the realtime file from the command line would look like this:

 php importcumulusfilev2-0.php file=realtime.txt type=realtime key=secretKey retainVal=7 retainUnit=day

This allows you to run the script as cron job on a Linux server, or as a scheduled task on a Windows server.

Version Control

  • 4.0 - 4 May 2020 [Download]
    • Updated for CMX 3.6.0 addition of Feels Like
  • 3.2 - 11 September 2018 [Download]
    • Fixed inserting of WindbearingSym and CurrWindBearingSym
  • 3.1 - 1 March 2018 [Download]
    • Fix variable typos in realtime table creation status messages
    • Remove some HTTP headers that were causing problems on some servers
  • 3.0 - 6 November 2016 [Download]
    • Converted to use prepared statements - more efficient for bulk inserts (the main use for script with CumulusMX?)
    • SQL injection protection improved - requires the table names to be defined in this script
  • 2.8 - 27 April 2015 [Download]
    • Added addtional configuration parameter $rainUnit, default is 'mm'
    • Added 'rain since midnight' to the monthly log file table
    • This version is REQUIRED to support CumulusMX direct inserts
    • Altered layout the SQL statements to make finding/fixing stuff easier!
    • To updated existing monthly tables use the following SQL command [if you use 'mm' for rain change (4,2) to (4,1)]:
      • ALTER TABLE <<YOUR_MONTHLY_TABLENAME>> ADD COLUMN RainSinceMidnight DECIMAL(4,2) NULL AFTER RG11rain;
  • 2.7 - 23 February 2015 [Download]
    • Fixed realtime/monthly/day tables creates, to make rainfall 2dp to allow for inches
    • Fixed monthly table create, to make evapotrans 2 dp
    • Converted from depreciated mysql to mysqli
  • 2.6 - 02 April 2014, Mark Crossley [Download]
    • Fixed a PHP vulnerability that could reveal your passcode
  • 2.5 - 03 December 2013 (uploaded 02 Feb 2014), Mark Crossley [Download]
    • Changed day file HighSolarRad from varchar(5) to decimal(5,1)
      • To alter an existing table...
      • ALTER TABLE `dayfile` CHANGE `HighSolarRad` `HighSolarRad` DECIMAL(5,1) NULL DEFAULT NULL
  • 2.4 - 23 October 2013, Mark crossley [Download]
    • Changed day file humidity fields from varchar(3) to decimal(4,1)
  • 2.3 - 05 June 2013, Mark Crossley [Download]
    • Fixed dayfile & monthfile table column HoursSun was decimal(2,1) to decimal(3,1)
  • 2.2 - 21 April 2013, Mark Crossley
    • Made dayfile UV a decimal(3,1) field rather than varchar(4)
  • 2.1 - 29 March 2013, Mark Crossley [Download]
    • Fixed typo in day file table field name LowDewPint -> LowDewPoint
  • 2.0 - 13 March 2013, Mark Crossley [Download]
    • Change monthly and realtime tables to use combined date/time columns rather than separate
    • Added optional retention time for realtime table. Records older than the specified age will be deleted. retainVal=NNN retainUnit=XXXX
    • Added checking to allow running of the script from a command line as well as via http
    • Added 'extra' columns to record wind directions as compass points where they are only provided as bearings:
Dayfile:  Added the following columns:- HWindGBearSym, DomWindDirSym
Monthly:  Added the following columns:- WindbearingSym, CurrWindBearingSym
  • 1.4a - 3 December 2012, Mark Crossley. Fixes syntax errors in 1.4, adds parameter presence checking. [Download]
  • 1.4 - 3 December 2012, Mark Crossley. Added ability to create and log data to a 'realtime' table.
  • 1.3b - 30 Nov 2012, Mark Crossley, changed so ALL missing values from the dayfile are entered into the table as NULL. If you have used the Cumulus editor, then they will be present in the file as blank fields. [Download]
  • 1.3a - 30 Nov 2012, Mark Crossley, added line breaks to output text [Download]
  • 1.3 - 27 Nov 2012, Mark Crossley, updated for Cumulus b1050 [Download]
  • 1.2 - 6 May 2011, Mark Crossley, updated for Cumulus 1.9.1
  • 1.1c Small modification to code to handle date delimiter with a dot [Download]
  • 1.1b Added a variable to consider decimal separator
  • 1.1a Added date delimiter
  • 1.1 Added the facility to identify the delimiter used on the import file
  • 1.0 First Release