shob01/foxess

Foxess云API访问

v0.2.3 2024-03-05 15:32 UTC

This package is auto-updated.

Last update: 2024-09-05 16:26:08 UTC


README

实现PHP类以通过FoxEss Open API访问FoxEss云数据。官方Open API文档也提到了用户应该了解的一些限制

截至今天,提供的类仅限于单个逆变器安装。简单的理由是这种配置符合我的个人需求,而且我无法测试具有多个逆变器的环境。

请注意,这是一个业余项目的结果,是我业余时间开发的。我是一名专业的软件工程师(C/C++,数据库,ABAP OO),但这是我第一个使用PHP的大型项目。我也不是很擅长Web开发和GitHub。我非常欢迎任何关于最佳实践和禁忌的建议。

安装

composer require shob01/foxess

快速开始

将文件.env.example复制到您的文档根目录下的.env,并填写您的FoxEss配置数据。

# Goto https://www.foxesscloud.com/bus/device/inverter to see your inverters SN
FOXESS_DEVICE_SN="your-inverter-serial-number"
# Goto https://www.foxesscloud.com/user/center and generate your personal API key
FOXESS_API_KEY="your-foxess-api-key"

在您的文档根目录下启动PHP内置的web服务器

php -S 127.0.0.1:8000

在您的浏览器中打开此URL:https://:8000/vendor/shob01/foxess/examples/Test.php

用法示例

这个简单的示例展示了如何读取当前月、今天和当前小时的产量报告数据。此外,还将获取今天SoC(充电状态)、逆变器电池温度的最小值、最大值、当前值和趋势值。

您可以在examples目录中找到此DashboardData.php和一些其他示例代码。每个示例代码还有一个相应的HTML文件,显示执行输出。

try {
    $startTime = new DateTime();

    $foxess = new CloudApi();

    $reportVars = [
        "gridConsumption",
        "loads",
        "feedin",
        "generation",
        "chargeEnergyToTal",
        "dischargeEnergyToTal",
    ];

    $now = new DateTime("now", $foxess->getTZ());
    // Get production report for current month
    $monthlyReport = new ResultDataTable($foxess->getReport("year", $reportVars, $now));
    $currentMonthData = ['date' => $now->format('Y-m')] +
        $monthlyReport->column($now->format('m') - 1);

    // Get production report for today
    $dailyReport = new ResultDataTable($foxess->getReport("month", $reportVars, $now));
    $todaysData = ['date' => $now->format('Y-m-d')] +
        $dailyReport->column($now->format('d') - 1);

    // Get production report for current hour
    $hourlyReport = new ResultDataTable($foxess->getReport("day", $reportVars, $now));
    $hourData = ['date' => $now->format('Y-m-d H')] +
        $hourlyReport->column($now->format('H') - 0);

    $rawVars = [
        "gridConsumptionPower",
        "loadsPower",
        "invBatPower",
        "pv1Power",
        "pv2Power",
        "pvPower",
        "generationPower",
        "feedinPower",
        "SoC"
    ];
    // Get latest raw (real) data
    $latestRaw = new ResultDataTable($foxess->getRaw($rawVars, 'now - 10 minutes'));
    $latestData = $latestRaw->column(-1);
    if (!empty($latestData)) {
        $time = $latestData['time'];
        $latestData['time'] = $time->format('Y-m-d H:i:s');
    }

    // Read SoC (State of charge) Inverter and Battery Temperation data from today
    $rawVars = ['SoC', 'invTemperation','batTemperature'];
    $todayData = new ResultDataTable($foxess->getRaw($rawVars,'today'));
    // Calculate min, max, current and trend values for todays data
    $minMax = $todayData->getMinMax();
    $dashboardData = [
        'month' => $currentMonthData,
        'today' => $todaysData,
        'hour' => $hourData,
        'latest' => $latestData,
        'minMax' => $minMax
    ];
    $endTime = new DateTime();
    $duration = $startTime->diff($endTime);

    outputJson('DashboardData', $dashboardData);

    echo 'Time used: ' . $duration->format('%s.%f') . ' seconds' . PHP_EOL;
} catch (Exception $fe) {
    echo "Exception occured: " . $fe->getMessage() . "<br>";
}

输出

DashboardData
{
    "month": {
        "date": "2024-02",
        "index": "2",
        "gridConsumption": 198.7,
        "loads": 230.8,
        "feedin": 15,
        "generation": 103.5,
        "chargeEnergyToTal": 50.5,
        "dischargeEnergyToTal": 68.4
    },
    "today": {
        "date": "2024-02-27",
        "index": "27",
        "gridConsumption": 3,
        "loads": 2.1,
        "feedin": 0.1,
        "generation": 0.3,
        "chargeEnergyToTal": 0,
        "dischargeEnergyToTal": 0.2
    },
    "hour": {
        "date": "2024-02-27 09",
        "index": "10",
        "gridConsumption": 0.2,
        "loads": 0.4,
        "feedin": 0,
        "generation": 0.2,
        "chargeEnergyToTal": 0,
        "dischargeEnergyToTal": 0.1
    },
    "latest": {
        "time": "2024-02-27 09:57:36",
        "gridConsumptionPower": 1.108,
        "loadsPower": 1.443,
        "invBatPower": 0,
        "pv1Power": 0.219,
        "pv2Power": 0.226,
        "pvPower": 0.445,
        "generationPower": 0.335,
        "feedinPower": 0,
        "SoC": 10
    },
    "minMax": {
        "SoC": {
            "unit": "%",
            "min": {
                "value": 10,
                "time": "2024-02-27 01:15:21"
            },
            "max": {
                "value": 11,
                "time": "2024-02-27 09:48:36"
            },
            "current": 10,
            "trend": 0
        },
        "invTemperation": {
            "unit": "\u2103",
            "min": {
                "value": 30,
                "time": "2024-02-27 05:00:28"
            },
            "max": {
                "value": 34,
                "time": "2024-02-27 09:57:36"
            },
            "current": 34,
            "trend": 1
        },
        "batTemperature": {
            "unit": "\u2103",
            "min": {
                "value": 26.6,
                "time": "2024-02-27 07:20:01"
            },
            "max": {
                "value": 26.9,
                "time": "2024-02-27 02:54:24"
            },
            "current": 26.6,
            "trend": -1
        }
    }
}
Time used: 8.49056 seconds

配置/依赖注入容器

有多种选项可以配置如何执行任务。我实现了一个非常简单的DI容器,用于控制可配置的依赖项。DI容器在PHP代码dependencies.php中设置。

$container = DIContainer::getInstance();

//$container->set(Config::class,fn() => new ConfigFile(__DIR__ . "/../../foxess_config.json"));
$container->set(Config::class,fn() => new ConfigDotEnv());
$container->set(IRequester::class,fn() => new GuzzleHttpRequester());
$container->set('TZ',fn() => new DateTimeZone("Europe/Berlin"));
  • Config::class定义了FoxEss配置数据的来源。已经提供了两个现成的类:

    • ConfigDotEnv:(默认)从.env文件读取数据,并将条目作为本地环境变量提供。
    • ConfigFile:从json文件读取数据。

  • IRequester::class定义了请求和响应处理。我正在使用GuzzleHttp,但可以用任何实现\Psr\Http\Message\ResponseInterface的任何东西替换。只需实现自己的IRequester接口版本。

  • TZ定义了请求数据和使用一些输出功能(如HtmlTableDataFormatterResultDataTable类)所使用的时区。有关详细信息,请参阅W3 schools PHP支持的时区