Final Update for calibration charge
This commit is contained in:
parent
c6a21232f1
commit
907bc6f32b
|
@ -3,7 +3,7 @@
|
||||||
dotnet_version='net6.0'
|
dotnet_version='net6.0'
|
||||||
salimax_ip="$1"
|
salimax_ip="$1"
|
||||||
username='ie-entwicklung'
|
username='ie-entwicklung'
|
||||||
|
root_password='Salimax4x25'
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
echo -e "\n============================ Build ============================\n"
|
echo -e "\n============================ Build ============================\n"
|
||||||
|
@ -20,4 +20,7 @@ rsync -v \
|
||||||
--exclude '*.pdb' \
|
--exclude '*.pdb' \
|
||||||
./bin/Release/$dotnet_version/linux-x64/publish/* \
|
./bin/Release/$dotnet_version/linux-x64/publish/* \
|
||||||
$username@"$salimax_ip":~/salimax
|
$username@"$salimax_ip":~/salimax
|
||||||
|
|
||||||
|
echo -e "\n============================ Execute ============================\n"
|
||||||
|
|
||||||
|
sshpass -p "$root_password" ssh -o StrictHostKeyChecking=no -t "$username"@"$salimax_ip" "echo '$root_password' | sudo -S sh -c 'cd salimax && ./restart'" 2>/dev/null
|
||||||
|
|
|
@ -23,11 +23,10 @@ for ip_address in "${ip_addresses[@]}"; do
|
||||||
--exclude '*.pdb' \
|
--exclude '*.pdb' \
|
||||||
./bin/Release/$dotnet_version/linux-x64/publish/* \
|
./bin/Release/$dotnet_version/linux-x64/publish/* \
|
||||||
$username@"$ip_address":~/salimax
|
$username@"$ip_address":~/salimax
|
||||||
|
|
||||||
ssh "$username"@"$ip_address" "cd salimax && echo '$root_password' | sudo -S ./restart"
|
|
||||||
|
|
||||||
|
|
||||||
echo "Deployed and ran commands on $ip_address"
|
ssh "$username"@"$ip_address" "cd salimax && echo '$root_password' | sudo -S ./restart"
|
||||||
|
|
||||||
|
echo "Deployed and ran commands on $ip_address"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,8 @@ namespace InnovEnergy.App.SaliMax.Ess;
|
||||||
public static class Controller
|
public static class Controller
|
||||||
{
|
{
|
||||||
private static readonly Double BatteryHeatingPower = 200.0; // TODO: move to config
|
private static readonly Double BatteryHeatingPower = 200.0; // TODO: move to config
|
||||||
private static Boolean _hasCalibrationChargeChecked = false;
|
private static Boolean _hasAdditionalCalibrationChargeChecked = false;
|
||||||
|
private static Boolean _hasRepetitiveCalibrationChargeChecked = false;
|
||||||
private static DateTime _nextDayAt10Am = DateTime.Now;
|
private static DateTime _nextDayAt10Am = DateTime.Now;
|
||||||
|
|
||||||
public static EssMode SelectControlMode(this StatusRecord s)
|
public static EssMode SelectControlMode(this StatusRecord s)
|
||||||
|
@ -188,38 +189,51 @@ public static class Controller
|
||||||
private static Boolean MustDoCalibrationCharge(this StatusRecord statusRecord)
|
private static Boolean MustDoCalibrationCharge(this StatusRecord statusRecord)
|
||||||
{
|
{
|
||||||
var calibrationChargeForced = statusRecord.Config.ForceCalibrationChargeState;
|
var calibrationChargeForced = statusRecord.Config.ForceCalibrationChargeState;
|
||||||
var additionalCalibrationRequired = CalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForAdditionalCalibration);
|
var additionalCalibrationRequired = AdditionalCalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForAdditionalCalibration);
|
||||||
var repetitiveCalibrationRequired = CalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForRepetitiveCalibration);
|
var repetitiveCalibrationRequired = RepetitiveCalibrationDateHasBeenPassed(statusRecord.Config.DayAndTimeForRepetitiveCalibration);
|
||||||
//var batteryCalibrationChargeRequested = statusRecord.Battery is { CalibrationChargeRequested: true };
|
|
||||||
|
|
||||||
var mustDoCalibrationCharge = calibrationChargeForced == CalibrationChargeType.ChargePermanently ||
|
var mustDoCalibrationCharge = calibrationChargeForced == CalibrationChargeType.ChargePermanently ||
|
||||||
(calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) ||
|
(calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && additionalCalibrationRequired) ||
|
||||||
(calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired);
|
(calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && repetitiveCalibrationRequired);
|
||||||
|
|
||||||
if (statusRecord.Battery is not null)
|
if (statusRecord.Battery is not null)
|
||||||
{
|
{
|
||||||
if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc )
|
if (calibrationChargeForced == CalibrationChargeType.AdditionallyOnce && statusRecord.Battery.Eoc )
|
||||||
{
|
{
|
||||||
statusRecord.Config.ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery;
|
statusRecord.Config.ForceCalibrationChargeState = CalibrationChargeType.RepetitivelyEvery;
|
||||||
_hasCalibrationChargeChecked = false;
|
_hasAdditionalCalibrationChargeChecked = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && statusRecord.Battery.Eoc)
|
else if (calibrationChargeForced == CalibrationChargeType.RepetitivelyEvery && statusRecord.Battery.Eoc)
|
||||||
{
|
{
|
||||||
statusRecord.Config.DayAndTimeForRepetitiveCalibration = statusRecord.Config.DayAndTimeForRepetitiveCalibration.AddDays(7);
|
statusRecord.Config.DayAndTimeForRepetitiveCalibration = statusRecord.Config.DayAndTimeForRepetitiveCalibration.AddDays(7);
|
||||||
_hasCalibrationChargeChecked = false;
|
_hasRepetitiveCalibrationChargeChecked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mustDoCalibrationCharge;
|
return mustDoCalibrationCharge;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Boolean CalibrationDateHasBeenPassed(DateTime calibrationChargeDate)
|
private static Boolean RepetitiveCalibrationDateHasBeenPassed(DateTime calibrationChargeDate)
|
||||||
{
|
{
|
||||||
if (!_hasCalibrationChargeChecked)
|
if (!_hasRepetitiveCalibrationChargeChecked)
|
||||||
{
|
{
|
||||||
if (DateTime.Now >= calibrationChargeDate )
|
if (DateTime.Now >= calibrationChargeDate )
|
||||||
{
|
{
|
||||||
_hasCalibrationChargeChecked = true;
|
_hasRepetitiveCalibrationChargeChecked = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
private static Boolean AdditionalCalibrationDateHasBeenPassed(DateTime calibrationChargeDate)
|
||||||
|
{
|
||||||
|
if (!_hasAdditionalCalibrationChargeChecked)
|
||||||
|
{
|
||||||
|
if (DateTime.Now >= calibrationChargeDate )
|
||||||
|
{
|
||||||
|
_hasAdditionalCalibrationChargeChecked = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -21,7 +21,11 @@ import Button from '@mui/material/Button';
|
||||||
import axiosConfig from '../../../Resources/axiosConfig';
|
import axiosConfig from '../../../Resources/axiosConfig';
|
||||||
import { Close as CloseIcon } from '@mui/icons-material';
|
import { Close as CloseIcon } from '@mui/icons-material';
|
||||||
import MenuItem from '@mui/material/MenuItem';
|
import MenuItem from '@mui/material/MenuItem';
|
||||||
import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers';
|
import {
|
||||||
|
DateTimePicker,
|
||||||
|
LocalizationProvider,
|
||||||
|
TimePicker
|
||||||
|
} from '@mui/x-date-pickers';
|
||||||
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
|
|
||||||
|
@ -47,6 +51,16 @@ function Configuration(props: ConfigurationProps) {
|
||||||
'ChargePermanently'
|
'ChargePermanently'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const daysInWeek = [
|
||||||
|
'Sunday',
|
||||||
|
'Monday',
|
||||||
|
'Tuesday',
|
||||||
|
'Wednesday',
|
||||||
|
'Thursday',
|
||||||
|
'Friday',
|
||||||
|
'Saturday'
|
||||||
|
];
|
||||||
|
|
||||||
const [errors, setErrors] = useState({
|
const [errors, setErrors] = useState({
|
||||||
minimumSoC: false,
|
minimumSoC: false,
|
||||||
gridSetPoint: false
|
gridSetPoint: false
|
||||||
|
@ -64,18 +78,7 @@ function Configuration(props: ConfigurationProps) {
|
||||||
const [updated, setUpdated] = useState(false);
|
const [updated, setUpdated] = useState(false);
|
||||||
const [dateSelectionError, setDateSelectionError] = useState('');
|
const [dateSelectionError, setDateSelectionError] = useState('');
|
||||||
const [isErrorDateModalOpen, setErrorDateModalOpen] = useState(false);
|
const [isErrorDateModalOpen, setErrorDateModalOpen] = useState(false);
|
||||||
const [openForcedCalibrationCharge, setOpenForcedCalibrationCharge] =
|
|
||||||
useState(false);
|
|
||||||
const [
|
|
||||||
selectedForcedCalibrationChargeOption,
|
|
||||||
setSelectedForcedCalibrationChargeOption
|
|
||||||
] = useState<string>(
|
|
||||||
CalibrationChargeOptions[
|
|
||||||
CalibrationChargeOptionsController.indexOf(
|
|
||||||
props.values.calibrationChargeState[0].value.toString()
|
|
||||||
)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
const [formValues, setFormValues] = useState<ConfigurationValues>({
|
const [formValues, setFormValues] = useState<ConfigurationValues>({
|
||||||
minimumSoC: props.values.minimumSoC[0].value,
|
minimumSoC: props.values.minimumSoC[0].value,
|
||||||
gridSetPoint: (props.values.gridSetPoint[0].value as number) / 1000,
|
gridSetPoint: (props.values.gridSetPoint[0].value as number) / 1000,
|
||||||
|
@ -105,9 +108,21 @@ function Configuration(props: ConfigurationProps) {
|
||||||
setErrorDateModalOpen(true);
|
setErrorDateModalOpen(true);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
const configurationToSend: ConfigurationValues = {
|
||||||
|
minimumSoC: formValues.minimumSoC,
|
||||||
|
gridSetPoint: formValues.gridSetPoint,
|
||||||
|
CalibrationChargeState: formValues.CalibrationChargeState,
|
||||||
|
calibrationChargeDate: dayjs(formValues.calibrationChargeDate)
|
||||||
|
.add(1, 'hours')
|
||||||
|
.toDate()
|
||||||
|
};
|
||||||
|
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const res = await axiosConfig
|
const res = await axiosConfig
|
||||||
.post(`/EditInstallationConfig?installationId=${props.id}`, formValues)
|
.post(
|
||||||
|
`/EditInstallationConfig?installationId=${props.id}`,
|
||||||
|
configurationToSend
|
||||||
|
)
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
if (err.response) {
|
if (err.response) {
|
||||||
setError(true);
|
setError(true);
|
||||||
|
@ -129,13 +144,26 @@ function Configuration(props: ConfigurationProps) {
|
||||||
const handleConfirm = (newDate) => {
|
const handleConfirm = (newDate) => {
|
||||||
setFormValues({
|
setFormValues({
|
||||||
...formValues,
|
...formValues,
|
||||||
['calibrationChargeDate']: newDate.toDate()
|
['calibrationChargeDate']: dayjs(newDate).toDate()
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSelectedCalibrationChargeDay = (event) => {
|
||||||
|
const selectedDay = daysInWeek.indexOf(event.target.value);
|
||||||
|
const currentDate = dayjs();
|
||||||
|
let difference = selectedDay - currentDate.day();
|
||||||
|
if (difference < 0) {
|
||||||
|
difference += 7;
|
||||||
|
}
|
||||||
|
const adjustedDate = currentDate.add(difference, 'day');
|
||||||
|
|
||||||
|
setFormValues({
|
||||||
|
...formValues,
|
||||||
|
['calibrationChargeDate']: adjustedDate.toDate()
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSelectedCalibrationChargeChange = (event) => {
|
const handleSelectedCalibrationChargeChange = (event) => {
|
||||||
setSelectedForcedCalibrationChargeOption(event.target.value);
|
|
||||||
|
|
||||||
setFormValues({
|
setFormValues({
|
||||||
...formValues,
|
...formValues,
|
||||||
['CalibrationChargeState']: CalibrationChargeOptions.indexOf(
|
['CalibrationChargeState']: CalibrationChargeOptions.indexOf(
|
||||||
|
@ -152,14 +180,6 @@ function Configuration(props: ConfigurationProps) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleOpenForcedCalibrationCharge = () => {
|
|
||||||
setOpenForcedCalibrationCharge(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleCloseForcedCalibrationCharge = () => {
|
|
||||||
setOpenForcedCalibrationCharge(false);
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
const { name, value } = e.target;
|
const { name, value } = e.target;
|
||||||
|
|
||||||
|
@ -277,11 +297,8 @@ function Configuration(props: ConfigurationProps) {
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div style={{ marginBottom: '5px', marginTop: '10px' }}>
|
||||||
<FormControl
|
<FormControl fullWidth sx={{ marginLeft: 1, width: 390 }}>
|
||||||
fullWidth
|
|
||||||
sx={{ marginLeft: 1, marginBottom: '10px', width: 390 }}
|
|
||||||
>
|
|
||||||
<InputLabel
|
<InputLabel
|
||||||
sx={{
|
sx={{
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
|
@ -294,11 +311,15 @@ function Configuration(props: ConfigurationProps) {
|
||||||
/>
|
/>
|
||||||
</InputLabel>
|
</InputLabel>
|
||||||
<Select
|
<Select
|
||||||
value={selectedForcedCalibrationChargeOption}
|
value={
|
||||||
|
CalibrationChargeOptions[
|
||||||
|
formValues.CalibrationChargeState
|
||||||
|
]
|
||||||
|
}
|
||||||
onChange={handleSelectedCalibrationChargeChange}
|
onChange={handleSelectedCalibrationChargeChange}
|
||||||
open={openForcedCalibrationCharge}
|
//open={openForcedCalibrationCharge}
|
||||||
onClose={handleCloseForcedCalibrationCharge}
|
//onClose={handleCloseForcedCalibrationCharge}
|
||||||
onOpen={handleOpenForcedCalibrationCharge}
|
//onOpen={handleOpenForcedCalibrationCharge}
|
||||||
>
|
>
|
||||||
{CalibrationChargeOptions.map((option) => (
|
{CalibrationChargeOptions.map((option) => (
|
||||||
<MenuItem key={option} value={option}>
|
<MenuItem key={option} value={option}>
|
||||||
|
@ -308,7 +329,7 @@ function Configuration(props: ConfigurationProps) {
|
||||||
</Select>
|
</Select>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
</div>
|
</div>
|
||||||
{formValues.CalibrationChargeState != 2 && (
|
{formValues.CalibrationChargeState == 1 && (
|
||||||
<div>
|
<div>
|
||||||
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
||||||
<DateTimePicker
|
<DateTimePicker
|
||||||
|
@ -323,6 +344,54 @@ function Configuration(props: ConfigurationProps) {
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{formValues.CalibrationChargeState == 0 && (
|
||||||
|
<>
|
||||||
|
<div style={{ marginBottom: '5px' }}>
|
||||||
|
<FormControl
|
||||||
|
fullWidth
|
||||||
|
sx={{ marginLeft: 1, width: 390, marginTop: 2 }}
|
||||||
|
>
|
||||||
|
<InputLabel
|
||||||
|
sx={{
|
||||||
|
fontSize: 14,
|
||||||
|
backgroundColor: 'transparent'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<FormattedMessage
|
||||||
|
id="calibration_charge_day"
|
||||||
|
defaultMessage="Calibration Charge Day"
|
||||||
|
/>
|
||||||
|
</InputLabel>
|
||||||
|
<Select
|
||||||
|
value={
|
||||||
|
daysInWeek[formValues.calibrationChargeDate.getDay()]
|
||||||
|
}
|
||||||
|
onChange={handleSelectedCalibrationChargeDay}
|
||||||
|
// open={openForcedCalibrationCharge}
|
||||||
|
// onClose={handleCloseForcedCalibrationCharge}
|
||||||
|
// onOpen={handleOpenForcedCalibrationCharge}
|
||||||
|
>
|
||||||
|
{daysInWeek.map((day) => (
|
||||||
|
<MenuItem key={day} value={day}>
|
||||||
|
{day}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={{ marginBottom: '5px', marginTop: '10px' }}>
|
||||||
|
<LocalizationProvider dateAdapter={AdapterDayjs}>
|
||||||
|
<TimePicker
|
||||||
|
label="Calibration Charge Hour"
|
||||||
|
value={dayjs(formValues.calibrationChargeDate)}
|
||||||
|
onChange={handleConfirm}
|
||||||
|
/>
|
||||||
|
</LocalizationProvider>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<div style={{ marginBottom: '5px' }}>
|
<div style={{ marginBottom: '5px' }}>
|
||||||
<TextField
|
<TextField
|
||||||
label={
|
label={
|
||||||
|
|
Loading…
Reference in New Issue