Adds ethernet-ip-scanlist features and database storage
This commit is contained in:
29
__tests__/actions/actions_taghistory.test.js
Normal file
29
__tests__/actions/actions_taghistory.test.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { configure } from "enzyme";
|
||||||
|
import Adapter from "enzyme-adapter-react-16";
|
||||||
|
configure({ adapter: new Adapter() });
|
||||||
|
|
||||||
|
import { IPC_TAGHISTORYUPDATE, ipcTagHistoryUpdate } from "../../app/src/actions/actions_taghistory";
|
||||||
|
|
||||||
|
describe("actions_taghistory", () => {
|
||||||
|
describe("ipcTagHistoryUpdate", () => {
|
||||||
|
let action;
|
||||||
|
|
||||||
|
const sampleTag = {
|
||||||
|
tagName: "test",
|
||||||
|
historyRows: []
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
action = ipcTagHistoryUpdate(undefined, sampleTag);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("has the correct type", () => {
|
||||||
|
expect(action.type).toEqual(IPC_TAGHISTORYUPDATE);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("has the correct payload", () => {
|
||||||
|
expect(action.payload).toEqual({ tagName: "test", historyRows: [] });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
@@ -8,12 +8,10 @@ describe("actions_tags", () => {
|
|||||||
describe("ipcTagUpdate", () => {
|
describe("ipcTagUpdate", () => {
|
||||||
let action;
|
let action;
|
||||||
|
|
||||||
const sampleTag = { state: {
|
const sampleTag = {
|
||||||
tag: {
|
tagName: "test",
|
||||||
name: "test",
|
value: 100.0
|
||||||
value: 100.0
|
};
|
||||||
}
|
|
||||||
}};
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
action = ipcTagUpdate(undefined, sampleTag);
|
action = ipcTagUpdate(undefined, sampleTag);
|
||||||
@@ -24,7 +22,7 @@ describe("actions_tags", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("has the correct payload", () => {
|
it("has the correct payload", () => {
|
||||||
expect(action.payload).toEqual({ name: "test", value: 100.0 });
|
expect(action.payload).toEqual({ tagName: "test", value: 100.0 });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -77,12 +77,12 @@ describe("Settings", () => {
|
|||||||
|
|
||||||
describe("tag list", () => {
|
describe("tag list", () => {
|
||||||
it("should have one row for each tag", () => {
|
it("should have one row for each tag", () => {
|
||||||
expect(container.find(".tag-list li")).toHaveLength(2);
|
expect(container.find(".tag-list tbody tr")).toHaveLength(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should update state when new tag input changed", () => {
|
it("should update state when new tag input changed", () => {
|
||||||
container.find(".tag-name-input").simulate("change", {target: {value: "testtag"}});
|
container.find(".tag-name-input").simulate("change", {target: {value: "testtag"}});
|
||||||
expect(container.state().newTag).toEqual("testtag");
|
expect(container.state().newTag.tagName).toEqual("testtag");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should run the storeNewTag function on submit button click", () => {
|
it("should run the storeNewTag function on submit button click", () => {
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ describe("TagsIndex", () => {
|
|||||||
describe("when tags are found", () => {
|
describe("when tags are found", () => {
|
||||||
const testTagList = [
|
const testTagList = [
|
||||||
{
|
{
|
||||||
name: "test1",
|
tagName: "test1",
|
||||||
value: 100
|
value: 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "test2",
|
tagName: "test2",
|
||||||
value: 200
|
value: 200
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ configure({ adapter: new Adapter() });
|
|||||||
|
|
||||||
import TagHistoryReducer from "../../app/src/reducers/reducer_taghistory";
|
import TagHistoryReducer from "../../app/src/reducers/reducer_taghistory";
|
||||||
import { IPC_TAGUPDATE } from "../../app/src/actions/actions_tags";
|
import { IPC_TAGUPDATE } from "../../app/src/actions/actions_tags";
|
||||||
|
import { IPC_TAGHISTORYUPDATE } from "../../app/src/actions/actions_taghistory";
|
||||||
|
|
||||||
describe("TagHistory", () => {
|
describe("TagHistory", () => {
|
||||||
it("should not change state on unused type", () => {
|
it("should not change state on unused type", () => {
|
||||||
@@ -22,20 +23,33 @@ describe("TagHistory", () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
it("should add a history tag to an empty state", () => {
|
it("should add a history tag to an empty state", () => {
|
||||||
action.payload = { name: "val_IntakePressure", value: 100 };
|
action.payload = { tagName: "val_IntakePressure", value: 100 };
|
||||||
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(1);
|
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should add another value to an existing history state", () => {
|
it("should add another value to an existing history state", () => {
|
||||||
action.payload = { name: "val_IntakePressure", value: 100 };
|
action.payload = { tagName: "val_IntakePressure", value: 100 };
|
||||||
const stateAfterAdd = TagHistoryReducer({}, action);
|
const stateAfterAdd = TagHistoryReducer({}, action);
|
||||||
expect(_.map(TagHistoryReducer(stateAfterAdd, action), (x) => x)[0]).toHaveLength(2);
|
expect(_.map(TagHistoryReducer(stateAfterAdd, action), (x) => x)[0]).toHaveLength(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not add to the history if the tag is not a historical tag", () => {
|
it("should not add to the history if the tag is not a historical tag", () => {
|
||||||
action.payload = { name: "test", value: 100 };
|
action.payload = { tagName: "test", value: 100 };
|
||||||
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(0);
|
expect(_.map(TagHistoryReducer({}, action), (x) => x)).toHaveLength(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("IPC_TAGHISTORYUPDATE", () => {
|
||||||
|
const action = {
|
||||||
|
type: IPC_TAGHISTORYUPDATE,
|
||||||
|
payload: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
it("should add to the tagHistory state", () => {
|
||||||
|
action.payload = {tagName: "test", historyRows: [{value: 100, timestamp: new Date(0)}]};
|
||||||
|
const stateAfterAdd = TagHistoryReducer({}, action);
|
||||||
|
expect(stateAfterAdd).toEqual( {test : [{value: 100, timestamp: new Date(0)}]});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -17,18 +17,18 @@ describe("PlcReducer", () => {
|
|||||||
describe("IPC_TAGUPDATE", () => {
|
describe("IPC_TAGUPDATE", () => {
|
||||||
const action = {
|
const action = {
|
||||||
type: IPC_TAGUPDATE,
|
type: IPC_TAGUPDATE,
|
||||||
payload: { name: "test", value: 111.111 }
|
payload: { tagName: "test", value: 111.111 }
|
||||||
};
|
};
|
||||||
|
|
||||||
it("should store a new value for a new tag", () => {
|
it("should store a new value for a new tag", () => {
|
||||||
const newState = TagsReducer({}, action);
|
const newState = TagsReducer({}, action);
|
||||||
expect(newState).toEqual({ test: { name: "test", value: 111.111 }});
|
expect(newState).toEqual({ test: { tagName: "test", value: 111.111 }});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should store a new value for an existing tag", () => {
|
it("should store a new value for an existing tag", () => {
|
||||||
const existingState = { test: { name: "test", value: 0.00 }};
|
const existingState = { test: { tagName: "test", value: 0.00 }};
|
||||||
const newState = TagsReducer(existingState, action);
|
const newState = TagsReducer(existingState, action);
|
||||||
expect(newState).toEqual({test: { name: "test", value: 111.111 }});
|
expect(newState).toEqual({test: { tagName: "test", value: 111.111 }});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
9
app/src/actions/actions_taghistory.js
Normal file
9
app/src/actions/actions_taghistory.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export const IPC_TAGHISTORYUPDATE = "IPC_TAGHISTORYUPDATE";
|
||||||
|
|
||||||
|
export function ipcTagHistoryUpdate(event, {tagName, historyRows}){
|
||||||
|
console.log(event, tagName, historyRows);
|
||||||
|
return {
|
||||||
|
type: IPC_TAGHISTORYUPDATE,
|
||||||
|
payload: {tagName, historyRows}
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ export const WRITE_TAG = "WRITE_TAG";
|
|||||||
export function ipcTagUpdate(event, tag){
|
export function ipcTagUpdate(event, tag){
|
||||||
return {
|
return {
|
||||||
type: IPC_TAGUPDATE,
|
type: IPC_TAGUPDATE,
|
||||||
payload: tag.state.tag
|
payload: tag
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ export function ipcTagSync(ipAddress, tagList){
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function storeNewTag(tag){
|
export function storeNewTag(tag){
|
||||||
|
ipcRenderer.send("tag:new", tag);
|
||||||
return {
|
return {
|
||||||
type: STORE_NEW_TAG,
|
type: STORE_NEW_TAG,
|
||||||
payload: tag
|
payload: tag
|
||||||
|
|||||||
@@ -12,24 +12,30 @@ export class Settings extends Component {
|
|||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
ipAddress: "",
|
ipAddress: "",
|
||||||
newTag: ""
|
newTag: {tagName: null, vanityName: null, storePeriod: null, storeChangeDelta: null},
|
||||||
|
editTag: {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
getTagList = () => {
|
getTagList = () => {
|
||||||
const { tags } = this.props;
|
const { tags } = this.props;
|
||||||
|
|
||||||
return _.map(tags, (tag) => {
|
return _.map(tags, (tag, key) => {
|
||||||
return (
|
return (
|
||||||
<li key={tag.name} className="list-group-item">
|
<tr key={key}>
|
||||||
{tag.name}
|
<td className="tagName">{tag.tagName}</td>
|
||||||
<button
|
<td className="vanityName">{tag.vanityName}</td>
|
||||||
className="btn btn-outline-danger float-right delete-button"
|
<td className="storePeriod">{tag.storePeriod}</td>
|
||||||
onClick={(e) => this.onDeleteClick(e, tag.name)}
|
<td className="storeChangeDelta">{tag.storeChangeDelta}</td>
|
||||||
>
|
<td className="deleteButton">
|
||||||
<FontAwesomeIcon icon={faTimesSquare} />
|
<button
|
||||||
</button>
|
className="btn btn-outline-danger float-right delete-button"
|
||||||
</li>
|
onClick={(e) => this.onDeleteClick(e, tag.tagName)}
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faTimesSquare} />
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -54,14 +60,16 @@ export class Settings extends Component {
|
|||||||
this.props.setPlcIpAddress(this.state.ipAddress);
|
this.props.setPlcIpAddress(this.state.ipAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
onNewTagChange = (e) => {
|
onNewTagChange = (e, paramName) => {
|
||||||
this.setState({newTag: e.target.value});
|
const newTag = this.state.newTag;
|
||||||
|
newTag[paramName] = e.target.value;
|
||||||
|
this.setState({newTag});
|
||||||
}
|
}
|
||||||
|
|
||||||
onNewTagSubmit = (e) => {
|
onNewTagSubmit = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.storeNewTag(this.state.newTag);
|
this.props.storeNewTag(this.state.newTag);
|
||||||
this.setState({newTag: ""});
|
this.setState({newTag: {tagName: null, vanityName: null, storePeriod: null, storeChangeDelta: null}});
|
||||||
}
|
}
|
||||||
|
|
||||||
onSave = (e) => {
|
onSave = (e) => {
|
||||||
@@ -97,22 +105,64 @@ export class Settings extends Component {
|
|||||||
|
|
||||||
|
|
||||||
<h4>Tag List</h4>
|
<h4>Tag List</h4>
|
||||||
<ul className="list-group tag-list">
|
{/* <ul className="list-group tag-list">
|
||||||
{this.getTagList()}
|
{this.getTagList()}
|
||||||
</ul>
|
</ul> */}
|
||||||
|
<table className="table tag-list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Tag Name (in PLC)</th>
|
||||||
|
<th>Vanity Name</th>
|
||||||
|
<th>Store Period (min.)</th>
|
||||||
|
<th>Store Change Delta</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{this.getTagList()}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<form className="form-inline">
|
<form className="form-inline">
|
||||||
<div className="form-group">
|
<div className="form-group">
|
||||||
<label htmlFor="tag-name-input">New Tag</label>
|
{/* <label htmlFor="tag-name-input">New Tag</label> */}
|
||||||
<input
|
<input
|
||||||
value={this.state.newTag}
|
value={this.state.newTag.tagName}
|
||||||
onChange={this.onNewTagChange}
|
onChange={(e) => this.onNewTagChange(e, "tagName")}
|
||||||
placeholder="New Tag Name..."
|
placeholder="New Tag Name..."
|
||||||
className="tag-name-input form-control m-2"
|
className="tag-name-input form-control m-2"
|
||||||
id="tag-name-input"
|
id="tag-name-input"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* <label htmlFor="tag-vanityname-input">Vanity Name</label> */}
|
||||||
|
<input
|
||||||
|
value={this.state.newTag.vanityName}
|
||||||
|
onChange={(e) => this.onNewTagChange(e, "vanityName")}
|
||||||
|
placeholder="Vanity Name..."
|
||||||
|
className="tag-vanityname-input form-control m-2"
|
||||||
|
id="tag-vanityname-input"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* <label htmlFor="tag-storeperiod-input">Store Period</label> */}
|
||||||
|
<input
|
||||||
|
value={this.state.newTag.storePeriod}
|
||||||
|
onChange={(e) => this.onNewTagChange(e, "storePeriod")}
|
||||||
|
placeholder="Store Period..."
|
||||||
|
className="tag-storeperiod-input form-control m-2"
|
||||||
|
id="tag-storeperiod-input"
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/* <label htmlFor="tag-storechangedelta-input">Store Change Delta</label> */}
|
||||||
|
<input
|
||||||
|
value={this.state.newTag.storeChangeDelta}
|
||||||
|
onChange={(e) => this.onNewTagChange(e, "storeChangeDelta")}
|
||||||
|
placeholder="Store Change Delta..."
|
||||||
|
className="tag-storechangedelta-input form-control m-2"
|
||||||
|
id="tag-storechangedelta-input"
|
||||||
|
/>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className="btn btn-success float-right add-tag-button m-2"
|
className="btn btn-success float-right add-tag-button m-2"
|
||||||
onClick={(e) => this.onNewTagSubmit(e)}
|
onClick={(e) => this.onNewTagSubmit(e)}
|
||||||
|
|||||||
@@ -16,16 +16,16 @@ export class TagsIndex extends Component {
|
|||||||
|
|
||||||
renderTagsList(){
|
renderTagsList(){
|
||||||
return _.map(this.props.tags, (t) => {
|
return _.map(this.props.tags, (t) => {
|
||||||
return (<tr key={t.name}>
|
return (<tr key={t.tagName}>
|
||||||
<td>{t.name}</td>
|
<td>{t.tagName}</td>
|
||||||
<td>{Math.round(t.value * 100) / 100}</td>
|
<td>{Math.round(t.value * 100) / 100}</td>
|
||||||
<td><input
|
<td><input
|
||||||
onChange={(e) => this.onTagWriteFieldChanged(e, t.name)}
|
onChange={(e) => this.onTagWriteFieldChanged(e, t.tagName)}
|
||||||
className="tag-write-input"
|
className="tag-write-input"
|
||||||
/></td>
|
/></td>
|
||||||
<td><button
|
<td><button
|
||||||
className="waves-effect waves-light btn tag-write-button"
|
className="waves-effect waves-light btn tag-write-button"
|
||||||
onClick={() => this.onWriteButtonClick(t.name)}
|
onClick={() => this.onWriteButtonClick(t.tagName)}
|
||||||
>Write</button></td>
|
>Write</button></td>
|
||||||
</tr>);
|
</tr>);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { IPC_TAGUPDATE } from "../actions/actions_tags";
|
import { IPC_TAGUPDATE } from "../actions/actions_tags";
|
||||||
import {history_tags as historyTags} from "../../../tagList.json";
|
import {history_tags as historyTags} from "../../../tagList.json";
|
||||||
|
import { IPC_TAGHISTORYUPDATE } from "../actions/actions_taghistory";
|
||||||
|
|
||||||
const historyPoints = 50000;
|
const historyPoints = 50000;
|
||||||
|
|
||||||
@@ -8,22 +9,32 @@ const historyPoints = 50000;
|
|||||||
export default function(state = {}, action){
|
export default function(state = {}, action){
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case IPC_TAGUPDATE:
|
case IPC_TAGUPDATE:
|
||||||
const { name, value } = action.payload;
|
const { tagName, value } = action.payload;
|
||||||
if (historyTags.includes(name)){
|
if (historyTags.includes(tagName)){
|
||||||
const thisEntry = {
|
const thisEntry = {
|
||||||
value,
|
value,
|
||||||
timestamp: new Date()
|
timestamp: new Date()
|
||||||
};
|
};
|
||||||
let tagHistory = [ thisEntry ];
|
let tagHistory = [ thisEntry ];
|
||||||
if (state[name]){
|
if (state[tagName]){
|
||||||
tagHistory = _.take(_.concat(tagHistory, state[name]), historyPoints);
|
tagHistory = _.take(_.concat(tagHistory, state[tagName]), historyPoints);
|
||||||
}
|
}
|
||||||
return { ...state, [name]: tagHistory};
|
return { ...state, [tagName]: tagHistory};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case IPC_TAGHISTORYUPDATE:
|
||||||
|
const { tagName: name, historyRows } = action.payload;
|
||||||
|
const thisTagHistory = _.map(historyRows, ({value, timestamp}) => {
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
timestamp: new Date(timestamp)
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return { ...state, [name]: thisTagHistory};
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import { IPC_TAGUPDATE, STORE_NEW_TAG, DELETE_TAG } from "../actions/actions_tag
|
|||||||
export default function(state = {}, action){
|
export default function(state = {}, action){
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case IPC_TAGUPDATE:
|
case IPC_TAGUPDATE:
|
||||||
const { name, value } = action.payload;
|
const tag = action.payload;
|
||||||
return { ...state, [name]: { name, value }};
|
return { ...state, [tag.tagName]: tag};
|
||||||
|
|
||||||
case STORE_NEW_TAG:
|
case STORE_NEW_TAG:
|
||||||
const newTagName = action.payload;
|
const newTagName = action.payload;
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import EventLog from "./components/EventLog";
|
|||||||
|
|
||||||
import { ipcTagUpdate } from "./actions/actions_tags";
|
import { ipcTagUpdate } from "./actions/actions_tags";
|
||||||
import { ipcPlcDetailsReceived, ipcPlcErrorReceived } from "./actions/actions_plc";
|
import { ipcPlcDetailsReceived, ipcPlcErrorReceived } from "./actions/actions_plc";
|
||||||
|
import { ipcTagHistoryUpdate } from "./actions/actions_taghistory";
|
||||||
|
|
||||||
export const { history_tags: historyTags, event_tags: eventTags } = require("../../tagList.json");
|
export const { history_tags: historyTags, event_tags: eventTags } = require("../../tagList.json");
|
||||||
export const historyPoints = 5000;
|
export const historyPoints = 5000;
|
||||||
@@ -26,7 +27,8 @@ export const historyPoints = 5000;
|
|||||||
const ipc = createIpc({
|
const ipc = createIpc({
|
||||||
"tag:valueupdate": ipcTagUpdate,
|
"tag:valueupdate": ipcTagUpdate,
|
||||||
"plc:connected": ipcPlcDetailsReceived,
|
"plc:connected": ipcPlcDetailsReceived,
|
||||||
"plc:error": ipcPlcErrorReceived
|
"plc:error": ipcPlcErrorReceived,
|
||||||
|
"tag:history": ipcTagHistoryUpdate
|
||||||
});
|
});
|
||||||
|
|
||||||
const createStoreWithMiddleware = applyMiddleware(ipc)(createStore);
|
const createStoreWithMiddleware = applyMiddleware(ipc)(createStore);
|
||||||
|
|||||||
109
main_process.js
109
main_process.js
@@ -1,14 +1,17 @@
|
|||||||
// Basic init
|
// Basic init
|
||||||
const electron = require("electron");
|
const electron = require("electron");
|
||||||
const { Controller, Tag } = require("ethernet-ip");
|
const { ScanList } = require("ethernet-ip-scanlist");
|
||||||
const _ = require("lodash");
|
const _ = require("lodash");
|
||||||
const { app, BrowserWindow, ipcMain } = electron;
|
const { app, BrowserWindow, ipcMain } = electron;
|
||||||
|
|
||||||
const tagList = require("./tagList.json");
|
const sqlite3 = require("sqlite3").verbose();
|
||||||
|
const db = new sqlite3.Database("./MaxWaterSystem.db");
|
||||||
|
|
||||||
|
const tagConfig = require("./tagList.json");
|
||||||
|
|
||||||
// To avoid being garbage collected
|
// To avoid being garbage collected
|
||||||
let mainWindow;
|
let mainWindow;
|
||||||
let PLC;
|
let scanList;
|
||||||
|
|
||||||
app.on("ready", () => {
|
app.on("ready", () => {
|
||||||
|
|
||||||
@@ -21,65 +24,97 @@ app.on("ready", () => {
|
|||||||
// Wait for allowing react app to fully load
|
// Wait for allowing react app to fully load
|
||||||
// before starting to send initalized data.
|
// before starting to send initalized data.
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
initPLC("10.20.4.36", tagList.scan_list);
|
setupDB();
|
||||||
|
initPLC("10.20.4.36", tagConfig.scan_list);
|
||||||
}, 2000);
|
}, 2000);
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function writeTag(tagName, tagValue){
|
function setupDB(){
|
||||||
const thisTag = new Tag(tagName);
|
db.run("CREATE TABLE IF NOT EXISTS tag_history (id INTEGER PRIMARY KEY, tag TEXT, value TEXT, reason TEXT, timestamp TEXT)");
|
||||||
PLC.readTag(thisTag).then(() => {
|
}
|
||||||
thisTag.value = tagValue;
|
|
||||||
PLC.writeTag(thisTag);
|
function clearAllHistory(){
|
||||||
|
db.run("DELETE FROM tag_history WHERE id > 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearTagHistory(tagName){
|
||||||
|
db.run(`DELETE FROM tag_history WHERE tagName = "${tagName}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendTagHistoryToDB(tag){
|
||||||
|
var stmt = db.prepare("INSERT INTO tag_history (tag, value, reason, timestamp) VALUES (?, ?, ?, ?)");
|
||||||
|
stmt.run(tag.tagName, tag.value, tag.lastSendReason, tag.lastSendTime.format());
|
||||||
|
stmt.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTagHistory(tagName){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
db.all(`SELECT value, reason, timestamp FROM tag_history WHERE tag = "${tagName}" ORDER BY datetime(timestamp) DESC`, function(err, rows) {
|
||||||
|
if (err) reject(err);
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function writeTag(tagName, tagValue){
|
||||||
|
scanList.tags[tagName].enipTag.value = tagValue;
|
||||||
|
}
|
||||||
|
|
||||||
function initPLC(ipAddress, tagList){
|
function initPLC(ipAddress, tagList){
|
||||||
PLC = new Controller();
|
scanList = new ScanList(ipAddress);
|
||||||
|
|
||||||
const setupTags = new Promise ((resolve) =>{
|
const setupTags = new Promise( (resolve) => {
|
||||||
resolve(_.map(tagList, (tag) => {
|
resolve(_.forEach(tagList, ({tag, vanityName, storePeriod, storeChangeDelta}) => {
|
||||||
PLC.subscribe(new Tag( tag ));
|
scanList.add(tag, vanityName, storePeriod, storeChangeDelta);
|
||||||
|
if(tagConfig.history_tags.includes(tag)){
|
||||||
|
getTagHistory(tag).then((historyRows) => {
|
||||||
|
// console.log("tag:history", {tag, historyRows});
|
||||||
|
mainWindow.webContents.send("tag:history", {tagName: tag, historyRows});
|
||||||
|
}, (err) => {
|
||||||
|
console.log("getHistoryTag Error:", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
setupTags.then(()=>{
|
setupTags.then(() => {
|
||||||
PLC.connect(ipAddress, 0).then( () => {
|
scanList.on("Updated", (tag) => {
|
||||||
const properties = { ...PLC.properties, ipAddress};
|
mainWindow.webContents.send("tag:valueupdate", tag);
|
||||||
mainWindow.webContents.send("plc:connected", properties);
|
|
||||||
PLC.scan().catch((err) => {
|
|
||||||
mainWindow.webContents.send("plc:error", err.message);
|
|
||||||
console.log(err);
|
|
||||||
});
|
|
||||||
}).catch((err) => {
|
|
||||||
mainWindow.webContents.send("plc:error", err.message);
|
|
||||||
console.log(err);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
PLC.forEach( (tag) => {
|
scanList.on("newValue", (tag) => {
|
||||||
tag.on("Initialized", (tag) => {
|
sendTagHistoryToDB(tag);
|
||||||
// console.log("main_process: Initialized", tag.name, tag.value);
|
|
||||||
mainWindow.webContents.send("tag:valueupdate", tag);
|
|
||||||
});
|
|
||||||
|
|
||||||
tag.on("Changed", (tag) => {
|
|
||||||
// console.log("main_process: Changed", tag.name, tag.value);
|
|
||||||
mainWindow.webContents.send("tag:valueupdate", tag);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scanList.start();
|
||||||
|
const properties = { ...scanList.PLC.properties, ipAddress};
|
||||||
|
mainWindow.webContents.send("plc:connected", properties);
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ipcMain.on("plc:initialize", (event, ipAddress, tagList) =>{
|
ipcMain.on("plc:initialize", (event, ipAddress, tagList) =>{
|
||||||
// console.log("plc:initialize", ipAddress, tagList);
|
|
||||||
initPLC(ipAddress, tagList);
|
initPLC(ipAddress, tagList);
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.on("tag:write", (event, tagName, value) => {
|
ipcMain.on("tag:write", (event, tagName, value) => {
|
||||||
// console.log("tag:write", tagName, value);
|
|
||||||
writeTag(tagName, value);
|
writeTag(tagName, value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcMain.on("tag:new", (event, {tagName, vanityName, storePeriod, storeChangeDelta}) => {
|
||||||
|
scanList.add(tagName, vanityName, storePeriod, storeChangeDelta);
|
||||||
|
scanList.stop();
|
||||||
|
scanList.start();
|
||||||
|
});
|
||||||
|
|
||||||
|
ipcMain.on("tag:clearHistory", (event, tagName) => {
|
||||||
|
clearTagHistory(tagName);
|
||||||
|
});
|
||||||
|
|
||||||
|
ipcMain.on("tag:clearAllHistory", () => {
|
||||||
|
clearAllHistory();
|
||||||
|
});
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"description": "Electron-based HMI Program",
|
"description": "Electron-based HMI Program",
|
||||||
"main": "main_process.js",
|
"main": "main_process.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"postinstall": "electron-builder install-app-deps",
|
||||||
"bundle": "webpack --mode development",
|
"bundle": "webpack --mode development",
|
||||||
"wpackserve": "webpack --mode development -w",
|
"wpackserve": "webpack --mode development -w",
|
||||||
"serve": "electron .",
|
"serve": "electron .",
|
||||||
@@ -45,6 +46,7 @@
|
|||||||
"file-loader": "^1.1.10",
|
"file-loader": "^1.1.10",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jest": "^22.4.3",
|
"jest": "^22.4.3",
|
||||||
|
"karma-verbose-reporter": "^0.0.6",
|
||||||
"mini-css-extract-plugin": "^0.4.0",
|
"mini-css-extract-plugin": "^0.4.0",
|
||||||
"npm-run-all": "^4.1.2",
|
"npm-run-all": "^4.1.2",
|
||||||
"webpack": "^4.1.1",
|
"webpack": "^4.1.1",
|
||||||
@@ -59,8 +61,10 @@
|
|||||||
"d3-interpolate": "^1.1.6",
|
"d3-interpolate": "^1.1.6",
|
||||||
"esdoc": "^1.0.4",
|
"esdoc": "^1.0.4",
|
||||||
"ethernet-ip": "^1.1.4",
|
"ethernet-ip": "^1.1.4",
|
||||||
|
"ethernet-ip-scanlist": "^1.0.2",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
"moment": "^2.22.0",
|
"moment": "^2.22.1",
|
||||||
|
"node": "^9.11.0",
|
||||||
"react": "^16.2.0",
|
"react": "^16.2.0",
|
||||||
"react-dom": "^16.2.0",
|
"react-dom": "^16.2.0",
|
||||||
"react-event-timeline": "^1.5.1",
|
"react-event-timeline": "^1.5.1",
|
||||||
@@ -71,7 +75,8 @@
|
|||||||
"react-vis": "^1.9.2",
|
"react-vis": "^1.9.2",
|
||||||
"redux": "^3.7.2",
|
"redux": "^3.7.2",
|
||||||
"redux-electron-ipc": "^1.1.12",
|
"redux-electron-ipc": "^1.1.12",
|
||||||
"redux-persist": "^5.9.1"
|
"redux-persist": "^5.9.1",
|
||||||
|
"sqlite3": "^4.0.0"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "com.henrypump.maxwatersystem",
|
"appId": "com.henrypump.maxwatersystem",
|
||||||
|
|||||||
687
tagList.json
687
tagList.json
@@ -1,162 +1,529 @@
|
|||||||
{
|
{
|
||||||
"scan_list":
|
"scan_list": [
|
||||||
[
|
{
|
||||||
"alarm_ESTOP",
|
"tag": "alarm_ESTOP",
|
||||||
"alarm_Flowmeter",
|
"vanityName": "Alarm: E-Stop",
|
||||||
"alarm_FluidLevel",
|
"storePeriod": 2.0,
|
||||||
"alarm_IntakePressure",
|
"storeChangeDelta": 0
|
||||||
"alarm_IntakeTemperature",
|
},
|
||||||
"alarm_Lockout",
|
{
|
||||||
"alarm_MinSpeed",
|
"tag": "alarm_Flowmeter",
|
||||||
"alarm_TubingPressure",
|
"vanityName": "Alarm: Flowmeter",
|
||||||
"alarm_VFD",
|
"storePeriod": 2.0,
|
||||||
"cfg_CostPerkWh",
|
"storeChangeDelta": 0
|
||||||
"cfg_CurrentLimitMultiplier",
|
},
|
||||||
"cfg_DHSensorDistToIntake",
|
{
|
||||||
"cfg_DHSensorPressureOffset",
|
"tag": "alarm_FluidLevel",
|
||||||
"cfg_FluidSpecificGravity",
|
"vanityName": "Alarm: Fluid Level",
|
||||||
"cfg_MinSpeedSecondsBeforeFault",
|
"storePeriod": 2.0,
|
||||||
"cfg_PID_Flow",
|
"storeChangeDelta": 0
|
||||||
"cfg_PID_FlowSP",
|
},
|
||||||
"cfg_PID_FluidLevel",
|
{
|
||||||
"cfg_PID_FluidLevelSP",
|
"tag": "alarm_IntakePressure",
|
||||||
"cfg_PID_Manual",
|
"vanityName": "Alarm: Intake Pressure",
|
||||||
"cfg_PID_ManualSP",
|
"storePeriod": 2.0,
|
||||||
"cfg_PID_TubingPressure",
|
"storeChangeDelta": 0
|
||||||
"cfg_PID_TubingPressureSP",
|
},
|
||||||
"cmd_Start",
|
{
|
||||||
"cmd_Stop",
|
"tag": "alarm_IntakeTemperature",
|
||||||
"Device_Status_INT",
|
"vanityName": "Alarm: Intake Temperature",
|
||||||
"Downhole_Sensor_Status_INT",
|
"storePeriod": 2.0,
|
||||||
"Flow_Total_LastMonth",
|
"storeChangeDelta": 0
|
||||||
"Flow_Total_Lifetime",
|
},
|
||||||
"Flow_Total_ThisMonth",
|
{
|
||||||
"rp_ALL",
|
"tag": "alarm_Lockout",
|
||||||
"rp_Flowmeter",
|
"vanityName": "Alarm Lockout Active",
|
||||||
"rp_FluidLevel",
|
"storePeriod": 2.0,
|
||||||
"rp_IntakePressure",
|
"storeChangeDelta": 0
|
||||||
"rp_IntakeTemperature",
|
},
|
||||||
"rp_MinSpeed",
|
{
|
||||||
"rp_TubingPressure",
|
"tag": "alarm_MinSpeed",
|
||||||
"rp_VFD",
|
"vanityName": "Alarm: Min. Speed",
|
||||||
"sp_ALL",
|
"storePeriod": 2.0,
|
||||||
"sp_Flowmeter",
|
"storeChangeDelta": 0
|
||||||
"sp_FluidLevel",
|
},
|
||||||
"sp_IntakePressure",
|
{
|
||||||
"sp_IntakeTemperature",
|
"tag": "alarm_TubingPressure",
|
||||||
"sp_Time",
|
"vanityName": "Alarm: Tubing Pressure",
|
||||||
"sp_TubingPressure",
|
"storePeriod": 2.0,
|
||||||
"sp_VFD",
|
"storeChangeDelta": 0
|
||||||
"sts_CurrentVFDFaultCode",
|
},
|
||||||
"sts_NoAlarms",
|
{
|
||||||
"sts_PID_Control",
|
"tag": "alarm_VFD",
|
||||||
"sts_PumpOff",
|
"vanityName": "Alarm: VFD",
|
||||||
"sts_RestartAllowed",
|
"storePeriod": 2.0,
|
||||||
"sts_TrueAlarm",
|
"storeChangeDelta": 0
|
||||||
"sts_WaitingToRestart",
|
},
|
||||||
"time_RunTime_Hours",
|
{
|
||||||
"time_TotalSecondsUntilStartup",
|
"tag": "cfg_CostPerkWh",
|
||||||
"val_Flowmeter",
|
"vanityName": "Cost ($) per kWh",
|
||||||
"val_Flowmeter_BarrelsPerDay",
|
"storePeriod": 10.0,
|
||||||
"val_FluidLevel",
|
"storeChangeDelta": 1.0
|
||||||
"val_IntakePressure",
|
},
|
||||||
"val_IntakeTemperature",
|
{
|
||||||
"val_TubingPressure",
|
"tag": "cfg_CurrentLimitMultiplier",
|
||||||
"VFD_MotorNPAmps",
|
"vanityName": "Current Limit Multiplier",
|
||||||
"VFD_MotorNPHertz",
|
"storePeriod": 10.0,
|
||||||
"VFD_MotorNPHorsepower",
|
"storeChangeDelta": 1.0
|
||||||
"VFD_MotorNPOLFactor",
|
},
|
||||||
"VFD_MotorNPRPM",
|
{
|
||||||
"VFD_MotorNPVolts",
|
"tag": "cfg_DHSensorDistToIntake",
|
||||||
"VFD_MotorPoles",
|
"vanityName": "Distance from Sensor to Intake",
|
||||||
"VFD_OutCurrent",
|
"storePeriod": 10.0,
|
||||||
"VFD_OutPower",
|
"storeChangeDelta": 1.0
|
||||||
"VFD_PWMFrequency",
|
},
|
||||||
"VFD_SpeedFdbk",
|
{
|
||||||
"VFD_SpeedRef",
|
"tag": "cfg_DHSensorPressureOffset",
|
||||||
"VFD_Temp"
|
"vanityName": "DH Sensor Pressure Offset",
|
||||||
],
|
"storePeriod": 10.0,
|
||||||
"history_tags":
|
"storeChangeDelta": 1.0
|
||||||
[
|
},
|
||||||
"val_Flowmeter",
|
{
|
||||||
"val_Flowmeter_BarrelsPerDay",
|
"tag": "cfg_FluidSpecificGravity",
|
||||||
"val_FluidLevel",
|
"vanityName": "Fluid Specific Gravity",
|
||||||
"val_IntakePressure",
|
"storePeriod": 10.0,
|
||||||
"val_IntakeTemperature",
|
"storeChangeDelta": 1.0
|
||||||
"val_TubingPressure",
|
},
|
||||||
"VFD_OutCurrent",
|
{
|
||||||
"VFD_OutPower",
|
"tag": "cfg_MinSpeedSecondsBeforeFault",
|
||||||
"VFD_SpeedFdbk",
|
"vanityName": "Min Speed Seconds Before Fault",
|
||||||
"VFD_SpeedRef",
|
"storePeriod": 10.0,
|
||||||
"VFD_Temp"
|
"storeChangeDelta": 1.0
|
||||||
],
|
},
|
||||||
"event_tags":
|
{
|
||||||
[
|
"tag": "cfg_PID_FlowSP",
|
||||||
{
|
"vanityName": "Flow Setpoint",
|
||||||
"tag": "alarm_ESTOP",
|
"storePeriod": 2.0,
|
||||||
"text": "E-Stop has been pressed",
|
"storeChangeDelta": 0.5
|
||||||
"valueTag": "",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_FluidLevelSP",
|
||||||
{
|
"vanityName": "Fluid Level Setpoint",
|
||||||
"tag": "alarm_Flowmeter",
|
"storePeriod": 2.0,
|
||||||
"text": "Flowmeter Alarm",
|
"storeChangeDelta": 0.5
|
||||||
"valueTag": "val_Flowmeter",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_ManualSP",
|
||||||
{
|
"vanityName": "Manual Frequency Setpoint",
|
||||||
"tag": "alarm_FluidLevel",
|
"storePeriod": 2.0,
|
||||||
"text": "Fluid Level Alarm",
|
"storeChangeDelta": 0.5
|
||||||
"valueTag": "val_FluidLevel",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_TubingPressureSP",
|
||||||
{
|
"vanityName": "Tubing Pressure Setpoint",
|
||||||
"tag": "alarm_IntakePressure",
|
"storePeriod": 2.0,
|
||||||
"text": "Intake Pressure Alarm",
|
"storeChangeDelta": 0.5
|
||||||
"valueTag": "val_IntakePressure",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_Flow",
|
||||||
{
|
"vanityName": "Flow Setpoint Selection Command",
|
||||||
"tag": "alarm_IntakeTemperature",
|
"storePeriod": 2.0,
|
||||||
"text": "Intake Temperature Alarm",
|
"storeChangeDelta": 0
|
||||||
"valueTag": "val_IntakeTemperature",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_FluidLevel",
|
||||||
{
|
"vanityName": "Fluid Level Setpoint Selection Command",
|
||||||
"tag": "alarm_MinSpeed",
|
"storePeriod": 2.0,
|
||||||
"text": "Minimum Speed Alarm",
|
"storeChangeDelta": 0
|
||||||
"valueTag": "VFD_SpeedFdbk",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_Manual",
|
||||||
{
|
"vanityName": "Manual Frequency Setpoint Selection Command",
|
||||||
"tag": "alarm_TubingPressure",
|
"storePeriod": 2.0,
|
||||||
"text": "Tubing Pressure Alarm",
|
"storeChangeDelta": 5
|
||||||
"valueTag": "val_TubingPressure",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cfg_PID_TubingPressure",
|
||||||
{
|
"vanityName": "Tubing Pressure Setpoint Selection Command",
|
||||||
"tag": "alarm_VFD",
|
"storePeriod": 2.0,
|
||||||
"text": "VFD Alarm",
|
"storeChangeDelta": 0
|
||||||
"valueTag": "sts_CurrentVFDFaultCode",
|
},
|
||||||
"eventType": "alarm"
|
{
|
||||||
},
|
"tag": "cmd_Start",
|
||||||
{
|
"vanityName": "Start Command",
|
||||||
"tag": "cmd_Start",
|
"storePeriod": 0,
|
||||||
"text": "Start button pressed",
|
"storeChangeDelta": 0
|
||||||
"valueTag": "",
|
},
|
||||||
"eventType": "event"
|
{
|
||||||
},
|
"tag": "cmd_Stop",
|
||||||
{
|
"vanityName": "Stop Command",
|
||||||
"tag": "cmd_Stop",
|
"storePeriod": 0,
|
||||||
"text": "Stop button pressed",
|
"storeChangeDelta": 0
|
||||||
"valueTag": "",
|
},
|
||||||
"eventType": "event"
|
{
|
||||||
},
|
"tag": "Device_Status_INT",
|
||||||
{
|
"vanityName": "Device Status Integer",
|
||||||
"tag": "cmd_Restart",
|
"storePeriod": 2.0,
|
||||||
"text": "System restarted automatically",
|
"storeChangeDelta": 1.0
|
||||||
"valueTag": "",
|
},
|
||||||
"eventType": "event"
|
{
|
||||||
}
|
"tag": "Downhole_Sensor_Status_INT",
|
||||||
]
|
"vanityName": "Downhole Sensor Status Integer",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "Flow_Total_LastMonth",
|
||||||
|
"vanityName": "Flow Total Last Month",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "Flow_Total_Lifetime",
|
||||||
|
"vanityName": "Lifetime Flow Total",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 100.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "Flow_Total_ThisMonth",
|
||||||
|
"vanityName": "Flow Total This Month",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 100.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_ALL",
|
||||||
|
"vanityName": "Overall Run Permissive",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_Flowmeter",
|
||||||
|
"vanityName": "Run Permissive: Flowmeter",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_FluidLevel",
|
||||||
|
"vanityName": "Run Permissive: Fluid Level",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_IntakePressure",
|
||||||
|
"vanityName": "Run Permissive: Intake Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_IntakeTemperature",
|
||||||
|
"vanityName": "Run Permissive: Intake Temperature",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_MinSpeed",
|
||||||
|
"vanityName": "Run Permissive: Min Speed",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_TubingPressure",
|
||||||
|
"vanityName": "Run Permissive: Tubing Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "rp_VFD",
|
||||||
|
"vanityName": "Run Permissive: VFD",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_ALL",
|
||||||
|
"vanityName": "Overall Start Permissive",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_Flowmeter",
|
||||||
|
"vanityName": "Start Permissive: Flowmeter",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_FluidLevel",
|
||||||
|
"vanityName": "Start Permissive: Fluid Level",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_IntakePressure",
|
||||||
|
"vanityName": "Start Permissive: Intake Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_IntakeTemperature",
|
||||||
|
"vanityName": "Start Permissive: Intake Temperature",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_Time",
|
||||||
|
"vanityName": "Start Permissive: Downtime",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_TubingPressure",
|
||||||
|
"vanityName": "Start Permissive: Tubing Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sp_VFD",
|
||||||
|
"vanityName": "Start Permissive: VFD",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_CurrentVFDFaultCode",
|
||||||
|
"vanityName": "Current VFD Fault Code",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_NoAlarms",
|
||||||
|
"vanityName": "No Active Alarms",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_PID_Control",
|
||||||
|
"vanityName": "PID Control Status",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_PumpOff",
|
||||||
|
"vanityName": "Pumped Off",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_RestartAllowed",
|
||||||
|
"vanityName": "Restart Allowed",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_TrueAlarm",
|
||||||
|
"vanityName": "True Alarm Active",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "sts_WaitingToRestart",
|
||||||
|
"vanityName": "Waiting to Restart",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "time_RunTime_Hours",
|
||||||
|
"vanityName": "Runtime Hours",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "time_TotalSecondsUntilStartup",
|
||||||
|
"vanityName": "Total Seconds until Startup",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 10.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_Flowmeter",
|
||||||
|
"vanityName": "Flow Rate (GPM)",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 5.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_Flowmeter_BarrelsPerDay",
|
||||||
|
"vanityName": "Flow Rate (BPD)",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_FluidLevel",
|
||||||
|
"vanityName": "Fluid Level",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_IntakePressure",
|
||||||
|
"vanityName": "Intake Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 5.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_IntakeTemperature",
|
||||||
|
"vanityName": "Intake Temperature",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "val_TubingPressure",
|
||||||
|
"vanityName": "Tubing Pressure",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 2.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPAmps",
|
||||||
|
"vanityName": "VFD Motor Nameplate Amps",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPHertz",
|
||||||
|
"vanityName": "VFD Motor Nameplate Hertz",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPHorsepower",
|
||||||
|
"vanityName": "VFD Motor Namplate Horsepower",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPOLFactor",
|
||||||
|
"vanityName": "VFD Motor Nameplate Service Factor",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPRPM",
|
||||||
|
"vanityName": "VFD Motor Nameplate RPM",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorNPVolts",
|
||||||
|
"vanityName": "VFD Motor Nameplate Volts",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_MotorPoles",
|
||||||
|
"vanityName": "VFD Motor Poles",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_OutCurrent",
|
||||||
|
"vanityName": "Output Current",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_OutPower",
|
||||||
|
"vanityName": "Output Power",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_PWMFrequency",
|
||||||
|
"vanityName": "PWM Frequency",
|
||||||
|
"storePeriod": 10.0,
|
||||||
|
"storeChangeDelta": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_SpeedFdbk",
|
||||||
|
"vanityName": "Motor Speed Feedback",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_SpeedRef",
|
||||||
|
"vanityName": "Motor Speed Reference",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "VFD_Temp",
|
||||||
|
"vanityName": "VFD Temperature",
|
||||||
|
"storePeriod": 2.0,
|
||||||
|
"storeChangeDelta": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"history_tags": [
|
||||||
|
"val_Flowmeter",
|
||||||
|
"val_Flowmeter_BarrelsPerDay",
|
||||||
|
"val_FluidLevel",
|
||||||
|
"val_IntakePressure",
|
||||||
|
"val_IntakeTemperature",
|
||||||
|
"val_TubingPressure",
|
||||||
|
"VFD_OutCurrent",
|
||||||
|
"VFD_OutPower",
|
||||||
|
"VFD_SpeedFdbk",
|
||||||
|
"VFD_SpeedRef",
|
||||||
|
"VFD_Temp"
|
||||||
|
],
|
||||||
|
"event_tags": [
|
||||||
|
{
|
||||||
|
"tag": "alarm_ESTOP",
|
||||||
|
"text": "E-Stop has been pressed",
|
||||||
|
"valueTag": "",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_Flowmeter",
|
||||||
|
"text": "Flowmeter Alarm",
|
||||||
|
"valueTag": "val_Flowmeter",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_FluidLevel",
|
||||||
|
"text": "Fluid Level Alarm",
|
||||||
|
"valueTag": "val_FluidLevel",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_IntakePressure",
|
||||||
|
"text": "Intake Pressure Alarm",
|
||||||
|
"valueTag": "val_IntakePressure",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_IntakeTemperature",
|
||||||
|
"text": "Intake Temperature Alarm",
|
||||||
|
"valueTag": "val_IntakeTemperature",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_MinSpeed",
|
||||||
|
"text": "Minimum Speed Alarm",
|
||||||
|
"valueTag": "VFD_SpeedFdbk",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_TubingPressure",
|
||||||
|
"text": "Tubing Pressure Alarm",
|
||||||
|
"valueTag": "val_TubingPressure",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "alarm_VFD",
|
||||||
|
"text": "VFD Alarm",
|
||||||
|
"valueTag": "sts_CurrentVFDFaultCode",
|
||||||
|
"eventType": "alarm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "cmd_Start",
|
||||||
|
"text": "Start button pressed",
|
||||||
|
"valueTag": "",
|
||||||
|
"eventType": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "cmd_Stop",
|
||||||
|
"text": "Stop button pressed",
|
||||||
|
"valueTag": "",
|
||||||
|
"eventType": "event"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tag": "cmd_Restart",
|
||||||
|
"text": "System restarted automatically",
|
||||||
|
"valueTag": "",
|
||||||
|
"eventType": "event"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
216
yarn.lock
216
yarn.lock
@@ -1729,10 +1729,6 @@ center-align@^0.1.1:
|
|||||||
align-text "^0.1.3"
|
align-text "^0.1.3"
|
||||||
lazy-cache "^1.0.3"
|
lazy-cache "^1.0.3"
|
||||||
|
|
||||||
chain-function@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
|
|
||||||
|
|
||||||
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
|
chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
|
||||||
@@ -1882,10 +1878,6 @@ class-utils@^0.3.5:
|
|||||||
isobject "^3.0.0"
|
isobject "^3.0.0"
|
||||||
static-extend "^0.1.1"
|
static-extend "^0.1.1"
|
||||||
|
|
||||||
classnames@2.2.5:
|
|
||||||
version "2.2.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
|
|
||||||
|
|
||||||
cli-boxes@^1.0.0:
|
cli-boxes@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
|
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
|
||||||
@@ -2042,7 +2034,7 @@ colors@1.0.3:
|
|||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
||||||
|
|
||||||
colors@^1.1.2:
|
colors@>=1.0, colors@^1.1.2:
|
||||||
version "1.2.1"
|
version "1.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794"
|
resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.1.tgz#f4a3d302976aaf042356ba1ade3b1a2c62d9d794"
|
||||||
|
|
||||||
@@ -2141,10 +2133,6 @@ copy-descriptor@^0.1.0:
|
|||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
|
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
|
||||||
|
|
||||||
core-js@2.5.1:
|
|
||||||
version "2.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
|
|
||||||
|
|
||||||
core-js@^1.0.0:
|
core-js@^1.0.0:
|
||||||
version "1.2.7"
|
version "1.2.7"
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
|
||||||
@@ -2411,18 +2399,6 @@ d3-sankey@^0.7.1:
|
|||||||
d3-collection "1"
|
d3-collection "1"
|
||||||
d3-shape "^1.2.0"
|
d3-shape "^1.2.0"
|
||||||
|
|
||||||
d3-scale@1.0.6:
|
|
||||||
version "1.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed"
|
|
||||||
dependencies:
|
|
||||||
d3-array "^1.2.0"
|
|
||||||
d3-collection "1"
|
|
||||||
d3-color "1"
|
|
||||||
d3-format "1"
|
|
||||||
d3-interpolate "1"
|
|
||||||
d3-time "1"
|
|
||||||
d3-time-format "2"
|
|
||||||
|
|
||||||
d3-scale@^1.0.5, d3-scale@^1.0.6:
|
d3-scale@^1.0.5, d3-scale@^1.0.6:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
|
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
|
||||||
@@ -2439,7 +2415,7 @@ d3-selection@^1.1.0:
|
|||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d"
|
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.3.0.tgz#d53772382d3dc4f7507bfb28bcd2d6aed2a0ad6d"
|
||||||
|
|
||||||
d3-shape@1.2.0, d3-shape@^1.1.0, d3-shape@^1.2.0:
|
d3-shape@^1.1.0, d3-shape@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
|
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2504,7 +2480,7 @@ dateformat@^3.0.2, dateformat@^3.0.3:
|
|||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
|
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
|
||||||
|
|
||||||
debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
|
debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
|
||||||
version "2.6.9"
|
version "2.6.9"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2658,10 +2634,6 @@ doctrine@^2.0.2, doctrine@^2.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
|
|
||||||
dom-helpers@^3.2.0:
|
|
||||||
version "3.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
|
|
||||||
|
|
||||||
dom-serializer@0, dom-serializer@~0.1.0:
|
dom-serializer@0, dom-serializer@~0.1.0:
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
|
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
|
||||||
@@ -3195,11 +3167,20 @@ esutils@^2.0.2:
|
|||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
|
||||||
|
|
||||||
ethernet-ip@^1.1.4:
|
ethernet-ip-scanlist@^1.0.2:
|
||||||
version "1.1.4"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/ethernet-ip/-/ethernet-ip-1.1.4.tgz#96390af1c33285c4ab489bd9785d164a966fc894"
|
resolved "https://registry.yarnpkg.com/ethernet-ip-scanlist/-/ethernet-ip-scanlist-1.1.1.tgz#817cef9103063d938b590969210cc9a9347c4318"
|
||||||
|
dependencies:
|
||||||
|
ethernet-ip "^1.1.5"
|
||||||
|
lodash "^4.17.5"
|
||||||
|
moment "^2.22.1"
|
||||||
|
|
||||||
|
ethernet-ip@^1.1.4, ethernet-ip@^1.1.5:
|
||||||
|
version "1.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/ethernet-ip/-/ethernet-ip-1.1.5.tgz#5d2e6a63db51bb083b40cfd8e448121e36c8d113"
|
||||||
dependencies:
|
dependencies:
|
||||||
dateformat "^3.0.3"
|
dateformat "^3.0.3"
|
||||||
|
task-easy "^0.2.0"
|
||||||
|
|
||||||
event-stream@~3.3.0:
|
event-stream@~3.3.0:
|
||||||
version "3.3.4"
|
version "3.3.4"
|
||||||
@@ -3592,6 +3573,12 @@ fs-extra@^5.0.0:
|
|||||||
jsonfile "^4.0.0"
|
jsonfile "^4.0.0"
|
||||||
universalify "^0.1.0"
|
universalify "^0.1.0"
|
||||||
|
|
||||||
|
fs-minipass@^1.2.5:
|
||||||
|
version "1.2.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
|
||||||
|
dependencies:
|
||||||
|
minipass "^2.2.1"
|
||||||
|
|
||||||
fs-write-stream-atomic@^1.0.8:
|
fs-write-stream-atomic@^1.0.8:
|
||||||
version "1.0.10"
|
version "1.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
|
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
|
||||||
@@ -4126,7 +4113,7 @@ iconv-lite@0.4.19:
|
|||||||
version "0.4.19"
|
version "0.4.19"
|
||||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
|
||||||
|
|
||||||
iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@~0.4.13:
|
iconv-lite@^0.4.17, iconv-lite@^0.4.19, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
|
||||||
version "0.4.21"
|
version "0.4.21"
|
||||||
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798"
|
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4156,6 +4143,12 @@ iferr@^0.1.5:
|
|||||||
version "0.1.5"
|
version "0.1.5"
|
||||||
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
|
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
|
||||||
|
|
||||||
|
ignore-walk@^3.0.1:
|
||||||
|
version "3.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
|
||||||
|
dependencies:
|
||||||
|
minimatch "^3.0.4"
|
||||||
|
|
||||||
ignore@^3.3.3:
|
ignore@^3.3.3:
|
||||||
version "3.3.7"
|
version "3.3.7"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
|
||||||
@@ -5144,6 +5137,12 @@ jsx-ast-utils@^2.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
array-includes "^3.0.3"
|
array-includes "^3.0.3"
|
||||||
|
|
||||||
|
karma-verbose-reporter@^0.0.6:
|
||||||
|
version "0.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/karma-verbose-reporter/-/karma-verbose-reporter-0.0.6.tgz#5909052451c607f02ac77c763791a2fe1251260c"
|
||||||
|
dependencies:
|
||||||
|
colors ">=1.0"
|
||||||
|
|
||||||
keyv@3.0.0:
|
keyv@3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
|
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
|
||||||
@@ -5369,7 +5368,7 @@ lodash.uniq@^4.5.0:
|
|||||||
version "4.5.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
||||||
|
|
||||||
lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.4:
|
lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
|
||||||
version "4.17.5"
|
version "4.17.5"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
|
||||||
|
|
||||||
@@ -5646,6 +5645,19 @@ minimist@~0.0.1:
|
|||||||
version "0.0.10"
|
version "0.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
|
||||||
|
|
||||||
|
minipass@^2.2.1, minipass@^2.2.4:
|
||||||
|
version "2.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40"
|
||||||
|
dependencies:
|
||||||
|
safe-buffer "^5.1.1"
|
||||||
|
yallist "^3.0.0"
|
||||||
|
|
||||||
|
minizlib@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
|
||||||
|
dependencies:
|
||||||
|
minipass "^2.2.1"
|
||||||
|
|
||||||
mississippi@^2.0.0:
|
mississippi@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
|
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
|
||||||
@@ -5680,9 +5692,9 @@ mkdirp@0.5.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
minimist "0.0.8"
|
minimist "0.0.8"
|
||||||
|
|
||||||
moment@^2.22.0:
|
moment@^2.22.1:
|
||||||
version "2.22.0"
|
version "2.22.1"
|
||||||
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.0.tgz#7921ade01017dd45186e7fee5f424f0b8663a730"
|
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad"
|
||||||
|
|
||||||
move-concurrently@^1.0.1:
|
move-concurrently@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
@@ -5716,6 +5728,10 @@ nan@^2.3.0:
|
|||||||
version "2.10.0"
|
version "2.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
|
||||||
|
|
||||||
|
nan@~2.9.2:
|
||||||
|
version "2.9.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
|
||||||
|
|
||||||
nanomatch@^1.2.9:
|
nanomatch@^1.2.9:
|
||||||
version "1.2.9"
|
version "1.2.9"
|
||||||
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
|
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
|
||||||
@@ -5746,6 +5762,14 @@ nearley@^2.7.10:
|
|||||||
randexp "0.4.6"
|
randexp "0.4.6"
|
||||||
semver "^5.4.1"
|
semver "^5.4.1"
|
||||||
|
|
||||||
|
needle@^2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa"
|
||||||
|
dependencies:
|
||||||
|
debug "^2.1.2"
|
||||||
|
iconv-lite "^0.4.4"
|
||||||
|
sax "^1.2.4"
|
||||||
|
|
||||||
neo-async@^2.5.0:
|
neo-async@^2.5.0:
|
||||||
version "2.5.1"
|
version "2.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
|
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
|
||||||
@@ -5754,6 +5778,10 @@ nice-try@^1.0.4:
|
|||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
|
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
|
||||||
|
|
||||||
|
node-bin-setup@^1.0.0:
|
||||||
|
version "1.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-bin-setup/-/node-bin-setup-1.0.6.tgz#4b5c9bb937ece702d7069b36ca78af4684677528"
|
||||||
|
|
||||||
node-dir@0.1.8:
|
node-dir@0.1.8:
|
||||||
version "0.1.8"
|
version "0.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
|
resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
|
||||||
@@ -5822,6 +5850,27 @@ node-pre-gyp@^0.6.39:
|
|||||||
tar "^2.2.1"
|
tar "^2.2.1"
|
||||||
tar-pack "^3.4.0"
|
tar-pack "^3.4.0"
|
||||||
|
|
||||||
|
node-pre-gyp@~0.9.0:
|
||||||
|
version "0.9.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0"
|
||||||
|
dependencies:
|
||||||
|
detect-libc "^1.0.2"
|
||||||
|
mkdirp "^0.5.1"
|
||||||
|
needle "^2.2.0"
|
||||||
|
nopt "^4.0.1"
|
||||||
|
npm-packlist "^1.1.6"
|
||||||
|
npmlog "^4.0.2"
|
||||||
|
rc "^1.1.7"
|
||||||
|
rimraf "^2.6.1"
|
||||||
|
semver "^5.3.0"
|
||||||
|
tar "^4"
|
||||||
|
|
||||||
|
node@^9.11.0:
|
||||||
|
version "9.11.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/node/-/node-9.11.0.tgz#84dfe1207e48469d56fe12af59dd6450a9fbd04f"
|
||||||
|
dependencies:
|
||||||
|
node-bin-setup "^1.0.0"
|
||||||
|
|
||||||
nomnom@^1.8.1:
|
nomnom@^1.8.1:
|
||||||
version "1.8.1"
|
version "1.8.1"
|
||||||
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
|
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
|
||||||
@@ -5879,6 +5928,17 @@ normalize-url@^1.4.0:
|
|||||||
query-string "^4.1.0"
|
query-string "^4.1.0"
|
||||||
sort-keys "^1.0.0"
|
sort-keys "^1.0.0"
|
||||||
|
|
||||||
|
npm-bundled@^1.0.1:
|
||||||
|
version "1.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
|
||||||
|
|
||||||
|
npm-packlist@^1.1.6:
|
||||||
|
version "1.1.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
|
||||||
|
dependencies:
|
||||||
|
ignore-walk "^3.0.1"
|
||||||
|
npm-bundled "^1.0.1"
|
||||||
|
|
||||||
npm-run-all@^4.1.2:
|
npm-run-all@^4.1.2:
|
||||||
version "4.1.2"
|
version "4.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
|
resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
|
||||||
@@ -6691,7 +6751,7 @@ promise@^7.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
asap "~2.0.3"
|
asap "~2.0.3"
|
||||||
|
|
||||||
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0:
|
prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0:
|
||||||
version "15.6.1"
|
version "15.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6785,7 +6845,7 @@ querystring@0.2.0:
|
|||||||
version "0.2.0"
|
version "0.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||||
|
|
||||||
raf@^3.1.0, raf@^3.2.0, raf@^3.4.0:
|
raf@^3.1.0, raf@^3.4.0:
|
||||||
version "3.4.0"
|
version "3.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
|
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6892,12 +6952,6 @@ react-redux@^5.0.7:
|
|||||||
loose-envify "^1.1.0"
|
loose-envify "^1.1.0"
|
||||||
prop-types "^15.6.0"
|
prop-types "^15.6.0"
|
||||||
|
|
||||||
react-resize-detector@1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-1.1.0.tgz#4a9831fa3caad32230478dd0185cbd2aa91a5ebf"
|
|
||||||
dependencies:
|
|
||||||
prop-types "^15.5.10"
|
|
||||||
|
|
||||||
react-router-dom@^4.2.2:
|
react-router-dom@^4.2.2:
|
||||||
version "4.2.2"
|
version "4.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d"
|
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d"
|
||||||
@@ -6921,15 +6975,6 @@ react-router@^4.2.0:
|
|||||||
prop-types "^15.5.4"
|
prop-types "^15.5.4"
|
||||||
warning "^3.0.0"
|
warning "^3.0.0"
|
||||||
|
|
||||||
react-smooth@1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.0.tgz#b29dbebddddb06d21b5b08962167fb9eac1897d8"
|
|
||||||
dependencies:
|
|
||||||
lodash "~4.17.4"
|
|
||||||
prop-types "^15.6.0"
|
|
||||||
raf "^3.2.0"
|
|
||||||
react-transition-group "^2.2.1"
|
|
||||||
|
|
||||||
react-test-renderer@^16.0.0-0:
|
react-test-renderer@^16.0.0-0:
|
||||||
version "16.3.1"
|
version "16.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.3.1.tgz#d9257936d8535bd40f57f3d5a84e7b0452fb17f2"
|
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.3.1.tgz#d9257936d8535bd40f57f3d5a84e7b0452fb17f2"
|
||||||
@@ -6939,16 +6984,6 @@ react-test-renderer@^16.0.0-0:
|
|||||||
prop-types "^15.6.0"
|
prop-types "^15.6.0"
|
||||||
react-is "^16.3.1"
|
react-is "^16.3.1"
|
||||||
|
|
||||||
react-transition-group@^2.2.1:
|
|
||||||
version "2.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.3.0.tgz#8dd1af58f6af284b19fd057f512e74f20438ad31"
|
|
||||||
dependencies:
|
|
||||||
chain-function "^1.0.0"
|
|
||||||
dom-helpers "^3.2.0"
|
|
||||||
loose-envify "^1.3.1"
|
|
||||||
prop-types "^15.5.8"
|
|
||||||
warning "^3.0.0"
|
|
||||||
|
|
||||||
react-vis@^1.9.2:
|
react-vis@^1.9.2:
|
||||||
version "1.9.2"
|
version "1.9.2"
|
||||||
resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.9.2.tgz#4dbd5d91ac820fd39fa7ad1c892198495194f6e3"
|
resolved "https://registry.yarnpkg.com/react-vis/-/react-vis-1.9.2.tgz#4dbd5d91ac820fd39fa7ad1c892198495194f6e3"
|
||||||
@@ -7094,26 +7129,6 @@ recast@^0.14.1:
|
|||||||
private "~0.1.5"
|
private "~0.1.5"
|
||||||
source-map "~0.6.1"
|
source-map "~0.6.1"
|
||||||
|
|
||||||
recharts-scale@0.3.2:
|
|
||||||
version "0.3.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.3.2.tgz#dac7621714a4765d152cb2adbc30c73b831208c9"
|
|
||||||
|
|
||||||
recharts@^1.0.0-beta.10:
|
|
||||||
version "1.0.0-beta.10"
|
|
||||||
resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.0.0-beta.10.tgz#d3cd15df6b7879d5968da3c942b5fcdaf2504fe1"
|
|
||||||
dependencies:
|
|
||||||
classnames "2.2.5"
|
|
||||||
core-js "2.5.1"
|
|
||||||
d3-interpolate "^1.1.5"
|
|
||||||
d3-scale "1.0.6"
|
|
||||||
d3-shape "1.2.0"
|
|
||||||
lodash "~4.17.4"
|
|
||||||
prop-types "^15.6.0"
|
|
||||||
react-resize-detector "1.1.0"
|
|
||||||
react-smooth "1.0.0"
|
|
||||||
recharts-scale "0.3.2"
|
|
||||||
reduce-css-calc "1.3.0"
|
|
||||||
|
|
||||||
rechoir@^0.6.2:
|
rechoir@^0.6.2:
|
||||||
version "0.6.2"
|
version "0.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
|
resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
|
||||||
@@ -7127,7 +7142,7 @@ redent@^1.0.0:
|
|||||||
indent-string "^2.1.0"
|
indent-string "^2.1.0"
|
||||||
strip-indent "^1.0.1"
|
strip-indent "^1.0.1"
|
||||||
|
|
||||||
reduce-css-calc@1.3.0, reduce-css-calc@^1.2.6:
|
reduce-css-calc@^1.2.6:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
|
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -7756,6 +7771,13 @@ sprintf-js@~1.0.2:
|
|||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||||
|
|
||||||
|
sqlite3@^4.0.0:
|
||||||
|
version "4.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-4.0.0.tgz#cc0e093ab51873f50d9dfc4126fcbef15d486570"
|
||||||
|
dependencies:
|
||||||
|
nan "~2.9.2"
|
||||||
|
node-pre-gyp "~0.9.0"
|
||||||
|
|
||||||
sshpk@^1.7.0:
|
sshpk@^1.7.0:
|
||||||
version "1.14.1"
|
version "1.14.1"
|
||||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb"
|
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb"
|
||||||
@@ -8031,6 +8053,22 @@ tar@^2.2.1:
|
|||||||
fstream "^1.0.2"
|
fstream "^1.0.2"
|
||||||
inherits "2"
|
inherits "2"
|
||||||
|
|
||||||
|
tar@^4:
|
||||||
|
version "4.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749"
|
||||||
|
dependencies:
|
||||||
|
chownr "^1.0.1"
|
||||||
|
fs-minipass "^1.2.5"
|
||||||
|
minipass "^2.2.4"
|
||||||
|
minizlib "^1.1.0"
|
||||||
|
mkdirp "^0.5.0"
|
||||||
|
safe-buffer "^5.1.1"
|
||||||
|
yallist "^3.0.2"
|
||||||
|
|
||||||
|
task-easy@^0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/task-easy/-/task-easy-0.2.0.tgz#af3e4637b09d1da26705717934c0c6321c7810a7"
|
||||||
|
|
||||||
temp-file@^3.1.1:
|
temp-file@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.1.1.tgz#8823649aa4e8a6e419eb71b601a2e4d472b0f24f"
|
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.1.1.tgz#8823649aa4e8a6e419eb71b601a2e4d472b0f24f"
|
||||||
@@ -8731,6 +8769,10 @@ yallist@^2.1.2:
|
|||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
||||||
|
|
||||||
|
yallist@^3.0.0, yallist@^3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
|
||||||
|
|
||||||
yargs-parser@^8.1.0:
|
yargs-parser@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
|
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
|
||||||
|
|||||||
Reference in New Issue
Block a user