From d559d43b2aaf6e8feb46d051e0ebc8ac828580ad Mon Sep 17 00:00:00 2001 From: Shankari Date: Sat, 16 Nov 2024 22:36:21 -0800 Subject: [PATCH 1/9] =?UTF-8?q?=F0=9F=92=84=E2=9C=A8=20Manually=20specify?= =?UTF-8?q?=20and=20push=20charging=20profiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the node-red UI to allow the user to specify start and end time and max current, and then send that to the station through the CSMS. High level flow: - Created UI for start/end time and max current - When changed, store them in the context - Use injection to initialize them to standard values - When button clicked, read values from the context, assemble into message and send it off Testing done: - Value was originally set to 10 ``` 2024-11-17 06:47:01.046160 [DEBG] iso15118_car pybind11_init_everestpy(pybind11::module_&):: :: Decoded message (ns=Namespace.ISO_V2_MSG_DEF): {"V2G_Message":{"Header":{"SessionID":"C21CF353E7BDD35F"},"Body":{"ChargingStatusRes":{"ResponseCode":"OK","EVSEID":"DE*PNX*00001","SAScheduleTupleID":1,"EVSEMaxCurrent":{"Multiplier":-1,"Unit":"A","Value":100},"AC_EVSEStatus":{"NotificationMaxDelay":0,"EVSENotification":"None","RCD":false}}}}} ``` - Profile was received ``` 2024-11-17 06:47:01.604088 [ERRO] ocpp:OCPP201 void ocpp::v201::ChargePoint::handle_set_charging_profile_req(ocpp::Call) :: Received SetChargingProfileRequest: { "chargingProfile": { "chargingProfileKind": "Absolute", "chargingProfilePurpose": "ChargingStationMaxProfile", "chargingSchedule": [ { "chargingRateUnit": "A", "chargingSchedulePeriod": [ { "limit": 20.0, "numberPhases": 3, "startPeriod": 0 } ], "duration": 3564, "id": 0, "minChargingRate": 0.0, "startSchedule": "2024-11-17T06:03:36.694Z" } ], "id": 2000, "stackLevel": 0 }, "evseId": 0 } with messageId: 4ce9af96-74a2-495d-8d46-1da729625cfc 2024-11-17 06:47:01.608717 [ERRO] ocpp:OCPP201 void ocpp::v201::ChargePoint::handle_set_charging_profile_req(ocpp::Call) :: Accepting SetChargingProfileRequest ``` - charge status messages now used the new value ``` 2024-11-17 06:47:01.677162 [DEBG] iso15118_car pybind11_init_everestpy(pybind11::module_&):: :: Decoded message (ns=Namespace.ISO_V2_MSG_DEF): {"V2G_Message":{"Header":{"SessionID":"C21CF353E7BDD35F"},"Body":{"ChargingStatusRes":{"ResponseCode":"OK","EVSEID":"DE*PNX*00001","SAScheduleTupleID":1,"EVSEMaxCurrent":{"Multiplier":-1,"Unit":"A","Value":100},"MeterInfo":{"MeterID":"YETI_POWERMETER","MeterReading":4984},"AC_EVSEStatus":{"NotificationMaxDelay":0,"EVSENotification":"None","RCD":false}}}}} 2024-11-17 06:47:02.369101 [DEBG] iso15118_car pybind11_init_everestpy(pybind11::module_&):: :: Decoded message (ns=Namespace.ISO_V2_MSG_DEF): {"V2G_Message":{"Header":{"SessionID":"C21CF353E7BDD35F"},"Body":{"ChargingStatusRes":{"ResponseCode":"OK","EVSEID":"DE*PNX*00001","SAScheduleTupleID":1,"EVSEMaxCurrent":{"Multiplier":-1,"Unit":"A","Value":100},"MeterInfo":{"MeterID":"YETI_POWERMETER","MeterReading":4986},"AC_EVSEStatus":{"NotificationMaxDelay":0,"EVSENotification":"None","RCD":false}}}}} 2024-11-17 06:47:03.010898 [DEBG] iso15118_car pybind11_init_everestpy(pybind11::module_&):: :: Decoded message (ns=Namespace.ISO_V2_MSG_DEF): {"V2G_Message":{"Header":{"SessionID":"C21CF353E7BDD35F"},"Body":{"ChargingStatusRes":{"ResponseCode":"OK","EVSEID":"DE*PNX*00001","SAScheduleTupleID":1,"EVSEMaxCurrent":{"Multiplier":-1,"Unit":"A","Value":100},"AC_EVSEStatus":{"NotificationMaxDelay":0,"EVSENotification":"None","RCD":false}}}}} 2024-11-17 06:47:03.664962 [DEBG] iso15118_car pybind11_init_everestpy(pybind11::module_&):: :: Decoded message (ns=Namespace.ISO_V2_MSG_DEF): {"V2G_Message":{"Header":{"SessionID":"C21CF353E7BDD35F"},"Body":{"ChargingStatusRes":{"ResponseCode":"OK","EVSEID":"DE*PNX*00001","SAScheduleTupleID":1,"EVSEMaxCurrent":{"Multiplier":-1,"Unit":"A","Value":200},"MeterInfo":{"MeterID":"YETI_POWERMETER","MeterReading":4988},"AC_EVSEStatus":{"NotificationMaxDelay":0,"EVSENotification":"None","RCD":false}}}}} ``` Signed-off-by: Shankari --- .../config/config-sil-iso15118-ac-flow.json | 435 +++++++++++++++--- 1 file changed, 373 insertions(+), 62 deletions(-) diff --git a/nodered/config/config-sil-iso15118-ac-flow.json b/nodered/config/config-sil-iso15118-ac-flow.json index e3a22387..12a12e57 100644 --- a/nodered/config/config-sil-iso15118-ac-flow.json +++ b/nodered/config/config-sil-iso15118-ac-flow.json @@ -28,6 +28,14 @@ "info": "", "env": [] }, + { + "id": "9fe0155e5b3d31b1", + "type": "tab", + "label": "External Power Control", + "disabled": false, + "info": "", + "env": [] + }, { "id": "2fdf74399d3a2276", "type": "group", @@ -270,53 +278,6 @@ "disabled": false, "hidden": false }, - { - "id": "9c00d65bdac51e5c", - "type": "ui_spacer", - "z": "663d251dbdfd20aa", - "name": "spacer", - "group": "27651fee38a05406", - "order": 4, - "width": 1, - "height": 1 - }, - { - "id": "c593d23dcd960bab", - "type": "ui_spacer", - "z": "663d251dbdfd20aa", - "name": "spacer", - "group": "27651fee38a05406", - "order": 4, - "width": 1, - "height": 1 - }, - { - "id": "25c6886fe5391a8f", - "type": "ui_spacer", - "z": "663d251dbdfd20aa", - "name": "spacer", - "group": "", - "order": 2, - "width": 6, - "height": 1 - }, - { - "id": "178f91bbe9f2fa1c", - "type": "ui_spacer", - "z": "663d251dbdfd20aa", - "name": "spacer", - "group": "", - "order": 5, - "width": "6", - "height": "1" - }, - { - "id": "569f3ba3fa7d27ae", - "type": "ui_tab", - "name": "Home", - "icon": "home", - "order": 1 - }, { "id": "ab3d4f6881421599", "type": "ui_group", @@ -328,20 +289,6 @@ "collapse": false, "className": "" }, - { - "id": "4f0748909e7fcc0d", - "type": "ui_tab", - "name": "Home", - "icon": "home", - "order": 1 - }, - { - "id": "608cea72d1eb0b30", - "type": "ui_tab", - "name": "Home", - "icon": "home", - "order": 1 - }, { "id": "f33656cf38af1793", "type": "ui_group", @@ -353,6 +300,17 @@ "collapse": false, "className": "" }, + { + "id": "0e8d234f60b178a8", + "type": "ui_group", + "name": "External Limits", + "tab": "d3ada9fa4cf6ac53", + "order": 6, + "disp": true, + "width": "6", + "collapse": false, + "className": "" + }, { "id": "cf9212e69c58032e", "type": "mqtt in", @@ -3576,5 +3534,358 @@ "142ed5afefab1cfd" ] ] + }, + { + "id": "1ef1dcc581d80607", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "start_time", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 260, + "y": 60, + "wires": [] + }, + { + "id": "eb8c4d1be09b9511", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "create_post_message", + "func": "node.warn(\"Received payload \"+msg.payload);\nconst time_values = flow.get([\"start_time\", \"end_time\"]);\nconst energy_values = flow.get([\"max_current\"]);\nconst duration = Math.ceil((time_values[1] - time_values[0]) / 1000);\nnode.warn(\"time_values are \" + time_values+\" duration = \"+duration);\nconst charge_profile_template = {\n \"id\": 2000,\n \"chargingProfileKind\": \"Absolute\",\n \"chargingProfilePurpose\": \"ChargingStationMaxProfile\",\n \"chargingSchedule\": [\n {\n \"id\": 0,\n \"chargingRateUnit\": \"A\",\n \"chargingSchedulePeriod\": [\n {\n \"limit\": energy_values[0],\n \"numberPhases\": 3,\n \"startPeriod\": 0\n }\n ],\n \"duration\": duration,\n \"minChargingRate\": 0.0,\n \"startSchedule\": new Date(time_values[0]),\n }\n ],\n \"stackLevel\": 0\n}\n\nconst wrapperMsg = {payload: charge_profile_template};\nreturn wrapperMsg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 300, + "y": 280, + "wires": [ + [ + "dd5c01bd89d1a332", + "0b8a2d5b13bb7809" + ] + ] + }, + { + "id": "dd5c01bd89d1a332", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "formatted_post", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "payload", + "targetType": "msg", + "statusVal": "", + "statusType": "auto", + "x": 580, + "y": 260, + "wires": [] + }, + { + "id": "0b8a2d5b13bb7809", + "type": "http request", + "z": "9fe0155e5b3d31b1", + "name": "", + "method": "POST", + "ret": "txt", + "paytoqs": "ignore", + "url": "http://host.docker.internal:9410/api/v0/cs/cp001/setchargingprofile", + "tls": "", + "persist": false, + "proxy": "", + "insecureHTTPParser": false, + "authType": "", + "senderr": false, + "headers": [ + { + "keyType": "other", + "keyValue": "Content-Type", + "valueType": "other", + "valueValue": "application/json" + } + ], + "x": 470, + "y": 340, + "wires": [ + [ + "28e4961dc9f0129e" + ] + ] + }, + { + "id": "28e4961dc9f0129e", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "http_response", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "payload", + "targetType": "msg", + "statusVal": "", + "statusType": "auto", + "x": 720, + "y": 340, + "wires": [] + }, + { + "id": "3d44bdce67fb80de", + "type": "ui_text_input", + "z": "9fe0155e5b3d31b1", + "name": "", + "label": "Start:", + "tooltip": "", + "group": "0e8d234f60b178a8", + "order": 1, + "width": 0, + "height": 0, + "passthru": true, + "mode": "datetime-local", + "delay": 300, + "topic": "topic", + "sendOnBlur": true, + "className": "", + "topicType": "msg", + "x": 110, + "y": 60, + "wires": [ + [ + "1ef1dcc581d80607", + "45fbfa036a572ce9" + ] + ] + }, + { + "id": "b041a6efa19167c7", + "type": "ui_text_input", + "z": "9fe0155e5b3d31b1", + "name": "", + "label": "End:", + "tooltip": "", + "group": "0e8d234f60b178a8", + "order": 1, + "width": 0, + "height": 0, + "passthru": true, + "mode": "datetime-local", + "delay": 300, + "topic": "external_limit_end", + "sendOnBlur": true, + "className": "", + "topicType": "msg", + "x": 430, + "y": 60, + "wires": [ + [ + "15a95c5d894549e7", + "9b997430586ae6b5" + ] + ] + }, + { + "id": "15a95c5d894549e7", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "end_time", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 580, + "y": 60, + "wires": [] + }, + { + "id": "45fbfa036a572ce9", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "set_start_time", + "rules": [ + { + "t": "set", + "p": "start_time", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 180, + "y": 120, + "wires": [ + [] + ] + }, + { + "id": "9b997430586ae6b5", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "set_end_time", + "rules": [ + { + "t": "set", + "p": "end_time", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 500, + "y": 120, + "wires": [ + [] + ] + }, + { + "id": "4ff73892fd4c4ec0", + "type": "ui_text-input", + "z": "9fe0155e5b3d31b1", + "action": "set", + "actionType": "str", + "write": "payload", + "writeType": "msg", + "name": "current_limit", + "label": "Current", + "tooltip": "", + "group": "0e8d234f60b178a8", + "order": 2, + "width": 0, + "height": 0, + "passthru": true, + "mode": "number", + "change": true, + "delay": 300, + "topic": "", + "x": 810, + "y": 60, + "wires": [ + [ + "136a9980a3a2e5ad", + "aff8eeda481cde7a" + ] + ] + }, + { + "id": "136a9980a3a2e5ad", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "set_max_current", + "rules": [ + { + "t": "set", + "p": "max_current", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 830, + "y": 120, + "wires": [ + [] + ] + }, + { + "id": "d8c82c7f6ae9e9fa", + "type": "ui_button", + "z": "9fe0155e5b3d31b1", + "name": "", + "group": "0e8d234f60b178a8", + "order": 3, + "width": 0, + "height": 0, + "passthru": false, + "label": "Send to CSMS", + "tooltip": "", + "color": "", + "bgcolor": "", + "className": "", + "icon": "", + "payload": "", + "payloadType": "str", + "topic": "topic", + "topicType": "msg", + "x": 100, + "y": 360, + "wires": [ + [ + "eb8c4d1be09b9511" + ] + ] + }, + { + "id": "aff8eeda481cde7a", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "current_limit", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 990, + "y": 60, + "wires": [] + }, + { + "id": "ce8a2c522beb9fd2", + "type": "inject", + "z": "9fe0155e5b3d31b1", + "name": "now", + "props": [ + { + "p": "payload" + }, + { + "p": "topic", + "vt": "str" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "", + "payloadType": "date", + "x": 290, + "y": 200, + "wires": [ + [ + "3d44bdce67fb80de", + "b041a6efa19167c7" + ] + ] } -] +] \ No newline at end of file From 721d6bf075c3c4dcf76b784dc85d61c4398f9a39 Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 01:30:03 -0800 Subject: [PATCH 2/9] =?UTF-8?q?=F0=9F=92=84=20=20Add=20MIDAS=20integration?= =?UTF-8?q?=20(all=20in=20node-red)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Login to MIDAS with username and password - Get token - Use token to retrive all rates - Display the retrieved rates in a table Related: https://github.com/EVerest/everest-demo/issues/79#issuecomment-2481082324 Testing done: - Ran flow and confirmed that the table showed data Signed-off-by: Shankari --- .../config/config-sil-iso15118-ac-flow.json | 380 ++++++++++++++++++ 1 file changed, 380 insertions(+) diff --git a/nodered/config/config-sil-iso15118-ac-flow.json b/nodered/config/config-sil-iso15118-ac-flow.json index 12a12e57..16d1453e 100644 --- a/nodered/config/config-sil-iso15118-ac-flow.json +++ b/nodered/config/config-sil-iso15118-ac-flow.json @@ -3887,5 +3887,385 @@ "b041a6efa19167c7" ] ] + }, + { + "id": "127f32101eb457a9", + "type": "ui_text-input", + "z": "9fe0155e5b3d31b1", + "action": "set", + "actionType": "str", + "write": "payload", + "writeType": "msg", + "name": "midas_username", + "label": "MIDAS Username", + "tooltip": "", + "group": "0e8d234f60b178a8", + "order": 4, + "width": 0, + "height": 0, + "passthru": true, + "mode": "text", + "change": true, + "delay": 300, + "topic": "", + "x": 150, + "y": 480, + "wires": [ + [ + "53e0a0fdef826546" + ] + ] + }, + { + "id": "0c2a5407890f9d90", + "type": "ui_text-input", + "z": "9fe0155e5b3d31b1", + "action": "set", + "actionType": "str", + "write": "payload", + "writeType": "msg", + "name": "midas_password", + "label": "MIDAS Password", + "tooltip": "", + "group": "0e8d234f60b178a8", + "order": 4, + "width": 0, + "height": 0, + "passthru": true, + "mode": "password", + "change": true, + "delay": 300, + "topic": "", + "x": 150, + "y": 540, + "wires": [ + [ + "32e72011475fdb43" + ] + ] + }, + { + "id": "a776addbf7929283", + "type": "ui_ui-button", + "z": "9fe0155e5b3d31b1", + "action": "click", + "actionType": "str", + "name": "midas_login", + "group": "0e8d234f60b178a8", + "order": 6, + "width": 0, + "height": 0, + "passthru": false, + "label": "Login", + "tooltip": "", + "color": "", + "bgcolor": "", + "icon": "", + "x": 150, + "y": 600, + "wires": [ + [ + "54d622574f8d449c" + ] + ] + }, + { + "id": "53e0a0fdef826546", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "store_username", + "rules": [ + { + "t": "set", + "p": "midas_username", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 420, + "y": 480, + "wires": [ + [] + ] + }, + { + "id": "32e72011475fdb43", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "store_password", + "rules": [ + { + "t": "set", + "p": "midas_password", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 420, + "y": 540, + "wires": [ + [] + ] + }, + { + "id": "1c41db118d9d7fda", + "type": "http request", + "z": "9fe0155e5b3d31b1", + "name": "", + "method": "GET", + "ret": "txt", + "paytoqs": "ignore", + "url": "https://midasapi.energy.ca.gov/api/token", + "tls": "", + "persist": false, + "proxy": "", + "insecureHTTPParser": false, + "authType": "", + "senderr": false, + "headers": [ + { + "keyType": "Authorization", + "keyValue": "", + "valueType": "msg", + "valueValue": "payload" + } + ], + "x": 610, + "y": 600, + "wires": [ + [ + "3df84a10c312b65b" + ] + ] + }, + { + "id": "54d622574f8d449c", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "create_credentials", + "func": "const [username, password] = flow.get([\"midas_username\", \"midas_password\"]);\nconst credentials = username+\":\"+password;\nconst encoded_creds = Buffer.from(credentials).toString('base64');\n// msg.raw_credential = credentials;\nreturn { payload: \"BASIC \" + encoded_creds };", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 370, + "y": 600, + "wires": [ + [ + "1c41db118d9d7fda", + "c9d7bfafde9995bd" + ] + ] + }, + { + "id": "c9d7bfafde9995bd", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "debug 3", + "active": false, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "payload", + "targetType": "msg", + "statusVal": "", + "statusType": "auto", + "x": 500, + "y": 680, + "wires": [] + }, + { + "id": "af18076715eb4907", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "token_response", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 1080, + "y": 540, + "wires": [] + }, + { + "id": "ab888e97bf676f1f", + "type": "http request", + "z": "9fe0155e5b3d31b1", + "name": "", + "method": "GET", + "ret": "txt", + "paytoqs": "ignore", + "url": "https://midasapi.energy.ca.gov/api/valuedata?id=USCA-TSTS-TTOU-TEST&querytype=alldata", + "tls": "", + "persist": false, + "proxy": "", + "insecureHTTPParser": false, + "authType": "", + "senderr": false, + "headers": [ + { + "keyType": "Authorization", + "keyValue": "", + "valueType": "msg", + "valueValue": "payload" + }, + { + "keyType": "Accept", + "keyValue": "", + "valueType": "other", + "valueValue": "application/json" + } + ], + "x": 910, + "y": 700, + "wires": [ + [ + "8fd6bf8a808acc78" + ] + ] + }, + { + "id": "b3db8a8d24a89e51", + "type": "template", + "z": "9fe0155e5b3d31b1", + "name": "prepend_bearer", + "field": "payload", + "fieldType": "msg", + "format": "handlebars", + "syntax": "mustache", + "template": "Bearer {{payload}}", + "output": "str", + "x": 720, + "y": 700, + "wires": [ + [ + "ab888e97bf676f1f" + ] + ] + }, + { + "id": "8fd6bf8a808acc78", + "type": "json", + "z": "9fe0155e5b3d31b1", + "name": "", + "property": "payload", + "action": "", + "pretty": false, + "x": 1090, + "y": 700, + "wires": [ + [ + "5c50f314b538a56a", + "f33cf937ec397bb5" + ] + ] + }, + { + "id": "fb99d1efd1c4c520", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "debug 4", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 1160, + "y": 820, + "wires": [] + }, + { + "id": "858ac58593760eaa", + "type": "ui_table", + "z": "9fe0155e5b3d31b1", + "group": "0e8d234f60b178a8", + "name": "real_time_table", + "order": 7, + "width": 0, + "height": 0, + "columns": [], + "outputs": 0, + "cts": false, + "x": 1000, + "y": 820, + "wires": [] + }, + { + "id": "3df84a10c312b65b", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "extract_token", + "func": "return {payload: msg.headers.token}", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 820, + "y": 600, + "wires": [ + [ + "af18076715eb4907", + "b3db8a8d24a89e51" + ] + ] + }, + { + "id": "5c50f314b538a56a", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "format_table", + "func": "// var json = msg.payload;\n\n\n//tab[top] = {'Variable' : top, 'Value' : pay};\n\n\n// const newpayload = [];\n// for (var index in json) {\n// newpayload.push({ 'Variable': index, 'Value': json[index] });\n// }\nreturn {payload: msg.payload.ValueInformation};", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 1250, + "y": 700, + "wires": [ + [ + "858ac58593760eaa", + "fb99d1efd1c4c520" + ] + ] + }, + { + "id": "f33cf937ec397bb5", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "debug 5", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "false", + "statusVal": "", + "statusType": "auto", + "x": 1200, + "y": 640, + "wires": [] } ] \ No newline at end of file From 7511893f8faa5b652707f60b6efb564d90d8a00b Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 07:09:59 -0800 Subject: [PATCH 3/9] =?UTF-8?q?=F0=9F=92=84=20Improve=20the=20layout=20and?= =?UTF-8?q?=20visualization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move the table down so we can actually see it - Add a chart to display the TOU We may or may not want to keep all these elements, but at least we know how to generate them now Signed-off-by: Shankari --- .../config/config-sil-iso15118-ac-flow.json | 285 +++++++++++------- 1 file changed, 176 insertions(+), 109 deletions(-) diff --git a/nodered/config/config-sil-iso15118-ac-flow.json b/nodered/config/config-sil-iso15118-ac-flow.json index 16d1453e..3edba6a8 100644 --- a/nodered/config/config-sil-iso15118-ac-flow.json +++ b/nodered/config/config-sil-iso15118-ac-flow.json @@ -246,7 +246,7 @@ "type": "ui_group", "name": "Connector 1 [ISO15118]", "tab": "d3ada9fa4cf6ac53", - "order": 2, + "order": 1, "disp": true, "width": "6", "collapse": false @@ -256,7 +256,7 @@ "type": "ui_group", "name": "RFID", "tab": "d3ada9fa4cf6ac53", - "order": 1, + "order": 5, "disp": true, "width": "6", "collapse": false @@ -283,7 +283,7 @@ "type": "ui_group", "name": "PowerCurve Selection", "tab": "d3ada9fa4cf6ac53", - "order": 4, + "order": 2, "disp": true, "width": "6", "collapse": false, @@ -294,7 +294,7 @@ "type": "ui_group", "name": "ISO + OCPP Messages", "tab": "d3ada9fa4cf6ac53", - "order": 4, + "order": 3, "disp": true, "width": "6", "collapse": false, @@ -305,12 +305,23 @@ "type": "ui_group", "name": "External Limits", "tab": "d3ada9fa4cf6ac53", - "order": 6, + "order": 4, "disp": true, - "width": "6", + "width": 6, "collapse": false, "className": "" }, + { + "id": "896ce8892f69fd26", + "type": "ui_group", + "name": "Schedule display", + "tab": "d3ada9fa4cf6ac53", + "order": 6, + "disp": true, + "width": "24", + "collapse": true, + "className": "" + }, { "id": "cf9212e69c58032e", "type": "mqtt in", @@ -1353,7 +1364,7 @@ "z": "f17b3c3577ed4179", "name": "", "group": "7cd2ccabb1265f7a", - "order": 4, + "order": 5, "width": 0, "height": 0, "passthru": false, @@ -1411,9 +1422,9 @@ "label": "connectors", "tooltip": "", "group": "7cd2ccabb1265f7a", - "order": 0, - "width": "0", - "height": "0", + "order": 4, + "width": 0, + "height": 0, "wrap": false, "passthru": true, "topic": "connectors", @@ -1528,8 +1539,8 @@ "name": "", "group": "b364f7eb4621082b", "order": 1, - "width": "3", - "height": "1", + "width": 3, + "height": 1, "passthru": false, "label": "Pause", "tooltip": "", @@ -1555,8 +1566,8 @@ "name": "", "group": "b364f7eb4621082b", "order": 2, - "width": "3", - "height": "1", + "width": 3, + "height": 1, "passthru": false, "label": "Resume", "tooltip": "", @@ -1659,7 +1670,7 @@ "type": "ui_text", "z": "a0826fab08a85be9", "group": "b364f7eb4621082b", - "order": 3, + "order": 4, "width": 0, "height": 0, "name": "", @@ -1675,7 +1686,7 @@ "type": "ui_text", "z": "a0826fab08a85be9", "group": "b364f7eb4621082b", - "order": 5, + "order": 6, "width": 0, "height": 0, "name": "", @@ -1774,7 +1785,7 @@ "type": "ui_level", "z": "a0826fab08a85be9", "group": "b364f7eb4621082b", - "order": 7, + "order": 8, "width": 0, "height": 0, "name": "", @@ -1877,7 +1888,7 @@ "g": "2fdf74399d3a2276", "name": "", "group": "b364f7eb4621082b", - "order": 6, + "order": 7, "width": 0, "height": 0, "gtype": "gage", @@ -1976,7 +1987,7 @@ "label": "Simulation enable (HIL)", "tooltip": "", "group": "b364f7eb4621082b", - "order": 10, + "order": 13, "width": 0, "height": 0, "passthru": true, @@ -2007,9 +2018,9 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 8, - "width": "3", - "height": "1", + "order": 9, + "width": 3, + "height": 1, "passthru": false, "label": "Car Plugin", "tooltip": "", @@ -2034,9 +2045,9 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 9, - "width": "3", - "height": "1", + "order": 10, + "width": 3, + "height": 1, "passthru": false, "label": "Stop & Unplug", "tooltip": "", @@ -2063,7 +2074,7 @@ "label": "", "tooltip": "", "group": "b364f7eb4621082b", - "order": 4, + "order": 5, "width": 0, "height": 0, "passthru": false, @@ -2090,7 +2101,7 @@ "tooltip": "", "place": "Select option", "group": "b364f7eb4621082b", - "order": 10, + "order": 14, "width": 0, "height": 0, "passthru": true, @@ -2205,9 +2216,9 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 9, - "width": "3", - "height": "1", + "order": 11, + "width": 3, + "height": 1, "passthru": false, "label": "EV Pause", "tooltip": "", @@ -2233,9 +2244,9 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 9, - "width": "3", - "height": "1", + "order": 12, + "width": 3, + "height": 1, "passthru": false, "label": "EV Resume", "tooltip": "", @@ -2263,7 +2274,7 @@ "label": "EAmount", "tooltip": "", "group": "b364f7eb4621082b", - "order": 15, + "order": 16, "width": 0, "height": 0, "passthru": true, @@ -2289,7 +2300,7 @@ "label": "DepartureTime:", "tooltip": "", "group": "b364f7eb4621082b", - "order": 16, + "order": 17, "width": 0, "height": 0, "passthru": true, @@ -2379,7 +2390,7 @@ "tooltip": "", "place": "Select option", "group": "b364f7eb4621082b", - "order": 14, + "order": 15, "width": 0, "height": 0, "passthru": true, @@ -3122,7 +3133,7 @@ "tooltip": "", "place": "Select option", "group": "b364f7eb4621082b", - "order": 2, + "order": 3, "width": 0, "height": 0, "passthru": true, @@ -3468,7 +3479,7 @@ "z": "6e0f6f4f7ec3c163", "name": "", "group": "ab3d4f6881421599", - "order": 3, + "order": 2, "width": 0, "height": 0, "label": "Power Draw over Time", @@ -3673,7 +3684,7 @@ "label": "End:", "tooltip": "", "group": "0e8d234f60b178a8", - "order": 1, + "order": 2, "width": 0, "height": 0, "passthru": true, @@ -3771,7 +3782,7 @@ "label": "Current", "tooltip": "", "group": "0e8d234f60b178a8", - "order": 2, + "order": 3, "width": 0, "height": 0, "passthru": true, @@ -3819,7 +3830,7 @@ "z": "9fe0155e5b3d31b1", "name": "", "group": "0e8d234f60b178a8", - "order": 3, + "order": 4, "width": 0, "height": 0, "passthru": false, @@ -3900,7 +3911,7 @@ "label": "MIDAS Username", "tooltip": "", "group": "0e8d234f60b178a8", - "order": 4, + "order": 5, "width": 0, "height": 0, "passthru": true, @@ -3928,7 +3939,7 @@ "label": "MIDAS Password", "tooltip": "", "group": "0e8d234f60b178a8", - "order": 4, + "order": 6, "width": 0, "height": 0, "passthru": true, @@ -3952,7 +3963,7 @@ "actionType": "str", "name": "midas_login", "group": "0e8d234f60b178a8", - "order": 6, + "order": 7, "width": 0, "height": 0, "passthru": false, @@ -4066,28 +4077,10 @@ "y": 600, "wires": [ [ - "1c41db118d9d7fda", - "c9d7bfafde9995bd" + "1c41db118d9d7fda" ] ] }, - { - "id": "c9d7bfafde9995bd", - "type": "debug", - "z": "9fe0155e5b3d31b1", - "name": "debug 3", - "active": false, - "tosidebar": true, - "console": false, - "tostatus": false, - "complete": "payload", - "targetType": "msg", - "statusVal": "", - "statusType": "auto", - "x": 500, - "y": 680, - "wires": [] - }, { "id": "af18076715eb4907", "type": "debug", @@ -4134,8 +4127,8 @@ "valueValue": "application/json" } ], - "x": 910, - "y": 700, + "x": 430, + "y": 680, "wires": [ [ "8fd6bf8a808acc78" @@ -4153,8 +4146,8 @@ "syntax": "mustache", "template": "Bearer {{payload}}", "output": "str", - "x": 720, - "y": 700, + "x": 160, + "y": 680, "wires": [ [ "ab888e97bf676f1f" @@ -4169,47 +4162,15 @@ "property": "payload", "action": "", "pretty": false, - "x": 1090, - "y": 700, + "x": 610, + "y": 680, "wires": [ [ "5c50f314b538a56a", - "f33cf937ec397bb5" + "3d3182ef4b0aefd2" ] ] }, - { - "id": "fb99d1efd1c4c520", - "type": "debug", - "z": "9fe0155e5b3d31b1", - "name": "debug 4", - "active": true, - "tosidebar": true, - "console": false, - "tostatus": false, - "complete": "false", - "statusVal": "", - "statusType": "auto", - "x": 1160, - "y": 820, - "wires": [] - }, - { - "id": "858ac58593760eaa", - "type": "ui_table", - "z": "9fe0155e5b3d31b1", - "group": "0e8d234f60b178a8", - "name": "real_time_table", - "order": 7, - "width": 0, - "height": 0, - "columns": [], - "outputs": 0, - "cts": false, - "x": 1000, - "y": 820, - "wires": [] - }, { "id": "3df84a10c312b65b", "type": "function", @@ -4243,20 +4204,100 @@ "initialize": "", "finalize": "", "libs": [], - "x": 1250, + "x": 870, + "y": 660, + "wires": [ + [ + "858ac58593760eaa" + ] + ] + }, + { + "id": "858ac58593760eaa", + "type": "ui_table", + "z": "9fe0155e5b3d31b1", + "group": "896ce8892f69fd26", + "name": "real_time_table", + "order": 1, + "width": 0, + "height": 0, + "columns": [], + "outputs": 0, + "cts": false, + "x": 1080, + "y": 660, + "wires": [] + }, + { + "id": "7c9d1a5aaa708145", + "type": "ui_chart", + "z": "9fe0155e5b3d31b1", + "name": "", + "group": "896ce8892f69fd26", + "order": 2, + "width": 24, + "height": 3, + "label": "TOU over time", + "chartType": "line", + "legend": "false", + "xformat": "HH:mm", + "interpolate": "linear", + "nodata": "", + "dot": false, + "ymin": "", + "ymax": "", + "removeOlder": 1, + "removeOlderPoints": "", + "removeOlderUnit": "3600", + "cutout": 0, + "useOneColor": false, + "useUTC": false, + "colors": [ + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#2ca02c", + "#98df8a", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5" + ], + "outputs": 1, + "useDifferentColor": false, + "className": "", + "x": 1080, + "y": 700, + "wires": [ + [] + ] + }, + { + "id": "3d3182ef4b0aefd2", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "format_chart", + "func": "const data_array = msg.payload.ValueInformation.map((entry) => {\n return {x: new Date(entry.DateStart+\"T\"+entry.TimeStart+\"-0800\").getTime(), y: entry.value}\n});\nnode.warn(data_array);\nreturn {payload: [{labels: [\"\"], series: [\"TOU\"], data: [data_array]}]};\n\n/*\nreturn {payload:\n [{\n \"series\": [\"A\", \"B\", \"C\"],\n \"data\": [\n [{ \"x\": 1504029632890, \"y\": 5 },\n { \"x\": 1504029636001, \"y\": 4 },\n { \"x\": 1504029638656, \"y\": 2 }\n ],\n [{ \"x\": 1504029633514, \"y\": 6 },\n { \"x\": 1504029636622, \"y\": 7 },\n { \"x\": 1504029639539, \"y\": 6 }\n ],\n [{ \"x\": 1504029634400, \"y\": 7 },\n { \"x\": 1504029637959, \"y\": 7 },\n { \"x\": 1504029640317, \"y\": 7 }\n ]\n ],\n \"labels\": [\"\"]\n }]\n }\n */", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 870, "y": 700, "wires": [ [ - "858ac58593760eaa", - "fb99d1efd1c4c520" + "7c9d1a5aaa708145", + "7bb036cb14fcfb0a" ] ] }, { - "id": "f33cf937ec397bb5", + "id": "7bb036cb14fcfb0a", "type": "debug", "z": "9fe0155e5b3d31b1", - "name": "debug 5", + "name": "debug 3", "active": true, "tosidebar": true, "console": false, @@ -4264,8 +4305,34 @@ "complete": "false", "statusVal": "", "statusType": "auto", - "x": 1200, - "y": 640, + "x": 1000, + "y": 760, "wires": [] + }, + { + "id": "87232c8ce6671d63", + "type": "inject", + "z": "9fe0155e5b3d31b1", + "name": "initialize", + "props": [ + { + "p": "payload" + } + ], + "repeat": "", + "crontab": "", + "once": true, + "onceDelay": 0.1, + "topic": "", + "payload": "[]", + "payloadType": "json", + "x": 1180, + "y": 600, + "wires": [ + [ + "858ac58593760eaa", + "7c9d1a5aaa708145" + ] + ] } ] \ No newline at end of file From 44ac9151000b846fdc8959ce7c6a252cc976f1ff Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 14:54:07 -0800 Subject: [PATCH 4/9] =?UTF-8?q?=F0=9F=93=A1=20Create=20the=20shell=20of=20?= =?UTF-8?q?the=20recurring=20schedule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are still some hardcoded things, and the scale is way off, but let's check this in so we don't lose the template. Testing done: ``` 2024-11-17 22:32:51.269355 [INFO] ocpp:OCPP201 :: Received SetChargingProfileRequest: { "chargingProfile": { "chargingProfileKind": "Recurring", "chargingProfilePurpose": "TxDefaultProfile", "chargingSchedule": [ { "chargingRateUnit": "A", "chargingSchedulePeriod": [ { "limit": 0.2150000035762787, "numberPhases": 3, "startPeriod": 0 }, { "limit": 0.10199999809265137, "numberPhases": 3, "startPeriod": 3600 }, { "limit": 0.10300000011920929, "numberPhases": 3, "startPeriod": 7200 }, { "limit": 0.10400000214576721, "numberPhases": 3, "startPeriod": 10800 }, { "limit": 0.10499999672174454, "numberPhases": 3, "startPeriod": 14400 }, { "limit": 0.10599999874830246, "numberPhases": 3, "startPeriod": 18000 }, { "limit": 0.10700000077486038, "numberPhases": 3, "startPeriod": 21600 }, { "limit": 0.1080000028014183, "numberPhases": 3, "startPeriod": 25200 }, { "limit": 0.10899999737739563, "numberPhases": 3, "startPeriod": 28800 }, { "limit": 0.10999999940395355, "numberPhases": 3, "startPeriod": 32400 }, { "limit": 0.11100000143051147, "numberPhases": 3, "startPeriod": 36000 }, { "limit": 0.1120000034570694, "numberPhases": 3, "startPeriod": 39600 }, { "limit": 0.11299999803304672, "numberPhases": 3, "startPeriod": 43200 }, { "limit": 0.11400000005960464, "numberPhases": 3, "startPeriod": 46800 }, { "limit": 0.11500000208616257, "numberPhases": 3, "startPeriod": 50400 }, { "limit": 0.11599999666213989, "numberPhases": 3, "startPeriod": 54000 }, { "limit": 0.11699999868869781, "numberPhases": 3, "startPeriod": 57600 }, { "limit": 0.11800000071525574, "numberPhases": 3, "startPeriod": 61200 }, { "limit": 0.11900000274181366, "numberPhases": 3, "startPeriod": 64800 }, { "limit": 0.11999999731779099, "numberPhases": 3, "startPeriod": 68400 }, { "limit": 0.12099999934434891, "numberPhases": 3, "startPeriod": 72000 }, { "limit": 0.12200000137090683, "numberPhases": 3, "startPeriod": 75600 }, { "limit": 0.12300000339746475, "numberPhases": 3, "startPeriod": 79200 }, { "limit": 0.12399999797344208, "numberPhases": 3, "startPeriod": 82800 } ], "duration": 86400, "id": 0, "minChargingRate": 0.0, "startSchedule": "2022-01-01T00:00:00.000Z" } ], "id": 100, "recurrencyKind": "Daily", "stackLevel": 0 }, "evseId": 0 } 2024-11-17 22:32:51.288371 [INFO] ocpp:OCPP201 :: About to publish composite charging schedules: 2024-11-17 22:32:51.288458 [INFO] ocpp:OCPP201 :: { "chargingRateUnit": "A", "chargingSchedulePeriod": [ { "limit": 0.12300000339746475, "numberPhases": 3, "startPeriod": 0 } ], "duration": 600, "evseId": 0, "scheduleStart": "2024-11-17T22:32:51.000Z" } 2024-11-17 22:32:51.288612 [INFO] ocpp:OCPP201 :: { "chargingRateUnit": "A", "chargingSchedulePeriod": [ { "limit": 0.12300000339746475, "numberPhases": 3, "startPeriod": 0 } ], "duration": 600, "evseId": 1, "scheduleStart": "2024-11-17T22:32:51.000Z" } ``` Signed-off-by: Shankari --- .../config/config-sil-iso15118-ac-flow.json | 178 ++++++++++++------ 1 file changed, 125 insertions(+), 53 deletions(-) diff --git a/nodered/config/config-sil-iso15118-ac-flow.json b/nodered/config/config-sil-iso15118-ac-flow.json index 3edba6a8..289fcb84 100644 --- a/nodered/config/config-sil-iso15118-ac-flow.json +++ b/nodered/config/config-sil-iso15118-ac-flow.json @@ -318,7 +318,7 @@ "tab": "d3ada9fa4cf6ac53", "order": 6, "disp": true, - "width": "24", + "width": 18, "collapse": true, "className": "" }, @@ -3910,17 +3910,17 @@ "name": "midas_username", "label": "MIDAS Username", "tooltip": "", - "group": "0e8d234f60b178a8", - "order": 5, - "width": 0, - "height": 0, + "group": "896ce8892f69fd26", + "order": 1, + "width": 7, + "height": 1, "passthru": true, "mode": "text", "change": true, "delay": 300, "topic": "", - "x": 150, - "y": 480, + "x": 110, + "y": 560, "wires": [ [ "53e0a0fdef826546" @@ -3938,17 +3938,17 @@ "name": "midas_password", "label": "MIDAS Password", "tooltip": "", - "group": "0e8d234f60b178a8", - "order": 6, - "width": 0, - "height": 0, + "group": "896ce8892f69fd26", + "order": 2, + "width": 5, + "height": 1, "passthru": true, "mode": "password", "change": true, "delay": 300, "topic": "", - "x": 150, - "y": 540, + "x": 110, + "y": 620, "wires": [ [ "32e72011475fdb43" @@ -3962,18 +3962,18 @@ "action": "click", "actionType": "str", "name": "midas_login", - "group": "0e8d234f60b178a8", - "order": 7, - "width": 0, - "height": 0, + "group": "896ce8892f69fd26", + "order": 3, + "width": 6, + "height": 1, "passthru": false, "label": "Login", "tooltip": "", "color": "", "bgcolor": "", "icon": "", - "x": 150, - "y": 600, + "x": 110, + "y": 680, "wires": [ [ "54d622574f8d449c" @@ -3999,8 +3999,8 @@ "from": "", "to": "", "reg": false, - "x": 420, - "y": 480, + "x": 380, + "y": 560, "wires": [ [] ] @@ -4024,8 +4024,8 @@ "from": "", "to": "", "reg": false, - "x": 420, - "y": 540, + "x": 380, + "y": 620, "wires": [ [] ] @@ -4053,8 +4053,8 @@ "valueValue": "payload" } ], - "x": 610, - "y": 600, + "x": 570, + "y": 680, "wires": [ [ "3df84a10c312b65b" @@ -4073,8 +4073,8 @@ "initialize": "", "finalize": "", "libs": [], - "x": 370, - "y": 600, + "x": 330, + "y": 680, "wires": [ [ "1c41db118d9d7fda" @@ -4094,8 +4094,8 @@ "targetType": "full", "statusVal": "", "statusType": "auto", - "x": 1080, - "y": 540, + "x": 1040, + "y": 620, "wires": [] }, { @@ -4127,8 +4127,8 @@ "valueValue": "application/json" } ], - "x": 430, - "y": 680, + "x": 390, + "y": 760, "wires": [ [ "8fd6bf8a808acc78" @@ -4146,8 +4146,8 @@ "syntax": "mustache", "template": "Bearer {{payload}}", "output": "str", - "x": 160, - "y": 680, + "x": 120, + "y": 760, "wires": [ [ "ab888e97bf676f1f" @@ -4162,12 +4162,13 @@ "property": "payload", "action": "", "pretty": false, - "x": 610, - "y": 680, + "x": 570, + "y": 760, "wires": [ [ "5c50f314b538a56a", - "3d3182ef4b0aefd2" + "3d3182ef4b0aefd2", + "7d3bb23e3d97455d" ] ] }, @@ -4183,8 +4184,8 @@ "initialize": "", "finalize": "", "libs": [], - "x": 820, - "y": 600, + "x": 780, + "y": 680, "wires": [ [ "af18076715eb4907", @@ -4204,8 +4205,8 @@ "initialize": "", "finalize": "", "libs": [], - "x": 870, - "y": 660, + "x": 830, + "y": 740, "wires": [ [ "858ac58593760eaa" @@ -4218,14 +4219,14 @@ "z": "9fe0155e5b3d31b1", "group": "896ce8892f69fd26", "name": "real_time_table", - "order": 1, + "order": 5, "width": 0, "height": 0, "columns": [], "outputs": 0, "cts": false, - "x": 1080, - "y": 660, + "x": 1040, + "y": 740, "wires": [] }, { @@ -4234,8 +4235,8 @@ "z": "9fe0155e5b3d31b1", "name": "", "group": "896ce8892f69fd26", - "order": 2, - "width": 24, + "order": 6, + "width": "18", "height": 3, "label": "TOU over time", "chartType": "line", @@ -4266,8 +4267,8 @@ "outputs": 1, "useDifferentColor": false, "className": "", - "x": 1080, - "y": 700, + "x": 1040, + "y": 780, "wires": [ [] ] @@ -4284,8 +4285,8 @@ "initialize": "", "finalize": "", "libs": [], - "x": 870, - "y": 700, + "x": 830, + "y": 780, "wires": [ [ "7c9d1a5aaa708145", @@ -4305,8 +4306,8 @@ "complete": "false", "statusVal": "", "statusType": "auto", - "x": 1000, - "y": 760, + "x": 960, + "y": 840, "wires": [] }, { @@ -4326,13 +4327,84 @@ "topic": "", "payload": "[]", "payloadType": "json", - "x": 1180, - "y": 600, + "x": 1140, + "y": 680, "wires": [ [ "858ac58593760eaa", "7c9d1a5aaa708145" ] ] + }, + { + "id": "f82d7044a6028ac8", + "type": "ui_ui-button", + "z": "9fe0155e5b3d31b1", + "action": "click", + "actionType": "str", + "name": "send_midas_schedule_to_csms", + "group": "896ce8892f69fd26", + "order": 4, + "width": 0, + "height": 0, + "passthru": false, + "label": "Send MIDAS schedule to CSMS", + "tooltip": "", + "color": "", + "bgcolor": "", + "icon": "", + "x": 150, + "y": 480, + "wires": [ + [ + "453f10c5a7350302" + ] + ] + }, + { + "id": "7d3bb23e3d97455d", + "type": "change", + "z": "9fe0155e5b3d31b1", + "name": "store_result_in_flow", + "rules": [ + { + "t": "set", + "p": "midas_schedule", + "pt": "flow", + "to": "payload", + "tot": "msg" + } + ], + "action": "", + "property": "", + "from": "", + "to": "", + "reg": false, + "x": 770, + "y": 840, + "wires": [ + [] + ] + }, + { + "id": "453f10c5a7350302", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "convert_to_recurring_schedule", + "func": "const midas_schedule = flow.get(\"midas_schedule\");\nnode.warn(midas_schedule);\n// the values that we get are in \n\nconst schedulePeriods = midas_schedule.ValueInformation.map((entry) => {\n return {\n // we get the hour by splitting the time and taking the\n // first entry, then we multiply by 3600 to get it in seconds\n startPeriod: entry.TimeStart.split(\":\")[0] * 3600,\n limit: entry.value,\n numberPhases: 3\n }\n});\nnode.warn(schedulePeriods);\n\nconst final_schedule = {\n \"id\": 100, \n \"chargingProfileKind\": \"Recurring\",\n \"chargingProfilePurpose\": \"TxDefaultProfile\",\n \"recurrencyKind\": \"Daily\",\n \"stackLevel\": 0,\n \"chargingSchedule\": [\n {\n \"id\": 0,\n \"chargingRateUnit\": \"A\",\n \"chargingSchedulePeriod\": schedulePeriods,\n \"duration\": 86400,\n \"minChargingRate\": 0.0,\n \"startSchedule\": new Date(\"2022-01-01T00:00:00Z\"),\n }],\n}\n\n\n// based on section 3.6 of the OCPP spec\n/*\nconst final_schedule = {\n id: 100,\n stackLevel: 0,\n chargingProfilePurpose: \"TxDefaultProfile\",\n chargingProfileKind: \"Recurring\",\n recurrencyKind: \"Daily\",\n chargingSchedule: {\n id: 0,\n duration: 86400,\n chargingRateUnit: \"A\",\n startSchedule: new Date(\"2022-01-01T00:00:00Z\").toString(),\n chargingSchedulePeriod: schedulePeriods\n }\n}\n*/\nreturn {payload: final_schedule};", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 450, + "y": 480, + "wires": [ + [ + "0b8a2d5b13bb7809", + "dd5c01bd89d1a332" + ] + ] } ] \ No newline at end of file From c04a15c332750cc74e8b4d672f19bd176331ee4d Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 17:55:36 -0800 Subject: [PATCH 5/9] =?UTF-8?q?=F0=9F=92=84Final=20polishing=20to=20the=20?= =?UTF-8?q?dashboard=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: - We now create "pseudo-real" aka believable schedules from the MIDAS tariff data by applying the rate of change, and flipping it, to support curtailment. - We display the configured and maximum current limits as timeseries Testing done: - Validated that the charging profiles are sent to the station - Validated that the currents are shown properly - Plugged in a car and validated that it charges properly TODO: Why is the "configured current limit" chart only displayed for an hour instead of the specified 3 hours? ``` + "removeOlder": "3", + "removeOlderPoints": "", + "removeOlderUnit": "3600", + "cutout": 0, ``` Signed-off-by: Shankari --- .../config/config-sil-iso15118-ac-flow.json | 247 +++++++++++++++--- 1 file changed, 216 insertions(+), 31 deletions(-) diff --git a/nodered/config/config-sil-iso15118-ac-flow.json b/nodered/config/config-sil-iso15118-ac-flow.json index 289fcb84..71a44d6a 100644 --- a/nodered/config/config-sil-iso15118-ac-flow.json +++ b/nodered/config/config-sil-iso15118-ac-flow.json @@ -1686,7 +1686,7 @@ "type": "ui_text", "z": "a0826fab08a85be9", "group": "b364f7eb4621082b", - "order": 6, + "order": 7, "width": 0, "height": 0, "name": "", @@ -1785,7 +1785,7 @@ "type": "ui_level", "z": "a0826fab08a85be9", "group": "b364f7eb4621082b", - "order": 8, + "order": 9, "width": 0, "height": 0, "name": "", @@ -1888,7 +1888,7 @@ "g": "2fdf74399d3a2276", "name": "", "group": "b364f7eb4621082b", - "order": 7, + "order": 8, "width": 0, "height": 0, "gtype": "gage", @@ -1987,7 +1987,7 @@ "label": "Simulation enable (HIL)", "tooltip": "", "group": "b364f7eb4621082b", - "order": 13, + "order": 14, "width": 0, "height": 0, "passthru": true, @@ -2018,7 +2018,7 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 9, + "order": 10, "width": 3, "height": 1, "passthru": false, @@ -2045,7 +2045,7 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 10, + "order": 11, "width": 3, "height": 1, "passthru": false, @@ -2101,7 +2101,7 @@ "tooltip": "", "place": "Select option", "group": "b364f7eb4621082b", - "order": 14, + "order": 15, "width": 0, "height": 0, "passthru": true, @@ -2216,7 +2216,7 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 11, + "order": 12, "width": 3, "height": 1, "passthru": false, @@ -2244,7 +2244,7 @@ "z": "a0826fab08a85be9", "name": "", "group": "b364f7eb4621082b", - "order": 12, + "order": 13, "width": 3, "height": 1, "passthru": false, @@ -2274,9 +2274,9 @@ "label": "EAmount", "tooltip": "", "group": "b364f7eb4621082b", - "order": 16, - "width": 0, - "height": 0, + "order": 17, + "width": 3, + "height": 1, "passthru": true, "mode": "text", "delay": 300, @@ -2300,9 +2300,9 @@ "label": "DepartureTime:", "tooltip": "", "group": "b364f7eb4621082b", - "order": 17, - "width": 0, - "height": 0, + "order": 18, + "width": 3, + "height": 1, "passthru": true, "mode": "text", "delay": 300, @@ -2390,7 +2390,7 @@ "tooltip": "", "place": "Select option", "group": "b364f7eb4621082b", - "order": 15, + "order": 16, "width": 0, "height": 0, "passthru": true, @@ -3605,7 +3605,7 @@ "id": "0b8a2d5b13bb7809", "type": "http request", "z": "9fe0155e5b3d31b1", - "name": "", + "name": "send_set_charging_profile", "method": "POST", "ret": "txt", "paytoqs": "ignore", @@ -3624,7 +3624,7 @@ "valueValue": "application/json" } ], - "x": 470, + "x": 510, "y": 340, "wires": [ [ @@ -4162,13 +4162,11 @@ "property": "payload", "action": "", "pretty": false, - "x": 570, + "x": 550, "y": 760, "wires": [ [ - "5c50f314b538a56a", - "3d3182ef4b0aefd2", - "7d3bb23e3d97455d" + "d8a242215aa132ac" ] ] }, @@ -4236,9 +4234,9 @@ "name": "", "group": "896ce8892f69fd26", "order": 6, - "width": "18", + "width": 18, "height": 3, - "label": "TOU over time", + "label": "Curtailment over time", "chartType": "line", "legend": "false", "xformat": "HH:mm", @@ -4267,7 +4265,7 @@ "outputs": 1, "useDifferentColor": false, "className": "", - "x": 1040, + "x": 1060, "y": 780, "wires": [ [] @@ -4289,8 +4287,7 @@ "y": 780, "wires": [ [ - "7c9d1a5aaa708145", - "7bb036cb14fcfb0a" + "7c9d1a5aaa708145" ] ] }, @@ -4298,15 +4295,16 @@ "id": "7bb036cb14fcfb0a", "type": "debug", "z": "9fe0155e5b3d31b1", - "name": "debug 3", + "name": "process_rate_schedules", "active": true, "tosidebar": true, "console": false, "tostatus": false, - "complete": "false", + "complete": "payload", + "targetType": "msg", "statusVal": "", "statusType": "auto", - "x": 960, + "x": 1010, "y": 840, "wires": [] }, @@ -4391,7 +4389,7 @@ "type": "function", "z": "9fe0155e5b3d31b1", "name": "convert_to_recurring_schedule", - "func": "const midas_schedule = flow.get(\"midas_schedule\");\nnode.warn(midas_schedule);\n// the values that we get are in \n\nconst schedulePeriods = midas_schedule.ValueInformation.map((entry) => {\n return {\n // we get the hour by splitting the time and taking the\n // first entry, then we multiply by 3600 to get it in seconds\n startPeriod: entry.TimeStart.split(\":\")[0] * 3600,\n limit: entry.value,\n numberPhases: 3\n }\n});\nnode.warn(schedulePeriods);\n\nconst final_schedule = {\n \"id\": 100, \n \"chargingProfileKind\": \"Recurring\",\n \"chargingProfilePurpose\": \"TxDefaultProfile\",\n \"recurrencyKind\": \"Daily\",\n \"stackLevel\": 0,\n \"chargingSchedule\": [\n {\n \"id\": 0,\n \"chargingRateUnit\": \"A\",\n \"chargingSchedulePeriod\": schedulePeriods,\n \"duration\": 86400,\n \"minChargingRate\": 0.0,\n \"startSchedule\": new Date(\"2022-01-01T00:00:00Z\"),\n }],\n}\n\n\n// based on section 3.6 of the OCPP spec\n/*\nconst final_schedule = {\n id: 100,\n stackLevel: 0,\n chargingProfilePurpose: \"TxDefaultProfile\",\n chargingProfileKind: \"Recurring\",\n recurrencyKind: \"Daily\",\n chargingSchedule: {\n id: 0,\n duration: 86400,\n chargingRateUnit: \"A\",\n startSchedule: new Date(\"2022-01-01T00:00:00Z\").toString(),\n chargingSchedulePeriod: schedulePeriods\n }\n}\n*/\nreturn {payload: final_schedule};", + "func": "const midas_schedule = flow.get(\"midas_schedule\");\n\n// Assumptions:\n// time ranges start and end at hour boundaries\n// there are no gaps (not sure how to handle gaps, we would probably need to have separate schedules)\n// since the duration is only in the schedule\n// logic for that seems too complicated right now\n// start date is hardcoded (can make it be dynamic if we assume that the first entry\n// has the earliest start date)\n\nconst schedulePeriods = midas_schedule.ValueInformation.map((entry) => {\n return {\n // we get the hour by splitting the time and taking the\n // first entry, then we multiply by 3600 to get it in seconds\n startPeriod: entry.TimeStart.split(\":\")[0] * 3600,\n limit: entry.value,\n numberPhases: 3\n }\n});\nnode.warn(schedulePeriods);\n\n// based on section 3.6 of the OCPP spec\n\nconst final_schedule = {\n \"id\": 100, \n \"chargingProfileKind\": \"Recurring\",\n \"chargingProfilePurpose\": \"TxDefaultProfile\",\n \"recurrencyKind\": \"Daily\",\n \"stackLevel\": 0,\n \"chargingSchedule\": [\n {\n \"id\": 0,\n \"chargingRateUnit\": \"A\",\n \"chargingSchedulePeriod\": schedulePeriods,\n \"duration\": 86400,\n \"minChargingRate\": 0.0,\n \"startSchedule\": new Date(\"2022-01-01T00:00:00Z\"),\n }],\n}\n\n\n/*\nconst final_schedule = {\n id: 100,\n stackLevel: 0,\n chargingProfilePurpose: \"TxDefaultProfile\",\n chargingProfileKind: \"Recurring\",\n recurrencyKind: \"Daily\",\n chargingSchedule: {\n id: 0,\n duration: 86400,\n chargingRateUnit: \"A\",\n startSchedule: new Date(\"2022-01-01T00:00:00Z\").toString(),\n chargingSchedulePeriod: schedulePeriods\n }\n}\n*/\nreturn {payload: final_schedule};", "outputs": 1, "timeout": 0, "noerr": 0, @@ -4406,5 +4404,192 @@ "dd5c01bd89d1a332" ] ] + }, + { + "id": "d8a242215aa132ac", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "massage_and_rescale", + "func": "// The MIDAS data currently has tariffs, which we don't support\n// we want to actually get curtailment data,\n// but don't have time to coordinate with CARB\n// so let's massage the tariff data to look like a curtailment.\n// Steps:\n// find the range of tariff changes\n// assume that range of current changes is from 0-48 (45)\n// Determine the scaling factor\n// determine the increment over the minimum tariff\n// apply the scaling factor\n// more tariff = lower usage, so subtract from the max current\n\nnode.warn(msg.payload);\nconst original_value_objs = msg.payload.ValueInformation;\nconst original_values = original_value_objs.map((entry) => {\n return entry.value;\n})\nconst min_original = Math.min(...original_values);\nconst max_original = Math.max(...original_values);\nconst scaling_factor = 48 / (max_original - min_original);\nnode.warn(\"min_original = \"+min_original+\" max original \"+max_original+\" scaling_factor\" + scaling_factor);\nconst new_value_objs = original_value_objs.map((entry) => {\n entry.value = 48 - ((entry.value - min_original) * scaling_factor);\n entry.Unit = 'A';\n return entry;\n});\nmsg.payload.ValueInformation = new_value_objs;\nreturn msg;", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 520, + "y": 820, + "wires": [ + [ + "5c50f314b538a56a", + "3d3182ef4b0aefd2", + "7d3bb23e3d97455d", + "7bb036cb14fcfb0a" + ] + ] + }, + { + "id": "563d0956472cfd36", + "type": "mqtt in", + "z": "9fe0155e5b3d31b1", + "name": "", + "topic": "everest_external/nodered/+/state/max_current", + "qos": "2", + "datatype": "auto-detect", + "broker": "fc8686af.48d178", + "nl": false, + "rap": true, + "rh": 0, + "inputs": 0, + "x": 270, + "y": 1060, + "wires": [ + [ + "61d453e21fbe4b48" + ] + ] + }, + { + "id": "61d453e21fbe4b48", + "type": "ui_chart", + "z": "9fe0155e5b3d31b1", + "name": "", + "group": "0e8d234f60b178a8", + "order": 4, + "width": "6", + "height": "4", + "label": "Configured current limits", + "chartType": "line", + "legend": "false", + "xformat": "HH:mm:ss", + "interpolate": "linear", + "nodata": "", + "dot": false, + "ymin": "", + "ymax": "", + "removeOlder": "3", + "removeOlderPoints": "", + "removeOlderUnit": "3600", + "cutout": 0, + "useOneColor": false, + "useUTC": false, + "colors": [ + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#2ca02c", + "#98df8a", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5" + ], + "outputs": 1, + "useDifferentColor": false, + "className": "", + "x": 870, + "y": 1020, + "wires": [ + [] + ] + }, + { + "id": "8fd1767acadc72c4", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "extract_ocpp_limit", + "func": "function get_humanized_evse(evseId) {\n if (evseId == 0) return \"Station\"\n else return \"EVSE \"+evseId;\n}\n\nreturn {payload: msg.payload.charging_schedule_period[0].limit,\n topic: get_humanized_evse(msg.payload.evse) + \" OCPP limit\"\n}", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 610, + "y": 1000, + "wires": [ + [ + "61d453e21fbe4b48", + "bfdde55c5b6eba0a" + ] + ] + }, + { + "id": "84cf15f37335a643", + "type": "split", + "z": "9fe0155e5b3d31b1", + "name": "", + "splt": "\\n", + "spltType": "str", + "arraySplt": 1, + "arraySpltType": "len", + "stream": false, + "addname": "", + "property": "payload", + "x": 610, + "y": 920, + "wires": [ + [ + "8fd1767acadc72c4" + ] + ] + }, + { + "id": "bfdde55c5b6eba0a", + "type": "debug", + "z": "9fe0155e5b3d31b1", + "name": "debug 4", + "active": true, + "tosidebar": true, + "console": false, + "tostatus": false, + "complete": "true", + "targetType": "full", + "statusVal": "", + "statusType": "auto", + "x": 860, + "y": 960, + "wires": [] + }, + { + "id": "98027f96fc6092aa", + "type": "mqtt in", + "z": "9fe0155e5b3d31b1", + "name": "", + "topic": "everest/ocpp/ocpp_generic/var", + "qos": "2", + "datatype": "auto-detect", + "broker": "fc8686af.48d178", + "nl": false, + "rap": true, + "rh": 0, + "inputs": 0, + "x": 250, + "y": 1000, + "wires": [ + [ + "8aeb84d9a7a87059" + ] + ] + }, + { + "id": "8aeb84d9a7a87059", + "type": "function", + "z": "9fe0155e5b3d31b1", + "name": "extract_schedules", + "func": "return {payload: msg.payload.data.schedules};", + "outputs": 1, + "timeout": 0, + "noerr": 0, + "initialize": "", + "finalize": "", + "libs": [], + "x": 410, + "y": 920, + "wires": [ + [ + "84cf15f37335a643" + ] + ] } ] \ No newline at end of file From 211a2c22cc9df6e79ac249438cdba3cba72e391a Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 18:09:48 -0800 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=94=8AAdd=20in=20additional=20logs=20?= =?UTF-8?q?to=20help=20us=20debug=20composite=20schedules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As outlined in https://github.com/EVerest/everest-demo/issues/90#issuecomment-2481606481 Signed-off-by: Shankari --- .../apply-compile-patches.sh | 1 + .../composite_schedule_fixes.patch | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 manager/demo-patches/composite_schedule_fixes.patch diff --git a/manager/demo-patch-scripts/apply-compile-patches.sh b/manager/demo-patch-scripts/apply-compile-patches.sh index b23195dd..943eea0d 100644 --- a/manager/demo-patch-scripts/apply-compile-patches.sh +++ b/manager/demo-patch-scripts/apply-compile-patches.sh @@ -3,3 +3,4 @@ echo "Applying compile-time patches" cd / && patch -p0 -i /tmp/demo-patches/enable_iso_dt.patch +cd / && patch -p1 -i /tmp/demo-patches/composite_schedule_fixes.patch diff --git a/manager/demo-patches/composite_schedule_fixes.patch b/manager/demo-patches/composite_schedule_fixes.patch new file mode 100644 index 00000000..c9608f9e --- /dev/null +++ b/manager/demo-patches/composite_schedule_fixes.patch @@ -0,0 +1,34 @@ +diff --git a/modules/API/API.cpp b/modules/API/API.cpp +index 68c4900d..03425dc4 100644 +--- a/ext/source/modules/API/API.cpp ++++ b/ext/source/modules/API/API.cpp +@@ -573,6 +573,7 @@ void API::init() { + if (this->r_ocpp.size() == 1) { + + this->r_ocpp.at(0)->subscribe_is_connected([this](bool is_connected) { ++ EVLOG_info << "Received OCPP connection status callback with is_connected: " << is_connected; + std::scoped_lock lock(ocpp_data_mutex); + if (is_connected) { + this->ocpp_connection_status = "connected"; +@@ -582,6 +583,7 @@ void API::init() { + }); + + this->r_ocpp.at(0)->subscribe_charging_schedules([this, &var_ocpp_schedule](json schedule) { ++ EVLOG_info << "Received OCPP charging schedule update: " << schedule; + std::scoped_lock lock(ocpp_data_mutex); + this->ocpp_charging_schedule = schedule; + this->ocpp_charging_schedule_updated = true; +diff --git a/modules/OCPP201/OCPP201.cpp b/modules/OCPP201/OCPP201.cpp +index 83f2324b..8eb7900f 100644 +--- a/ext/source/modules/OCPP201/OCPP201.cpp ++++ b/ext/source/modules/OCPP201/OCPP201.cpp +@@ -1181,6 +1181,9 @@ void OCPP201::process_deauthorized(const int32_t evse_id, const int32_t connecto + } + + void OCPP201::publish_charging_schedules(const std::vector& composite_schedules) { ++ EVLOG_info << "About to publish composite charging schedules: "; ++ for (ocpp::v201::CompositeSchedule cs: composite_schedules) ++ EVLOG_info << cs << '\n'; + const auto everest_schedules = conversions::to_everest_charging_schedules(composite_schedules); + this->p_ocpp_generic->publish_charging_schedules(everest_schedules); + } From 8547de3e91ebefde7d9fef922f93138375f76338 Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 19:02:55 -0800 Subject: [PATCH 7/9] Expose the MQTT servers on both maeve and everest Before this, the maeve MQTT server was exposed as localhost 1883. The EVerest MQTT server was not exposed. This made it hard for us to use MQTT Explorer to view and experiment with EVerest MQTT messages. Exposing it at a different port (CSCS, 2727), and remapping the Maeve port to be CSMS (2767) to leave localhost:1883 open for any other MQTT servers that people may be running. Signed-off-by: Shankari --- docker-compose.ocpp201.yml | 2 ++ maeve/docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.ocpp201.yml b/docker-compose.ocpp201.yml index 1d964c6a..4c4c94a0 100644 --- a/docker-compose.ocpp201.yml +++ b/docker-compose.ocpp201.yml @@ -4,6 +4,8 @@ services: mqtt-server: image: ghcr.io/everest/everest-demo/mqtt-server:${TAG} platform: linux/x86_64 + ports: + - 2727:1883 # (CSCS) logging: driver: none diff --git a/maeve/docker-compose.yml b/maeve/docker-compose.yml index a49a4975..1f5e5482 100644 --- a/maeve/docker-compose.yml +++ b/maeve/docker-compose.yml @@ -16,7 +16,7 @@ services: target: /mosquitto/config read_only: true ports: - - "1883:1883" + - "2767:1883" # CSMS - "9000:9000" user: "10000:10000" healthcheck: From a96e60096d33a0131b136b2e1339311e02c4c519 Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 19:13:43 -0800 Subject: [PATCH 8/9] Don't override the AC flow Now that we have made all the changes to the checked-in flow, we don't need to copy it over any more. Hopefully, this will also encourage us to commit code to main more often and not work for too long off branches on forks. Testing done: None, but it is a pretty obvious change Signed-off-by: Shankari --- demo-iso15118-2-ocpp-201.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/demo-iso15118-2-ocpp-201.sh b/demo-iso15118-2-ocpp-201.sh index 4d43820b..9109b975 100755 --- a/demo-iso15118-2-ocpp-201.sh +++ b/demo-iso15118-2-ocpp-201.sh @@ -129,10 +129,6 @@ docker cp manager/config-sil-ocpp201-pnc.yaml everest-ac-demo-manager-1:/ext/so docker exec everest-ac-demo-manager-1 rm /ext/dist/share/everest/modules/OCPP201/component_config/custom/EVSE_2.json docker exec everest-ac-demo-manager-1 rm /ext/dist/share/everest/modules/OCPP201/component_config/custom/Connector_2_1.json -echo "Configuring and restarting nodered" -docker cp nodered/config/config-sil-iso15118-ac-flow.json everest-ac-demo-nodered-1:/config/config-sil-iso15118-ac-flow.json -docker restart everest-ac-demo-nodered-1 - if [[ "$DEMO_VERSION" =~ sp2 || "$DEMO_VERSION" =~ sp3 ]]; then docker cp manager/cached_certs_correct_name_emaid.tar.gz everest-ac-demo-manager-1:/ext/source/build docker exec everest-ac-demo-manager-1 /bin/bash -c "pushd /ext/source/build && tar xf cached_certs_correct_name_emaid.tar.gz" From 5a670ac097a44d872261aaf570463f332835efc1 Mon Sep 17 00:00:00 2001 From: Shankari Date: Sun, 17 Nov 2024 19:27:40 -0800 Subject: [PATCH 9/9] =?UTF-8?q?=F0=9F=8E=80=20Bump=20up=20the=20version=20?= =?UTF-8?q?so=20highlight=20that=20we=20are=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Shankari --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 50cb6303..ed626354 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -TAG=0.0.20 +TAG=0.0.21 EVEREST_MANAGER_CPUS='1.0' EVEREST_MANAGER_MEMORY='1024mb'