2023-02-25 14:53:58 +00:00
#undef BatteriesAllowed
2023-02-23 16:59:55 +00:00
2023-02-25 14:53:58 +00:00
using InnovEnergy.App.SaliMax.Controller ;
2023-02-23 16:58:33 +00:00
using InnovEnergy.Lib.Utils ;
2023-04-18 08:04:08 +00:00
using InnovEnergy.Lib.Units ;
2023-02-23 16:58:33 +00:00
2023-02-25 14:53:58 +00:00
namespace InnovEnergy.App.SaliMax ;
2023-02-23 16:58:33 +00:00
public static class Topology
{
public static void Print ( StatusRecord s )
{
const String chargingSeparator = ">>>>>>>>>>" ;
const String dischargingSeparator = "<<<<<<<<<" ;
const Int32 height = 25 ;
var pwr = s . InverterStatus ! . Ac . ActivePower ;
2023-04-18 08:04:08 +00:00
var pvPower = ( s . AmptStatus ! . Strings [ 0 ] . Voltage * s . AmptStatus . Strings [ 0 ] . Current + s . AmptStatus ! . Strings [ 1 ] . Voltage * s . AmptStatus . Strings [ 1 ] . Current ) ; // TODO using one Ampt
var loadPower = Utils . Round3 ( ( s . GridMeterStatus ! . Ac . ActivePower + pwr ) ) ; // it's a + because the pwr is inverted
2023-02-23 16:58:33 +00:00
2023-04-18 08:04:08 +00:00
var gridSeparator = s . GridMeterStatus ! . Ac . ActivePower > 0 ? chargingSeparator : dischargingSeparator ;
2023-02-23 16:58:33 +00:00
var inverterSeparator = - pwr > 0 ? chargingSeparator : dischargingSeparator ;
2023-04-18 08:04:08 +00:00
var dcSeparator = - s . DcDcStatus ! . Right . Power > 0 ? chargingSeparator : dischargingSeparator ;
2023-02-23 16:58:33 +00:00
#if BatteriesAllowed
var battery1Separator = s . BatteriesStatus [ 0 ] ! . Power > 0 ? chargingSeparator : dischargingSeparator ;
var battery2Separator = s . BatteriesStatus [ 1 ] ! . Power > 0 ? chargingSeparator : dischargingSeparator ;
#endif
////////////////// Grid //////////////////////
var boxGrid = AsciiArt . CreateBox
(
"Grid" ,
s . GridMeterStatus . Ac . L1 . Voltage . V ( ) ,
s . GridMeterStatus . Ac . L2 . Voltage . V ( ) ,
s . GridMeterStatus . Ac . L3 . Voltage . V ( )
) . AlignCenterVertical ( height ) ;
2023-04-18 08:04:08 +00:00
var gridAcBusArrow = AsciiArt . CreateHorizontalArrow ( s . GridMeterStatus ! . Ac . ActivePower , gridSeparator )
2023-02-23 16:58:33 +00:00
. AlignCenterVertical ( height ) ;
////////////////// Ac Bus //////////////////////
var boxAcBus = AsciiArt . CreateBox
(
"AC Bus" ,
s . InverterStatus . Ac . L1 . Voltage . V ( ) ,
s . InverterStatus . Ac . L2 . Voltage . V ( ) ,
s . InverterStatus . Ac . L3 . Voltage . V ( )
) ;
var boxLoad = AsciiArt . CreateBox
(
"" ,
"LOAD" ,
""
) ;
var loadRect = StringUtils . AlignBottom ( CreateRect ( boxAcBus , boxLoad , loadPower ) , height ) ;
2023-04-18 08:04:08 +00:00
var acBusInvertArrow = AsciiArt . CreateHorizontalArrow ( - pwr , inverterSeparator )
2023-02-23 16:58:33 +00:00
. AlignCenterVertical ( height ) ;
//////////////////// Inverter /////////////////////////
var inverterBox = AsciiArt . CreateBox
(
"" ,
"Inverter" ,
""
) . AlignCenterVertical ( height ) ;
2023-04-18 08:04:08 +00:00
var inverterArrow = AsciiArt . CreateHorizontalArrow ( - pwr , inverterSeparator )
2023-02-23 16:58:33 +00:00
. AlignCenterVertical ( height ) ;
//////////////////// DC Bus /////////////////////////
var dcBusBox = AsciiArt . CreateBox
(
"DC Bus" ,
( s . InverterStatus . ActualDcLinkVoltageLowerHalfExt + s . InverterStatus . ActualDcLinkVoltageUpperHalfExt ) . V ( ) ,
""
) ;
var pvBox = AsciiArt . CreateBox
(
"MPPT" ,
2023-04-18 08:04:08 +00:00
( ( s . AmptStatus ! . Strings [ 0 ] . Voltage + s . AmptStatus ! . Strings [ 1 ] . Voltage ) / 2 ) . V ( ) ,
2023-02-23 16:58:33 +00:00
""
) ;
var pvRect = StringUtils . AlignTop ( CreateRect ( pvBox , dcBusBox , pvPower ) , height ) ;
var dcBusArrow = AsciiArt . CreateHorizontalArrow ( - s . DcDcStatus ! . Dc . Power , dcSeparator )
. AlignCenterVertical ( height ) ;
//////////////////// Dc/Dc /////////////////////////
var dcBox = AsciiArt . CreateBox
(
"Dc/Dc" ,
s . DcDcStatus . BatteryVoltage . V ( ) ,
""
) . AlignCenterVertical ( height ) ;
#if BatteriesAllowed
2023-04-18 08:04:08 +00:00
var dcArrow1 = AsciiArt . CreateHorizontalArrow ( s . BatteriesStatus [ 0 ] ! . Power , battery1Separator ) ;
var dcArrow2 = AsciiArt . CreateHorizontalArrow ( s . BatteriesStatus [ 1 ] ! . Power , battery2Separator ) ;
2023-02-23 16:58:33 +00:00
#else
var dcArrow1 = "" ;
var dcArrow2 = "" ;
var dcArrowRect = StringUtils . AlignCenterVertical ( CreateRect ( dcArrow1 , dcArrow2 ) , height ) ;
#endif
#if BatteriesAllowed
//////////////////// Batteries /////////////////////////
var battery1Box = AsciiArt . CreateBox
(
"Battery 1" ,
s . BatteriesStatus [ 0 ] . Voltage . V ( ) ,
s . BatteriesStatus [ 0 ] . Soc . Percent ( ) ,
s . BatteriesStatus [ 0 ] . Temperature . Celsius ( )
) ;
var battery2Box = AsciiArt . CreateBox
(
"Battery 2" ,
s . BatteriesStatus [ 1 ] . Voltage . V ( ) ,
s . BatteriesStatus [ 1 ] . Soc . Percent ( ) ,
s . BatteriesStatus [ 1 ] . Temperature . Celsius ( )
) ;
var batteryRect = CreateRect ( battery1Box , battery2Box ) . AlignCenterVertical ( height ) ;
var avgBatteryBox = AsciiArt . CreateBox
(
"Batteries" ,
s . AvgBatteriesStatus ! . Voltage . V ( ) ,
s . AvgBatteriesStatus . Soc . Percent ( ) ,
s . AvgBatteriesStatus . Temperature . Celsius ( )
) . AlignCenterVertical ( height ) ;
var topology = boxGrid . SideBySideWith ( gridAcBusArrow , "" )
. SideBySideWith ( loadRect , "" )
. SideBySideWith ( acBusInvertArrow , "" )
. SideBySideWith ( inverterBox , "" )
. SideBySideWith ( inverterArrow , "" )
. SideBySideWith ( pvRect , "" )
. SideBySideWith ( dcBusArrow , "" )
. SideBySideWith ( dcBox , "" )
. SideBySideWith ( dcArrowRect , "" )
. SideBySideWith ( batteryRect , "" )
. SideBySideWith ( avgBatteryBox , "" ) + "\n" ;
#else
var topology = boxGrid . SideBySideWith ( gridAcBusArrow , "" )
. SideBySideWith ( loadRect , "" )
. SideBySideWith ( acBusInvertArrow , "" )
. SideBySideWith ( inverterBox , "" )
. SideBySideWith ( inverterArrow , "" )
. SideBySideWith ( pvRect , "" )
. SideBySideWith ( dcBusArrow , "" )
. SideBySideWith ( dcBox , "" ) + "\n" ;
#endif
Console . WriteLine ( topology ) ;
}
private static String CreateRect ( String boxTop , String boxBottom , Decimal power )
{
var powerArrow = AsciiArt . CreateVerticalArrow ( power ) ;
var boxes = new [ ] { boxTop , powerArrow , boxBottom } ;
var maxWidth = boxes . Max ( l = > l . Width ( ) ) ;
var rect = boxes . Select ( l = > l . AlignCenterHorizontal ( maxWidth ) ) . JoinLines ( ) ;
return rect ;
}
private static String CreateRect ( String boxTop , String boxBottom )
{
var boxes = new [ ] { boxTop , boxBottom } ;
var maxWidth = boxes . Max ( l = > l . Width ( ) ) ;
var rect = boxes . Select ( l = > l . AlignCenterHorizontal ( maxWidth ) ) . JoinLines ( ) ;
return rect ;
}
}