diff --git a/.gitignore b/.gitignore index 586e066c0..602f3329d 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,11 @@ private !/src/server/test/**/*.csv !/src/server/data/unit/*.csv +# CSV gz files (except ones needed for database tests) +*.csv.gz +!/src/server/test/**/*.csv.gz +!/src/server/data/unit/*.csv.gz + # Database postgres-data diff --git a/src/client/app/components/AreaUnitSelectComponent.tsx b/src/client/app/components/AreaUnitSelectComponent.tsx index 5dcf5bff8..b994e4b13 100644 --- a/src/client/app/components/AreaUnitSelectComponent.tsx +++ b/src/client/app/components/AreaUnitSelectComponent.tsx @@ -69,11 +69,11 @@ export default function AreaUnitSelectComponent() { {graphState.areaNormalization &&

- : + :

{/* Note input */} - + ); -} \ No newline at end of file +} diff --git a/src/client/app/components/csv/ReadingsCSVUploadComponent.tsx b/src/client/app/components/csv/ReadingsCSVUploadComponent.tsx index 3783fb131..1f5fae9cf 100644 --- a/src/client/app/components/csv/ReadingsCSVUploadComponent.tsx +++ b/src/client/app/components/csv/ReadingsCSVUploadComponent.tsx @@ -4,7 +4,7 @@ import * as React from 'react'; import { Button, Col, Input, Form, FormGroup, Label } from 'reactstrap'; -import { ReadingsCSVUploadProps, TimeSortTypes, BooleanTypes } from '../../types/csvUploadForm'; +import { ReadingsCSVUploadProps, TimeSortTypes, BooleanMeterTypes } from '../../types/csvUploadForm'; import { ReadingsCSVUploadDefaults } from '../../utils/csvUploadDefaults'; import FormFileUploaderComponent from '../FormFileUploaderComponent'; import { FormattedMessage } from 'react-intl'; @@ -90,12 +90,12 @@ export default class ReadingsCSVUploadComponent extends React.Component) { const target = e.target; - this.props.selectCumulative(target.value as BooleanTypes); + this.props.selectCumulative(target.value as BooleanMeterTypes); } private handleSetCumulativeReset(e: React.ChangeEvent) { const target = e.target; - this.props.selectCumulativeReset(target.value as BooleanTypes); + this.props.selectCumulativeReset(target.value as BooleanMeterTypes); } private handleSetCumulativeResetStart(e: React.ChangeEvent) { @@ -120,7 +120,7 @@ export default class ReadingsCSVUploadComponent extends React.Component) { const target = e.target; - this.props.selectEndOnly(target.value as BooleanTypes); + this.props.selectEndOnly(target.value as BooleanMeterTypes); } private handleSetHonorDst() { @@ -194,9 +194,9 @@ export default class ReadingsCSVUploadComponent extends React.Component - - - + + + @@ -206,9 +206,9 @@ export default class ReadingsCSVUploadComponent extends React.Component - - - + + + @@ -269,9 +269,9 @@ export default class ReadingsCSVUploadComponent extends React.Component - - - + + + diff --git a/src/client/app/components/groups/CreateGroupModalComponent.tsx b/src/client/app/components/groups/CreateGroupModalComponent.tsx index 2849a8dc1..2d08e6137 100644 --- a/src/client/app/components/groups/CreateGroupModalComponent.tsx +++ b/src/client/app/components/groups/CreateGroupModalComponent.tsx @@ -148,7 +148,6 @@ export default function CreateGroupModalComponent(props: CreateGroupModalCompone notifyMsg += '\n"' + meter.identifier + '"' + translate('group.area.calculate.error.zero'); } }); - translate('group.area.calculate.header') let msg = translate('group.area.calculate.header') + areaSum + ' ' + translate(`AreaUnitType.${state.areaUnit}`); if (notifyMsg != '') { msg += '\n' + translate('group.area.calculate.error.header') + notifyMsg; @@ -310,7 +309,7 @@ export default function CreateGroupModalComponent(props: CreateGroupModalCompone {/* Name input */} - + {/* default graphic unit input */} - + {/* Displayable input */} - + {/* GPS input */} - + {/* Area input */} - + {/* meter area unit input */} - + {/* Note input */} - + {/* Name input for admin*/} - + {/* default graphic unit input for admin */} - + {/* Name display for non-admin */} - + {/* default graphic unit display for non-admin */} - + {/* TODO: This component still displays a dropdown arrow, even though a user cannot use the dropdown */} {/* Displayable input, only for admin. */} - + {/* GPS input, only for admin. */} - + {/* Area input, only for admin. */} - + {/* Calculate sum of meter areas */} @@ -546,7 +545,7 @@ export default function EditGroupModalComponent(props: EditGroupModalComponentPr {/* meter area unit input */} - + {/* Note input, only for admin. */} - +
{/* Use meter translation id string since same one wanted. */} - + {/* This is the default graphic unit associated with the group or no unit if none. */} {props.group.defaultGraphicUnit === -99 ? ' ' + noUnitTranslated().identifier : ' ' + unitState[props.group.defaultGraphicUnit].identifier}
{loggedInAsAdmin &&
- {translate(`TrueFalseType.${props.group.displayable.toString()}`)} + {translate(`TrueFalseType.${props.group.displayable.toString()}`)}
} {/* Only show first 30 characters so card does not get too big. Should limit to one line */} {loggedInAsAdmin &&
- {props.group.note?.slice(0, 29)} + {props.group.note?.slice(0, 29)}
}
@@ -90,4 +90,4 @@ export default function GroupViewComponent(props: GroupViewComponentProps) {
); -} \ No newline at end of file +} diff --git a/src/client/app/components/maps/MapCalibrationComponent.tsx b/src/client/app/components/maps/MapCalibrationComponent.tsx index 438c79772..ecbae600c 100644 --- a/src/client/app/components/maps/MapCalibrationComponent.tsx +++ b/src/client/app/components/maps/MapCalibrationComponent.tsx @@ -9,6 +9,7 @@ import MapCalibrationChartDisplayContainer from '../../containers/maps/MapCalibr import MapCalibrationInfoDisplayContainer from '../../containers/maps/MapCalibrationInfoDisplayContainer'; import UnsavedWarningContainer from '../../containers/UnsavedWarningContainer'; import HeaderComponent from '../../components/HeaderComponent'; +import MapsDetailContainer from '../../containers/maps/MapsDetailContainer'; interface MapCalibrationProps { mode: CalibrationModeTypes; @@ -26,7 +27,7 @@ export default class MapCalibrationComponent extends React.Component - + ); @@ -36,17 +37,15 @@ export default class MapCalibrationComponent extends React.Component
- - + +
); } else { // preview mode containers return (
- - -

+

); } diff --git a/src/client/app/components/meters/CreateMeterModalComponent.tsx b/src/client/app/components/meters/CreateMeterModalComponent.tsx index 800c2b19a..d8a49cc1c 100644 --- a/src/client/app/components/meters/CreateMeterModalComponent.tsx +++ b/src/client/app/components/meters/CreateMeterModalComponent.tsx @@ -333,7 +333,7 @@ export default function CreateMeterModalComponent(props: CreateMeterModalCompone {/* Identifier input */} - + {/* Name input */} - + {/* default graphic unit input */} - + {/* Displayable input */} - + handleStringChange(e)} value={state.readingFrequency} - invalid={state.readingFrequency === ''}/> + invalid={state.readingFrequency === ''} /> @@ -502,7 +502,7 @@ export default function CreateMeterModalComponent(props: CreateMeterModalCompone {/* GPS input */} - + {/* Area input */} - + {/* meter area unit input */} - + {/* note input */} - + {/* cumulative input */} - - - handleBooleanChange(e)}> - {Object.keys(TrueFalseType).map(key => { - return () - })} - - - {/* cumulativeReset input */} - - - handleBooleanChange(e)}> - {Object.keys(TrueFalseType).map(key => { - return () - })} - - + + + + handleBooleanChange(e)}> + {Object.keys(TrueFalseType).map(key => { + return () + })} + + + {/* cumulativeReset input */} + + + handleBooleanChange(e)}> + {Object.keys(TrueFalseType).map(key => { + return () + })} + + + {/* cumulativeResetStart input */} - - - handleStringChange(e)} - value={state.cumulativeResetStart} - placeholder='HH:MM:SS' /> - - {/* cumulativeResetEnd input */} - - - handleStringChange(e)} - value={state.cumulativeResetEnd} - placeholder='HH:MM:SS' /> - + + + + handleStringChange(e)} + value={state.cumulativeResetStart} + placeholder='HH:MM:SS' /> + + {/* cumulativeResetEnd input */} + + + handleStringChange(e)} + value={state.cumulativeResetEnd} + placeholder='HH:MM:SS' /> + + {/* endOnlyTime input */} @@ -636,7 +640,7 @@ export default function CreateMeterModalComponent(props: CreateMeterModalCompone onChange={e => handleNumberChange(e)} min='0' defaultValue={state.readingGap} - invalid={state?.readingGap < 0}/> + invalid={state?.readingGap < 0} /> @@ -670,80 +674,84 @@ export default function CreateMeterModalComponent(props: CreateMeterModalCompone min='1' max='9' defaultValue={state.readingDuplication} - invalid={state?.readingDuplication < 1 || state?.readingDuplication > 9}/> + invalid={state?.readingDuplication < 1 || state?.readingDuplication > 9} /> - + {/* timeSort input */} - - - handleStringChange(e)}> - {Object.keys(MeterTimeSortType).map(key => { - // This is a bit of a hack but it should work fine. The TypeSortTypes and MeterTimeSortType should be in sync. - // The translation is on the former so we use that enum name there but loop on the other to get the value desired. - return () - })} - - - {/* Timezone input */} - - - handleTimeZoneChange(timeZone)} /> - - {/* reading input */} - - - handleNumberChange(e)} - defaultValue={state.reading} /> - + + + + handleStringChange(e)}> + {Object.keys(MeterTimeSortType).map(key => { + // This is a bit of a hack but it should work fine. The TypeSortTypes and MeterTimeSortType should be in sync. + // The translation is on the former so we use that enum name there but loop on the other to get the value desired. + return () + })} + + + {/* Timezone input */} + + + handleTimeZoneChange(timeZone)} /> + + {/* reading input */} + + + handleNumberChange(e)} + defaultValue={state.reading} /> + + {/* startTimestamp input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state.startTimestamp} /> - - {/* endTimestamp input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state.endTimestamp} /> - - {/* endTimestamp input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state.previousEnd} /> - + + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state.startTimestamp} /> + + {/* endTimestamp input */} + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state.endTimestamp} /> + + {/* endTimestamp input */} + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state.previousEnd} /> + + diff --git a/src/client/app/components/meters/EditMeterModalComponent.tsx b/src/client/app/components/meters/EditMeterModalComponent.tsx index af4939d97..60fe15df8 100644 --- a/src/client/app/components/meters/EditMeterModalComponent.tsx +++ b/src/client/app/components/meters/EditMeterModalComponent.tsx @@ -360,7 +360,7 @@ export default function EditMeterModalComponent(props: EditMeterModalComponentPr {/* Identifier input */} - + {/* Name input */} - + {/* default graphic unit input */} - + {/* Displayable input */} - + {/* GPS input */} - + {/* Area input */} - + {/* meter area unit input */} - + {/* note input */} - + {/* cumulative input */} - - - handleBooleanChange(e)}> - {Object.keys(TrueFalseType).map(key => { - return () - })} - - - {/* cumulativeReset input */} - - - handleBooleanChange(e)}> - {Object.keys(TrueFalseType).map(key => { - return () - })} - - + + + + handleBooleanChange(e)}> + {Object.keys(TrueFalseType).map(key => { + return () + })} + + + {/* cumulativeReset input */} + + + handleBooleanChange(e)}> + {Object.keys(TrueFalseType).map(key => { + return () + })} + + {/* cumulativeResetStart input */} - - - handleStringChange(e)} - value={state.cumulativeResetStart} - placeholder='HH:MM:SS' /> - - {/* cumulativeResetEnd input */} - - - handleStringChange(e)} - value={state?.cumulativeResetEnd} - placeholder='HH:MM:SS' /> - + + + + handleStringChange(e)} + value={state.cumulativeResetStart} + placeholder='HH:MM:SS' /> + + {/* cumulativeResetEnd input */} + + + handleStringChange(e)} + value={state?.cumulativeResetEnd} + placeholder='HH:MM:SS' /> + {/* endOnlyTime input */} @@ -684,72 +686,76 @@ export default function EditMeterModalComponent(props: EditMeterModalComponentPr {/* timeSort input */} - - - handleStringChange(e)}> - {Object.keys(MeterTimeSortType).map(key => { - // This is a bit of a hack but it should work fine. The TypeSortTypes and MeterTimeSortType should be in sync. - // The translation is on the former so we use that enum name there but loop on the other to get the value desired. - return () - })} - - - {/* Timezone input */} - - - handleTimeZoneChange(timeZone)} /> - - {/* reading input */} - - - handleNumberChange(e)} - defaultValue={state?.reading} /> - + + + + handleStringChange(e)}> + {Object.keys(MeterTimeSortType).map(key => { + // This is a bit of a hack but it should work fine. The TypeSortTypes and MeterTimeSortType should be in sync. + // The translation is on the former so we use that enum name there but loop on the other to get the value desired. + return () + })} + + + {/* Timezone input */} + + + handleTimeZoneChange(timeZone)} /> + + {/* reading input */} + + + handleNumberChange(e)} + defaultValue={state?.reading} /> + + {/* startTimestamp input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state?.startTimestamp} /> - - {/* endTimestamp input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state?.endTimestamp} /> - - {/* previousEnd input */} - - - handleStringChange(e)} - placeholder='YYYY-MM-DD HH:MM:SS' - value={state?.previousEnd} /> - + + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state?.startTimestamp} /> + + {/* endTimestamp input */} + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state?.endTimestamp} /> + + {/* previousEnd input */} + + + handleStringChange(e)} + placeholder='YYYY-MM-DD HH:MM:SS' + value={state?.previousEnd} /> + + diff --git a/src/client/app/components/meters/MeterViewComponent.tsx b/src/client/app/components/meters/MeterViewComponent.tsx index f7e0e4d98..a2a08d0f0 100644 --- a/src/client/app/components/meters/MeterViewComponent.tsx +++ b/src/client/app/components/meters/MeterViewComponent.tsx @@ -14,7 +14,7 @@ import { FormattedMessage } from 'react-intl'; import { isRoleAdmin } from '../../utils/hasPermissions'; import { CurrentUserState } from 'types/redux/currentUser'; import '../../styles/card-page.css'; -import { UnitData} from '../../types/redux/units'; +import { UnitData } from '../../types/redux/units'; import { noUnitTranslated } from '../../utils/input'; interface MeterViewComponentProps { @@ -67,14 +67,14 @@ export default function MeterViewComponent(props: MeterViewComponentProps) { {loggedInAsAdmin &&
- {props.meter.name} + {props.meter.name}
}
{unitName}
- {graphicName} + {graphicName}
{loggedInAsAdmin &&
@@ -83,13 +83,13 @@ export default function MeterViewComponent(props: MeterViewComponentProps) { } {loggedInAsAdmin &&
- {translate(`TrueFalseType.${props.meter.displayable.toString()}`)} + {translate(`TrueFalseType.${props.meter.displayable.toString()}`)}
} {loggedInAsAdmin &&
{/* Only show first 30 characters so card does not get too big. Should limit to one line. Check in case null. */} - {props.meter.note?.slice(0, 29)} + {props.meter.note?.slice(0, 29)}
} {loggedInAsAdmin && diff --git a/src/client/app/components/unit/CreateUnitModalComponent.tsx b/src/client/app/components/unit/CreateUnitModalComponent.tsx index 3dcbf99e6..81d556262 100644 --- a/src/client/app/components/unit/CreateUnitModalComponent.tsx +++ b/src/client/app/components/unit/CreateUnitModalComponent.tsx @@ -122,7 +122,7 @@ export default function CreateUnitModalComponent() { {/* Identifier input */} - + {/* Name input */} - + {/* Displayable type input */} - + {/* Note input */} - + {/* Identifier input */} - + {/* Name input */} - + {/* Displayable type input */} - + {/* Note input */} - + ); -} \ No newline at end of file +} diff --git a/src/client/app/components/unit/UnitViewComponent.tsx b/src/client/app/components/unit/UnitViewComponent.tsx index 65548c419..6753a0835 100644 --- a/src/client/app/components/unit/UnitViewComponent.tsx +++ b/src/client/app/components/unit/UnitViewComponent.tsx @@ -41,7 +41,7 @@ export default function UnitViewComponent(props: UnitViewComponentProps) { {props.unit.identifier}
- {props.unit.name} + {props.unit.name}
{props.unit.typeOfUnit} @@ -50,7 +50,7 @@ export default function UnitViewComponent(props: UnitViewComponentProps) { {props.unit.unitRepresent}
- {props.unit.displayable} + {props.unit.displayable}
{translate(`TrueFalseType.${props.unit.preferredDisplay.toString()}`)} @@ -63,7 +63,7 @@ export default function UnitViewComponent(props: UnitViewComponentProps) {
{/* Only show first 30 characters so card does not get too big. Should limit to one line. Protect against null from DB in note. */} - {props.unit.note ? props.unit.note.slice(0, 29) : ''} + {props.unit.note ? props.unit.note.slice(0, 29) : ''}
); -} \ No newline at end of file +} diff --git a/src/client/app/containers/csv/UploadCSVContainer.tsx b/src/client/app/containers/csv/UploadCSVContainer.tsx index 6990c35e1..7307691af 100644 --- a/src/client/app/containers/csv/UploadCSVContainer.tsx +++ b/src/client/app/containers/csv/UploadCSVContainer.tsx @@ -7,7 +7,7 @@ import MetersCSVUploadComponent from '../../components/csv/MetersCSVUploadCompon import ReadingsCSVUploadComponent from '../../components/csv/ReadingsCSVUploadComponent'; import FooterContainer from '../FooterContainer'; import { uploadCSVApi } from '../../utils/api'; -import { ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem, TimeSortTypes, BooleanTypes } from '../../types/csvUploadForm'; +import { ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem, TimeSortTypes, BooleanMeterTypes } from '../../types/csvUploadForm'; import { ReadingsCSVUploadDefaults, MetersCSVUploadDefaults } from '../../utils/csvUploadDefaults'; import { TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap'; import { FormattedMessage } from 'react-intl'; @@ -95,7 +95,7 @@ export default class UploadCSVContainer extends React.Component<{}, UploadCSVCon } })) } - private selectCumulative(value: BooleanTypes) { + private selectCumulative(value: BooleanMeterTypes) { this.setState(previousState => ({ ...previousState, uploadReadingsPreferences: { @@ -104,7 +104,7 @@ export default class UploadCSVContainer extends React.Component<{}, UploadCSVCon } })) } - private selectCumulativeReset(value: BooleanTypes) { + private selectCumulativeReset(value: BooleanMeterTypes) { this.setState(previousState => ({ ...previousState, uploadReadingsPreferences: { @@ -149,7 +149,7 @@ export default class UploadCSVContainer extends React.Component<{}, UploadCSVCon } })) } - private selectEndOnly(value: BooleanTypes) { + private selectEndOnly(value: BooleanMeterTypes) { this.setState(previousState => ({ ...previousState, uploadReadingsPreferences: { @@ -326,4 +326,4 @@ export default class UploadCSVContainer extends React.Component<{}, UploadCSVCon ) } -} \ No newline at end of file +} diff --git a/src/client/app/translations/data.js b/src/client/app/translations/data.js index dc41f4175..d57f90346 100644 --- a/src/client/app/translations/data.js +++ b/src/client/app/translations/data.js @@ -17,11 +17,12 @@ const localeData = { "admin.only": "Admin Only", "admin.panel": "Admin Panel", "alphabetically": "Alphabetically", - "area": "Area", + "area": "Area:", "area.but.no.unit": "You have entered a nonzero area but no area unit.", "area.error": "Please enter a number for area", "area.normalize": "Normalize by Area", "area.calculate.auto": "Calculate Group Area", + "area.unit": "Area Unit:", "AreaUnitType.feet": "sq. feet", "AreaUnitType.meters": "sq. meters", "AreaUnitType.none": "no unit", @@ -30,9 +31,9 @@ const localeData = { "bar.interval": "Bar Interval", "bar.raw": "Cannot create bar graph on raw units such as temperature", "bar.stacking": "Bar Stacking", - "BooleanTypes.false": "no", - "BooleanTypes.meter": "meter or default value", - "BooleanTypes.true": "yes", + "BooleanMeterTypes.false": "no", + "BooleanMeterTypes.meter": "meter or default value", + "BooleanMeterTypes.true": "yes", "calibration.display": "result:", "calibration.reset.button": "Reset", "calibration.save.database": "Save changes to database", @@ -63,8 +64,6 @@ const localeData = { "conversion.failed.to.edit.conversion": "Failed to edit conversion.", "conversion.intercept": "Intercept:", "conversion.is.deleted": "Conversion removed from database", - "conversion.note": "Note:", - "conversion.remove": "Remove", "conversion.represent": "Conversion Represent:", "conversion.select.destination": "Select a destination unit", "conversion.select.source": "Select a source unit", @@ -117,6 +116,7 @@ const localeData = { "default.bar.stacking": "Stack bars by default", "default.graph.type": "Default Graph Type", "default.graph.settings": "Default Graph Settings", + "defaultGraphicUnit": "Default Graphic Unit:", "default.language": "Default Language", "default.meter.reading.frequency": "Default meter reading frequency", "default.site.title": "Default Site Title", @@ -129,7 +129,7 @@ const localeData = { "descending": "Descending", "discard.changes": "Discard Changes", "disable": "Disable", - "displayable": "Displayable", + "displayable": "Displayable:", "DisplayableType.none": "none", "DisplayableType.all": "all", "DisplayableType.admin": "admin", @@ -159,11 +159,11 @@ const localeData = { "failed.to.link.graph": "Failed to link graph", "failed.to.submit.changes": "Failed to submit changes", "false": "False", + "gps": "GPS: latitude, longitude", "graph": "Graph", "graph.type": "Graph Type", "group": "Group", "group.all.meters": "All Meters", - "group.area": "Group Area:", "group.area.calculate": "Calculate Group Area", "group.area.calculate.header": "Group Area will be set to ", "group.area.calculate.error.header": "The following meters were excluded from the sum because:", @@ -171,13 +171,10 @@ const localeData = { "group.area.calculate.error.unit": ": nonzero area but no area unit", "group.area.calculate.error.no.meters": "No meters in group", "group.area.calculate.error.group.unit": "No group area unit", - "group.area.unit": "Group Area Unit:", "group.create.nounit": "The default graphic unit was changed to no unit from ", - "group.defaultGraphicUnit": "Default Graphic Unit:", "group.delete.group": "Delete Group", "group.delete.issue": "is contained in the following groups and cannot be deleted", "group.details": "Group Details", - "group.displayable": "Group Displayable:", "group.edit.cancelled": "THE CHANGE TO THE GROUP IS CANCELLED", "group.edit.changed": "will have its compatible units changed by the edit to this group", "group.edit.circular": "Adding this meter/group to this group creates a circular dependency.", @@ -187,14 +184,10 @@ const localeData = { "group.edit.verify": "Given the messages, do you want to cancel this change (click Cancel) or continue (click OK)?", "group.failed.to.create.group": "Failed to create a group with message: ", "group.failed.to.edit.group": "Failed to edit group with message: ", - "group.gps": "Group GPS (latitude, longitude):", "group.gps.error": "Please input a valid GPS: (latitude, longitude)", "group.hidden": "At least one group is not visible to you", - "group.id": "Group ID", "group.input.error": "Input invalid so group not created or edited.", - "group.name": "Group Name:", "group.name.error": "Please enter a valid name: (must have at least one character that is not a space)", - "group.note": "Group Note:", "groups": "Groups", "group.successfully.create.group": "Successfully created a group.", "group.successfully.edited.group": "Successfully edited group.", @@ -248,6 +241,7 @@ const localeData = { "hide.options.in.link": "Hide options in link", "home": "Home", "hour": "Hour", + "identifier": "Identifier:", "import.meter.readings": "Import Meter Readings", "incompatible.groups": "Incompatible Groups", "incompatible.meters": "Incompatible Meters", @@ -302,26 +296,19 @@ const localeData = { "menu": "Menu", "meter": "Meter", "meters": "Meters", - "meter.area": "Area:", - "meter.area.unit": "Meter Area Unit:", "meter.create": "Create a Meter", "meter.cumulative": "Cumulative:", "meter.cumulativeReset": "Cumulative Reset:", "meter.cumulativeResetEnd": "Cumulative Reset End:", "meter.cumulativeResetStart": "Cumulative Reset Start:", - "meter.defaultGraphicUnit": "Default Graphic Unit:", - "meter.displayable": "Displayable:", "meter.enabled": "Updates:", "meter.endOnlyTime": "End Only Time:", "meter.endTimeStamp": "End Time Stamp:", "meter.failed.to.create.meter": "Failed to create a meter with message: ", "meter.failed.to.edit.meter": "Failed to edit meter with message: ", - "meter.gps": "GPS: latitude, longitude", "meter.hidden": "At least one meter is not visible to you", "meter.id": "ID", - "meter.identifier": "Identifier:", "meter.input.error": "Input invalid so meter not created or edited.", - "meter.note": "Note:", "meter.unit.change.requires": "needs to be changed before changing this unit's type", "meter.unitName": "Unit:", "meter.url": "URL:", @@ -329,9 +316,7 @@ const localeData = { "meter.is.enabled": "Updates Enabled", "meter.is.not.displayable": "Display Disabled", "meter.is.not.enabled": "Updates Disabled", - "meter.name": "Name:", "meter.previousEnd": "Previous End Time Stamp:", - "meter.reading": "Reading:", "meter.readingDuplication": "Reading Duplication:", "meter.readingFrequency": "Reading Frequency", "meter.readingGap": "Reading Gap:", @@ -344,11 +329,11 @@ const localeData = { "meter.type": "Type:", "minute": "Minute", "more.energy": "more energy", - "name": "Name", + "name": "Name:", "navigation": "Navigation", "need.more.points": "Need more points", "no": "no", - "note": "Note", + "note": "Note:", "oed": "Open Energy Dashboard", "oed.description": "Open Energy Dashboard is an independent open source project. ", "oed.version": "OED version ", @@ -363,6 +348,7 @@ const localeData = { "per.second": "Per Second", "projected.to.be.used": "projected to be used", "rate": "Rate", + "reading": "Reading:", "redo.cik.and.refresh.db.views": "Processing changes. This may take a while.", "redraw": "Redraw", "remove": "Remove", @@ -407,25 +393,17 @@ const localeData = { "UnitRepresentType.quantity": "quantity", "UnitRepresentType.flow": "flow", "UnitRepresentType.raw": "raw", - "UnitRepresentType.unused": "unused", "UnitType.unit": "unit", "UnitType.meter": "meter", "UnitType.suffix": "suffix", - "unit.displayable": "Displayable:", - "unit.dropdown.displayable": "Select a displayable type:", "unit.dropdown.displayable.option.none": "None", "unit.dropdown.displayable.option.all": "All", "unit.dropdown.displayable.option.admin": "admin", "unit.failed.to.create.unit": "Failed to create a unit.", "unit.failed.to.edit.unit": "Failed to edit unit.", - "unit.id": "ID:", - "unit.identifier": "Identifier:", "unit.input.error": "Input invalid so unit not created or edited.", - "unit.name": "Unit Name:", "unit.none": "no unit", - "unit.note": "Note:", "unit.preferred.display": "Preferred Display:", - "unit.remove": "Remove", "unit.represent": "Unit Represent:", "unit.sec.in.rate": "Sec in Rate:", "unit.submit.new.unit": "Submit New Unit", @@ -434,9 +412,6 @@ const localeData = { "unit.suffix": "Suffix:", "unit.type.of.unit": "Type of Unit:", "units": "Units", - "units.area": "Area Unit", - "unused.groups": "Unused Groups", - "unused.meters": "Unused Meters", "unsaved.warning": "You have unsaved change(s). Are you sure you want to leave?", "update": "update", "updated.map.with.calibration": "Updated map with renewed calibration", @@ -473,11 +448,12 @@ const localeData = { "admin.only": "Uniquement pour Les Administrateurs", "admin.panel": "Panneau d'administration", "alphabetically": "Alphabétiquement", - "area": "Région", + "area": "Région:", "area.but.no.unit": "(Need French) You have entered a nonzero area but no area unit.", "area.error": "(Need French) Please enter a number for area", "area.normalize": "(Need French) Normalize by Area", "area.calculate.auto": "(Need French) Calculate Group Area", + "area.unit": "(Need French) Area Unit:", "AreaUnitType.feet": "pieds carrés", "AreaUnitType.meters": "mètre carré", "AreaUnitType.none": "(Need French) no unit", @@ -486,9 +462,9 @@ const localeData = { "bar.interval": "Intervalle du Diagramme à Bandes", "bar.raw": "(Need French) Cannot create bar graph on raw units such as temperature", "bar.stacking": "Empilage de Bandes", - "BooleanTypes.false": "(need French) yes", - "BooleanTypes.meter": "valeur du compteur ou valeur par défaut", - "BooleanTypes.true": "(need French) no", + "BooleanMeterTypes.false": "(need French) yes", + "BooleanMeterTypes.meter": "valeur du compteur ou valeur par défaut", + "BooleanMeterTypes.true": "(need French) no", "calibration.display": "résultat: ", "calibration.reset.button": "Réinitialiser", "calibration.save.database": "Enregistrer les modifications dans la base de données", @@ -519,8 +495,6 @@ const localeData = { "conversion.failed.to.edit.conversion": "(Need French) Failed to edit conversion.", "conversion.intercept": "(Need French) Intercept:", "conversion.is.deleted": "(Need French) Conversion removed from database", - "conversion.note": "(Need French) Note:", - "conversion.remove": "(Need French) Remove", "conversion.represent": "(Need French) Conversion Represent:", "conversion.select.destination": "(Need French) Select a destination unit", "conversion.select.source": "(Need French) Select a source unit", @@ -573,6 +547,7 @@ const localeData = { "default.bar.stacking": "(Need French) Stack bars by default", "default.graph.type": "Type du Diagramme par Défaut", "default.graph.settings": "(Need French) Default Graph Settings", + "defaultGraphicUnit": "(Need French) Default Graphic Unit:", "default.language": "Langue par Défaut", "default.meter.reading.frequency": "(Need French) Default meter reading frequency", "default.site.title": "Titre du Site par Défaut", @@ -585,7 +560,7 @@ const localeData = { "descending": "Descendant", "discard.changes": "Annuler les Modifications", "disable": "Désactiver", - "displayable": "Affichable", + "displayable": "Affichable:", "DisplayableType.none": "(Need French) none", "DisplayableType.all": "(Need French) all", "DisplayableType.admin": "(Need French) admin", @@ -615,11 +590,11 @@ const localeData = { "failed.to.link.graph": "Échec de lier le graphique", "failed.to.submit.changes": "Échec de l'envoi des modifications", "false": "Faux", + "gps": "(Need French) GPS: latitude, longitude", "graph": "Graphique", "graph.type": "Type du Diagramme", "group": "Groupe", "group.all.meters": "Tous les compteurs", - "group.area": "(Need French) Group Area:", "group.area.calculate": "(Need French) Calculate Group Area", "group.area.calculate.header": "(Need French) Group Area will be set to ", "group.area.calculate.error.header": "(Need French) The following meters were excluded from the sum because:", @@ -627,13 +602,10 @@ const localeData = { "group.area.calculate.error.unit": "(Need French) : nonzero area but no area unit", "group.area.calculate.error.no.meters": "(Need French) No meters in group", "group.area.calculate.error.group.unit": "(Need French) No group area unit", - "group.area.unit": "(Need French) Group Area Unit:", "group.create.nounit": "(Need French) The default graphic unit was changed to no unit from ", - "group.defaultGraphicUnit": "(Need French) Default Graphic Unit:", "group.delete.group": "(Need French) Delete Group", "group.delete.issue": "(Need French) is contained in the following groups and cannot be deleted", "group.details": "(Need French) Group Details", - "group.displayable": "(Need French) Group Displayable:", "group.edit.cancelled": "(Need French) THE CHANGE TO THE GROUP IS CANCELLED", "group.edit.changed": "(Need French) will have its compatible units changed by the edit to this group", "group.edit.circular": "(Need French) Adding this meter/group to this group creates a circular dependency.", @@ -643,14 +615,10 @@ const localeData = { "group.edit.verify": "(Need French) Given the messages, do you want to cancel this change (click Cancel) or continue (click OK)?", "group.failed.to.create.group": "(Need French) Failed to create a group with message: ", "group.failed.to.edit.group": "(Need French) Failed to edit group with message: ", - "group.gps": "GPS de groupe (latitude, longitude):", "group.gps.error": "(Need French) Please input a valid GPS: (latitude, longitude)", "group.hidden": "(Need French) At least one group is not visible to you", - "group.id": "(Need French) Group ID", "group.input.error": "(Need French) Input invalid so group not created or edited.", - "group.name": "(Need French) Group Name:", "group.name.error": "(Need French) Please enter a valid name: (must have at least one character that is not a space)", - "group.note": "(Need French) Group Note:", "groups": "Groupes", "group.successfully.create.group": "(Need French) Successfully created a group.", "group.successfully.edited.group": "(Need French) Successfully edited group.", @@ -704,6 +672,7 @@ const localeData = { "hide.options.in.link": "(Need French) Hide options in link", "home": "Accueil", "hour": "(Need French) Hour", + "identifier": "(Need French) Identifier:", "import.meter.readings": "Importer des Relevés de Mètres", "incompatible.groups": "(Need French) Incompatible Groups", "incompatible.meters": "(Need French) Incompatible Meters", @@ -758,26 +727,19 @@ const localeData = { "menu": "Menu", "meter": "Mèter", "meters": "Mèters", - "meter.area": "(Need French) Area:", - "meter.area.unit": "(Need French) Meter Area Unit:", "meter.create": "(Need French) Create a Meter", "meter.cumulative": "(Need French) Cumulative:", "meter.cumulativeReset": "(Need French) Cumulative Reset:", "meter.cumulativeResetEnd": "(Need French) Cumulative Reset End:", "meter.cumulativeResetStart": "(Need French) Cumulative Reset Start:", - "meter.defaultGraphicUnit": "(Need French) Default Graphic Unit:", - "meter.displayable": "Affichage du Mèters", "meter.enabled": "Mises à Jour du Mèters", "meter.endOnlyTime": "(Need French) End Only Time:", "meter.endTimeStamp": "(Need French) End Time Stamp:", "meter.failed.to.create.meter": "(Need French) Failed to create a meter with message: ", "meter.failed.to.edit.meter": "(Need French) Failed to edit meter with message: ", - "meter.gps": "(Need French) Meter GPS: latitude, longitude", "meter.hidden": "(Need French) At least one meter is not visible to you", "meter.id": "Identifiant du Mèters", - "meter.identifier": "(Need French) Meter identifier", "meter.input.error": "(Need French) Input invalid so meter not created or edited.", - "meter.note": "(Need French) Note:", "meter.unit.change.requires": "(Need French) needs to be changed before changing this unit's type", "meter.unitName": "(Need French) Unit:", "meter.url": "URL du Mèters", @@ -785,9 +747,7 @@ const localeData = { "meter.is.enabled": "Mises à Jour Activées", "meter.is.not.displayable": "Affichage Désactivé", "meter.is.not.enabled": "Mises à Jour Désactivées", - "meter.name": "Nom du Mèters", "meter.previousEnd": "(need French) Previous End Time Stamp:", - "meter.reading": "(need French) Reading:", "meter.readingDuplication": "(need French) Reading Duplication:", "meter.readingFrequency": "(need French) Reading Frequency", "meter.readingGap": "(need French) Reading Gap:", @@ -800,11 +760,11 @@ const localeData = { "meter.type": "Type de Mèters", "minute": "(need French) Minute", "more.energy": "plus d'énergie", - "name": "Nom", + "name": "Nom:", "navigation": "Navigation", "need.more.points": "(Need French) Need more points", "no": "(need French) no", - "note": "Noter", + "note": "Noter:", "oed": "Tableau de Bord Ouvert d'énergie", "oed.description": "Le Tableau de Bord Ouvert d'énergie est un projet open source indépendant. ", "oed.version": "(Need French) OED version ", @@ -819,6 +779,7 @@ const localeData = { "per.second": "(Need French) Per Second", "projected.to.be.used": "projeté pour être utilisé", "rate": "(need French) Rate", + "reading": "(need French) Reading:", "redo.cik.and.refresh.db.views": "(need French) Processing changes. This may take a while", "redraw": "Redessiner", "remove": "(need French) Remove", @@ -863,25 +824,17 @@ const localeData = { "UnitRepresentType.quantity": "(Need French) quantity", "UnitRepresentType.flow": "(Need French) flow", "UnitRepresentType.raw": "(Need French) raw", - "UnitRepresentType.unused": "(Need French) unused", "UnitType.unit": "(Need French) unit", "UnitType.meter": "(Need French) meter", "UnitType.suffix": "(Need French) suffix", - "unit.displayable": "(Need French) Displayable:", - "unit.dropdown.displayable": "(Need French) Select a displayable type:", "unit.dropdown.displayable.option.none": "(Need French) None", "unit.dropdown.displayable.option.all": "(Need French) All", "unit.dropdown.displayable.option.admin": "(Need French) admin", "unit.failed.to.create.unit": "(Need French) Failed to create a unit.", "unit.failed.to.edit.unit": "(Need French) Failed to edit unit.", - "unit.id": "(Need French) ID:", - "unit.identifier": "(Need French) Identifier:", "unit.input.error": "(Need French) Input invalid so unit not created or edited.", - "unit.name": "(Need French) Unit Name:", "unit.none": "(Need French) no unit", - "unit.note": "(Need French) Note:", "unit.preferred.display": "(Need French) Preferred Display:", - "unit.remove": "(Need French) Remove", "unit.represent": "(Need French) Unit Represent:", "unit.sec.in.rate": "(Need French) Sec in Rate:", "unit.submit.new.unit": "(Need French) Submit New Unit", @@ -890,9 +843,6 @@ const localeData = { "unit.suffix": "(Need French) Suffix:", "unit.type.of.unit": "(Need French) Type of Unit:", "units": "(Need French) Units", - "units.area": "(Need French) Area Unit", - "unused.groups": "Groupes non utilisés", - "unused.meters": "Mètres non utilisés", "unsaved.warning": "(Need French) You have unsaved change(s). Are you sure you want to leave?", "update": "update", "updated.map.with.calibration": "(need French) Updated map with renewed calibration", @@ -929,11 +879,12 @@ const localeData = { "admin.only": "Solo administrador", "admin.panel": "Panel de administración", "alphabetically": "Alfabéticamente", - "area": "Área", + "area": "Área:", "area.but.no.unit": "(Need Spanish)You have entered a nonzero area but no area unit.", "area.error": "Por favor entra un numero por la área", "area.normalize": "(Need Spanish) Normalize by Area", "area.calculate.auto": "(Need Spanish) Calculate Group Area", + "area.unit": "(Need Spanish) Area Unit:", "AreaUnitType.feet": "pies cuadrados", "AreaUnitType.meters": "metros cuadrados", "AreaUnitType.none": "(Need Spanish) no unit", @@ -942,9 +893,9 @@ const localeData = { "bar.interval": "Intervalo de barra", "bar.raw": "(Need Spanish) Cannot create bar graph on raw units such as temperature", "bar.stacking": "Barra de apilamiento", - "BooleanTypes.false": "sí", - "BooleanTypes.meter": "(Need Spanish) meter or default value", - "BooleanTypes.true": "no", + "BooleanMeterTypes.false": "sí", + "BooleanMeterTypes.meter": "(Need Spanish) meter or default value", + "BooleanMeterTypes.true": "no", "calibration.display": "Resultado: ", "calibration.reset.button": "Restablecimiento", "calibration.save.database": "Guardar los cambios en la base de datos", @@ -975,8 +926,6 @@ const localeData = { "conversion.failed.to.edit.conversion": "(Need Spanish) Failed to edit conversion.", "conversion.intercept": "(Need Spanish) Intercept:", "conversion.is.deleted": "(Need Spanish) Conversion removed from database", - "conversion.note": "(Need Spanish) Note:", - "conversion.remove": "(Need Spanish) Remove", "conversion.represent": "(Need Spanish) Conversion Represent:", "conversion.select.destination": "(Need Spanish) Select a destination unit", "conversion.select.source": "(Need Spanish) Select a source unit", @@ -1029,6 +978,7 @@ const localeData = { "default.bar.stacking": "(Need Spanish) Stack bars by default", "default.graph.type": "Por defecto tipo de gráfico", "default.graph.settings": "(Need Spanish) Default Graph Settings", + "defaultGraphicUnit": "(Need Spanish) Default Graphic Unit:", "default.language": "Idioma por defecto", "default.meter.reading.frequency": "(Need Spanish) Default meter reading frequency", "default.site.title": "Título del Sitio Predeterminado", @@ -1041,7 +991,7 @@ const localeData = { "descending": "Descendente", "discard.changes": "Descartar los Cambios", "disable": "Desactivar", - "displayable": "Visualizable", + "displayable": "Visualizable:", "DisplayableType.none": "(Need Spanish) none", "DisplayableType.all": "(Need Spanish) all", "DisplayableType.admin": "(Need Spanish) admin", @@ -1071,11 +1021,11 @@ const localeData = { "failed.to.link.graph": "No se pudo vincular el gráfico", "failed.to.submit.changes": "No se pudo entregar los cambios", "false": "Falso", + "gps": "GPS: latitud, longitud", "graph": "Gráfico", "graph.type": "Tipo de gráfico", "group": "Grupo", "group.all.meters": "(Need Spanish) All Meters", - "group.area": "(Need Spanish) Group Area:", "group.area.calculate": "(Need Spanish) Calculate Group Area", "group.area.calculate.header": "(Need Spanish) Group Area will be set to ", "group.area.calculate.error.header": "(Need Spanish) The following meters were excluded from the sum because:", @@ -1083,13 +1033,10 @@ const localeData = { "group.area.calculate.error.unit": "(Need Spanish) : nonzero area but no area unit", "group.area.calculate.error.no.meters": "(Need Spanish) No meters in group", "group.area.calculate.error.group.unit": "(Need Spanish) No group area unit", - "group.area.unit": "(Need Spanish) Group Area Unit:", "group.create.nounit": "(Need Spanish) The default graphic unit was changed to no unit from ", - "group.defaultGraphicUnit": "(Need Spanish) Default Graphic Unit:", "group.delete.group": "(Need Spanish) Delete Group", "group.delete.issue": "(Need Spanish) is contained in the following groups and cannot be deleted", "group.details": "(Need Spanish) Group Details", - "group.displayable": "(Need Spanish) Group Displayable:", "group.edit.cancelled": "(Need Spanish) THE CHANGE TO THE GROUP IS CANCELLED", "group.edit.changed": "(Need Spanish) will have its compatible units changed by the edit to this group", "group.edit.circular": "(Need Spanish) Adding this meter/group to this group creates a circular dependency.", @@ -1099,14 +1046,10 @@ const localeData = { "group.edit.verify": "(Need Spanish) Given the messages, do you want to cancel this change (click Cancel) or continue (click OK)?", "group.failed.to.create.group": "(Need Spanish) Failed to create a group with message: ", "group.failed.to.edit.group": "(Need Spanish) Failed to edit group with message: ", - "group.gps": "GPS de grupo: (latitud, longitud):", "group.gps.error": "Por favor importa un GPS valído: (latitud, longitud)", "group.hidden": "(Need Spanish) At least one group is not visible to you", - "group.id": "ID de grupo", "group.input.error": "(Need Spanish) Input invalid so group not created or edited.", - "group.name": "(Need Spanish) Group Name:", "group.name.error": "(Need Spanish) Please enter a valid name: (must have at least one character that is not a space)", - "group.note": "(Need Spanish) Group Note:", "groups": "Grupos", "group.successfully.create.group": "(Need Spanish) Successfully created a group.", "group.successfully.edited.group": "(Need Spanish) Successfully edited group.", @@ -1159,6 +1102,7 @@ const localeData = { "hide.options": "Opciones de muelle", "hide.options.in.link": "Ocultar las opciones en el enlace", "home": "Hogar", + "identifier": "(Need Spanish) Identifier:", "hour": "Hora", "import.meter.readings": "Importar lecturas del medidor", "incompatible.groups": "(Need Spanish) Incompatible Groups", @@ -1214,26 +1158,19 @@ const localeData = { "menu": "Menú", "meter": "Medidor", "meters": "Medidores", - "meter.area": "(need Spanish) Area:", - "meter.area.unit": "(need Spanish) Meter Area Unit:", "meter.create": "(need Spanish) Create a Meter", "meter.cumulative": "(need Spanish) Cumulative:", "meter.cumulativeReset": "(need Spanish) Cumulative Reset:", "meter.cumulativeResetEnd": "(need Spanish) Cumulative Reset End:", "meter.cumulativeResetStart": "(need Spanish) Cumulative Reset Start:", - "meter.defaultGraphicUnit": "(need Spanish) Default Graphic Unit:", - "meter.displayable": "(need Spanish) Displayable:", "meter.enabled": "Medidor activada", "meter.endOnlyTime": "(need Spanish) End Only Time:", "meter.endTimeStamp": "(need Spanish) End Time Stamp:", "meter.failed.to.create.meter": "(Need Spanish) Failed to create a meter with message: ", "meter.failed.to.edit.meter": "(Need Spanish) Failed to edit meter with message: ", - "meter.gps": "Medidor GPS: latitud, longitud", "meter.hidden": "(Need Spanish) At least one meter is not visible to you", "meter.id": "ID del medidor", - "meter.identifier": "Identificador de medidor", "meter.input.error": "(Need Spanish) Input invalid so meter not created or edited.", - "meter.note": "(need Spanish) Note:", "meter.unit.change.requires": "(Need Spanish) needs to be changed before changing this unit's type", "meter.unitName": "(need Spanish) Unit:", "meter.url": "URL del medidor", @@ -1241,9 +1178,7 @@ const localeData = { "meter.is.enabled": "Actualizaciones Habilitado", "meter.is.not.displayable": "El medidor es visualizable", "meter.is.not.enabled": "El medidor no esta activada", - "meter.name": "Nombre del medidor", "meter.previousEnd": "(need Spanish) Previous End Time Stamp:", - "meter.reading": "(need Spanish) Reading:", "meter.readingDuplication": "(need Spanish) Reading Duplication:", "meter.readingFrequency": "(need Spanish) Reading Frequency", "meter.readingGap": "(need Spanish) Reading Gap:", @@ -1256,11 +1191,11 @@ const localeData = { "meter.type": "Tipo de medidor", "minute": "Minuto", "more.energy": "más energía", - "name": "Nombre", + "name": "Nombre:", "navigation": "Navegación", "need.more.points": "Nececitar más puntos", "no": "no", - "note": "Nota", + "note": "Nota:", "oed": "Panel de Energía Abierta", "oed.description": "Open Energy Dashboard es un proyecto independiente. ", "oed.version": "OED versión ", @@ -1275,6 +1210,7 @@ const localeData = { "per.second": "(need Spanish) Per Second", "projected.to.be.used": "proyectado para ser utilizado", "rate": "(need Spanish) Rate", + "reading": "(need Spanish) Reading:", "redo.cik.and.refresh.db.views": "(need Spanish) Processing changes. This may take a while.", "redraw": "Redibujar", "remove": "Eliminar", @@ -1319,25 +1255,17 @@ const localeData = { "UnitRepresentType.quantity": "(Need Spanish) quantity", "UnitRepresentType.flow": "(Need Spanish) flow", "UnitRepresentType.raw": "(Need Spanish) raw", - "UnitRepresentType.unused": "(Need Spanish) unused", "UnitType.unit": "(Need Spanish) unit", "UnitType.meter": "(Need Spanish) meter", "UnitType.suffix": "(Need Spanish) suffix", - "unit.displayable": "(Need Spanish) Displayable:", - "unit.dropdown.displayable": "(Need Spanish) Select a displayable type:", "unit.dropdown.displayable.option.none": "(Need Spanish) None", "unit.dropdown.displayable.option.all": "(Need Spanish) All", "unit.dropdown.displayable.option.admin": "(Need Spanish) admin", "unit.failed.to.create.unit": "(Need Spanish) Failed to create a unit.", "unit.failed.to.edit.unit": "(Need Spanish) Failed to edit unit.", - "unit.id": "(Need Spanish) ID:", - "unit.identifier": "(Need Spanish) Identifier:", "unit.input.error": "(Need Spanish) Input invalid so unit not created or edited.", - "unit.name": "(Need Spanish) Unit Name:", "unit.none": "(Need Spanish) no unit", - "unit.note": "(Need Spanish) Note:", "unit.preferred.display": "(Need Spanish) Preferred Display:", - "unit.remove": "(Need Spanish) Remove", "unit.represent": "(Need Spanish) Unit Represent:", "unit.sec.in.rate": "(Need Spanish) Sec in Rate:", "unit.submit.new.unit": "(Need Spanish) Submit New Unit", @@ -1346,9 +1274,6 @@ const localeData = { "unit.suffix": "(Need Spanish) Suffix:", "unit.type.of.unit": "(Need Spanish) Type of Unit:", "units": "(Need Spanish) Units", - "units.area": "(Need Spanish) Area Unit", - "unused.groups": "Grupos no utilizados", - "unused.meters": "Metros no utilizados", "unsaved.warning": "Tienes cambios sin guardar. ¿Estás seguro que quieres irte?", "update": "Actualizado", "updated.map.with.calibration": "Mapa actualizado con calibración renovada", diff --git a/src/client/app/types/csvUploadForm.ts b/src/client/app/types/csvUploadForm.ts index 70c5c5d8d..dfc37a76b 100644 --- a/src/client/app/types/csvUploadForm.ts +++ b/src/client/app/types/csvUploadForm.ts @@ -11,6 +11,14 @@ interface CSVUploadPreferences { update: boolean; } +// Very similar to CSVUploadPreferences but uses a different Boolean type that is expected when the form is submitted. +export interface CSVUploadPreferencesForm { + meterName: string; + gzip: BooleanTypes; + headerRow: BooleanTypes; + update: BooleanTypes; +} + interface CSVUploadProps extends CSVUploadPreferences { submitCSV: (file: File) => Promise; setMeterName: (mode: MODE, value: string) => void; @@ -30,6 +38,13 @@ export const enum TimeSortTypes { } export const enum BooleanTypes { + // Normally the values here are not used when displayed to user but the ones in data.js so translated. + true = 'yes', + false = 'no' +} + +// Unusual boolean that also allows for meter so 3-way. +export const enum BooleanMeterTypes { // Normally the values here are not used when displayed to user but the ones in data.js so translated. true = 'yes', false = 'no', @@ -39,15 +54,15 @@ export const enum BooleanTypes { export interface ReadingsCSVUploadPreferencesItem extends CSVUploadPreferences { createMeter: boolean; - cumulative: BooleanTypes; - cumulativeReset: BooleanTypes; + cumulative: BooleanMeterTypes; + cumulativeReset: BooleanMeterTypes; cumulativeResetStart: string; cumulativeResetEnd: string; duplications: string; // Not sure how to type this an integer string; meterName: string; lengthGap: string; lengthVariation: string; - endOnly: BooleanTypes; + endOnly: BooleanMeterTypes; refreshHourlyReadings: boolean; refreshReadings: boolean; timeSort: TimeSortTypes; @@ -55,12 +70,30 @@ export interface ReadingsCSVUploadPreferencesItem extends CSVUploadPreferences { relaxedParsing: boolean; } +export interface ReadingsCSVUploadPreferencesForm extends CSVUploadPreferencesForm { + createMeter: BooleanTypes; + cumulative: BooleanMeterTypes; + cumulativeReset: BooleanMeterTypes; + cumulativeResetStart: string; + cumulativeResetEnd: string; + duplications: string; // Not sure how to type this an integer string; + meterName: string; + lengthGap: string; + lengthVariation: string; + endOnly: BooleanMeterTypes; + refreshHourlyReadings: BooleanTypes; + refreshReadings: BooleanTypes; + timeSort: TimeSortTypes; + honorDst: BooleanTypes; + relaxedParsing: BooleanTypes; +} + export interface ReadingsCSVUploadProps extends ReadingsCSVUploadPreferencesItem, CSVUploadProps{ // Note: each of these will have to change in consideration of redux; selectTimeSort: (value: TimeSortTypes) => void; selectDuplications: (value: string) => void; - selectCumulative: (value: BooleanTypes) => void; - selectCumulativeReset: (value: BooleanTypes) => void; + selectCumulative: (value: BooleanMeterTypes) => void; + selectCumulativeReset: (value: BooleanMeterTypes) => void; setCumulativeResetStart: (value: string) => void; setCumulativeResetEnd: (value: string) => void; setLengthGap: (value: string) => void; @@ -80,4 +113,4 @@ export type MetersCSVUpload = CSVUploadPreferences; export type MetersCSVUploadPreferencesItem = MetersCSVUpload; -export type MetersCSVUploadProps = CSVUploadProps; \ No newline at end of file +export type MetersCSVUploadProps = CSVUploadProps; diff --git a/src/client/app/types/redux/units.ts b/src/client/app/types/redux/units.ts index 0668b94e1..523bed286 100644 --- a/src/client/app/types/redux/units.ts +++ b/src/client/app/types/redux/units.ts @@ -60,8 +60,7 @@ export enum DisplayableType { export enum UnitRepresentType { quantity = 'quantity', flow = 'flow', - raw = 'raw', - unused = 'unused' + raw = 'raw' } export interface UnitData { diff --git a/src/client/app/utils/api/UploadCSVApi.ts b/src/client/app/utils/api/UploadCSVApi.ts index 536465a9d..1906b8469 100644 --- a/src/client/app/utils/api/UploadCSVApi.ts +++ b/src/client/app/utils/api/UploadCSVApi.ts @@ -5,7 +5,9 @@ */ import ApiBackend from './ApiBackend'; -import { ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem } from '../../types/csvUploadForm'; +import { + ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem, BooleanTypes, CSVUploadPreferencesForm, ReadingsCSVUploadPreferencesForm +} from '../../types/csvUploadForm'; export default class UploadCSVApi { private readonly backend: ApiBackend; @@ -16,7 +18,19 @@ export default class UploadCSVApi { public async submitReadings(uploadPreferences: ReadingsCSVUploadPreferencesItem, readingsFile: File): Promise { const formData = new FormData(); - for (const [preference, value] of Object.entries(uploadPreferences)) { + // The Boolean values in state must be converted to the submitted values of yes and no. + const uploadPreferencesForm: ReadingsCSVUploadPreferencesForm = { + ...uploadPreferences, + gzip: uploadPreferences.gzip ? BooleanTypes.true : BooleanTypes.false, + headerRow: uploadPreferences.headerRow ? BooleanTypes.true : BooleanTypes.false, + update: uploadPreferences.update ? BooleanTypes.true : BooleanTypes.false, + createMeter: uploadPreferences.createMeter ? BooleanTypes.true : BooleanTypes.false, + refreshHourlyReadings: uploadPreferences.refreshHourlyReadings ? BooleanTypes.true : BooleanTypes.false, + refreshReadings: uploadPreferences.refreshReadings ? BooleanTypes.true : BooleanTypes.false, + honorDst: uploadPreferences.honorDst ? BooleanTypes.true : BooleanTypes.false, + relaxedParsing: uploadPreferences.relaxedParsing ? BooleanTypes.true : BooleanTypes.false + } + for (const [preference, value] of Object.entries(uploadPreferencesForm)) { formData.append(preference, value.toString()); } formData.append('csvfile', readingsFile); // It is important for the server that the file is attached last. @@ -25,7 +39,14 @@ export default class UploadCSVApi { public async submitMeters(uploadPreferences: MetersCSVUploadPreferencesItem, metersFile: File): Promise { const formData = new FormData(); - for (const [preference, value] of Object.entries(uploadPreferences)) { + // The Boolean values in state must be converted to the submitted values of yes and no. + const uploadPreferencesForm: CSVUploadPreferencesForm = { + ...uploadPreferences, + gzip: uploadPreferences.gzip ? BooleanTypes.true : BooleanTypes.false, + headerRow: uploadPreferences.headerRow ? BooleanTypes.true : BooleanTypes.false, + update: uploadPreferences.update ? BooleanTypes.true : BooleanTypes.false + } + for (const [preference, value] of Object.entries(uploadPreferencesForm)) { formData.append(preference, value.toString()); } formData.append('csvfile', metersFile); // It is important for the server that the file is attached last. diff --git a/src/client/app/utils/csvUploadDefaults.ts b/src/client/app/utils/csvUploadDefaults.ts index d8b7378ff..2ee4bbff8 100644 --- a/src/client/app/utils/csvUploadDefaults.ts +++ b/src/client/app/utils/csvUploadDefaults.ts @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem, TimeSortTypes, BooleanTypes } from '../types/csvUploadForm'; +import { ReadingsCSVUploadPreferencesItem, MetersCSVUploadPreferencesItem, TimeSortTypes, BooleanMeterTypes } from '../types/csvUploadForm'; // This file contains the default parameters for uploading readings and meters CSV files. These defaults should be consistent with the defaults // specified in /src/server/services/csvPipeline/validateCsvUploadParams and with /src/server/sql/create_meters_table.sql. @@ -10,13 +10,13 @@ export const ReadingsCSVUploadDefaults: ReadingsCSVUploadPreferencesItem = { meterName: '', timeSort: TimeSortTypes.meter, duplications: '', - cumulative: BooleanTypes.meter, - cumulativeReset: BooleanTypes.meter, + cumulative: BooleanMeterTypes.meter, + cumulativeReset: BooleanMeterTypes.meter, cumulativeResetStart: '', cumulativeResetEnd: '', lengthGap: '', lengthVariation: '', - endOnly: BooleanTypes.meter, + endOnly: BooleanMeterTypes.meter, createMeter: false, gzip: false, headerRow: false, @@ -32,4 +32,4 @@ export const MetersCSVUploadDefaults: MetersCSVUploadPreferencesItem = { gzip: false, headerRow: false, update: false -} \ No newline at end of file +} diff --git a/src/client/app/utils/input.ts b/src/client/app/utils/input.ts index cd77ceb6a..bd86b3342 100644 --- a/src/client/app/utils/input.ts +++ b/src/client/app/utils/input.ts @@ -85,7 +85,7 @@ export const NoUnit: UnitData = { id: -99, name: '', identifier: 'no unit', - unitRepresent: UnitRepresentType.unused, + unitRepresent: UnitRepresentType.quantity, secInRate: 99, typeOfUnit: UnitType.unit, unitIndex: -99, diff --git a/src/server/migrations/0.8.0-1.0.0/sql/meter/add_constraints.sql b/src/server/migrations/0.8.0-1.0.0/sql/meter/add_constraints.sql index 535b245c4..11c57cdd0 100644 --- a/src/server/migrations/0.8.0-1.0.0/sql/meter/add_constraints.sql +++ b/src/server/migrations/0.8.0-1.0.0/sql/meter/add_constraints.sql @@ -3,6 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ ALTER TABLE meters ADD CONSTRAINT default_timezone_meter CHECK (default_timezone_meter IS NULL OR check_timezone(default_timezone_meter::TEXT) = true); -ALTER TABLE meters ADD CONSTRAINT area CHECK (area >= 0); ALTER TABLE meters ADD CONSTRAINT reading_duplication CHECK (reading_duplication::INTEGER >= 1 AND reading_duplication::INTEGER <= 9); ALTER TABLE meters ADD CONSTRAINT time_sort CHECK (time_sort::TEXT = 'increasing' OR time_sort::TEXT = 'decreasing'); diff --git a/src/server/migrations/0.8.0-1.0.0/sql/unit/add_unit_represent_types.sql b/src/server/migrations/0.8.0-1.0.0/sql/unit/add_unit_represent_types.sql index 3c5164c7b..4daf3d07f 100644 --- a/src/server/migrations/0.8.0-1.0.0/sql/unit/add_unit_represent_types.sql +++ b/src/server/migrations/0.8.0-1.0.0/sql/unit/add_unit_represent_types.sql @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ DO $$ BEGIN - CREATE TYPE unit_represent_type AS ENUM('quantity', 'flow', 'raw', 'unused'); + CREATE TYPE unit_represent_type AS ENUM('quantity', 'flow', 'raw'); EXCEPTION WHEN duplicate_object THEN null; END $$; diff --git a/src/server/models/Unit.js b/src/server/models/Unit.js index 5baa1d354..f1056c7fc 100644 --- a/src/server/models/Unit.js +++ b/src/server/models/Unit.js @@ -81,7 +81,7 @@ class Unit { } /** - * Returns a promise to create the unitRepresentType enum of quantity, flow, raw, and unused. + * Returns a promise to create the unitRepresentType enum of quantity, flow and raw. * @param {*} conn The connection to use. * @returns {Promise.<>} */ @@ -260,8 +260,7 @@ Unit.displayableType = Object.freeze({ Unit.unitRepresentType = Object.freeze({ QUANTITY: 'quantity', FLOW: 'flow', - RAW: 'raw', - UNUSED: 'unused' + RAW: 'raw' }); Unit.areaUnitType = Object.freeze({ diff --git a/src/server/routes/csv.js b/src/server/routes/csv.js index fb85c0590..be57acbc4 100644 --- a/src/server/routes/csv.js +++ b/src/server/routes/csv.js @@ -105,7 +105,7 @@ router.use(function (req, res, next) { }); router.post('/meters', validateMetersCsvUploadParams, async (req, res) => { - const isGzip = req.body.gzip === 'true'; + const isGzip = req.body.gzip === BooleanTypesJS.true; const uploadedFilepath = req.file.path; let csvFilepath; try { @@ -149,7 +149,7 @@ router.post('/meters', validateMetersCsvUploadParams, async (req, res) => { }); router.post('/readings', validateReadingsCsvUploadParams, async (req, res) => { - const isGzip = req.body.gzip === 'true'; + const isGzip = req.body.gzip === BooleanTypesJS.true; const isRefreshReadings = req.body.refreshReadings === BooleanTypesJS.true; const isRefreshHourlyReadings = req.body.refreshHourlyReadings === BooleanTypesJS.true; const uploadedFilepath = req.file.path; @@ -215,4 +215,4 @@ router.post('/readings', validateReadingsCsvUploadParams, async (req, res) => { } }); -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/src/server/services/csvPipeline/ValidationSchemas.js b/src/server/services/csvPipeline/ValidationSchemas.js index 8f11b8e81..39c1c4669 100644 --- a/src/server/services/csvPipeline/ValidationSchemas.js +++ b/src/server/services/csvPipeline/ValidationSchemas.js @@ -34,7 +34,7 @@ class BooleanParam extends EnumParam { * @param {string} paramName - The name of the parameter. */ constructor(paramName) { - super(paramName, ['true', 'false']); + super(paramName, ['yes', 'no']); } } @@ -57,4 +57,4 @@ module.exports = { EnumParam, BooleanParam, StringParam -} \ No newline at end of file +} diff --git a/src/server/services/csvPipeline/uploadMeters.js b/src/server/services/csvPipeline/uploadMeters.js index 65e7efd35..db80dd14f 100644 --- a/src/server/services/csvPipeline/uploadMeters.js +++ b/src/server/services/csvPipeline/uploadMeters.js @@ -7,6 +7,7 @@ const { CSVPipelineError } = require('./CustomErrors'); const Meter = require('../../models/Meter'); const readCsv = require('../pipeline-in-progress/readCsv'); const Unit = require('../../models/Unit'); +const { BooleanTypesJS } = require('./validateCsvUploadParams'); /** * Middleware that uploads meters via the pipeline. This should be the final stage of the CSV Pipeline. @@ -27,7 +28,7 @@ async function uploadMeters(req, res, filepath, conn) { }); // If there is a header row, we remove and ignore it for now. - const meters = (req.body.headerRow === 'true') ? temp.slice(1) : temp; + const meters = (req.body.headerRow === BooleanTypesJS.true) ? temp.slice(1) : temp; // The original code used a Promise.all to run through the meters. The issue is that the promises are run in parallel. // If the meters are independent as expected then this works fine. However, in the error case where one CSV file has // the same meter name listed twice, the order of the attempts to add to the database was arbitrary. This meant one of them @@ -74,7 +75,7 @@ async function uploadMeters(req, res, filepath, conn) { // Replace the default graphic unit's name by its id. meter[24] = defaultGraphicUnitId; - if (req.body.update === 'true') { + if (req.body.update === BooleanTypesJS.true) { // Updating the new meters. // First get its id. let nameOfMeter = req.body.meterName; @@ -162,4 +163,4 @@ async function getUnitId(unitName, expectedUnitType, conn) { return unit.id; } -module.exports = uploadMeters; \ No newline at end of file +module.exports = uploadMeters; diff --git a/src/server/services/csvPipeline/uploadReadings.js b/src/server/services/csvPipeline/uploadReadings.js index 643ee7ac2..103bd5fb5 100644 --- a/src/server/services/csvPipeline/uploadReadings.js +++ b/src/server/services/csvPipeline/uploadReadings.js @@ -5,7 +5,7 @@ const express = require('express'); const { CSVPipelineError } = require('./CustomErrors'); const { loadCsvInput } = require('../pipeline-in-progress/loadCsvInput'); -const { TimeSortTypesJS, BooleanTypesJS } = require('./validateCsvUploadParams'); +const { TimeSortTypesJS, BooleanMeterTypesJS, BooleanTypesJS } = require('./validateCsvUploadParams'); const Meter = require('../../models/Meter'); const { log } = require('../../log'); const moment = require('moment'); @@ -21,15 +21,15 @@ const moment = require('moment'); async function uploadReadings(req, res, filepath, conn) { const { meterName, createMeter, headerRow, update, honorDst, relaxedParsing } = req.body; // extract query parameters // The next few have no value in the DB for a meter so always use the value passed. - const hasHeaderRow = (headerRow === 'true'); - const shouldUpdate = (update === 'true'); - let shouldHonorDst = (honorDst === 'true'); - let shouldRelaxedParsing = (relaxedParsing === 'true'); + const hasHeaderRow = (headerRow === BooleanTypesJS.true); + const shouldUpdate = (update === BooleanTypesJS.true); + let shouldHonorDst = (honorDst === BooleanTypesJS.true); + let shouldRelaxedParsing = (relaxedParsing === BooleanTypesJS.true); let meterCreated = false; let meter = await Meter.getByName(meterName, conn) .catch(async err => { // Meter#getByNames throws an error when no meter is found. We need the catch clause to account for this error. - if (createMeter !== 'true') { + if (createMeter !== BooleanTypesJS.true) { // If createMeter is not set to true, we do not know what to do with the readings so we error out. throw new CSVPipelineError( `User Error: Meter with name '${meterName}' not found. createMeter needs to be set true in order to automatically create meter.`, @@ -129,31 +129,31 @@ async function uploadReadings(req, res, filepath, conn) { readingTimeSort = timeSort; } - if (cumulative === undefined || cumulative === BooleanTypesJS.meter) { + if (cumulative === undefined || cumulative === BooleanMeterTypesJS.meter) { if (meter.cumulative === null) { // This probably should not happen with a new DB but keep just in case. // No variation allowed. - readingsCumulative = BooleanTypesJS.false; + readingsCumulative = BooleanMeterTypesJS.false; } else { - readingsCumulative = BooleanTypesJS[meter.cumulative]; + readingsCumulative = BooleanMeterTypesJS[meter.cumulative]; } } else { readingsCumulative = cumulative; } - const areReadingsCumulative = (readingsCumulative === BooleanTypesJS.true); + const areReadingsCumulative = (readingsCumulative === BooleanMeterTypesJS.true); - if (cumulativeReset === undefined || cumulativeReset === BooleanTypesJS.meter) { + if (cumulativeReset === undefined || cumulativeReset === BooleanMeterTypesJS.meter) { if (meter.cumulativeReset === null) { // This probably should not happen with a new DB but keep just in case. // No variation allowed. - readingsReset = BooleanTypesJS.false; + readingsReset = BooleanMeterTypesJS.false; } else { - readingsReset = BooleanTypesJS[meter.cumulativeReset]; + readingsReset = BooleanMeterTypesJS[meter.cumulativeReset]; } } else { readingsReset = cumulativeReset; } - const doReadingsReset = (readingsReset === BooleanTypesJS.true); + const doReadingsReset = (readingsReset === BooleanMeterTypesJS.true); if (cumulativeResetStart === undefined || cumulativeResetStart === '') { if (meter.cumulativeResetStart === null) { @@ -205,18 +205,18 @@ async function uploadReadings(req, res, filepath, conn) { readingLengthVariation = parseFloat(lengthVariation); } - if (endOnly === undefined || endOnly === BooleanTypesJS.meter) { + if (endOnly === undefined || endOnly === BooleanMeterTypesJS.meter) { if (meter.endOnlyTime === null) { // This probably should not happen with a new DB but keep just in case. // No variation allowed. - readingEndOnly = BooleanTypesJS.false; + readingEndOnly = BooleanMeterTypesJS.false; } else { - readingEndOnly = BooleanTypesJS[meter.endOnlyTime]; + readingEndOnly = BooleanMeterTypesJS[meter.endOnlyTime]; } } else { readingEndOnly = endOnly; } - const areReadingsEndOnly = (readingEndOnly === BooleanTypesJS.true); + const areReadingsEndOnly = (readingEndOnly === BooleanMeterTypesJS.true); const mapRowToModel = row => { return row; }; // STUB function to satisfy the parameter of loadCsvInput. return await loadCsvInput( @@ -241,4 +241,4 @@ async function uploadReadings(req, res, filepath, conn) { ); // load csv data } -module.exports = uploadReadings; \ No newline at end of file +module.exports = uploadReadings; diff --git a/src/server/services/csvPipeline/validateCsvUploadParams.js b/src/server/services/csvPipeline/validateCsvUploadParams.js index df79f507c..83cb1665c 100644 --- a/src/server/services/csvPipeline/validateCsvUploadParams.js +++ b/src/server/services/csvPipeline/validateCsvUploadParams.js @@ -39,6 +39,16 @@ MeterTimeSortTypesJS = Object.freeze({ BooleanTypesJS = Object.freeze({ true: 'yes', false: 'no', +}); + +/** + * Enum of Boolean types. + * This enum needs to be kept in sync with the enum in src/client/app/types/csvUploadForm.ts + * @enum {string} + */ +BooleanMeterTypesJS = Object.freeze({ + true: 'yes', + false: 'no', // meter means to use value stored on meter or the default if not. meter: 'meter value or default' }); @@ -56,27 +66,27 @@ BooleanTypesJS = Object.freeze({ // we should change these strings to booleans. const DEFAULTS = { common: { - gzip: 'true', - headerRow: 'false', - update: 'false' + gzip: BooleanTypesJS.true, + headerRow: BooleanTypesJS.false, + update: BooleanTypesJS.false }, meters: { }, readings: { timeSort: undefined, duplications: undefined, - cumulative: BooleanTypesJS.meter, - cumulativeReset: BooleanTypesJS.meter, + cumulative: BooleanMeterTypesJS.meter, + cumulativeReset: BooleanMeterTypesJS.meter, cumulativeResetStart: undefined, cumulativeResetEnd: undefined, lengthGap: undefined, lengthVariation: undefined, endOnly: undefined, - createMeter: 'false', - refreshReadings: 'false', - refreshHourlyReadings: 'false', - honorDst: 'false', - relaxedParsing: 'false' + createMeter: BooleanTypesJS.false, + refreshReadings: BooleanTypesJS.false, + refreshHourlyReadings: BooleanTypesJS.false, + honorDst: BooleanTypesJS.false, + relaxedParsing: BooleanTypesJS.false } } @@ -111,22 +121,18 @@ const VALIDATION = { ...COMMON_PROPERTIES, timeSort: new EnumParam('timeSort', [TimeSortTypesJS.increasing, TimeSortTypesJS.decreasing, TimeSortTypesJS.meter]), duplications: new StringParam('duplications', '^\\d+$|^(?![\s\S])', 'duplications must be an integer or empty.'), - cumulative: new EnumParam('cumulative', [BooleanTypesJS.true, BooleanTypesJS.false, BooleanTypesJS.meter]), - cumulativeReset: new EnumParam('cumulativeReset', [BooleanTypesJS.true, BooleanTypesJS.false, BooleanTypesJS.meter]), + cumulative: new EnumParam('cumulative', [BooleanMeterTypesJS.true, BooleanMeterTypesJS.false, BooleanMeterTypesJS.meter]), + cumulativeReset: new EnumParam('cumulativeReset', [BooleanMeterTypesJS.true, BooleanMeterTypesJS.false, BooleanMeterTypesJS.meter]), cumulativeResetStart: new StringParam('cumulativeResetStart', undefined, undefined), cumulativeResetEnd: new StringParam('cumulativeResetEnd', undefined, undefined), lengthGap: new StringParam('lengthGap', undefined, undefined), lengthVariation: new StringParam('lengthVariation', undefined, undefined), - endOnly: new EnumParam('endOnly', [BooleanTypesJS.true, BooleanTypesJS.false, BooleanTypesJS.meter]), + endOnly: new EnumParam('endOnly', [BooleanMeterTypesJS.true, BooleanMeterTypesJS.false, BooleanMeterTypesJS.meter]), createMeter: new BooleanParam('createMeter'), refreshReadings: new BooleanParam('refreshReadings'), refreshHourlyReadings: new BooleanParam('refreshHourlyReadings'), - honorDst: { - type: 'string' - }, - relaxedParsing: { - type: 'string' - } + honorDst: new BooleanParam('honorDst'), + relaxedParsing: new BooleanParam('relaxedParsing') }, additionalProperties: false // This protects us from unintended parameters as well as typos. } @@ -141,13 +147,13 @@ function validateRequestParams(body, schema) { if (errors.length !== 0) { errors.forEach(err => { if (err.schema instanceof Param) { - responseMessage = 'User Error: ' + responseMessage + err.schema.message(err.instance) + '\n'; + responseMessage = 'User Error: ' + responseMessage + err.path + ': ' + err.schema.message(err.instance) + '\n'; } else if (err.name === 'required') { - responseMessage = 'User Error: ' + responseMessage + `${err.argument} must be provided as the field ${err.argument}=.\n`; + responseMessage = 'User Error: ' + responseMessage + err.path + ': ' + `${err.argument} must be provided as the field ${err.argument}=.\n`; } else if (err.name === 'additionalProperties') { - responseMessage = 'User Error: ' + responseMessage + err.argument + ' is an unexpected argument.\n'; + responseMessage = 'User Error: ' + responseMessage + err.path + ': '+ err.argument + ' is an unexpected argument.\n'; } else { - responseMessage = responseMessage + err.message; + responseMessage = responseMessage + err.path + ': ' + 'has message: ' + err.message; } }); return { @@ -161,6 +167,7 @@ function validateRequestParams(body, schema) { } } + /** * Middleware that validates a request to upload readings via the CSV Pipeline and sets defaults for upload parameters. * @param {express.Request} req @@ -200,10 +207,10 @@ function validateReadingsCsvUploadParams(req, res, next) { req.body.update = DEFAULTS.common.update; } if (!honorDst) { - req.body.honorDst = DEFAULTS.common.honorDst; + req.body.honorDst = DEFAULTS.readings.honorDst; } if (!relaxedParsing) { - req.body.relaxedParsing = DEFAULTS.common.relaxedParsing; + req.body.relaxedParsing = DEFAULTS.readings.relaxedParsing; } next(); } @@ -242,5 +249,6 @@ module.exports = { validateReadingsCsvUploadParams, TimeSortTypesJS, MeterTimeSortTypesJS, + BooleanMeterTypesJS, BooleanTypesJS -}; \ No newline at end of file +}; diff --git a/src/server/sql/unit/create_unit_represent_types_enum.sql b/src/server/sql/unit/create_unit_represent_types_enum.sql index 18ab987ca..50ca470d2 100644 --- a/src/server/sql/unit/create_unit_represent_types_enum.sql +++ b/src/server/sql/unit/create_unit_represent_types_enum.sql @@ -5,7 +5,7 @@ -- This should avoid an error when the type already exists. This is an issue since -- OED install stops the creation of database items after this. DO $$ BEGIN - CREATE TYPE unit_represent_type AS ENUM('quantity', 'flow', 'raw', 'unused'); + CREATE TYPE unit_represent_type AS ENUM('quantity', 'flow', 'raw'); EXCEPTION WHEN duplicate_object THEN null; END $$; diff --git a/src/server/test/db/conversionTests.js b/src/server/test/db/conversionTests.js index 90e550a9c..bd0c4da6b 100644 --- a/src/server/test/db/conversionTests.js +++ b/src/server/test/db/conversionTests.js @@ -8,7 +8,7 @@ const Unit = require('../../models/Unit'); /** * Compares the expected and actual conversions. - * @param {*} expected The exepected conversion. + * @param {*} expected The expected conversion. * @param {*} actual The actual conversion. */ function expectConversionToBeEquivalent(expected, actual) { @@ -23,14 +23,14 @@ function expectConversionToBeEquivalent(expected, actual) { mocha.describe('Conversions', () => { mocha.beforeEach(async () => { conn = testDB.getConnection(); - const unitA = new Unit(undefined, 'Unit A', 'Unit A', Unit.unitRepresentType.UNUSED, 1000, - Unit.unitType.UNIT, 1, 'Suffix A', Unit.displayableType.ADMIN, true, 'Note A'); - const unitB = new Unit(undefined, 'Unit B', 'Unit B', Unit.unitRepresentType.UNUSED, 2000, - Unit.unitType.METER, 1, 'Suffix B', Unit.displayableType.ALL, true, 'Note B'); + const unitA = new Unit(undefined, 'Unit A', 'Unit A', Unit.unitRepresentType.QUANTITY, 1000, + Unit.unitType.UNIT, 1, 'Suffix A', Unit.displayableType.ADMIN, true, 'Note A'); + const unitB = new Unit(undefined, 'Unit B', 'Unit B', Unit.unitRepresentType.QUANTITY, 2000, + Unit.unitType.METER, 1, 'Suffix B', Unit.displayableType.ALL, true, 'Note B'); await unitA.insert(conn); await unitB.insert(conn); }); - + mocha.it('can be saved and retrived', async () => { const conn = testDB.getConnection(); const unitAId = (await Unit.getByName('Unit A', conn)).id; @@ -48,15 +48,15 @@ mocha.describe('Conversions', () => { const unitBId = (await Unit.getByName('Unit B', conn)).id; const conversionPreInsert = new Conversion(unitAId, unitBId, true, 1.23, 4.56, 'Note'); await conversionPreInsert.insert(conn); - + // Updates the conversion. Note that the sourceId and destinationId can't be changed. conversionPreInsert.bidirectional = false; conversionPreInsert.intercept = 3.14; conversionPreInsert.note = 'New note'; await conversionPreInsert.update(conn); - + const covnersionPostInsert = await Conversion.getBySourceDestination(unitAId, unitBId, conn); - expectConversionToBeEquivalent(conversionPreInsert, covnersionPostInsert); + expectConversionToBeEquivalent(conversionPreInsert, covnersionPostInsert); }); mocha.it('can be deleted', async () => { @@ -70,4 +70,4 @@ mocha.describe('Conversions', () => { const conversionPostInsert = await Conversion.getBySourceDestination(unitAId, unitBId, conn); expect(conversionPostInsert).to.be.equal(null); }); -}); \ No newline at end of file +}); diff --git a/src/server/test/db/groupTests.js b/src/server/test/db/groupTests.js index a2953794b..b11a55098 100644 --- a/src/server/test/db/groupTests.js +++ b/src/server/test/db/groupTests.js @@ -12,11 +12,11 @@ const Unit = require('../../models/Unit'); const gps = new Point(90, 45); async function setupGroupsAndMeters(conn) { - const unitA = new Unit(undefined, 'Unit A', 'Unit A Id', Unit.unitRepresentType.UNUSED, 1000, + const unitA = new Unit(undefined, 'Unit A', 'Unit A Id', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 1, 'Unit A Suffix', Unit.displayableType.ALL, true, 'Unit A Note'); - const unitB = new Unit(undefined, 'Unit B', 'Unit B Id', Unit.unitRepresentType.UNUSED, 2000, + const unitB = new Unit(undefined, 'Unit B', 'Unit B Id', Unit.unitRepresentType.QUANTITY, 2000, Unit.unitType.UNIT, 2, 'Unit B Suffix', Unit.displayableType.ALL, true, 'Unit B Note'); - const unitC = new Unit(undefined, 'Unit C', 'Unit C Id', Unit.unitRepresentType.UNUSED, 3000, + const unitC = new Unit(undefined, 'Unit C', 'Unit C Id', Unit.unitRepresentType.QUANTITY, 3000, Unit.unitType.UNIT, 3, 'Unit C Suffix', Unit.displayableType.ALL, true, 'Unit C Note'); await Promise.all([unitA, unitB, unitC].map(unit => unit.insert(conn))); const unitAId = (await Unit.getByName('Unit A', conn)).id; @@ -73,7 +73,7 @@ mocha.describe('Groups', () => { await groupPreInsert.insert(conn); groupPreInsert.name = 'New name'; - const unit = new Unit(undefined, 'Unit', 'Unit Id', Unit.unitRepresentType.UNUSED, 1000, + const unit = new Unit(undefined, 'Unit', 'Unit Id', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 1, 'Unit Suffix', Unit.displayableType.ALL, true, 'Unit Note'); await unit.insert(conn); const unitId = (await Unit.getByName('Unit', conn)).id; diff --git a/src/server/test/db/meterTests.js b/src/server/test/db/meterTests.js index 42f97698d..ef30c9783 100644 --- a/src/server/test/db/meterTests.js +++ b/src/server/test/db/meterTests.js @@ -61,11 +61,11 @@ function expectMetersToBeEquivalent(expected, actual) { mocha.describe('Meters', () => { let unitA, unitB; mocha.beforeEach(async () => { - unitA = new Unit(undefined, 'Unit A', 'Unit A Id', Unit.unitRepresentType.UNUSED, 1000, + unitA = new Unit(undefined, 'Unit A', 'Unit A Id', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 1, 'Unit A Suffix', Unit.displayableType.ALL, true, 'Unit A Note'); - unitB = new Unit(undefined, 'Unit B', 'Unit B Id', Unit.unitRepresentType.UNUSED, 2000, + unitB = new Unit(undefined, 'Unit B', 'Unit B Id', Unit.unitRepresentType.QUANTITY, 2000, Unit.unitType.UNIT, 2, 'Unit B Suffix', Unit.displayableType.ALL, true, 'Unit B Note'); - const unitC = new Unit(undefined, 'Unit C', 'Unit C Id', Unit.unitRepresentType.UNUSED, 3000, + const unitC = new Unit(undefined, 'Unit C', 'Unit C Id', Unit.unitRepresentType.QUANTITY, 3000, Unit.unitType.UNIT, 3, 'Unit C Suffix', Unit.displayableType.ALL, true, 'Unit C Note'); await Promise.all([unitA, unitB, unitC].map(unit => unit.insert(conn))); }); diff --git a/src/server/test/db/unitTests.js b/src/server/test/db/unitTests.js index 4077a9077..232ede684 100644 --- a/src/server/test/db/unitTests.js +++ b/src/server/test/db/unitTests.js @@ -9,7 +9,7 @@ const { expectUnitToBeEquivalent, expectArrayOfUnitsToBeEquivalent } = require(' mocha.describe('Units', () => { mocha.it('can be saved and retrieved', async () => { const conn = testDB.getConnection(); - const unitTypePreInsert = new Unit(undefined, 'Unit', 'Index', Unit.unitRepresentType.UNUSED, + const unitTypePreInsert = new Unit(undefined, 'Unit', 'Index', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 5, 'Suffix', Unit.displayableType.ALL, true, 'Note'); await unitTypePreInsert.insert(conn); // Gets unit by id. @@ -25,7 +25,7 @@ mocha.describe('Units', () => { mocha.it('meter type can be retrieved by unitIndex', async () => { const conn = testDB.getConnection(); - const meterTypePreInsert = new Unit(undefined, 'Meter', 'Meter Id', Unit.unitRepresentType.UNUSED, + const meterTypePreInsert = new Unit(undefined, 'Meter', 'Meter Id', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.METER, 5, 'Suffix', Unit.displayableType.ALL, true, 'Note'); await meterTypePreInsert.insert(conn); const meterTypePostInsertId = (await Unit.getByName('Meter', conn)).id; @@ -35,7 +35,7 @@ mocha.describe('Units', () => { mocha.it('can be saved, edited, and retrieved', async () => { const conn = testDB.getConnection(); - const unitPreInsert = new Unit(undefined, 'Unit', 'Unit Id', Unit.unitRepresentType.UNUSED, + const unitPreInsert = new Unit(undefined, 'Unit', 'Unit Id', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 5, 'Suffix', Unit.displayableType.ALL, true, 'Note'); await unitPreInsert.insert(conn); const unitPostInsert = await Unit.getById(1, conn); @@ -53,17 +53,17 @@ mocha.describe('Units', () => { mocha.describe('With units set up', async () => { mocha.beforeEach(async () => { const conn = testDB.getConnection(); - const unitTypeMeterAll = new Unit(undefined, 'Meter All', 'Meter All Id', Unit.unitRepresentType.UNUSED, 2000, + const unitTypeMeterAll = new Unit(undefined, 'Meter All', 'Meter All Id', Unit.unitRepresentType.QUANTITY, 2000, Unit.unitType.METER, 1, '', Unit.displayableType.ALL, true, 'Meter All Note'); - const unitTypeMeterAdmin = new Unit(undefined, 'Meter Admin', 'Meter Admin Id', Unit.unitRepresentType.UNUSED, 3000, + const unitTypeMeterAdmin = new Unit(undefined, 'Meter Admin', 'Meter Admin Id', Unit.unitRepresentType.QUANTITY, 3000, Unit.unitType.METER, 2, 'Meter Admin Suffix', Unit.displayableType.ADMIN, true, 'Meter Admin Note'); - const unitTypeUnitAll = new Unit(undefined, 'Unit All', 'Unit All Id', Unit.unitRepresentType.UNUSED, 4000, + const unitTypeUnitAll = new Unit(undefined, 'Unit All', 'Unit All Id', Unit.unitRepresentType.QUANTITY, 4000, Unit.unitType.UNIT, 3, '', Unit.displayableType.ALL, true, 'Unit All Note'); - const unitTypeUnitAdmin = new Unit(undefined, 'Unit Admin', 'Unit Admin Id', Unit.unitRepresentType.UNUSED, 5000, + const unitTypeUnitAdmin = new Unit(undefined, 'Unit Admin', 'Unit Admin Id', Unit.unitRepresentType.QUANTITY, 5000, Unit.unitType.UNIT, 4, 'Unit Admin Suffix', Unit.displayableType.ADMIN, true, 'Unit Admin Note'); - const unitTypeSuffixAll = new Unit(undefined, 'Suffix All', 'Suffix All Id', Unit.unitRepresentType.UNUSED, 6000, + const unitTypeSuffixAll = new Unit(undefined, 'Suffix All', 'Suffix All Id', Unit.unitRepresentType.QUANTITY, 6000, Unit.unitType.SUFFIX, 5, '', Unit.displayableType.ALL, true, 'Suffix All Note'); - const unitTypeSuffixNone = new Unit(undefined, 'Suffix None', 'Suffix None Id', Unit.unitRepresentType.UNUSED, 7000, + const unitTypeSuffixNone = new Unit(undefined, 'Suffix None', 'Suffix None Id', Unit.unitRepresentType.QUANTITY, 7000, Unit.unitType.SUFFIX, 6, 'Suffix None Suffix', Unit.displayableType.NONE, true, 'Suffix None Note'); const units = [unitTypeMeterAll, unitTypeMeterAdmin, unitTypeUnitAll, unitTypeUnitAdmin, unitTypeSuffixAll, unitTypeSuffixNone]; await Promise.all(units.map(unit => unit.insert(conn))); diff --git a/src/server/test/migration/migrateDatabaseInvalidTests.js b/src/server/test/migration/migrateDatabaseInvalidTests.js index af3eea29b..62343b0e1 100644 --- a/src/server/test/migration/migrateDatabaseInvalidTests.js +++ b/src/server/test/migration/migrateDatabaseInvalidTests.js @@ -6,9 +6,32 @@ const { mocha, expect, testDB } = require('../common'); const Migration = require('../../models/Migration'); const { migrateAll } = require('../../migrations/migrateDatabase'); +const VERSION = require('../../version'); +// Puts the parts of the semantic version together separated by period. +function getVersion(major, minor, patch) { + return (major + '.' + minor + '.' + patch); +} -const versionLists = ['0.100.0-0.200.0', '0.200.0-0.300.0', '0.300.0-0.100.0', '0.100.0-0.400.0', '0.200.1-0.500.0']; +// The current version of OED. +const startMajor = Number(VERSION.major); +const startMinor = Number(VERSION.minor); +const startPatch = Number(VERSION.patch); +// The possible migrations to use in testing. +// They all displace from the current version so they work even when the OED version changes. +const versionLists = [ + // Valid from above the current version to the next one. + getVersion(startMajor, startMinor + 100, startPatch) + '-' + getVersion(startMajor, startMinor + 200, startPatch), + // Valid for the next version migration. + getVersion(startMajor, startMinor + 200, startPatch) + '-' + getVersion(startMajor, startMinor + 300, startPatch), + // Invalid since goes backwards from the last 1 above. + getVersion(startMajor, startMinor + 300, startPatch) + '-' + getVersion(startMajor, startMinor + 100, startPatch), + // Valid from the first one after current to a higher one that is different. + getVersion(startMajor, startMinor + 100, startPatch) + '-' + getVersion(startMajor, startMinor + 400, startPatch), + // Valid from the second one after current to a higher one that is different. + // Note increase the patch version so you cannot get to the final version in this migration from the current version. + getVersion(startMajor, startMinor + 200, startPatch + 1) + '-' + getVersion(startMajor, startMinor + 500, startPatch), +] const migrationList = []; const called = [false, false, false, false, false]; @@ -30,31 +53,37 @@ for (let i = 0; i < versionLists.length; i++) { mocha.describe('Migration Invalid', () => { mocha.beforeEach(async () => { const conn = testDB.getConnection(); - await new Migration(undefined, '0.0.0', '0.100.0').insert(conn); + // Add migration from the current version to the first one above for migrations. + await new Migration(undefined, getVersion(startMajor, startMinor, startPatch), + getVersion(startMajor, startMinor + 100, startPatch)).insert(conn); }); mocha.it('should fail because of down migration', async () => { const conn = testDB.getConnection(); - await expect(migrateAll('0.500.0', migrationList, conn)) - .to.be.rejectedWith('Migration fromVersion 0.300.0 is more recent than toVersion 0.100.0'); + await expect(migrateAll(getVersion(startMajor, startMinor + 500, startPatch), migrationList, conn)) + .to.be.rejectedWith('Migration fromVersion ' + getVersion(startMajor, startMinor + 300, startPatch) + + ' is more recent than toVersion 1.100.0'); }); mocha.it('should fail because there is no path', async () => { const conn = testDB.getConnection(); - const list = migrationList.filter(e => e.fromVersion !== '0.300.0'); - await expect(migrateAll('0.500.0', list, conn)) + // Get rid of the invalid conversion so all OK. + const list = migrationList.filter(e => e.fromVersion !== getVersion(startMajor, startMinor + 300, startPatch)); + await expect(migrateAll(getVersion(startMajor, startMinor + 500, startPatch), list, conn)) .to.be.rejectedWith('No path found'); }); mocha.it('should fail because there is no version in the list', async () => { - const list = migrationList.filter(e => e.fromVersion !== '0.300.0'); - await expect(migrateAll('0.600.0', list, conn)) - .to.be.rejectedWith('Could not find version 0.600.0 from the registered migration list'); + // Get rid of the invalid conversion so all OK. + const list = migrationList.filter(e => e.fromVersion !== getVersion(startMajor, startMinor + 300, startPatch)); + await expect(migrateAll(getVersion(startMajor, startMinor + 600, startPatch), list, conn)) + .to.be.rejectedWith('Could not find version 1.600.0 from the registered migration list'); }); mocha.it('should fail because the current version is the highest Version', async () => { - const list = migrationList.filter(e => e.fromVersion !== '0.300.0'); - await expect(migrateAll('0.100.0', list, conn)) - .to.be.rejectedWith('You have the highest version'); + // Get rid of the invalid conversion so all OK. + const list = migrationList.filter(e => e.fromVersion !== getVersion(startMajor, startMinor + 300, startPatch)); + await expect(migrateAll('1.100.0', list, conn)) + .to.be.rejectedWith('You have the highest version'); }); }); diff --git a/src/server/test/web/csvPipeline/README.md b/src/server/test/web/csvPipeline/README.md index e21a942f8..16e4ca8e7 100644 --- a/src/server/test/web/csvPipeline/README.md +++ b/src/server/test/web/csvPipeline/README.md @@ -79,7 +79,7 @@ The input meter file will be pipe#AInputMeter.csv, the input readings file will | 73 | | | | | | | | The meter in DB is set to reading_gap=60 and reading_variation=120 but then the curl passes 120.1 and 121.2 for gap & variation. Should get Length variation for line 5. Expect 1, 2+, 3, 4+, 5-, 5- (same as previous point and extra one since last reading goes into next day). This also checks that floating point numbers come through correctly by seeing message has correct value. | 74 | | X | | | | 3 | | The meter in DB is set to reading_duplication=3 and no value in curl. Repeat every reading 3x but should only see once. Get standard cum values. | | 75 | X | | | | | | | The meter in DB is set to time_sort='decreasing' and no value in curl. Should get usual values. | - | 76 | | | | | | | X | The meter in DB is set to end_only_time='true' and no value in curl. Should get usual values with first one dropped. | + | 76 | | | | | | | X | The meter in DB is set to end_only_time='yes' and no value in curl. Should get usual values with first one dropped. | ## Tests with multiple input files of first two meter and then readings diff --git a/src/server/test/web/csvPipelineTest.js b/src/server/test/web/csvPipelineTest.js index b65efade7..fc81af265 100644 --- a/src/server/test/web/csvPipelineTest.js +++ b/src/server/test/web/csvPipelineTest.js @@ -9,6 +9,7 @@ const Point = require('../../models/Point'); const Unit = require('../../models/Unit'); const { insertStandardUnits, insertStandardConversions, insertUnits, insertConversions } = require('../../util/insertData') const { redoCik } = require('../../services/graph/redoCik'); +const { BooleanTypesJS } = require('../../services/csvPipeline/validateCsvUploadParams'); const util = require('util'); const fs = require('fs'); const csv = require('csv'); @@ -37,189 +38,189 @@ const CHAI_METERS_REQUEST = `chai.request(app).post('${UPLOAD_METERS_ROUTE}').fi const testCases = { pipe1: { description: 'Ascending time readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', 'true').field('meterName', 'pipe1').field('gzip', 'false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', BooleanTypesJS.true).field('meterName', 'pipe1').field('gzip', BooleanTypesJS.false)"], fileName: ['pipe1Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe2: { description: 'Descending time readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', 'true').field('meterName', 'pipe2').field('gzip', 'false').field('timeSort', 'decreasing')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', BooleanTypesJS.true).field('meterName', 'pipe2').field('gzip', BooleanTypesJS.false).field('timeSort', 'decreasing')"], fileName: ['pipe2Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe3: { description: 'Cumulative time readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', 'true').field('meterName', 'pipe3').field('gzip', 'false').field('cumulative', 'true')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', BooleanTypesJS.true).field('meterName', 'pipe3').field('gzip', BooleanTypesJS.false).field('cumulative', BooleanTypesJS.true)"], fileName: ['pipe3Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe3: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe3 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe3
'] }, pipe4: { description: 'Cumulative, descending time readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('timeSort','decreasing').field('cumulative','true').field('meterName','pipe4').field('createMeter','true').field('gzip', 'false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('timeSort','decreasing').field('cumulative',BooleanTypesJS.true).field('meterName','pipe4').field('createMeter',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe4Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe4: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe4 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort decreasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe4
'] }, pipe5: { description: 'Cumulative time readings with reset with default cumulative reset', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', 'true').field('meterName', 'pipe5').field('gzip', 'false').field('cumulative', 'true').field('cumulativeReset','true')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', BooleanTypesJS.true).field('meterName', 'pipe5').field('gzip', BooleanTypesJS.false).field('cumulative', BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true)"], fileName: ['pipe5Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe5: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe5 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe5
'] }, pipe6: { description: 'Cumulative time readings with reset with cumulative reset around midnight', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe6').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe6').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe6Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe6: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe6 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 23:45; cumulativeResetEnd 00:15; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe6
'] }, pipe7: { description: 'Cumulative time readings with reset with cumulative reset around noon which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', 'true').field('meterName', 'pipe7').field('gzip', 'false').field('cumulative', 'true').field('cumulativeReset','true').field('cumulativeResetStart','11:45').field('cumulativeResetEnd','12:15')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('createMeter', BooleanTypesJS.true).field('meterName', 'pipe7').field('gzip', BooleanTypesJS.false).field('cumulative', BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','11:45').field('cumulativeResetEnd','12:15')"], fileName: ['pipe7Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe7: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe7 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 11:45; cumulativeResetEnd 12:15; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe7: Error parsing Reading #4. Reading value of 96 gives -48 with error message:
A negative meterReading has been detected but either cumulativeReset is not enabled, or the start time and end time of this reading is out of the reset range. Reject all readings.
For reading #4 on meter pipe7 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value -48 start time 2021-06-04T00:00:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 11:45; cumulativeResetEnd 12:15; lengthGap 0; lengthVariation 0; onlyEndTime false
'], }, pipe8: { description: 'Cumulative time readings with reset with cumulative reset tight around midnight', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('cumulativeResetStart','00:00').field('cumulativeResetEnd','00:00.001').field('meterName','pipe8').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','00:00').field('cumulativeResetEnd','00:00.001').field('meterName','pipe8').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe8Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe8: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe8 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00; cumulativeResetEnd 00:00.001; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe8
'] }, pipe9: { description: 'Cumulative time readings with reset without cumulative reset which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('meterName','pipe9').field('createMeter','true').field('gzip', 'false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('meterName','pipe9').field('createMeter',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe9Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe9: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe9 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe9: Error parsing Reading #4. Reading value of 96 gives -48 with error message:
A negative meterReading has been detected but either cumulativeReset is not enabled, or the start time and end time of this reading is out of the reset range. Reject all readings.
For reading #4 on meter pipe9 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value -48 start time 2021-06-04T00:00:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe10: { description: 'Cumulative time readings changing at noon with default cumulative reset', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('meterName','pipe10').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('meterName','pipe10').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe10Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe10: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe10 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T12:00:00Z end time 2021-06-02T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe10
'] }, pipe11: { description: 'Cumulative time readings changing at noon without cumulative reset which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('meterName','pipe11').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('meterName','pipe11').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe11Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe11: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe11 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T12:00:00Z end time 2021-06-02T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe11: Error parsing Reading #4. Reading value of 96 gives -48 with error message:
A negative meterReading has been detected but either cumulativeReset is not enabled, or the start time and end time of this reading is out of the reset range. Reject all readings.
For reading #4 on meter pipe11 in pipeline: previous reading has value 72 start time 2021-06-03T12:00:00Z end time 2021-06-04T12:00:00Z and current reading has value -48 start time 2021-06-04T12:00:00Z end time 2021-06-05T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe12: { description: 'Cumulative time readings changing at noon with cumulative reset at noon', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('cumulativeResetStart','11:45').field('cumulativeResetEnd','12:15').field('meterName','pipe12').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','11:45').field('cumulativeResetEnd','12:15').field('meterName','pipe12').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe12Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe12: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe12 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T12:00:00Z end time 2021-06-02T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 11:45; cumulativeResetEnd 12:15; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe12
'] }, pipe13: { description: 'Cumulative time readings changing at noon with cumulative reset at midnight which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe13').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe13').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe13Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe13: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe13 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T12:00:00Z end time 2021-06-02T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 23:45; cumulativeResetEnd 00:15; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe13: Error parsing Reading #4. Reading value of 96 gives -48 with error message:
A negative meterReading has been detected but either cumulativeReset is not enabled, or the start time and end time of this reading is out of the reset range. Reject all readings.
For reading #4 on meter pipe13 in pipeline: previous reading has value 72 start time 2021-06-03T12:00:00Z end time 2021-06-04T12:00:00Z and current reading has value -48 start time 2021-06-04T12:00:00Z end time 2021-06-05T12:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 23:45; cumulativeResetEnd 00:15; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe14: { description: 'Ascending time readings with length variation and default time variation', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe14').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe14').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe14Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe14: Warning parsing Reading #2. Reading value gives 48 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #2 on meter pipe14 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-03T00:01:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe14: Warning parsing Reading #3. Reading value gives 72 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #3 on meter pipe14 in pipeline: previous reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-03T00:01:00Z and current reading has value 72 start time 2021-06-03T00:01:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe14: Warning parsing Reading #4. Reading value gives 96 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #4 on meter pipe14 in pipeline: previous reading has value 72 start time 2021-06-03T00:01:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:00:00Z end time 2021-06-04T23:58:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe14: Warning parsing Reading #5. Reading value gives 120 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #5 on meter pipe14 in pipeline: previous reading has value 96 start time 2021-06-04T00:00:00Z end time 2021-06-04T23:58:00Z and current reading has value 120 start time 2021-06-04T23:58:00Z end time 2021-06-06T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe15: { description: 'Ascending time readings with length variation where length variation set small so warns on 2 readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe15').field('lengthVariation','60').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe15').field('lengthVariation','60').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe15Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe15: Warning parsing Reading #3. Reading value gives 72 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 60 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #3 on meter pipe15 in pipeline: previous reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-03T00:01:00Z and current reading has value 72 start time 2021-06-03T00:01:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 60; onlyEndTime false

For meter pipe15: Warning parsing Reading #5. Reading value gives 120 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 60 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #5 on meter pipe15 in pipeline: previous reading has value 96 start time 2021-06-04T00:00:00Z end time 2021-06-04T23:58:00Z and current reading has value 120 start time 2021-06-04T23:58:00Z end time 2021-06-06T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 60; onlyEndTime false
'] }, pipe16: { description: 'Ascending time readings with length variation and length variation set so warns on 1 reading', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe16').field('lengthVariation','120').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe16').field('lengthVariation','120').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe16Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe16: Warning parsing Reading #5. Reading value gives 120 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 120 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #5 on meter pipe16 in pipeline: previous reading has value 96 start time 2021-06-04T00:00:00Z end time 2021-06-04T23:58:00Z and current reading has value 120 start time 2021-06-04T23:58:00Z end time 2021-06-06T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 120; onlyEndTime false
'] }, pipe17: { description: 'Ascending time readings with length variation and gap where length variation set so all pass but gap not big enough so warns on 2 reading', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe17').field('lengthVariation','121').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe17').field('lengthVariation','121').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe17Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe17: Warning parsing Reading #2. Reading value gives 48 with warning message:
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
For reading #2 on meter pipe17 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-02T00:01:00Z end time 2021-06-03T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 121; onlyEndTime false

For meter pipe17: Warning parsing Reading #4. Reading value gives 96 with warning message:
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
For reading #4 on meter pipe17 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 121; onlyEndTime false
'] }, pipe18: { description: 'Ascending time readings with gaps and small time gap so 1 passes and 1 warns', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe18').field('lengthGap','60').field('lengthVariation','121').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe18').field('lengthGap','60').field('lengthVariation','121').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe18Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe18: Warning parsing Reading #4. Reading value gives 96 with warning message:
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 60 seconds.
For reading #4 on meter pipe18 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 60; lengthVariation 121; onlyEndTime false
'] }, pipe19: { description: 'Ascending time readings with gap and just right size time gap', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe19').field('lengthGap','120').field('lengthVariation','121').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe19').field('lengthGap','120').field('lengthVariation','121').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe19Input.csv'], responseCode: [200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe20: { description: 'Cumulative time readings with header', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('headerRow','true').field('cumulative','true').field('meterName','pipe20').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('cumulative',BooleanTypesJS.true).field('meterName','pipe20').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe20Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe20: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe20 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe20
'] }, pipe21: { description: 'Cumulative time readings with duplication', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('duplications','3').field('cumulative','true').field('meterName','pipe21').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('duplications','3').field('cumulative',BooleanTypesJS.true).field('meterName','pipe21').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe21Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe21: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe21 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 3; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe21
'] }, pipe22: { description: 'Cumulative time readings with default cumulative reset with negative reading which in incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('meterName','pipe22').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('meterName','pipe22').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe22Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe22: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe22 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
For meter pipe22:
Error parsing Reading #4. Detected a negative value while handling cumulative readings so all reading are rejected.
For reading #4 on meter pipe22 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value -145 start time 2021-06-04T00:00:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe23: { description: 'Ascending time readings that are end only', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('endOnly','true').field('meterName','pipe23').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('endOnly',BooleanTypesJS.true).field('meterName','pipe23').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe23Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe23: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe23 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe23
'] }, pipe24: { description: 'Descending time readings that are end only', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('timeSort','decreasing').field('endOnly','true').field('meterName','pipe24').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('timeSort','decreasing').field('endOnly',BooleanTypesJS.true).field('meterName','pipe24').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe24Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe24: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe24 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort decreasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe24
'] }, pipe25: { description: 'Descending, cumulative time readings that are end only', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('timeSort','decreasing').field('endOnly','true').field('meterName','pipe25').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('timeSort','decreasing').field('endOnly',BooleanTypesJS.true).field('meterName','pipe25').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe25Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe25: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe25 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort decreasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe25
'] }, pipe26: { description: 'Ascending time readings with bad start date/time which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe26').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe26').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe26Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):

For meter pipe26: Error parsing Reading #2 The start (2021-06-02 00:00:00 x) and/or end time (2021-06-03 00:00:00) provided did not parse into a valid date/time so all reading are rejected.
For reading #2 on meter pipe26 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value unknown start time Invalid date end time 2021-06-03T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe27: { description: 'Ascending time readings with bad end date/time which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe27').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe27').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe27Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):

For meter pipe27: Error parsing Reading #2 The start (2021-06-02 00:00:00) and/or end time (2021-06-32 00:00:00) provided did not parse into a valid date/time so all reading are rejected.
For reading #2 on meter pipe27 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value unknown start time 2021-06-02T00:00:00Z end time Invalid date with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] @@ -227,7 +228,7 @@ const testCases = { // Pipe28 removed since stronger tests on dates cause it to fail. pipe29: { description: 'Cumulative time readings with bad reading value which in incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('meterName','pipe29').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('meterName','pipe29').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe29Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe29: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe29 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
For meter pipe29: Error parsing Reading #4 with cumulative data. The reading value provided of 240.x is not considered a number so all reading are rejected.
'] @@ -235,42 +236,42 @@ const testCases = { pipe30: { description: 'Ascending time readings with bad reading value which in incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe30').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe30').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe30Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):

For meter pipe30: Error parsing Reading #4 The reading value provided of 9a is not considered a number so all reading are rejected.
'] }, pipe31: { description: 'Cumulative time readings with gaps with length variation but still needs to drop 2 readings with gap', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe31').field('cumulative','true').field('lengthVariation','121').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe31').field('cumulative',BooleanTypesJS.true).field('lengthVariation','121').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe31Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe31: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe31 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 121; onlyEndTime false

For meter pipe31: Error parsing Reading #2. Reading value gives 48 with error message:
The end of the previous reading is too far from the start of the next readings in cumulative data so drop this reading.
For reading #2 on meter pipe31 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-02T00:01:00Z end time 2021-06-03T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 121; onlyEndTime false

For meter pipe31: Error parsing Reading #4. Reading value gives 96 with error message:
The end of the previous reading is too far from the start of the next readings in cumulative data so drop this reading.
For reading #4 on meter pipe31 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 121; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe31
  2. Dropped Reading #2 for meter pipe31
  3. Dropped Reading #4 for meter pipe31
'] }, pipe32: { description: 'Cumulative time readings with one reading start before end of previous so dropped', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe32').field('cumulative','true').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe32').field('cumulative',BooleanTypesJS.true).field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe32Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe32: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe32 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe32: Error parsing Reading #2. Reading value gives 48 with error message:
The reading start time is before the previous end time and the data is cumulative so OED cannot use this reading.
For reading #2 on meter pipe32 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-01T23:59:59Z end time 2021-06-03T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe32: Warning parsing Reading #3. Reading value gives 72 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #3 on meter pipe32 in pipeline: previous reading has value 48 start time 2021-06-01T23:59:59Z end time 2021-06-03T00:00:00Z and current reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe32
  2. Dropped Reading #2 for meter pipe32
'] }, pipe33: { description: 'Cumulative time readings with negative reading which is incorrect', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe33').field('cumulative','true').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe33').field('cumulative',BooleanTypesJS.true).field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe33Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe33: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe33 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
For meter pipe33:
Error parsing Reading #3. Detected a negative value while handling cumulative readings so all reading are rejected.
For reading #3 on meter pipe33 in pipeline: previous reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-03T00:00:00Z and current reading has value -73 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe34: { description: 'Ascending time readings with one reading start/end the same so dropped', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe34').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe34').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe34Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe34: Error parsing Reading #2. Reading value gives 48 with error message:
The reading end time is not after the start time so we must drop the reading.
For reading #2 on meter pipe34 in pipeline: previous reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe34: Warning parsing Reading #3. Reading value gives 72 with warning message:
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #3 on meter pipe34 in pipeline: previous reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #2 for meter pipe34
'] }, pipe35: { description: 'Ascending time readings that are end only with two readings time the same so dropped', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('refreshReadings','true').field('meterName','pipe35').field('endOnly','true').field('createMeter','true').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('refreshReadings',BooleanTypesJS.true).field('meterName','pipe35').field('endOnly',BooleanTypesJS.true).field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)"], fileName: ['pipe35Input.csv'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe35: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe35 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe35: Error parsing Reading #2. Reading value gives 48 with error message:
The reading end time is not after the start time so we must drop the reading. The start time came from the previous readings end time.
For reading #2 on meter pipe35 in pipeline: previous reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe35: Warning parsing Reading #3. Reading value gives 72 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #3 on meter pipe35 in pipeline: previous reading has value 48 start time 2021-06-02T00:00:00Z end time 2021-06-02T00:00:00Z and current reading has value 72 start time 2021-06-02T00:00:00Z end time 2021-06-04T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe35: Warning parsing Reading #4. Reading value gives 96 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 0 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #4 on meter pipe35 in pipeline: previous reading has value 72 start time 2021-06-02T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:00:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe35
  2. Dropped Reading #2 for meter pipe35
'] @@ -278,196 +279,196 @@ const testCases = { pipe40: { description: 'Cumulative time zipped readings with header', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('headerRow','true').field('cumulative','true').field('createMeter','true').field('meterName', 'pipe40')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('cumulative',BooleanTypesJS.true).field('createMeter',BooleanTypesJS.true).field('meterName', 'pipe40')"], fileName: ['pipe40Input.csv.gz'], responseCode: [400], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe40: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe40 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe40
'] }, pipe50: { description: 'Ascending time readings with two readings uploads where update readings', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('createMeter','true').field('meterName', 'pipe50')", CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('update','true').field('meterName', 'pipe50')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('createMeter',BooleanTypesJS.true).field('meterName', 'pipe50')", CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('update',BooleanTypesJS.true).field('meterName', 'pipe50')"], fileName: ['pipe50AInput.csv', 'pipe50BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe50: Warning parsing Reading #1. Reading value gives 0 with warning message:
The current reading startTime is not after the previous reading\'s end time. Note this is treated only as a warning since readings may be sent out of order.
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
For reading #1 on meter pipe50 in pipeline: previous reading has value 120 start time 2021-06-05T00:00:00Z end time 2021-06-06T00:00:00Z and current reading has value 0 start time 2021-05-31T00:00:00Z end time 2021-06-01T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe51: { description: 'Ascending time readings with two readings uploads without update so no changes', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe51').field('createMeter','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe51').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('meterName','pipe51').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe51').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe51AInput.csv', 'pipe51BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

It looks like the insert of the readings was a success.

', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe51: Warning parsing Reading #1. Reading value gives 0 with warning message:
The current reading startTime is not after the previous reading\'s end time. Note this is treated only as a warning since readings may be sent out of order.
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
For reading #1 on meter pipe51 in pipeline: previous reading has value 120 start time 2021-06-05T00:00:00Z end time 2021-06-06T00:00:00Z and current reading has value 0 start time 2021-05-31T00:00:00Z end time 2021-06-01T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe52: { description: 'Cumulative time readings with default reset with two uploads to add more readings with a reset', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative','true').field('meterName','pipe52').field('createMeter','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('meterName','pipe52').field('gzip','false')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('meterName','pipe52').field('createMeter',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('meterName','pipe52').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe52AInput.csv', 'pipe52BInput.csv'], responseCode: [400, 200], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe52: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe52 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe52
', '

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe60: { description: 'Cumulative time readings with three readings uploads', - chaiRequest: [CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('createMeter','true').field('meterName', 'pipe60').field('cumulative', 'true')", CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('meterName', 'pipe60').field('cumulative', 'true')", CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('meterName', 'pipe60').field('cumulative', 'true')"], + chaiRequest: [CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('createMeter',BooleanTypesJS.true).field('meterName', 'pipe60').field('cumulative', BooleanTypesJS.true)", CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('meterName', 'pipe60').field('cumulative', BooleanTypesJS.true)", CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('meterName', 'pipe60').field('cumulative', BooleanTypesJS.true)"], fileName: ['pipe60AInput.csv', 'pipe60BInput.csv', 'pipe60CInput.csv'], responseCode: [400, 200, 200], responseString: ['

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe60: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe60 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe60
', '

SUCCESS

It looks like the insert of the readings was a success.

', '

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe70: { description: 'Create meter cumulative reset around noon with reading upload with reset at midnight which is incorrect', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe70').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe70').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe70AInputMeter.csv', 'pipe70BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe70: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe70 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 11:45:00; cumulativeResetEnd 12:15:00; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe70: Error parsing Reading #4. Reading value of 96 gives -48 with error message:
A negative meterReading has been detected but either cumulativeReset is not enabled, or the start time and end time of this reading is out of the reset range. Reject all readings.
For reading #4 on meter pipe70 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value -48 start time 2021-06-04T00:00:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 11:45:00; cumulativeResetEnd 12:15:00; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe71: { description: 'Create meter cumulative reset around midnight with reading upload with reset at midnight', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('cumulative','true').field('cumulativeReset','true').field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe71').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('cumulativeReset',BooleanTypesJS.true).field('cumulativeResetStart','23:45').field('cumulativeResetEnd','00:15').field('meterName','pipe71').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe71AInputMeter.csv', 'pipe71BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe71: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe71 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 23:45; cumulativeResetEnd 00:15; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe71
'] }, pipe72: { description: 'Create meter with modest length variation and gap with reading upload where warn on larger gaps', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe72').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe72').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe72AInputMeter.csv', 'pipe72BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe72: Warning parsing Reading #4. Reading value gives 96 with warning message:
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 60 seconds.
For reading #4 on meter pipe72 in pipeline: previous reading has value 72 start time 2021-06-03T00:00:00Z end time 2021-06-04T00:00:00Z and current reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 60; lengthVariation 120; onlyEndTime false

For meter pipe72: Warning parsing Reading #5. Reading value gives 120 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 120 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #5 on meter pipe72 in pipeline: previous reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z and current reading has value 120 start time 2021-06-05T00:00:00Z end time 2021-06-06T00:04:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 60; lengthVariation 120; onlyEndTime false
'] }, pipe73: { description: 'Create meter with modest length variation and gap with reading upload that changes these values so fewer warnings; also checks floating point values in reading upload', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe73').field('lengthGap','120.1').field('lengthVariation','120.2').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe73').field('lengthGap','120.1').field('lengthVariation','120.2').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe73AInputMeter.csv', 'pipe73BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe73: Warning parsing Reading #5. Reading value gives 120 with warning message:
The previous reading has a different time length than the current reading and exceeds the tolerance of 120.2 seconds. Note this is treated only as a warning since this may be expected for certain meters.
For reading #5 on meter pipe73 in pipeline: previous reading has value 96 start time 2021-06-04T00:02:00Z end time 2021-06-05T00:00:00Z and current reading has value 120 start time 2021-06-05T00:00:00Z end time 2021-06-06T00:04:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 120.1; lengthVariation 120.2; onlyEndTime false
'] }, pipe74: { description: 'Create meter with duplication with reading upload', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('cumulative','true').field('meterName','pipe74').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('cumulative',BooleanTypesJS.true).field('meterName','pipe74').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe74AInputMeter.csv', 'pipe74BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe74: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe74 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 3; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe74
'] }, pipe75: { description: 'Create meter with decreasing with reading upload', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe75').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe75').field('gzip', BooleanTypesJS.false)"], fileName: ['pipe75AInputMeter.csv', 'pipe75BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

'] }, pipe76: { description: 'Create meter with end only with reading upload', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip','false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe76').field('gzip','false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip',BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe76').field('gzip',BooleanTypesJS.false)"], fileName: ['pipe76AInputMeter.csv', 'pipe76BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe76: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe76 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 1970-01-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe76
'] }, pipe80: { description: 'Two meter uploads where second sets cumulative with reading upload; all without headers', - chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', 'false')", CHAI_METERS_REQUEST + ".field('gzip', 'false').field('update','true').field('meterName', 'pipe80')", CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('meterName', 'pipe80')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false)", CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('update',BooleanTypesJS.true).field('meterName', 'pipe80')", CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('meterName', 'pipe80')"], fileName: ['pipe80AInputMeter.csv', 'pipe80BInputMeter.csv', 'pipe80CInput.csv'], responseCode: [200, 200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe80: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe80 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe80
'] }, pipe90: { description: 'Two meter uploads with header and zipped where second sets cumulative & reset, renames meter then reading upload', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true')", CHAI_METERS_REQUEST + ".field('headerRow','true').field('update','true').field('meterName', 'pipe90x')", CHAI_READINGS_REQUEST + ".field('gzip', 'false').field('meterName', 'pipe90')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true)", CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('update',BooleanTypesJS.true).field('meterName', 'pipe90x')", CHAI_READINGS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('meterName', 'pipe90')"], fileName: ['pipe90AInputMeter.csv.gz', 'pipe90BInputMeter.csv.gz', 'pipe90CInput.csv'], responseCode: [200, 200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe90: Error parsing Reading #1. Reading value gives 24 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe90 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 24 start time 2021-06-01T00:00:00Z end time 2021-06-02T00:00:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset true; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe90
'] }, pipe110: { description: 'Create meter with timezone with hourly reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe110').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe110').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe110AInputMeter.csv', 'pipe110BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe110: Warning parsing Reading #2. Reading value gives 120 with warning message:
Reading #2 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T01:00:00-06:00 endTimestamp of 2022-03-13T03:00:00-05:00 reading value of 120 and the first part has a startTimestamp of 2022-03-13T01:00:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 120. This is only a notification and should not be an issue.
For reading #2 on meter pipe110 in pipeline: previous reading has value 60 start time 2022-03-13T00:00:00Z end time 2022-03-13T01:00:00Z and current reading has value 120 start time 2022-03-13T02:00:00Z end time 2022-03-13T03:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe111: { description: 'Create meter with timezone with daily reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe111').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe111').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe111AInputMeter.csv', 'pipe111BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe111: Warning parsing Reading #2. Reading value gives 2760 with warning message:
Reading #2 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T00:00:00-06:00 endTimestamp of 2022-03-14T00:00:00-05:00 reading value of 2760 and the first part has a startTimestamp of 2022-03-13T00:00:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 240. This is only a notification and should not be an issue.
Reading #2 crossed into daylight savings so it needs to be split where the second part is now being used. The original reading had startTimestamp of 2022-03-13T00:00:00-06:00 endTimestamp of 2022-03-14T00:00:00-05:00 reading value of 2760 and the second part has a startTimestamp of 2022-03-13T03:00:00Z endTimestamp of 2022-03-14T00:00:00Z reading value of 2520. This is only a notification and should not be an issue.
For reading #2 on meter pipe111 in pipeline: previous reading has value 1440 start time 2022-03-12T00:00:00Z end time 2022-03-13T00:00:00Z and current reading has value 2760 start time 2022-03-13T00:00:00Z end time 2022-03-14T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe112: { description: 'Create meter with timezone with 15-minute reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe112').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe112').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe112AInputMeter.csv', 'pipe112BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe112: Warning parsing Reading #2. Reading value gives 30 with warning message:
Reading #2 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T01:45:00-06:00 endTimestamp of 2022-03-13T03:00:00-05:00 reading value of 30 and the first part has a startTimestamp of 2022-03-13T01:45:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 30. This is only a notification and should not be an issue.
For reading #2 on meter pipe112 in pipeline: previous reading has value 15 start time 2022-03-13T01:30:00Z end time 2022-03-13T01:45:00Z and current reading has value 30 start time 2022-03-13T02:45:00Z end time 2022-03-13T03:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe113: { description: 'Create meter with timezone with 23-minute reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe113').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe113').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe113AInputMeter.csv', 'pipe113BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe113: Warning parsing Reading #2. Reading value gives 46 with warning message:
Reading #2 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the first part has a startTimestamp of 2022-03-13T01:46:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 28. This is only a notification and should not be an issue.
Reading #2 crossed into daylight savings so it needs to be split where the second part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the second part has a startTimestamp of 2022-03-13T03:00:00Z endTimestamp of 2022-03-13T03:09:00Z reading value of 18. This is only a notification and should not be an issue.
For reading #2 on meter pipe113 in pipeline: previous reading has value 23 start time 2022-03-13T01:23:00Z end time 2022-03-13T01:46:00Z and current reading has value 46 start time 2022-03-13T02:46:00Z end time 2022-03-13T03:09:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe114: { description: 'Create cumulative meter with timezone with 23-minute reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe114').field('honorDst', 'true').field('cumulative','true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe114').field('honorDst', BooleanTypesJS.true).field('cumulative',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe114AInputMeter.csv', 'pipe114BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe114: Error parsing Reading #1. Reading value gives 0 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe114 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 0 start time 2022-03-13T01:00:00Z end time 2022-03-13T01:23:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe114: Warning parsing Reading #3. Reading value gives 46 with warning message:
Reading #3 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the first part has a startTimestamp of 2022-03-13T01:46:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 28. This is only a notification and should not be an issue.
Reading #3 crossed into daylight savings so it needs to be split where the second part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the second part has a startTimestamp of 2022-03-13T03:00:00Z endTimestamp of 2022-03-13T03:09:00Z reading value of 18. This is only a notification and should not be an issue.
For reading #3 on meter pipe114 in pipeline: previous reading has value 23 start time 2022-03-13T01:23:00Z end time 2022-03-13T01:46:00Z and current reading has value 46 start time 2022-03-13T02:46:00Z end time 2022-03-13T03:09:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe114
'] }, pipe115: { description: 'Create meter with timezone with end-only reading upload into DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe115').field('honorDst', 'true').field('endOnly', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe115').field('honorDst', BooleanTypesJS.true).field('endOnly', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe115AInputMeter.csv', 'pipe115BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe115: Error parsing Reading #1. Reading value gives -99 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe115 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value -99 start time 1970-01-01T00:00:00Z end time 2022-03-13T01:23:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe115: Warning parsing Reading #3. Reading value gives 46 with warning message:
Reading #3 crossed into daylight savings so it needs to be split where the first part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the first part has a startTimestamp of 2022-03-13T01:46:00Z endTimestamp of 2022-03-13T02:00:00Z reading value of 28. This is only a notification and should not be an issue.
Reading #3 crossed into daylight savings so it needs to be split where the second part is now being used. The original reading had startTimestamp of 2022-03-13T01:46:00-06:00 endTimestamp of 2022-03-13T03:09:00-05:00 reading value of 46 and the second part has a startTimestamp of 2022-03-13T03:00:00Z endTimestamp of 2022-03-13T03:09:00Z reading value of 18. This is only a notification and should not be an issue.
For reading #3 on meter pipe115 in pipeline: previous reading has value 23 start time 2022-03-13T01:23:00Z end time 2022-03-13T02:46:00Z and current reading has value 46 start time 2022-03-13T02:46:00Z end time 2022-03-13T03:09:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe115
'] }, pipe116: { description: 'Create meter with timezone with hourly reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe116').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe116').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe116AInputMeter.csv', 'pipe116BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe116: Error parsing Reading #2. Reading value gives -1 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:00:00-05:00 and endTimestamp of 2022-11-06T01:00:00-06:00 and value of -1. This should not be an issue but the reading is lost.
For reading #2 on meter pipe116 in pipeline: previous reading has value 60 start time 2022-11-06T00:00:00Z end time 2022-11-06T01:00:00Z and current reading has value -1 start time 2022-11-06T00:00:00Z end time 2022-11-06T01:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe116: Warning parsing Reading #3. Reading value gives 120 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:00:00-06:00 endTimestamp of 2022-11-06T02:00:00-06:00 reading value of 120. The used part has startTimestamp of 2022-11-06T01:00:00Z and endTimestamp of 2022-11-06T02:00:00Z and value of 120. This is only a notification and should not be an issue.
For reading #3 on meter pipe116 in pipeline: previous reading has value -1 start time 2022-11-06T00:00:00Z end time 2022-11-06T01:00:00Z and current reading has value 120 start time 2022-11-06T01:00:00Z end time 2022-11-06T02:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #2 for meter pipe116
'] }, pipe117: { description: 'Create meter with timezone with daily reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe117').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe117').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe117AInputMeter.csv', 'pipe117BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe117: Warning parsing Reading #2. Reading value gives 2880 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T00:00:00-05:00 endTimestamp of 2022-11-07T00:00:00-06:00 reading value of 3000. The used part has startTimestamp of 2022-11-06T00:00:00Z and endTimestamp of 2022-11-07T00:00:00Z and value of 2880. This is only a notification and should not be an issue.
For reading #2 on meter pipe117 in pipeline: previous reading has value 1440 start time 2022-11-05T00:00:00Z end time 2022-11-06T00:00:00Z and current reading has value 2880 start time 2022-11-06T00:00:00Z end time 2022-11-07T00:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] }, pipe118: { description: 'Create meter with timezone with 15-minute reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe118').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe118').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe118AInputMeter.csv', 'pipe118BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe118: Error parsing Reading #2. Reading value gives -1 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:45:00-05:00 and endTimestamp of 2022-11-06T01:00:00-06:00 and value of -1. This should not be an issue but the reading is lost.
For reading #2 on meter pipe118 in pipeline: previous reading has value 15 start time 2022-11-06T01:30:00Z end time 2022-11-06T01:45:00Z and current reading has value -1 start time 2022-11-06T00:45:00Z end time 2022-11-06T01:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe118: Error parsing Reading #3. Reading value gives -2 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:00:00-06:00 and endTimestamp of 2022-11-06T01:15:00-06:00 and value of -2. This should not be an issue but the reading is lost.
For reading #3 on meter pipe118 in pipeline: previous reading has value -1 start time 2022-11-06T00:45:00Z end time 2022-11-06T01:00:00Z and current reading has value -2 start time 2022-11-06T01:00:00Z end time 2022-11-06T01:15:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe118: Error parsing Reading #4. Reading value gives -3 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:15:00-06:00 and endTimestamp of 2022-11-06T01:30:00-06:00 and value of -3. This should not be an issue but the reading is lost.
For reading #4 on meter pipe118 in pipeline: previous reading has value -2 start time 2022-11-06T01:00:00Z end time 2022-11-06T01:15:00Z and current reading has value -3 start time 2022-11-06T01:15:00Z end time 2022-11-06T01:30:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe118: Error parsing Reading #5. Reading value gives -4 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:30:00-06:00 and endTimestamp of 2022-11-06T01:45:00-06:00 and value of -4. This should not be an issue but the reading is lost.
For reading #5 on meter pipe118 in pipeline: previous reading has value -3 start time 2022-11-06T01:15:00Z end time 2022-11-06T01:30:00Z and current reading has value -4 start time 2022-11-06T01:30:00Z end time 2022-11-06T01:45:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe118: Warning parsing Reading #6. Reading value gives 30 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:45:00-06:00 endTimestamp of 2022-11-06T02:00:00-06:00 reading value of 30. The used part has startTimestamp of 2022-11-06T01:45:00Z and endTimestamp of 2022-11-06T02:00:00Z and value of 30. This is only a notification and should not be an issue.
For reading #6 on meter pipe118 in pipeline: previous reading has value -4 start time 2022-11-06T01:30:00Z end time 2022-11-06T01:45:00Z and current reading has value 30 start time 2022-11-06T01:45:00Z end time 2022-11-06T02:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #2 for meter pipe118
  2. Dropped Reading #3 for meter pipe118
  3. Dropped Reading #4 for meter pipe118
  4. Dropped Reading #5 for meter pipe118
'] }, pipe119: { description: 'Create meter with timezone with 23-minute reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe119').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe119').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe119AInputMeter.csv', 'pipe119BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe119: Error parsing Reading #2. Reading value gives -1 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:46:00-05:00 and endTimestamp of 2022-11-06T01:09:00-06:00 and value of -1. This should not be an issue but the reading is lost.
For reading #2 on meter pipe119 in pipeline: previous reading has value 23 start time 2022-11-06T01:23:00Z end time 2022-11-06T01:46:00Z and current reading has value -1 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe119: Error parsing Reading #3. Reading value gives -2 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:09:00-06:00 and endTimestamp of 2022-11-06T01:32:00-06:00 and value of -2. This should not be an issue but the reading is lost.
For reading #3 on meter pipe119 in pipeline: previous reading has value -1 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z and current reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe119: Warning parsing Reading #4. Reading value gives 18 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:32:00-06:00 endTimestamp of 2022-11-06T01:55:00-06:00 reading value of 46. The used part has startTimestamp of 2022-11-06T01:46:00Z and endTimestamp of 2022-11-06T01:55:00Z and value of 18. This is only a notification and should not be an issue.
For reading #4 on meter pipe119 in pipeline: previous reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z and current reading has value 18 start time 2022-11-06T01:32:00Z end time 2022-11-06T01:55:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #2 for meter pipe119
  2. Dropped Reading #3 for meter pipe119
'] }, pipe120: { description: 'Create cumulative meter with timezone with 23-minute reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe120').field('honorDst', 'true').field('cumulative','true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe120').field('honorDst', BooleanTypesJS.true).field('cumulative',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe120AInputMeter.csv', 'pipe120BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe120: Error parsing Reading #1. Reading value gives 0 with error message:
The first ever reading must be dropped when dealing with cumulative data.
For reading #1 on meter pipe120 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value 0 start time 2022-11-06T01:00:00Z end time 2022-11-06T01:23:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe120: Error parsing Reading #3. Reading value gives 0 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:46:00-05:00 and endTimestamp of 2022-11-06T01:09:00-06:00 and value of 0. This should not be an issue but the reading is lost.
For reading #3 on meter pipe120 in pipeline: previous reading has value 23 start time 2022-11-06T01:23:00Z end time 2022-11-06T01:46:00Z and current reading has value 0 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe120: Error parsing Reading #4. Reading value gives 0 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:09:00-06:00 and endTimestamp of 2022-11-06T01:32:00-06:00 and value of 0. This should not be an issue but the reading is lost.
For reading #4 on meter pipe120 in pipeline: previous reading has value 0 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z and current reading has value 0 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

For meter pipe120: Warning parsing Reading #5. Reading value gives 18 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:32:00-06:00 endTimestamp of 2022-11-06T01:55:00-06:00 reading value of 46. The used part has startTimestamp of 2022-11-06T01:46:00Z and endTimestamp of 2022-11-06T01:55:00Z and value of 18. This is only a notification and should not be an issue.
For reading #5 on meter pipe120 in pipeline: previous reading has value 0 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z and current reading has value 18 start time 2022-11-06T01:32:00Z end time 2022-11-06T01:55:00Z with timeSort increasing; duplications 1; cumulative true; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe120
  2. Dropped Reading #3 for meter pipe120
  3. Dropped Reading #4 for meter pipe120
'] }, pipe121: { description: 'Create end-only meter with timezone with 23-minute reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe121').field('honorDst', 'true').field('endOnly', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe121').field('honorDst', BooleanTypesJS.true).field('endOnly', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe121AInputMeter.csv', 'pipe121BInput.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe121: Error parsing Reading #1. Reading value gives -99 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe121 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value -99 start time 1970-01-01T00:00:00Z end time 2022-11-06T01:23:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe121: Error parsing Reading #3. Reading value gives -1 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:46:00-05:00 and endTimestamp of 2022-11-06T01:09:00-06:00 and value of -1. This should not be an issue but the reading is lost.
For reading #3 on meter pipe121 in pipeline: previous reading has value 23 start time 2022-11-06T01:23:00Z end time 2022-11-06T01:46:00Z and current reading has value -1 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe121: Error parsing Reading #4. Reading value gives -2 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:09:00-06:00 and endTimestamp of 2022-11-06T01:32:00-06:00 and value of -2. This should not be an issue but the reading is lost.
For reading #4 on meter pipe121 in pipeline: previous reading has value -1 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z and current reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe121: Warning parsing Reading #5. Reading value gives 18 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:32:00-06:00 endTimestamp of 2022-11-06T01:55:00-06:00 reading value of 46. The used part has startTimestamp of 2022-11-06T01:46:00Z and endTimestamp of 2022-11-06T01:55:00Z and value of 18. This is only a notification and should not be an issue.
For reading #5 on meter pipe121 in pipeline: previous reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z and current reading has value 18 start time 2022-11-06T01:32:00Z end time 2022-11-06T01:55:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe121
  2. Dropped Reading #3 for meter pipe121
  3. Dropped Reading #4 for meter pipe121
'] }, pipe122: { description: 'Create end-only meter with timezone with two 23-minute reading upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe122').field('honorDst', 'true').field('endOnly', 'true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe122').field('honorDst', 'true').field('endOnly', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe122').field('honorDst', BooleanTypesJS.true).field('endOnly', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe122').field('honorDst', BooleanTypesJS.true).field('endOnly', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe122AInputMeter.csv', 'pipe122BInput.csv', 'pipe122CInput.csv'], responseCode: [200, 400, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe122: Error parsing Reading #1. Reading value gives -99 with error message:
The first ever reading must be dropped when dealing only with endTimestamps.
For reading #1 on meter pipe122 in pipeline: previous reading has value 0 start time 1970-01-01T00:00:00Z end time 1970-01-01T00:00:00Z and current reading has value -99 start time 1970-01-01T00:00:00Z end time 2022-11-06T01:23:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe122: Error parsing Reading #3. Reading value gives -1 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:46:00-05:00 and endTimestamp of 2022-11-06T01:09:00-06:00 and value of -1. This should not be an issue but the reading is lost.
For reading #3 on meter pipe122 in pipeline: previous reading has value 23 start time 2022-11-06T01:23:00Z end time 2022-11-06T01:46:00Z and current reading has value -1 start time 2022-11-06T00:46:00Z end time 2022-11-06T01:09:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe122
  2. Dropped Reading #3 for meter pipe122
', '

FAILURE

It looks like the insert of the readings had issues with some or all of the readings where the processing of the readings returned these warning(s)/error(s):


For meter pipe122: Error parsing Reading #1. Reading value gives -2 with error message:
This reading is entirely within the shift time from daylight savings to standard time so it is dropped. The dropped reading had startTimestamp of 2022-11-06T01:09:00-06:00 and endTimestamp of 2022-11-06T01:32:00-06:00 and value of -2. This should not be an issue but the reading is lost.
For reading #1 on meter pipe122 in pipeline: previous reading has value -1 start time 2022-11-06T01:46:00Z end time 2022-11-06T01:09:00Z and current reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

For meter pipe122: Warning parsing Reading #2. Reading value gives 18 with warning message:
This or a previous reading crossed from daylight savings time and is the first one that does not entirely overlap a previous reading so its reading will be prorated where the original values were: startTimestamp of 2022-11-06T01:32:00-06:00 endTimestamp of 2022-11-06T01:55:00-06:00 reading value of 46. The used part has startTimestamp of 2022-11-06T01:46:00Z and endTimestamp of 2022-11-06T01:55:00Z and value of 18. This is only a notification and should not be an issue.
For reading #2 on meter pipe122 in pipeline: previous reading has value -2 start time 2022-11-06T01:09:00Z end time 2022-11-06T01:32:00Z and current reading has value 18 start time 2022-11-06T01:32:00Z end time 2022-11-06T01:55:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime true

Readings Dropped and should have previous messages

  1. Dropped Reading #1 for meter pipe122
'] }, pipe123: { description: 'Create meter with timezone with 30-minute reading with gap upload from DST', - chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow','true').field('gzip', 'false')", CHAI_READINGS_REQUEST + ".field('meterName','pipe123').field('honorDst', 'true').field('gzip', 'false')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('headerRow',BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)", CHAI_READINGS_REQUEST + ".field('meterName','pipe123').field('honorDst', BooleanTypesJS.true).field('gzip', BooleanTypesJS.false)"], fileName: ['pipe123AInputMeter.csv', 'pipe123BInput.csv'], responseCode: [200, 200], responseString: ['

SUCCESS

Successfully inserted the meters.', '

SUCCESS

It looks like the insert of the readings was a success.

However, note that the processing of the readings returned these warning(s):


For meter pipe123: Warning parsing Reading #2. Reading value gives 30 with warning message:
The reading start time is shifted and within the DST shift so it is possible that the crossing to standard time was missed and readings overlap. The current reading startTime is not after the previous reading\'s end time. Note this is treated only as a warning since readings may be sent out of order.
There is a gap in time between this reading and the previous reading that exceeds the allowed amount of 0 seconds.
For reading #2 on meter pipe123 in pipeline: previous reading has value 15 start time 2022-11-06T01:25:00Z end time 2022-11-06T01:55:00Z and current reading has value 30 start time 2022-11-06T01:30:00Z end time 2022-11-06T02:00:00Z with timeSort increasing; duplications 1; cumulative false; cumulativeReset false; cumulativeResetStart 00:00:00; cumulativeResetEnd 23:59:59.999999; lengthGap 0; lengthVariation 0; onlyEndTime false
'] @@ -483,7 +484,7 @@ for (let fileKey in testCases) { await insertStandardConversions(conn); // Create needed units for meters. const units = [ - ['Electric_Utility', '', Unit.unitRepresentType.QUANTITY, 3600, Unit.unitType.METER, '', Unit.displayableType.NONE, false, 'for teting'] + ['Electric_Utility', '', Unit.unitRepresentType.QUANTITY, 3600, Unit.unitType.METER, '', Unit.displayableType.NONE, false, 'for testing'] ]; await insertUnits(units, false, conn); // Create conversions from meter units to standard units. @@ -549,7 +550,7 @@ metersUpload: an array where each entry is a meter object that is what should be const testMeters = { pipe100: { description: 'Second meter upload where incorrectly provides meter name so fails', - chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', 'false').field('headerRow','true')", CHAI_METERS_REQUEST + ".field('gzip', 'false').field('update','true').field('meterName', 'pipe100').field('headerRow','true')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('headerRow',BooleanTypesJS.true)", CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('update',BooleanTypesJS.true).field('meterName', 'pipe100').field('headerRow',BooleanTypesJS.true)"], fileName: ['pipe100InputMeter.csv', 'pipe100InputMeter.csv'], responseCode: [200, 400], responseString: ['

SUCCESS

Successfully inserted the meters.', '

FAILURE

CSVPipelineError: Failed to upload meters due to internal OED Error: Meter name provided ("pipe100") in request with update for meters but more than one meter in CSV so not processing'], @@ -619,7 +620,7 @@ const testMeters = { }, pipe101: { description: 'Second meter with same name so fails but first meter exists', - chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', 'false').field('headerRow','true')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('headerRow',BooleanTypesJS.true)"], fileName: ['pipe101InputMeter.csv'], responseCode: [400], responseString: ['

FAILURE

CSVPipelineError: Failed to upload meters due to internal OED Error: Meter name of "pipe101" got database error of: duplicate key value violates unique constraint "meters_name_key"'], @@ -658,7 +659,7 @@ const testMeters = { }, pipe102: { description: 'Update meter where name does not exist so fails', - chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', 'false').field('headerRow','true').field('update','true')"], + chaiRequest: [CHAI_METERS_REQUEST + ".field('gzip', BooleanTypesJS.false).field('headerRow',BooleanTypesJS.true).field('update',BooleanTypesJS.true)"], fileName: ['pipe102InputMeter.csv'], responseCode: [400], responseString: ['

FAILURE

CSVPipelineError: Failed to upload meters due to internal OED Error: Meter name of "pipe102" does not seem to exist with update for meters and got DB error of: No data returned from the query.'], diff --git a/src/server/test/web/groups.js b/src/server/test/web/groups.js index c9e0ee7e4..12bcfd276 100644 --- a/src/server/test/web/groups.js +++ b/src/server/test/web/groups.js @@ -31,7 +31,7 @@ mocha.describe('groups API', () => { * - - group C * - - - meter C */ - await new Unit(undefined, 'Unit', 'Unit', Unit.unitRepresentType.UNUSED, 1000, Unit.unitType.UNIT, + await new Unit(undefined, 'Unit', 'Unit', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 1, 'Unit Suffix', Unit.displayableType.ALL, true, 'Unit Note').insert(conn); const unitId = (await Unit.getByName('Unit', conn)).id; groupA = new Group(undefined, 'A', true, gpsPoint, 'notes A', 33.5, unitId, Unit.areaUnitType.METERS); diff --git a/src/server/test/web/meters.js b/src/server/test/web/meters.js index c0c6b8aaa..055cba7eb 100644 --- a/src/server/test/web/meters.js +++ b/src/server/test/web/meters.js @@ -98,7 +98,7 @@ mocha.describe('meters API', () => { let unitId; mocha.beforeEach(async () => { conn = testDB.getConnection(); - const unit = new Unit(undefined, 'Unit', 'Unit', Unit.unitRepresentType.UNUSED, 1000, Unit.unitType.UNIT, + const unit = new Unit(undefined, 'Unit', 'Unit', Unit.unitRepresentType.QUANTITY, 1000, Unit.unitType.UNIT, 1, 'Unit Suffix', Unit.displayableType.ALL, true, 'Unit Note'); await unit.insert(conn); unitId = unit.id; diff --git a/src/server/test/web/readings.js b/src/server/test/web/readings.js index 606c1c36d..e9c35f911 100644 --- a/src/server/test/web/readings.js +++ b/src/server/test/web/readings.js @@ -891,7 +891,7 @@ mocha.describe('readings API', () => { mocha.it('should return an empty json object for an invalid unit', async () => { const unitData = [ ['kWh', '', Unit.unitRepresentType.QUANTITY, 3600, Unit.unitType.UNIT, '', Unit.displayableType.ALL, true, 'OED created standard unit'], - ['invalidUnit', '', Unit.unitRepresentType.UNUSED, 1, Unit.unitType.UNIT, '', Unit.displayableType.ALL, true, 'Invalid Unit'] + ['invalidUnit', '', Unit.unitRepresentType.QUANTITY, 1, Unit.unitType.UNIT, '', Unit.displayableType.ALL, true, 'Invalid Unit'] ]; const conversionData = [ ['invalidUnit', 'kWh', false, 1, 0, 'invalidUnit → kWh'] @@ -1139,4 +1139,4 @@ mocha.describe('readings API', () => { }); }); }); -}); \ No newline at end of file +});