added Control Permission in Growatt Configuration tab

This commit is contained in:
Yinyin Liu 2025-12-03 13:33:49 +01:00
parent da037b7f5a
commit f453ecda6e
2 changed files with 70 additions and 47 deletions

View File

@ -332,7 +332,10 @@ export interface JSONRecordData {
ClusterNumber: number; ClusterNumber: number;
PvNumber: number; PvNumber: number;
//For Sinexcel: TimeChargeDischarge mode //For SodistoerHome-Growatt:
ControlPermission:boolean;
//For SodistoerHome-Sinexcel: TimeChargeDischarge mode
TimeChargeDischargePower?: number; TimeChargeDischargePower?: number;
TimeChargeDischargeTime?: string; TimeChargeDischargeTime?: string;
TimeChargeDischargeDate?: string; TimeChargeDischargeDate?: string;
@ -643,7 +646,10 @@ export type ConfigurationValues = {
clusterNumber: number; clusterNumber: number;
PvNumber: number; PvNumber: number;
// For Sinexcel: TimeChargeDischarge mode //For sodistoreHome-Growatt:
controlPermission:boolean;
// For sodistoreHome-Sinexcel: TimeChargeDischarge mode
timeChargeDischargePower?: number; timeChargeDischargePower?: number;
timeChargeDischargeTime?: Date | string; timeChargeDischargeTime?: Date | string;
timeChargeDischargeDate?: Date | string; timeChargeDischargeDate?: Date | string;

View File

@ -29,6 +29,8 @@ import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { DatePicker, TimePicker } from '@mui/x-date-pickers'; import { DatePicker, TimePicker } from '@mui/x-date-pickers';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import Switch from '@mui/material/Switch';
import FormControlLabel from '@mui/material/FormControlLabel';
interface SodistoreHomeConfigurationProps { interface SodistoreHomeConfigurationProps {
values: JSONRecordData; values: JSONRecordData;
@ -87,20 +89,31 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
props.values.Config.OperatingPriority props.values.Config.OperatingPriority
), ),
batteriesCount: props.values.Config.BatteriesCount, batteriesCount: props.values.Config.BatteriesCount,
...(device === 4 clusterNumber: props.values.Config.ClusterNumber??1,
? { PvNumber: props.values.Config.PvNumber??0,
clusterNumber: props.values.Config.ClusterNumber??1, timeChargeDischargePower: props.values.Config?.TimeChargeDischargePower ?? 0, // default 0 W
PvNumber: props.values.Config.PvNumber??0, timeChargeDischargeTime: props.values.Config?.TimeChargeDischargeTime ? dayjs(props.values.Config.TimeChargeDischargeTime).toDate() : dayjs().hour(8).minute(0).second(0).toDate(), // default 08:00
timeChargeDischargePower: timeChargeDischargeDate: props.values.Config?.TimeChargeDischargeDate ? dayjs(props.values.Config.TimeChargeDischargeDate).toDate() : dayjs().add(1, 'day').toDate(), // default = tomorrow
props.values.Config?.TimeChargeDischargePower ?? 0, // default 0 W controlPermission: props.values.Config.ControlPermission??false,
timeChargeDischargeTime: props.values.Config?.TimeChargeDischargeTime // ...(device === 4
? dayjs(props.values.Config.TimeChargeDischargeTime).toDate() // ? {
: dayjs().hour(8).minute(0).second(0).toDate(), // default 08:00 // clusterNumber: props.values.Config.ClusterNumber??1,
timeChargeDischargeDate: props.values.Config?.TimeChargeDischargeDate // PvNumber: props.values.Config.PvNumber??0,
? dayjs(props.values.Config.TimeChargeDischargeDate).toDate() // timeChargeDischargePower:
: dayjs().add(1, 'day').toDate(), // default = tomorrow // props.values.Config?.TimeChargeDischargePower ?? 0, // default 0 W
} // timeChargeDischargeTime: props.values.Config?.TimeChargeDischargeTime
: {}), // ? dayjs(props.values.Config.TimeChargeDischargeTime).toDate()
// : dayjs().hour(8).minute(0).second(0).toDate(), // default 08:00
// timeChargeDischargeDate: props.values.Config?.TimeChargeDischargeDate
// ? dayjs(props.values.Config.TimeChargeDischargeDate).toDate()
// : dayjs().add(1, 'day').toDate(), // default = tomorrow
// }
// : {}),
// ...(device === 3
// ? {
// controlPermission: props.values.Config.ControlPermission??true,
// }
// : {}),
}); });
const handleOperatingPriorityChange = (event) => { const handleOperatingPriorityChange = (event) => {
@ -122,7 +135,10 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
batteriesCount:formValues.batteriesCount, batteriesCount:formValues.batteriesCount,
clusterNumber:formValues.clusterNumber, clusterNumber:formValues.clusterNumber,
PvNumber:formValues.PvNumber, PvNumber:formValues.PvNumber,
timeChargeDischargePower: formValues.timeChargeDischargePower,
timeChargeDischargeTime: formValues.timeChargeDischargeTime,
timeChargeDischargeDate: formValues.timeChargeDischargeDate,
controlPermission:formValues.controlPermission
// ...(device === 4 && // ...(device === 4 &&
// OperatingPriorityOptions[formValues.operatingPriority] === // OperatingPriorityOptions[formValues.operatingPriority] ===
// 'TimeChargeDischarge' && { // 'TimeChargeDischarge' && {
@ -290,6 +306,37 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
autoComplete="off" autoComplete="off"
> >
<> <>
{device === 3 && (
<div style={{ marginBottom: '5px' }}>
<FormControlLabel
labelPlacement="start"
control={
<Switch
sx={{
transform: "scale(1.4)",
marginLeft: "15px",
}}
checked={formValues.controlPermission ?? false}
onChange={(e) =>
handleChange({
target: {
name: "controlPermission",
value: e.target.checked
}
})
}
/>
}
label={
<FormattedMessage
id="controlPermission"
defaultMessage="Control Permission"
/>
}
/>
</div>
)}
<div style={{ marginBottom: '5px' }}> <div style={{ marginBottom: '5px' }}>
<TextField <TextField
label={ label={
@ -305,36 +352,6 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
/> />
</div> </div>
{/*<div style={{ marginBottom: '5px' }}>*/}
{/* <TextField*/}
{/* label={*/}
{/* <FormattedMessage*/}
{/* id="clusterNumber"*/}
{/* defaultMessage="Cluster Number"*/}
{/* />*/}
{/* }*/}
{/* name="clusterNumber"*/}
{/* value={formValues.clusterNumber}*/}
{/* onChange={handleChange}*/}
{/* fullWidth*/}
{/* />*/}
{/*</div>*/}
{/*<div style={{ marginBottom: '5px' }}>*/}
{/* <TextField*/}
{/* label={*/}
{/* <FormattedMessage*/}
{/* id="PvNumber"*/}
{/* defaultMessage="PV Number"*/}
{/* />*/}
{/* }*/}
{/* name="PvNumber"*/}
{/* value={formValues.PvNumber}*/}
{/* onChange={handleChange}*/}
{/* fullWidth*/}
{/* />*/}
{/*</div>*/}
{device === 4 && ( {device === 4 && (
<> <>
<div style={{ marginBottom: '5px' }}> <div style={{ marginBottom: '5px' }}>