* commit '318e3c3571dd061d9405c52dda4372218bf110e3': Updated README with documentation Removed old files Fixed CSV file download Moved files in preparation of going all-in on SailsJS Fixed Font-Awesome, set up database cleanup Add Device button is fixed Adds ability to add devices global variables for sampleData Added ability to associate individual devices with tags Error checking on config and tag entries Add config model use port 3000 in dev mode Multiple tag comparison working Can see tags and values now Tag Server website works without data Setup DB Structure using Models in Sails.js Add CRUD for devices
POCloud Data Logger
Written by Patrick McDonagh, Henry Pump
Prerequisites
- NodeJS
- Python 2.7
- npm
- MySQL
- Bower
Installation
-
Clone this repository using either HTTPS:
git clone http://<USERNAME>@bitbucket.poconsole.net/scm/pocloud/tag-server.git -
Change directory to the "www" folder
cd tag-server/www -
Install necessary npm packages
npm install -
Install necessary bower packages
bower install -
Create init.d scripts
INFO HERE COMING SOON -
Test Web Server functionality
sails liftProceed to http://:3000 to test the web server and set up tags.
-
Enter tag information in web server.
-
Test the Python datalogger functiality.
python python/tagserver.pyThe program should return messages saying it has stored values. If errors occur, check the PLC ip address. If errors persist, contact Henry Pump.
-
Start the init.d scripts so the programs run in the background.
/etc/int.d/tagserver startand
/etc/init.d/website start OR forever www/app.js
Database Documentation
MySQL Tables
+---------------------+
| Tables_in_poconsole |
+---------------------+
| config |
| data_types |
| device_types |
| devices |
| tag_classes |
| tag_vals |
| tags |
+---------------------+
config Table
Holds parameter/val pairs for configuration parameters
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| parameter | varchar(255) | YES | UNI | NULL | |
| val | varchar(255) | YES | | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
data_types Table
Holds all possible data types
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| data_type | varchar(255) | YES | UNI | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
device_types Table
Holds all possible device types
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| dType | varchar(255) | YES | UNI | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
devices Table
Holds device configuration.
devices.device_type = device_types.dType
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| device_type | int(11) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
tag_classes Table
Holds all possible tag classes. All Data Logger tags are "Custom" (id=5)
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| class_type | varchar(255) | YES | UNI | NULL | |
| description | varchar(255) | YES | | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
tag_vals Table
Holds stored measurements of values of tags.
tag_vals.tagID = tags.id
+-----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| tagID | int(11) | YES | | NULL | |
| val | float | YES | | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+-----------+------------------+------+-----+---------+----------------+
tags Table
Holds the scan-list of tags to be evaluated.
tag.tag_class = tag_classes.id
tag.deviceID = devices.id
tag.data_type = data_types.id
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| tag_class | int(11) | YES | | NULL | |
| tag | varchar(255) | YES | | NULL | |
| deviceID | int(11) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| data_type | int(11) | YES | | NULL | |
| change_threshold | float | YES | | NULL | |
| guarantee_sec | int(11) | YES | | NULL | |
| map_function | varchar(255) | YES | | NULL | |
| units | varchar(255) | YES | | NULL | |
| minExpected | float | YES | | NULL | |
| maxExpected | float | YES | | NULL | |
| createdAt | datetime | YES | | NULL | |
| updatedAt | datetime | YES | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
Web API
The web API provides a REST-ful API to access the tags and values stored in the database.
Devices
GET /device
Returns all the devices stored in the database
Returns:
[
{
"device_type": {
"id": 1,
"dType": "CLX",
"createdAt": "2016-04-27T14:10:35.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
"id": 1,
"address": "10.10.10.3",
"createdAt": "2016-04-27T14:19:20.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
{
"device_type": {
"id": 2,
"dType": "Micro800",
"createdAt": "2016-04-27T14:10:43.000Z",
"updatedAt": "2016-04-27T14:10:43.000Z"
},
"id": 11,
"address": "192.168.1.20",
"createdAt": "2016-04-29T21:36:28.000Z",
"updatedAt": "2016-04-29T21:36:28.000Z"
}
]
GET /device/
Returns only the information about the specific device
Returns:
[
{
"device_type": {
"id": 1,
"dType": "CLX",
"createdAt": "2016-04-27T14:10:35.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
"id": 1,
"address": "10.10.10.3",
"createdAt": "2016-04-27T14:19:20.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
}
]
POST /device
Adds a new device to the database
Parameters:*
{
address: < URL of the device >,
device_type: < ID of device type>
}
UPDATE /device/
Updates a device in the database
Parameters:*
{
address: < URL of the device >,
device_type: < ID of device type>
}
DELETE /device/
Deletes a device from the database
Tags
GET /tag
Returns all the tags stored in the database
Returns:
[
{
"tag_class": {
"id": 5,
"class_type": "custom",
"description": "User-Selected Tags",
"createdAt": "2016-04-27T14:17:54.000Z",
"updatedAt": "2016-04-27T14:17:54.000Z"
},
"deviceID": {
"id": 1,
"address": "10.10.10.3",
"createdAt": "2016-04-27T14:19:20.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z",
"device_type": 1
},
"data_type": {
"id": 1,
"data_type": "float",
"createdAt": "2016-04-27T22:37:48.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z"
},
{
"tag_class": {
"id": 5,
"class_type": "custom",
"description": "User-Selected Tags",
"createdAt": "2016-04-27T14:17:54.000Z",
"updatedAt": "2016-04-27T14:17:54.000Z"
},
"deviceID": {
"id": 1,
"address": "10.10.10.3",
"createdAt": "2016-04-27T14:19:20.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z",
"device_type": 1
},
"data_type": {
"id": 1,
"data_type": "float",
"createdAt": "2016-04-27T22:37:48.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
"id": 3,
"name": "Tag 3 Test",
"tag": "Tag3.val",
"description": "This is another randomly generated tag",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "lbs",
"minExpected": 0,
"maxExpected": 100,
"createdAt": "2016-04-29T17:00:54.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
}
]
GET /tag/
Returns only the information about the specified tag
Returns:
[
{
"tag_class": {
"id": 5,
"class_type": "custom",
"description": "User-Selected Tags",
"createdAt": "2016-04-27T14:17:54.000Z",
"updatedAt": "2016-04-27T14:17:54.000Z"
},
"deviceID": {
"id": 1,
"address": "10.10.10.3",
"createdAt": "2016-04-27T14:19:20.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z",
"device_type": 1
},
"data_type": {
"id": 1,
"data_type": "float",
"createdAt": "2016-04-27T22:37:48.000Z",
"updatedAt": "2016-04-29T17:02:15.000Z"
},
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z"
}
]
POST /tag
Adds a new tag to the scan list
Parameters
{
tag: < Tag name in PLC >,
name: < Vanity Name >,
tag_class: 5,
deviceID: < device ID of the source device >,
units: < units >,
minExpected: < Minimum Expected value (used for gauges) >,
maxExpected: < Maximum Expected value (used for gauges) >,
guarantee_sec: < Maximum time between stored measurements >,
change_threshold: < amount change to require data to be stored >,
description: < description of the tag >,
data_type: < data type ID for the tag >
}
UPDATE /tag/
Updates a tag in the scan list
Parameters
{
tag: < Tag name in PLC >,
name: < Vanity Name >,
tag_class: 5,
deviceID: < device ID of the source device >,
units: < units >,
minExpected: < Minimum Expected value (used for gauges) >,
maxExpected: < Maximum Expected value (used for gauges) >,
guarantee_sec: < Maximum time between stored measurements >,
change_threshold: < amount change to require data to be stored >,
description: < description of the tag >,
data_type: < data type ID for the tag >
}
DELETE /tag/
Deletes a tag in the scan list
Tag Values
GET /tag_val
Gets all values in the database
Returns:
[
{
"tagID": {
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z",
"tag_class": 5,
"deviceID": 1,
"data_type": 1
},
"id": 1,
"val": 3.14159,
"createdAt": "2016-04-27T14:26:58.000Z",
"updatedAt": "2016-04-27T14:26:58.000Z"
},
{
"tagID": {
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z",
"tag_class": 5,
"deviceID": 1,
"data_type": 1
},
"id": 2,
"val": 12.2334,
"createdAt": "2016-04-27T22:40:38.000Z",
"updatedAt": "2016-04-27T22:40:38.000Z"
},
{
"tagID": {
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z",
"tag_class": 5,
"deviceID": 1,
"data_type": 1
},
"id": 3,
"val": 10.6255,
"createdAt": "2016-04-27T22:40:48.000Z",
"updatedAt": "2016-04-27T22:40:48.000Z"
},
{
"tagID": {
"id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"description": "changed description",
"change_threshold": 5,
"guarantee_sec": 3600,
"map_function": null,
"units": "degF",
"minExpected": 0,
"maxExpected": 1000,
"createdAt": "2016-04-27T14:21:37.000Z",
"updatedAt": "2016-04-29T16:17:02.000Z",
"tag_class": 5,
"deviceID": 1,
"data_type": 1
},
"id": 4,
"val": 6.06918,
"createdAt": "2016-04-27T22:40:58.000Z",
"updatedAt": "2016-04-27T22:40:58.000Z"
}
]
GET /tag_val/latest
Returns the latest stored value for all tags
Returns:
[
{
"id": 13931,
"dtime": "2016-05-02T23:04:17.000Z",
"t_id": 1,
"name": "Test Tag",
"tag": "testtag.val",
"val": 162.312,
"units": "degF",
"description": "changed description",
"minExpected": 0,
"maxExpected": 1000
},
{
"id": 13932,
"dtime": "2016-05-02T23:04:17.000Z",
"t_id": 3,
"name": "Tag 3 Test",
"tag": "Tag3.val",
"val": -2.93347,
"units": "lbs",
"description": "This is another randomly generated tag",
"minExpected": 0,
"maxExpected": 100
}
]
DELETE /tag_val/
Deletes value for the specified ID.
Web API Advanced Parameters
Reference the Waterline Documentation to learn about the advanced query parameters.