import React, { Fragment, useEffect, useState } from 'react'; import { Breadcrumb, BreadcrumbItem, Row, Col, Card, CardBody, Button, ButtonGroup, Form, FormGroup, Input, Label, CustomInput, Spinner, } from 'reactstrap'; import CountUp from 'react-countup'; import moment from 'moment'; import loadable from '@loadable/component'; import Cascader from 'rc-cascader'; import CardSummary from '../common/CardSummary'; import LineChart from '../common/LineChart'; import { getCookieValue, createCookie } from '../../../helpers/utils'; import withRedirect from '../../../hoc/withRedirect'; import { withTranslation } from 'react-i18next'; import { toast } from 'react-toastify'; import ButtonIcon from '../../common/ButtonIcon'; import { APIBaseURL } from '../../../config'; import { periodTypeOptions } from '../common/PeriodTypeOptions'; import { comparisonTypeOptions } from '../common/ComparisonTypeOptions'; import { DateRangePicker } from 'rsuite'; import { endOfDay} from 'date-fns'; const DetailedDataTable = loadable(() => import('../common/DetailedDataTable')); const MeterEnergy = ({ setRedirect, setRedirectUrl, t }) => { let current_moment = moment(); useEffect(() => { let is_logged_in = getCookieValue('is_logged_in'); let user_name = getCookieValue('user_name'); let user_display_name = getCookieValue('user_display_name'); let user_uuid = getCookieValue('user_uuid'); let token = getCookieValue('token'); if (is_logged_in === null || !is_logged_in) { setRedirectUrl(`/authentication/basic/login`); setRedirect(true); } else { //update expires time of cookies createCookie('is_logged_in', true, 1000 * 60 * 60 * 8); createCookie('user_name', user_name, 1000 * 60 * 60 * 8); createCookie('user_display_name', user_display_name, 1000 * 60 * 60 * 8); createCookie('user_uuid', user_uuid, 1000 * 60 * 60 * 8); createCookie('token', token, 1000 * 60 * 60 * 8); } }); // State //Query From const [selectedSpaceName, setSelectedSpaceName] = useState(undefined); const [selectedSpaceID, setSelectedSpaceID] = useState(undefined); const [meterList, setMeterList] = useState([]); const [filteredMeterList, setFilteredMeterList] = useState([]); const [selectedMeter, setSelectedMeter] = useState(undefined); const [comparisonType, setComparisonType] = useState('month-on-month'); const [periodType, setPeriodType] = useState('daily'); const [cascaderOptions, setCascaderOptions] = useState(undefined); const [basePeriodDateRange, setBasePeriodDateRange] = useState([current_moment.clone().subtract(1, 'months').startOf('month').toDate(), current_moment.clone().subtract(1, 'months').toDate()]); const [basePeriodDateRangePickerDisabled, setBasePeriodDateRangePickerDisabled] = useState(true); const [reportingPeriodDateRange, setReportingPeriodDateRange] = useState([current_moment.clone().startOf('month').toDate(), current_moment.toDate()]); const dateRangePickerLocale = { sunday: t('sunday'), monday: t('monday'), tuesday: t('tuesday'), wednesday: t('wednesday'), thursday: t('thursday'), friday: t('friday'), saturday: t('saturday'), ok: t('ok'), today: t('today'), yesterday: t('yesterday'), hours: t('hours'), minutes: t('minutes'), seconds: t('seconds'), last7Days: t('last7Days') }; const dateRangePickerStyle = { display: 'block', zIndex: 10}; // buttons const [submitButtonDisabled, setSubmitButtonDisabled] = useState(true); const [spinnerHidden, setSpinnerHidden] = useState(true); const [exportButtonHidden, setExportButtonHidden] = useState(true); //Results const [meterEnergyCategory, setMeterEnergyCategory] = useState({ 'name': '', 'unit': '' }); const [reportingPeriodEnergyConsumptionInCategory, setReportingPeriodEnergyConsumptionInCategory] = useState(0); const [reportingPeriodEnergyConsumptionRate, setReportingPeriodEnergyConsumptionRate] = useState(''); const [reportingPeriodEnergyConsumptionInTCE, setReportingPeriodEnergyConsumptionInTCE] = useState(0); const [reportingPeriodEnergyConsumptionInCO2, setReportingPeriodEnergyConsumptionInCO2] = useState(0); const [basePeriodEnergyConsumptionInCategory, setBasePeriodEnergyConsumptionInCategory] = useState(0); const [meterLineChartOptions, setMeterLineChartOptions] = useState([]); const [meterLineChartData, setMeterLineChartData] = useState({}); const [meterLineChartLabels, setMeterLineChartLabels] = useState([]); const [parameterLineChartOptions, setParameterLineChartOptions] = useState([]); const [parameterLineChartData, setParameterLineChartData] = useState({}); const [parameterLineChartLabels, setParameterLineChartLabels] = useState([]); const [detailedDataTableColumns, setDetailedDataTableColumns] = useState([{dataField: 'startdatetime', text: t('Datetime'), sort: true}]); const [detailedDataTableData, setDetailedDataTableData] = useState([]); const [excelBytesBase64, setExcelBytesBase64] = useState(undefined); useEffect(() => { let isResponseOK = false; fetch(APIBaseURL + '/spaces/tree', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { console.log(response); if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { console.log(json); if (isResponseOK) { // rename keys json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); setCascaderOptions(json); setSelectedSpaceName([json[0]].map(o => o.label)); setSelectedSpaceID([json[0]].map(o => o.value)); // get Meters by root Space ID let isResponseOK = false; fetch(APIBaseURL + '/spaces/' + [json[0]].map(o => o.value) + '/meters', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { if (isResponseOK) { json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); console.log(json); setMeterList(json[0]); setFilteredMeterList(json[0]); if (json[0].length > 0) { setSelectedMeter(json[0][0].value); // enable submit button setSubmitButtonDisabled(false); } else { setSelectedMeter(undefined); // disable submit button setSubmitButtonDisabled(true); } } else { toast.error(json.description) } }).catch(err => { console.log(err); }); // end of get Meters by root Space ID } else { toast.error(json.description); } }).catch(err => { console.log(err); }); }, [t,]); const labelClasses = 'ls text-uppercase text-600 font-weight-semi-bold mb-0'; let onSpaceCascaderChange = (value, selectedOptions) => { setSelectedSpaceName(selectedOptions.map(o => o.label).join('/')); setSelectedSpaceID(value[value.length - 1]); let isResponseOK = false; fetch(APIBaseURL + '/spaces/' + value[value.length - 1] + '/meters', { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; } return response.json(); }).then(json => { if (isResponseOK) { json = JSON.parse(JSON.stringify([json]).split('"id":').join('"value":').split('"name":').join('"label":')); console.log(json) setMeterList(json[0]); setFilteredMeterList(json[0]); if (json[0].length > 0) { setSelectedMeter(json[0][0].value); // enable submit button setSubmitButtonDisabled(false); } else { setSelectedMeter(undefined); // disable submit button setSubmitButtonDisabled(true); } } else { toast.error(json.description) } }).catch(err => { console.log(err); }); } const onSearchMeter = ({ target }) => { const keyword = target.value.toLowerCase(); const filteredResult = meterList.filter( meter => meter.label.toLowerCase().includes(keyword) ); setFilteredMeterList(keyword.length ? filteredResult : meterList); if (filteredResult.length > 0) { setSelectedMeter(filteredResult[0].value); // enable submit button setSubmitButtonDisabled(false); } else { setSelectedMeter(undefined); // disable submit button setSubmitButtonDisabled(true); }; }; let onComparisonTypeChange = ({ target }) => { console.log(target.value); setComparisonType(target.value); if (target.value === 'year-over-year') { setBasePeriodDateRangePickerDisabled(true); setBasePeriodDateRange([moment(reportingPeriodDateRange[0]).subtract(1, 'years').toDate(), moment(reportingPeriodDateRange[1]).subtract(1, 'years').toDate()]); } else if (target.value === 'month-on-month') { setBasePeriodDateRangePickerDisabled(true); setBasePeriodDateRange([moment(reportingPeriodDateRange[0]).subtract(1, 'months').toDate(), moment(reportingPeriodDateRange[1]).subtract(1, 'months').toDate()]); } else if (target.value === 'free-comparison') { setBasePeriodDateRangePickerDisabled(false); } else if (target.value === 'none-comparison') { setBasePeriodDateRange([null, null]); setBasePeriodDateRangePickerDisabled(true); } }; // Callback fired when value changed let onBasePeriodChange = (DateRange) => { if(DateRange == null) { setBasePeriodDateRange([null, null]); } else { if (moment(DateRange[1]).format('HH:mm:ss') == '00:00:00') { // if the user did not change time value, set the default time to the end of day DateRange[1] = endOfDay(DateRange[1]); } setBasePeriodDateRange([DateRange[0], DateRange[1]]); } }; // Callback fired when value changed let onReportingPeriodChange = (DateRange) => { if(DateRange == null) { setReportingPeriodDateRange([null, null]); } else { if (moment(DateRange[1]).format('HH:mm:ss') == '00:00:00') { // if the user did not change time value, set the default time to the end of day DateRange[1] = endOfDay(DateRange[1]); } setReportingPeriodDateRange([DateRange[0], DateRange[1]]); if (comparisonType === 'year-over-year') { setBasePeriodDateRange([moment(DateRange[0]).clone().subtract(1, 'years').toDate(), moment(DateRange[1]).clone().subtract(1, 'years').toDate()]); } else if (comparisonType === 'month-on-month') { setBasePeriodDateRange([moment(DateRange[0]).clone().subtract(1, 'months').toDate(), moment(DateRange[1]).clone().subtract(1, 'months').toDate()]); } } }; // Callback fired when value clean let onBasePeriodClean = event => { setBasePeriodDateRange([null, null]); }; // Callback fired when value clean let onReportingPeriodClean = event => { setReportingPeriodDateRange([null, null]); }; // Handler const handleSubmit = e => { e.preventDefault(); console.log('handleSubmit'); console.log(selectedSpaceID); console.log(selectedMeter); console.log(comparisonType); console.log(periodType); console.log(basePeriodDateRange[0] != null ? moment(basePeriodDateRange[0]).format('YYYY-MM-DDTHH:mm:ss') : null) console.log(basePeriodDateRange[1] != null ? moment(basePeriodDateRange[1]).format('YYYY-MM-DDTHH:mm:ss') : null) console.log(moment(reportingPeriodDateRange[0]).format('YYYY-MM-DDTHH:mm:ss')) console.log(moment(reportingPeriodDateRange[1]).format('YYYY-MM-DDTHH:mm:ss')); // disable submit button setSubmitButtonDisabled(true); // show spinner setSpinnerHidden(false); // hide export button setExportButtonHidden(true) // Reinitialize tables setDetailedDataTableData([]); let isResponseOK = false; fetch(APIBaseURL + '/reports/meterenergy?' + 'meterid=' + selectedMeter + '&periodtype=' + periodType + '&baseperiodstartdatetime=' + (basePeriodDateRange[0] != null ? moment(basePeriodDateRange[0]).format('YYYY-MM-DDTHH:mm:ss') : '') + '&baseperiodenddatetime=' + (basePeriodDateRange[1] != null ? moment(basePeriodDateRange[1]).format('YYYY-MM-DDTHH:mm:ss') : '') + '&reportingperiodstartdatetime=' + moment(reportingPeriodDateRange[0]).format('YYYY-MM-DDTHH:mm:ss') + '&reportingperiodenddatetime=' + moment(reportingPeriodDateRange[1]).format('YYYY-MM-DDTHH:mm:ss'), { method: 'GET', headers: { "Content-type": "application/json", "User-UUID": getCookieValue('user_uuid'), "Token": getCookieValue('token') }, body: null, }).then(response => { if (response.ok) { isResponseOK = true; }; return response.json(); }).then(json => { if (isResponseOK) { console.log(json) setMeterEnergyCategory({ 'name': json['meter']['energy_category_name'], 'unit': json['meter']['unit_of_measure'] }); setReportingPeriodEnergyConsumptionRate(parseFloat(json['reporting_period']['increment_rate'] * 100).toFixed(2) + "%"); setReportingPeriodEnergyConsumptionInCategory(json['reporting_period']['total_in_category']); setReportingPeriodEnergyConsumptionInTCE(json['reporting_period']['total_in_kgce'] / 1000); setReportingPeriodEnergyConsumptionInCO2(json['reporting_period']['total_in_kgco2e'] / 1000); setBasePeriodEnergyConsumptionInCategory(json['base_period']['total_in_category']); let names = Array(); names.push({ 'value': 'a0', 'label': json['meter']['energy_category_name'] }); setMeterLineChartOptions(names); let timestamps = {} timestamps['a0'] = json['reporting_period']['timestamps']; setMeterLineChartLabels(timestamps); let values = {'a0':[]} json['reporting_period']['values'].forEach((currentValue, index) => { values['a0'][index] = currentValue.toFixed(2); }); setMeterLineChartData(values) names = Array(); json['parameters']['names'].forEach((currentValue, index) => { names.push({ 'value': 'a' + index, 'label': currentValue }); }); setParameterLineChartOptions(names); timestamps = {} json['parameters']['timestamps'].forEach((currentValue, index) => { timestamps['a' + index] = currentValue; }); setParameterLineChartLabels(timestamps); values = {} json['parameters']['values'].forEach((currentValue, index) => { values['a' + index] = currentValue; }); setParameterLineChartData(values); setDetailedDataTableColumns([{ dataField: 'startdatetime', text: t('Datetime'), sort: true }, { dataField: 'a0', text: json['meter']['energy_category_name'] + ' (' + json['meter']['unit_of_measure'] + ')', sort: true, formatter: function (decimalValue) { if (typeof decimalValue === 'number') { return decimalValue.toFixed(2); } else { return null; } } }]); let detailed_value_list = []; json['reporting_period']['timestamps'].forEach((currentTimestamp, timestampIndex) => { let detailed_value = {}; detailed_value['id'] = timestampIndex; detailed_value['startdatetime'] = currentTimestamp; detailed_value['a0'] = json['reporting_period']['values'][timestampIndex]; detailed_value_list.push(detailed_value); }); let detailed_value = {}; detailed_value['id'] = detailed_value_list.length; detailed_value['startdatetime'] = t('Total'); detailed_value['a0'] = json['reporting_period']['total_in_category']; detailed_value_list.push(detailed_value); setDetailedDataTableData(detailed_value_list); setExcelBytesBase64(json['excel_bytes_base64']); // enable submit button setSubmitButtonDisabled(false); // hide spinner setSpinnerHidden(true); // show export button setExportButtonHidden(false); } else { toast.error(json.description) setSpinnerHidden(true); setSubmitButtonDisabled(false); } }).catch(err => { console.log(err); }); }; const handleExport = e => { e.preventDefault(); const mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' const fileName = 'meterenergy.xlsx' var fileUrl = "data:" + mimeType + ";base64," + excelBytesBase64; fetch(fileUrl) .then(response => response.blob()) .then(blob => { var link = window.document.createElement("a"); link.href = window.URL.createObjectURL(blob, { type: mimeType }); link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); }); }; return (
{t('Meter Data')}{t('Meter Energy')}

setSelectedMeter(target.value)} > {filteredMeterList.map((meter, index) => ( ))} {comparisonTypeOptions.map((comparisonType, index) => ( ))} setPeriodType(target.value)} > {periodTypeOptions.map((periodType, index) => ( ))}






); }; export default withTranslation()(withRedirect(MeterEnergy));