shob01 / foxess
Foxess云API访问
Requires
- guzzlehttp/guzzle: ^7.7
- vlucas/phpdotenv: ^5.5
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
定义了请求数据和使用一些输出功能(如HtmlTableDataFormatter
和ResultDataTable
类)所使用的时区。有关详细信息,请参阅W3 schools PHP支持的时区。