Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter

- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
This commit is contained in:
Eric F
2026-06-08 00:38:27 -04:00
parent 468cfeaa50
commit d398a6ced2
7326 changed files with 1177561 additions and 7 deletions

View File

@@ -0,0 +1,64 @@
set(TEST_TARGET_NAME ${PROJECT_NAME}_EnergyManager_tests)
add_executable(${TEST_TARGET_NAME})
add_dependencies(${TEST_TARGET_NAME} ${MODULE_NAME})
get_target_property(GENERATED_INCLUDE_DIR generate_cpp_files EVEREST_GENERATED_INCLUDE_DIR)
target_include_directories(${TEST_TARGET_NAME} PRIVATE
..
${GENERATED_INCLUDE_DIR}
${CMAKE_BINARY_DIR}/generated/modules/${MODULE_NAME}
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_sources(${TEST_TARGET_NAME} PRIVATE
energy_manager_tests.cpp
JsonDefinedEnergyManagerTest.cpp
../Broker.cpp
../BrokerFastCharging.cpp
../EnergyManagerImpl.cpp
../Market.cpp
../Offer.cpp
)
set(JSON_TESTS_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/json_tests")
target_compile_definitions(${TEST_TARGET_NAME} PRIVATE
BUILD_TESTING_MODULE_ENERGY_MANAGER
JSON_TESTS_LOCATION="${JSON_TESTS_LOCATION}"
)
target_link_libraries(${TEST_TARGET_NAME} PRIVATE
GTest::gmock
GTest::gtest_main
everest::log
everest::framework
)
add_test(${TEST_TARGET_NAME} ${TEST_TARGET_NAME})
ev_register_test_target(${TEST_TARGET_NAME})
# Copy the json files used for testing to the destination directory.
# Uses a stamp file so the copy only runs when source fixtures change —
# plain add_custom_target always runs, which invalidates dependents on every build.
# NOTE: glob is intentionally NOT CONFIGURE_DEPENDS — that flag triggers a cmake
# reconfigure on any fixture mtime change, which cascades into ev-cli regeneration
# and rebuilds hundreds of unrelated targets. If you add/remove a fixture file,
# re-run cmake manually.
file(GLOB JSON_TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/json_tests/*")
set(JSON_TESTS_STAMP "${CMAKE_CURRENT_BINARY_DIR}/json_tests.stamp")
add_custom_command(
OUTPUT ${JSON_TESTS_STAMP}
COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/json_tests
${CMAKE_CURRENT_BINARY_DIR}/json_tests
COMMAND ${CMAKE_COMMAND} -E touch ${JSON_TESTS_STAMP}
DEPENDS ${JSON_TEST_FILES}
VERBATIM
)
add_custom_target(copy_json_tests DEPENDS ${JSON_TESTS_STAMP})
add_dependencies(${TEST_TARGET_NAME} copy_json_tests)

View File

@@ -0,0 +1,97 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include "JsonDefinedEnergyManagerTest.hpp"
#include "EnergyManagerConfigJson.hpp"
#include "everest/logging.hpp"
#include <fstream>
namespace module {
JsonDefinedEnergyManagerTest::JsonDefinedEnergyManagerTest() = default;
JsonDefinedEnergyManagerTest::JsonDefinedEnergyManagerTest(const std::filesystem::path& path) {
load_test(path);
}
void JsonDefinedEnergyManagerTest::TestBody() {
run_test(start_times);
}
void JsonDefinedEnergyManagerTest::load_test(const std::filesystem::path& path) {
std::ifstream f(path.c_str());
json data;
try {
data = json::parse(f);
} catch (...) {
EVLOG_error << "Cannot parse JSON file " << path;
}
if (data.contains("basefile")) {
// Load base file first
std::filesystem::path basefile = std::filesystem::path(path).parent_path() / std::string(data.at("basefile"));
std::ifstream bf(basefile.c_str());
json databf = json::parse(bf);
// Apply patches
data = databf.patch(data.at("patches"));
}
this->request = data.at("request");
for (auto results : data.at("expected_results")) {
std::vector<types::energy::EnforcedLimits> l;
for (auto limit : results) {
types::energy::EnforcedLimits e;
from_json(limit, e);
l.push_back(e);
}
this->expected_results.push_back(l);
}
// Recreate the EnergyManagerImpl with the config from the test
this->config = data.at("config");
this->impl.reset(
new EnergyManagerImpl(this->config, [](const std::vector<types::energy::EnforcedLimits>& limits) { return; }));
this->comment = path;
for (auto start_time : data.at("start_times")) {
this->start_times.push_back(Everest::Date::from_rfc3339(start_time));
}
}
void JsonDefinedEnergyManagerTest::run_test(std::vector<date::utc_clock::time_point> _start_times) {
assert(_start_times.size() == expected_results.size());
for (int i = 0; i < _start_times.size(); i++) {
const auto enforced_limits = this->impl->run_optimizer(request, _start_times[i]);
json diff = json::diff(json(expected_results[i]), json(enforced_limits));
ASSERT_EQ(diff.size(), 0) << "At start time " << _start_times[i] << ": Diff to expected output:" << std::endl
<< diff.dump(2) << std::endl
<< "----------------------------------------" << std::endl
<< "Comment: " << std::endl
<< comment << std::endl
<< "----------------------------------------" << std::endl
<< "Full Request: " << std::endl
<< request << "----------------------------------------" << std::endl
<< "Full Enforced Limits: " << std::endl
<< json(enforced_limits).dump(4) << "----------------------------------------"
<< std::endl;
}
}
// Example to modify the test after loading
// TEST_F(JsonDefinedEnergyManagerTest, json_based_test_01) {
// load_test(std::string(JSON_TESTS_LOCATION) + "/1_0_two_evse_load_balancing.json");
// // Do here any modifications to the test
// this->request;
// this->expected_result;
// run_test();
// }
} // namespace module

View File

@@ -0,0 +1,216 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include "JsonDefinedEnergyManagerTest.hpp"
static const std::string source1 = "SOURCE1";
static const std::string source2 = "SOURCE2";
namespace module {
// Register all json tests in the JSON_TESTS_LOCATION directory
void register_json_tests() {
const std::filesystem::path json_tests{std::string(JSON_TESTS_LOCATION)};
for (auto const& test_file : std::filesystem::directory_iterator{json_tests}) {
if (test_file.is_regular_file()) {
::testing::RegisterTest("JsonDefinedEnergyManagerTest", test_file.path().stem().string().c_str(), nullptr,
nullptr, __FILE__, __LINE__, [=]() -> JsonDefinedEnergyManagerTest* {
return new JsonDefinedEnergyManagerTest(test_file.path());
});
}
}
}
} // namespace module
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
// Add the JSON tests programmatically
module::register_json_tests();
return RUN_ALL_TESTS();
}
TEST(FreeFunctionTests, GetWattFreqTable) {
std::vector<types::energy::FrequencyWattPoint> table{{49., -7000}, {50., 0}, {51., 7000}};
EXPECT_EQ(module::get_watt_from_freq_table(table, 48.), -7000.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 49.), -7000.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 49.5), -3500.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 50.), 0.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 50.5), 3500.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 51.), 7000.);
EXPECT_EQ(module::get_watt_from_freq_table(table, 52.), 7000.);
}
TEST(FreeFunctionTests, ApplyLimitIfSmaller) {
std::optional<types::energy::NumberWithSource> base;
types::energy::NumberWithSource result;
const std::string source = "SOURCE";
// Base has no value yet
module::apply_limit_if_smaller(base, 20., source);
EXPECT_TRUE(base.has_value());
EXPECT_EQ(base.value().value, 20.);
EXPECT_EQ(base.value().source, source);
// Now base has a value, test if a bigger limit does not apply
module::apply_limit_if_smaller(base, 21., source);
EXPECT_TRUE(base.has_value());
EXPECT_EQ(base.value().value, 20.);
EXPECT_EQ(base.value().source, source);
// Now base has a value, test if a smaller limit does apply
module::apply_limit_if_smaller(base, 19., source);
EXPECT_TRUE(base.has_value());
EXPECT_EQ(base.value().value, 19.);
EXPECT_EQ(base.value().source, source);
}
TEST(FreeFunctionTests, ApplySetpoints) {
module::ScheduleReq imp;
module::ScheduleReq::value_type v;
// At first it is mostly empty
v.timestamp = "2024-12-17T13:08:46.479Z";
imp.push_back(v);
// Add another entry with an ampere limit
v.timestamp = "2024-12-17T13:08:47.479Z";
v.limits_to_root.ac_max_current_A = {13.0, source1};
imp.push_back(v);
// Add another entry with an additional watt limit
v.timestamp = "2024-12-17T13:08:48.479Z";
v.limits_to_root.total_power_W = {2200.0, source2};
imp.push_back(v);
module::ScheduleReq exp{imp};
module::ScheduleReq imp_orig{imp};
module::ScheduleReq exp_orig{imp};
module::ScheduleSetpoints setpoints;
module::ScheduleSetpoints::value_type s;
// At first no setpoint is actually set
s.timestamp = "2024-12-17T13:08:46.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:47.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:48.479Z";
setpoints.push_back(s);
module::apply_setpoints(imp, exp, setpoints, {});
EXPECT_FALSE(imp[0].limits_to_root.ac_max_current_A.has_value());
EXPECT_FALSE(imp[0].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(imp[1].limits_to_root.ac_max_current_A.has_value());
EXPECT_FALSE(imp[1].limits_to_root.total_power_W.has_value());
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().value, 13.0);
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().source, source1);
EXPECT_TRUE(imp[2].limits_to_root.ac_max_current_A.has_value());
EXPECT_TRUE(imp[2].limits_to_root.total_power_W.has_value());
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().value, 13.0);
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().source, source1);
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().value, 2200.);
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().source, source2);
setpoints.clear();
types::energy::SetpointType sp;
sp.ac_current_A = 8.0;
sp.source = "SOURCESETPOINT";
s.setpoint = sp;
s.timestamp = "2024-12-17T13:08:46.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:47.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:48.479Z";
setpoints.push_back(s);
module::apply_setpoints(imp, exp, setpoints, {});
EXPECT_TRUE(imp[0].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[0].limits_to_root.ac_max_current_A.value().value, 8.0);
EXPECT_EQ(imp[0].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(imp[0].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(imp[1].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().value, 8.0);
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(imp[1].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(imp[2].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().value, 8.0);
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_TRUE(imp[2].limits_to_root.total_power_W.has_value());
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().value, 2200);
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().source, source2);
EXPECT_TRUE(exp[0].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[0].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[0].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(exp[0].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(exp[1].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[1].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[1].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(exp[1].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(exp[2].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[2].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[2].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_TRUE(exp[2].limits_to_root.total_power_W.has_value());
EXPECT_EQ(exp[2].limits_to_root.total_power_W.value().value, 2200);
EXPECT_EQ(exp[2].limits_to_root.total_power_W.value().source, source2);
imp = imp_orig;
exp = exp_orig;
setpoints.clear();
sp.ac_current_A = 14.0;
sp.source = "SOURCESETPOINT";
s.setpoint = sp;
s.timestamp = "2024-12-17T13:08:46.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:47.479Z";
setpoints.push_back(s);
s.timestamp = "2024-12-17T13:08:48.479Z";
setpoints.push_back(s);
module::apply_setpoints(imp, exp, setpoints, {});
EXPECT_TRUE(imp[0].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[0].limits_to_root.ac_max_current_A.value().value, 14.0);
EXPECT_EQ(imp[0].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(imp[0].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(imp[1].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().value, 13.0);
EXPECT_EQ(imp[1].limits_to_root.ac_max_current_A.value().source, source1);
EXPECT_FALSE(imp[1].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(imp[2].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().value, 13.0);
EXPECT_EQ(imp[2].limits_to_root.ac_max_current_A.value().source, source1);
EXPECT_TRUE(imp[2].limits_to_root.total_power_W.has_value());
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().value, 2200);
EXPECT_EQ(imp[2].limits_to_root.total_power_W.value().source, source2);
EXPECT_TRUE(exp[0].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[0].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[0].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(exp[0].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(exp[1].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[1].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[1].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_FALSE(exp[1].limits_to_root.total_power_W.has_value());
EXPECT_TRUE(exp[2].limits_to_root.ac_max_current_A.has_value());
EXPECT_EQ(exp[2].limits_to_root.ac_max_current_A.value().value, 0.0);
EXPECT_EQ(exp[2].limits_to_root.ac_max_current_A.value().source, "SOURCESETPOINT");
EXPECT_TRUE(exp[2].limits_to_root.total_power_W.has_value());
EXPECT_EQ(exp[2].limits_to_root.total_power_W.value().value, 2200);
EXPECT_EQ(exp[2].limits_to_root.total_power_W.value().source, source2);
}

View File

@@ -0,0 +1,48 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#ifndef TESTS_ENERGY_MANAGER_CONFIG_JSON_HPP
#define TESTS_ENERGY_MANAGER_CONFIG_JSON_HPP
#include "EnergyManagerImpl.hpp"
#include <nlohmann/json.hpp>
NLOHMANN_JSON_NAMESPACE_BEGIN
template <> struct adl_serializer<module::EnergyManagerConfig> {
static void to_json(json& j, const module::EnergyManagerConfig& config) {
j = {
{"nominal_ac_voltage", config.nominal_ac_voltage},
{"update_interval", config.update_interval},
{"schedule_interval_duration", config.schedule_interval_duration},
{"schedule_total_duration", config.schedule_total_duration},
{"slice_ampere", config.slice_ampere},
{"slice_watt", config.slice_watt},
{"debug", config.debug},
{"switch_3ph1ph_while_charging_mode", config.switch_3ph1ph_while_charging_mode},
{"switch_3ph1ph_max_nr_of_switches_per_session", config.switch_3ph1ph_max_nr_of_switches_per_session},
{"switch_3ph1ph_switch_limit_stickyness", config.switch_3ph1ph_switch_limit_stickyness},
{"switch_3ph1ph_power_hysteresis_W", config.switch_3ph1ph_power_hysteresis_W},
{"switch_3ph1ph_time_hysteresis_s", config.switch_3ph1ph_time_hysteresis_s},
};
}
static module::EnergyManagerConfig from_json(const json& j) {
return {
j.at("nominal_ac_voltage"),
j.at("update_interval"),
j.at("schedule_interval_duration"),
j.at("schedule_total_duration"),
j.at("slice_ampere"),
j.at("slice_watt"),
j.at("debug"),
j.at("switch_3ph1ph_while_charging_mode"),
j.at("switch_3ph1ph_max_nr_of_switches_per_session"),
j.at("switch_3ph1ph_switch_limit_stickyness"),
j.at("switch_3ph1ph_power_hysteresis_W"),
j.at("switch_3ph1ph_time_hysteresis_s"),
};
}
};
NLOHMANN_JSON_NAMESPACE_END
#endif // TESTS_ENERGY_MANAGER_CONFIG_JSON_HPP

View File

@@ -0,0 +1,44 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#ifndef JSON_DEFINED_ENERGY_MANAGER_TEST_HPP
#define JSON_DEFINED_ENERGY_MANAGER_TEST_HPP
#include <chrono>
#include <date/date.h>
#include <date/tz.h>
#include <filesystem>
#include <gtest/gtest.h>
#include <memory>
#include <generated/types/energy.hpp>
#include "EnergyManagerImpl.hpp"
namespace module {
// This test runs a test from a single json file
// and asserts that the result matches the expected result defined in the same file
class JsonDefinedEnergyManagerTest : public ::testing::Test {
public:
JsonDefinedEnergyManagerTest();
explicit JsonDefinedEnergyManagerTest(const std::filesystem::path& path);
void TestBody() override;
protected:
void load_test(const std::filesystem::path& path);
void run_test(std::vector<date::utc_clock::time_point> _start_times);
std::unique_ptr<EnergyManagerImpl> impl;
std::vector<date::utc_clock::time_point> start_times;
EnergyManagerConfig config;
types::energy::EnergyFlowRequest request;
std::vector<std::vector<types::energy::EnforcedLimits>> expected_results;
private:
std::string comment;
};
} // namespace module
#endif // JSON_DEFINED_ENERGY_MANAGER_TEST_HPP

View File

@@ -0,0 +1,335 @@
{
"description": "Tests one external watt setpoint for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 10.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"energy_usage_root": {
"current_A": {
"L1": 0.029999999329447746,
"L2": 0.0,
"L3": 0.0,
"N": 0.0
},
"energy_Wh_import": {
"L1": 1.7999999523162842,
"L2": 0.0,
"L3": 0.0,
"total": 1.7999999523162842
},
"power_W": {
"L1": 2.0,
"L2": 0.0,
"L3": 0.0,
"total": 2.0
},
"timestamp": "2024-12-17T13:08:46.479Z",
"voltage_V": {
"DC": 248.10000610351563,
"L1": 0.0,
"L2": 0.0
},
"frequency_Hz": {
"L1": 47.0,
"L2": 47.0,
"L3": 47.0
}
},
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 9.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"schedule_setpoints": [
{
"setpoint": {
"priority": 42,
"source": "external_limit_1_setpoint",
"frequency_table": [
{
"frequency_Hz": 49.0,
"total_power_W": -7000.0
},
{
"frequency_Hz": 50.0,
"total_power_W": 0
},
{
"frequency_Hz": 51.0,
"total_power_W": 7000.0
}
]
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "EVSE1_leave",
"value": -10.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "EVSE1_leave",
"value": -6900.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_leave",
"value": -10.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "EVSE1_leave",
"value": -6900.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_leave",
"value": -10.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "EVSE1_leave",
"value": -6900.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": -9.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_leave",
"value": -6210.0
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,323 @@
{
"description": "Tests loadbalancing between two DC EVSE nodes (50/50)",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 2,
"slice_watt": 1000,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"total_power_W": {
"value": 10000.0,
"source": "EVSE1_leaves"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"total_power_W": {
"value": 50000.0,
"source": "EVSE1_leaves"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 60.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
},
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"total_power_W": {
"value": 12000.0,
"source": "EVSE2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE2_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE2_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE2_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"total_power_W": {
"value": 60000.0,
"source": "EVSE2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 80.0,
"source": "EVSE2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE2_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE2_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE2_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse2"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 125.0,
"source": "GridConnection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 120.0,
"source": "GridConnection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "GridConnection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 125.0,
"source": "GridConnection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 120.0,
"source": "GridConnection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "GridConnection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "EVSE1_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "EVSE1_root",
"value": 41400.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "EVSE1_root",
"value": 41400.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "EVSE1_root",
"value": 41400.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1",
"valid_for": 10
},
{
"limits_root_side": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "GridConnection_root",
"value": 41400.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "GridConnection_root",
"value": 41400.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 60.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_NumPhasesActive",
"value": 3
},
"total_power_W": {
"source": "GridConnection_root",
"value": 41400.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse2",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,299 @@
{
"description": "Tests loadbalancing between two EVSE nodes (50/50)",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
},
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE2_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE2_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE2_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 8.0,
"source": "EVSE2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE2_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE2_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE2_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse2"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "GridConnection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "GridConnection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "GridConnection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "GridConnection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "GridConnection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "GridConnection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 24.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 24.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "GridConnection_root",
"value": 24.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1",
"valid_for": 10
},
{
"limits_root_side": {
"ac_max_current_A": {
"source": "EVSE2_leave",
"value": 8.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE2_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE2_leave",
"value": 8.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE2_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE2_leave",
"value": 8.0
},
"ac_max_phase_count": {
"source": "GridConnection_phase,EVSE2_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse2",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,88 @@
{
"basefile": "1_0_two_ac_evse_load_balancing.json",
"description": "Tests load balancing between two EVSE nodes, one is charging and one is unplugged with 0A in idle",
"patches": [
{
"op": "replace",
"path": "/request/children/1/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "replace",
"path": "/request/children/1/evse_state",
"value": "Unplugged"
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_current_A/source",
"value": "GridConnection_root,EVSE1_root"
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_current_A/value",
"value": 32.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_current_A/source",
"value": "GridConnection_root,EVSE1_root"
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_current_A/value",
"value": 32.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_current_A/source",
"value": "GridConnection_root,EVSE1_root"
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_current_A/value",
"value": 32.0
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/source",
"value": ""
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/value",
"value": 0.0
},
{
"op": "remove",
"path": "/expected_results/0/1/limits_root_side/ac_max_phase_count"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/source",
"value": ""
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "remove",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_phase_count"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/source",
"value": ""
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "remove",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_phase_count"
}
]
}

View File

@@ -0,0 +1,61 @@
{
"basefile": "1_0_two_ac_evse_load_balancing.json",
"description": "Tests load balancing between two EVSE nodes, one is charging and one is unplugged with 6A in idle",
"patches": [
{
"op": "replace",
"path": "/request/children/1/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 6.0
},
{
"op": "replace",
"path": "/request/children/1/evse_state",
"value": "Unplugged"
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_current_A/value",
"value": 26.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_current_A/value",
"value": 26.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_current_A/value",
"value": 26.0
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/source",
"value": "EVSE2_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/value",
"value": 6.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/source",
"value": "EVSE2_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/value",
"value": 6.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/source",
"value": "EVSE2_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/value",
"value": 6.0
}
]
}

View File

@@ -0,0 +1,90 @@
{
"basefile": "1_0_two_ac_evse_load_balancing.json",
"description": "Tests load balancing between two EVSE nodes, one is charging and one is unplugged with 6A in idle",
"patches": [
{
"op": "replace",
"path": "/request/children/0/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 45.0
},
{
"op": "replace",
"path": "/request/children/0/schedule_import/0/limits_to_leaves/ac_max_current_A/value",
"value": 44.0
},
{
"op": "replace",
"path": "/request/children/1/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "replace",
"path": "/request/children/1/schedule_export/0/limits_to_root/ac_max_current_A/value",
"value": 8.0
},
{
"op": "remove",
"path": "/request/children/1/schedule_export/0/limits_to_leaves/ac_max_current_A"
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_current_A/value",
"value": 40.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_current_A/value",
"value": 40.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_current_A/value",
"value": 40.0
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/source",
"value": "EVSE2_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/source",
"value": "EVSE2_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/source",
"value": "EVSE2_root"
}
]
}

View File

@@ -0,0 +1,109 @@
{
"basefile": "1_0_two_ac_evse_load_balancing.json",
"description": "Tests load balancing between two EVSE nodes, both are discharging",
"patches": [
{
"op": "replace",
"path": "/request/children/0/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "replace",
"path": "/request/children/0/schedule_export/0/limits_to_root/ac_max_current_A/value",
"value": 12.0
},
{
"op": "replace",
"path": "/request/children/1/schedule_import/0/limits_to_root/ac_max_current_A/value",
"value": 0.0
},
{
"op": "replace",
"path": "/request/children/1/schedule_export/0/limits_to_root/ac_max_current_A/value",
"value": 11.0
},
{
"op": "remove",
"path": "/request/children/0/schedule_export/0/limits_to_leaves/ac_max_current_A"
},
{
"op": "remove",
"path": "/request/children/1/schedule_export/0/limits_to_leaves/ac_max_current_A"
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/0/limits_root_side/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/0/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/0/schedule/1/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/source",
"value": "GridConnection_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/limits_root_side/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/source",
"value": "GridConnection_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/0/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/source",
"value": "GridConnection_root"
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_current_A/value",
"value": -8.0
},
{
"op": "replace",
"path": "/expected_results/0/1/schedule/1/limits_to_root/ac_max_phase_count/source",
"value": "BrokerFastCharging_FixedValue"
}
]
}

View File

@@ -0,0 +1,235 @@
{
"description": "Tests one external limit for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "grid_connection_root,external_limit_1_root,EVSE1_root",
"value": 32.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "grid_connection_root,external_limit_1_root,EVSE1_root",
"value": 32.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "grid_connection_root,external_limit_1_root,EVSE1_root",
"value": 32.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,235 @@
{
"description": "Tests one external limit for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 13.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": 13.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": 13.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": 13.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,283 @@
{
"description": "Tests one external limit for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_2_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 31.0,
"source": "external_limit_2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_2_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,518 @@
{
"description": "Tests one external limit for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:40.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 5.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 6.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:38.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:39.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:41.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:42.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:43.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_2_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 31.0,
"source": "external_limit_2_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_2_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_2_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": 6.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:38.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:39.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:08:41.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:42.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_2_leave",
"value": 31.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_2_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:43.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,400 @@
{
"description": "Tests one external limit for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z",
"2024-12-17T13:01:00.000Z",
"2024-12-17T13:02:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Both",
"switch_3ph1ph_max_nr_of_switches_per_session": 3,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 0.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {},
"limits_to_root": {
"total_power_W": {
"value": 11000.0,
"source": "external_limit_1_root"
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_leaves": {},
"limits_to_root": {
"total_power_W": {
"value": 2000.0,
"source": "external_limit_1_root"
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_leaves": {},
"limits_to_root": {
"total_power_W": {
"value": 5000.0,
"source": "external_limit_1_root"
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_leaves": {},
"limits_to_root": {
"total_power_W": {
"value": 0.0,
"source": "external_limit_1_root"
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
}
],
"schedule_setpoints": [],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "grid_connection_root,EVSE1_root",
"value": 32.0
},
"ac_max_phase_count": {
"source": "EVSE1_minphase",
"value": 1
},
"total_power_W": {
"source": "grid_connection_root,EVSE1_root",
"value": 7360.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "grid_connection_root,EVSE1_root",
"value": 32.0
},
"ac_max_phase_count": {
"source": "EVSE1_minphase",
"value": 1
},
"total_power_W": {
"source": "grid_connection_root,EVSE1_root",
"value": 7360.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
],
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_root",
"value": 15.942028999328613
},
"ac_max_phase_count": {
"source": "grid_connection_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_root",
"value": 11000.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
],
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_root",
"value": 15.942028999328613
},
"ac_max_phase_count": {
"source": "grid_connection_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_root",
"value": 11000.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:00:01.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,30 @@
{
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"expected_results": [
[]
],
"request": {
"children": [],
"node_type": "Undefined",
"schedule_setpoints": [],
"uuid": "",
"schedule_import": [],
"schedule_export": []
},
"start_times": [
"2025-01-16T15:42:56.390Z"
]
}

View File

@@ -0,0 +1,88 @@
{
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "",
"value": 0.0
},
"total_power_W": {
"source": "",
"value": 0.0
}
},
"timestamp": "2024-01-01T12:00:00.000Z"
}
],
"schedule_setpoints": [],
"uuid": "evse_manager",
"valid_for": 10
}
]
],
"request": {
"children": [],
"energy_usage_root": {
"current_A": {
"L1": 0.029999999329447746,
"L2": 0.0,
"L3": 0.0,
"N": 0.0
},
"energy_Wh_import": {
"L1": 1.7999999523162842,
"L2": 0.0,
"L3": 0.0,
"total": 1.7999999523162842
},
"power_W": {
"L1": 2.0,
"L2": 0.0,
"L3": 0.0,
"total": 2.0
},
"timestamp": "2024-03-27T12:41:16.864Z",
"voltage_V": {
"DC": 248.10000610351563,
"L1": 0.0,
"L2": 0.0
}
},
"node_type": "Evse",
"priority_request": false,
"schedule_import": [],
"schedule_export": [],
"schedule_setpoints": [],
"uuid": "evse_manager"
},
"start_times": [
"2024-01-01T12:00:00.000Z"
]
}

View File

@@ -0,0 +1,338 @@
{
"description": "Tests one external ampere setpoint for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 10.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 9.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"schedule_setpoints": [
{
"setpoint": {
"priority": 42,
"source": "external_limit_1_setpoint",
"ac_current_A": 7.5
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"ac_current_A": 13.0
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"ac_current_A": -8.0
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"ac_current_A": -12.0
},
"timestamp": "2024-12-17T13:08:44.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 7.5
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 7.5
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 7.5
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 13.0
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": -8.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_leave",
"value": -10.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:44.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": -9.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}

View File

@@ -0,0 +1,366 @@
{
"description": "Tests one external watt setpoint for one EVSE",
"start_times": [
"2024-12-17T13:00:00.000Z"
],
"config": {
"nominal_ac_voltage": 230.0,
"update_interval": 1,
"schedule_interval_duration": 60,
"schedule_total_duration": 1,
"slice_ampere": 0.5,
"slice_watt": 500,
"debug": false,
"switch_3ph1ph_while_charging_mode": "Never",
"switch_3ph1ph_max_nr_of_switches_per_session": 10,
"switch_3ph1ph_switch_limit_stickyness": "DontChange",
"switch_3ph1ph_power_hysteresis_W": 500,
"switch_3ph1ph_time_hysteresis_s": 30
},
"request": {
"children": [
{
"children": [
{
"children": [],
"evse_state": "Charging",
"node_type": "Evse",
"priority_request": false,
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 10.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 0.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "EVSE1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "EVSE1_phase"
},
"ac_min_current_A": {
"value": 6.0,
"source": "EVSE1_mincurrent"
},
"ac_min_phase_count": {
"value": 1,
"source": "EVSE1_minphase"
},
"ac_number_of_active_phases": 3,
"ac_supports_changing_phases_during_charging": true
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "evse1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 9.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"schedule_setpoints": [
{
"setpoint": {
"priority": 42,
"source": "external_limit_1_setpoint",
"total_power_W": 4242.0
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"total_power_W": 8242.0
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"total_power_W": -4242.0
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"setpoint": {
"priority": 41,
"source": "external_limit_1_setpoint",
"total_power_W": -14242.0
},
"timestamp": "2024-12-17T13:08:44.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "external_limit_1_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "external_limit_1_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"uuid": "external_limit_1"
}
],
"node_type": "Generic",
"schedule_export": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 16.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_import": [
{
"limits_to_leaves": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_leave"
}
},
"limits_to_root": {
"ac_max_current_A": {
"value": 32.0,
"source": "grid_connection_root"
},
"ac_max_phase_count": {
"value": 3,
"source": "grid_connection_phase"
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
}
],
"schedule_setpoints": [],
"uuid": "grid_connection"
},
"expected_results": [
[
{
"limits_root_side": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 6.147826194763184
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_setpoint",
"value": 4242.0
}
},
"schedule": [
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 6.147826194763184
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_setpoint",
"value": 4242.0
}
},
"timestamp": "2024-12-17T13:00:00.000Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 6.147826194763184
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_setpoint",
"value": 4242.0
}
},
"timestamp": "2024-12-17T13:08:36.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": 11.944927215576172
},
"ac_max_phase_count": {
"source": "grid_connection_phase,external_limit_1_phase,EVSE1_phase",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_setpoint",
"value": 8242.0
}
},
"timestamp": "2024-12-17T13:08:37.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_setpoint",
"value": -6.147826194763184
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_setpoint",
"value": -4242.0
}
},
"timestamp": "2024-12-17T13:08:40.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "EVSE1_leave",
"value": -10.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "EVSE1_leave",
"value": -6900.0
}
},
"timestamp": "2024-12-17T13:08:44.479Z"
},
{
"limits_to_root": {
"ac_max_current_A": {
"source": "external_limit_1_leave",
"value": -9.0
},
"ac_max_phase_count": {
"source": "BrokerFastCharging_FixedValue",
"value": 3
},
"total_power_W": {
"source": "external_limit_1_leave",
"value": -6210.0
}
},
"timestamp": "2024-12-17T13:08:46.479Z"
}
],
"uuid": "evse1",
"valid_for": 10
}
]
]
}