import { EcoFlowClient } from '../client.js';
export const getSolarInputTool = {
name: 'ecoflow_get_solar_input',
description: 'Get solar panel input data for an EcoFlow device including current power, voltage, and daily energy statistics.',
inputSchema: {
type: 'object' as const,
properties: {
serial_number: {
type: 'string',
description: 'The device serial number'
}
},
required: ['serial_number']
}
};
interface SolarArgs {
serial_number: string;
}
interface SolarStatus {
totalSolarWatts: number;
panels: Array<{
port: string;
watts: number;
voltage?: number;
current?: number;
}>;
mppt?: {
inWatts?: number;
inVoltage?: number;
inCurrent?: number;
chargeWatts?: number;
};
}
export async function executeGetSolarInput(
client: EcoFlowClient,
args: SolarArgs
): Promise<string> {
try {
const quota = await client.getDeviceQuotaAll(args.serial_number);
const status: SolarStatus = {
totalSolarWatts: 0,
panels: []
};
// MPPT data (common for most devices)
if (quota['mppt.inWatts'] !== undefined) {
status.mppt = {
inWatts: quota['mppt.inWatts'] as number,
inVoltage: quota['mppt.inVol'] as number,
inCurrent: quota['mppt.inAmp'] as number,
chargeWatts: quota['mppt.chgPauseFlag'] !== 1 ? (quota['mppt.chgWatts'] as number) : 0
};
status.totalSolarWatts = status.mppt.inWatts || 0;
}
// PV1 solar input
if (quota['pd.pv1InputWatts'] !== undefined) {
const pv1Watts = quota['pd.pv1InputWatts'] as number;
status.panels.push({
port: 'PV1',
watts: pv1Watts,
voltage: quota['pd.pv1InputVol'] as number,
current: quota['pd.pv1InputCur'] as number
});
status.totalSolarWatts += pv1Watts;
}
// PV2 solar input
if (quota['pd.pv2InputWatts'] !== undefined) {
const pv2Watts = quota['pd.pv2InputWatts'] as number;
status.panels.push({
port: 'PV2',
watts: pv2Watts,
voltage: quota['pd.pv2InputVol'] as number,
current: quota['pd.pv2InputCur'] as number
});
status.totalSolarWatts += pv2Watts;
}
// MPPT solar inputs (Delta Pro 3 and similar)
if (quota['mppt.pv1InputWatts'] !== undefined) {
const pv1Watts = quota['mppt.pv1InputWatts'] as number;
status.panels.push({
port: 'MPPT-PV1',
watts: pv1Watts,
voltage: quota['mppt.pv1InputVol'] as number,
current: quota['mppt.pv1InputCur'] as number
});
}
if (quota['mppt.pv2InputWatts'] !== undefined) {
const pv2Watts = quota['mppt.pv2InputWatts'] as number;
status.panels.push({
port: 'MPPT-PV2',
watts: pv2Watts,
voltage: quota['mppt.pv2InputVol'] as number,
current: quota['mppt.pv2InputCur'] as number
});
}
// Check for PowerStream micro-inverter solar data
if (quota['20_1.pv1InputWatts'] !== undefined) {
const pv1Watts = quota['20_1.pv1InputWatts'] as number;
status.panels.push({
port: 'PowerStream-PV1',
watts: pv1Watts,
voltage: quota['20_1.pv1InputVol'] as number
});
status.totalSolarWatts += pv1Watts;
}
if (quota['20_1.pv2InputWatts'] !== undefined) {
const pv2Watts = quota['20_1.pv2InputWatts'] as number;
status.panels.push({
port: 'PowerStream-PV2',
watts: pv2Watts,
voltage: quota['20_1.pv2InputVol'] as number
});
status.totalSolarWatts += pv2Watts;
}
const output = {
serialNumber: args.serial_number,
totalSolarInputWatts: status.totalSolarWatts,
panels: status.panels.length > 0 ? status.panels : undefined,
mppt: status.mppt
};
return JSON.stringify(output, null, 2);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new Error(`Failed to get solar input: ${message}`);
}
}