import { map, sortBy } from 'common/collections'; import { flow } from 'common/fp'; import { toFixed } from 'common/math'; import { pureComponentHooks } from 'common/react'; import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Chart, ColorBox, Flex, Icon, LabeledList, ProgressBar, Section, Table } from '../components'; import { Window } from '../layouts'; const PEAK_DRAW = 500000; export const powerRank = (str) => { const unit = String(str.split(' ')[1]).toLowerCase(); return ['w', 'kw', 'mw', 'gw'].indexOf(unit); }; export const PowerMonitor = () => { return ( ); }; export const PowerMonitorContent = (props, context) => { const { act, data } = useBackend(context); const { map_levels, all_sensors, focus } = data; if (focus) { return ; } let body = No sensors detected; if (all_sensors) { body = ( {all_sensors.map((sensor) => (
); } return (
act('refresh')} /> }> {body}
); }; export const PowerMonitorFocus = (props, context) => { const { act, data } = useBackend(context); const { focus } = props; const { history } = focus; const [sortByField, setSortByField] = useLocalState( context, 'sortByField', null ); const supply = history.supply[history.supply.length - 1] || 0; const demand = history.demand[history.demand.length - 1] || 0; const supplyData = history.supply.map((value, i) => [i, value]); const demandData = history.demand.map((value, i) => [i, value]); const maxValue = Math.max(PEAK_DRAW, ...history.supply, ...history.demand); // Process area data const areas = flow([ map((area, i) => ({ ...area, // Generate a unique id id: area.name + i, })), sortByField === 'name' && sortBy((area) => area.name), sortByField === 'charge' && sortBy((area) => -area.charge), sortByField === 'draw' && sortBy( (area) => -powerRank(area.load), (area) => -parseFloat(area.load) ), sortByField === 'problems' && sortBy( (area) => area.eqp, (area) => area.lgt, (area) => area.env, (area) => area.charge, (area) => area.name ), ])(focus.areas); return (
act('clear')} /> } />
{toFixed(supply / 1000) + ' kW'} {toFixed(demand / 1000) + ' kW'}
Sort by: setSortByField(sortByField !== 'name' && 'name')} /> setSortByField(sortByField !== 'charge' && 'charge')} /> setSortByField(sortByField !== 'draw' && 'draw')} /> setSortByField(sortByField !== 'problems' && 'problems') } /> Area Charge Draw Eqp Lgt Env {areas.map((area, i) => ( ))}
{area.name} {area.load}
); }; export const AreaCharge = (props) => { const { charging, charge } = props; return ( 50 ? 'battery-half' : 'battery-quarter')) || (charging === 1 && 'bolt') || (charging === 2 && 'battery-full') } color={ (charging === 0 && (charge > 50 ? 'yellow' : 'red')) || (charging === 1 && 'yellow') || (charging === 2 && 'green') } /> {toFixed(charge) + '%'} ); }; AreaCharge.defaultHooks = pureComponentHooks; const AreaStatusColorBox = (props) => { const { status } = props; const power = Boolean(status & 2); const mode = Boolean(status & 1); const tooltipText = (power ? 'On' : 'Off') + ` [${mode ? 'auto' : 'manual'}]`; return ( ); }; AreaStatusColorBox.defaultHooks = pureComponentHooks;