Keba Renault Zoe Wallbox Phase Switching Automation (1-Phase / 3-Phase Control)
This Node-RED flow automates phase switching for a Keba Wallbox (EV Charger) between 1-phase and 3-phase charging modes using the local REST API of the wallbox.
Main Features: Dynamic Phase Switching: Switches between 1-phase and 3-phase charging modes based on the state of an input_boolean in Home Assistant (input_boolean.keba_wallbox_3_phasen).
Authentication Handling: Performs an API login to the Keba Wallbox to get a valid access token (JWT), which is used for all further API calls.
Charging State Detection: Checks the current charging state of the Wallbox via Home Assistant (binary_sensor.keba_p30_charging_state), to avoid switching phases while the car is actively charging.
Fail-Safe Logic: Includes delays and retries to ensure stable phase switching behavior, with additional stop-charging commands if needed.
Integration with Home Assistant: Switches a Home Assistant switch entity (switch.keba_wallbox_phasen_switch_2) to signal the current active phase (for dashboard display or automation triggers).
[{"id":"e69afc95048ed668","type":"comment","z":"de3fdf315c475e0c","name":"Keba-Wallbox-Phasen-Switch","info":"","x":180,"y":380,"wires":[]},{"id":"e52d60019572cf53","type":"debug","z":"de3fdf315c475e0c","name":"POST Phase 1 Command","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1880,"y":580,"wires":[]},{"id":"5877b0b4d5b4a618","type":"http request","z":"de3fdf315c475e0c","name":"Keba Wallbox Login","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/jwt/login","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-Type","valueType":"other","valueValue":"application/json"}],"x":920,"y":640,"wires":[["6d27ebd748a57d61"]]},{"id":"6d27ebd748a57d61","type":"function","z":"de3fdf315c475e0c","name":"Übergabe Login","func":"global.set('accessToken', msg.payload.accessToken);\nmsg.headers = {};\nmsg.headers['Authorization'] = 'Bearer ' + msg.payload.accessToken;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1120,"y":640,"wires":[["bef1691b110f7215"]]},{"id":"4b0bae57fe7ad780","type":"http request","z":"de3fdf315c475e0c","name":"Switch Phase 1 Command","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/wallboxes/your-wallbox-sn/phase-toggle?numberOfPhases=1","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1520,"y":640,"wires":[["e52d60019572cf53","ee60e46e2a3e8ac2"]]},{"id":"bef1691b110f7215","type":"function","z":"de3fdf315c475e0c","name":"1 Phase","func":"msg.headers = msg.headers || {};\nmsg.headers['Authorization'] = 'Bearer ' + global.get('accessToken');\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = { \"numberOfPhases\": 1 };\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1300,"y":640,"wires":[["4b0bae57fe7ad780"]]},{"id":"ccc0a747a55fd78f","type":"function","z":"de3fdf315c475e0c","name":"Zugangsdaten","func":"msg.headers = {};\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = {\n \"username\": \"admin\",\n \"password\": \"xxx\"\n};\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":640,"wires":[["5877b0b4d5b4a618"]]},{"id":"f2b7942761748f17","type":"debug","z":"de3fdf315c475e0c","name":"POST Phase 3 Command","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1880,"y":420,"wires":[]},{"id":"a3fab337639c3cb3","type":"http request","z":"de3fdf315c475e0c","name":"Keba Wallbox Login","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/jwt/login","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"Content-Type","valueType":"other","valueValue":"application/json"}],"x":880,"y":480,"wires":[["d3ffb2b71d4a61f5"]]},{"id":"d3ffb2b71d4a61f5","type":"function","z":"de3fdf315c475e0c","name":"Übergabe Login","func":"global.set('accessToken', msg.payload.accessToken);\nmsg.headers = {};\nmsg.headers['Authorization'] = 'Bearer ' + msg.payload.accessToken;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1080,"y":480,"wires":[["dccb5ffea70ef496"]]},{"id":"012816481cb2e1b3","type":"http request","z":"de3fdf315c475e0c","name":"Switch Phase 3 Command","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/wallboxes/your-wallbox-sn/phase-toggle?numberOfPhases=3","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1480,"y":480,"wires":[["f2b7942761748f17","19bfc5709423763a"]]},{"id":"dccb5ffea70ef496","type":"function","z":"de3fdf315c475e0c","name":"3 Phase","func":"msg.headers = msg.headers || {};\nmsg.headers['Authorization'] = 'Bearer ' + global.get('accessToken');\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = { \"numberOfPhases\": 3 };\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1260,"y":480,"wires":[["012816481cb2e1b3"]]},{"id":"0345e7c420d3f9bb","type":"function","z":"de3fdf315c475e0c","name":"Zugangsdaten","func":"msg.headers = {};\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = {\n \"username\": \"admin\",\n \"password\": \"xxx\"\n};\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":480,"wires":[["a3fab337639c3cb3"]]},{"id":"b881d836ac3adb8f","type":"api-current-state","z":"de3fdf315c475e0c","name":"Zoe läd bereits","server":"xxx","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.keba_p30_charging_state","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":460,"y":600,"wires":[["78fd6c72d8be674c"],["ccc0a747a55fd78f"]]},{"id":"406ae90674f81dc4","type":"debug","z":"de3fdf315c475e0c","name":"POST Stop Charging Sync","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1620,"y":520,"wires":[]},{"id":"78fd6c72d8be674c","type":"function","z":"de3fdf315c475e0c","name":"Zugangsdaten","func":"msg.headers = {};\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = {\n \"username\": \"admin\",\n \"password\": \"xxx\"\n};\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":580,"wires":[["3d990686e1aa2a8f"]]},{"id":"3d990686e1aa2a8f","type":"http request","z":"de3fdf315c475e0c","name":"Keba Wallbox Login","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/jwt/login","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"","valueType":"other","valueValue":""}],"x":900,"y":580,"wires":[["9f33fdeb245add58"]]},{"id":"9f33fdeb245add58","type":"function","z":"de3fdf315c475e0c","name":"Übergabe Login","func":"global.set('accessToken', msg.payload.accessToken);\nmsg.headers = {};\nmsg.headers['Authorization'] = 'Bearer ' + msg.payload.accessToken;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1100,"y":580,"wires":[["2975512646e1bb13"]]},{"id":"2975512646e1bb13","type":"http request","z":"de3fdf315c475e0c","name":"Stop Charging Sync Command","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/wallboxes/your-wallbox-sn/stop-charging-sync","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1330,"y":580,"wires":[["406ae90674f81dc4","136c87cb4a68b75f"]]},{"id":"86d644589735f528","type":"api-current-state","z":"de3fdf315c475e0c","name":"Zoe läd bereits","server":"xxx","version":3,"outputs":2,"halt_if":"on","halt_if_type":"str","halt_if_compare":"is","entity_id":"binary_sensor.keba_p30_charging_state","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":"0","forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":460,"y":480,"wires":[["e485ad617c097201"],["0345e7c420d3f9bb"]]},{"id":"323005195ea46111","type":"debug","z":"de3fdf315c475e0c","name":"POST Stop Charging Sync","active":true,"tosidebar":true,"console":true,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1600,"y":360,"wires":[]},{"id":"e485ad617c097201","type":"function","z":"de3fdf315c475e0c","name":"Zugangsdaten","func":"msg.headers = {};\nmsg.headers['Content-Type'] = 'application/json';\nmsg.payload = {\n \"username\": \"admin\",\n \"password\": \"xxx\"\n};\nreturn msg;\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":420,"wires":[["0b290e7df68a12a4"]]},{"id":"0b290e7df68a12a4","type":"http request","z":"de3fdf315c475e0c","name":"Keba Wallbox Login","method":"POST","ret":"obj","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/jwt/login","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[{"keyType":"other","keyValue":"","valueType":"other","valueValue":""}],"x":880,"y":420,"wires":[["e618a4351fc73dd1"]]},{"id":"e618a4351fc73dd1","type":"function","z":"de3fdf315c475e0c","name":"Übergabe Login","func":"global.set('accessToken', msg.payload.accessToken);\nmsg.headers = {};\nmsg.headers['Authorization'] = 'Bearer ' + msg.payload.accessToken;\nmsg.headers['Content-Type'] = 'application/json';\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1080,"y":420,"wires":[["3ff7e8f84968f91a"]]},{"id":"3ff7e8f84968f91a","type":"http request","z":"de3fdf315c475e0c","name":"Stop Charging Sync Command","method":"POST","ret":"txt","paytoqs":"ignore","url":"https://192.168.178.94:8443/v2/wallboxes/your-wallbox-sn/stop-charging-sync","tls":"tls_config_id","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":1310,"y":420,"wires":[["323005195ea46111","4016d5baaaf4d1fa"]]},{"id":"600c70d4c765b273","type":"inject","z":"de3fdf315c475e0c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":460,"y":560,"wires":[["78fd6c72d8be674c"]]},{"id":"b15095e5b8e003e5","type":"inject","z":"de3fdf315c475e0c","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":460,"wires":[["86d644589735f528"]]},{"id":"c4b136a91d587612","type":"server-state-changed","z":"de3fdf315c475e0c","name":"keba_wallbox_3_phasen","server":"xxx","version":6,"outputs":2,"exposeAsEntityConfig":"","entities":{"entity":["input_boolean.keba_wallbox_3_phasen"],"substring":[],"regex":[]},"outputInitially":false,"stateType":"str","ifState":"on","ifStateType":"str","ifStateOperator":"is","outputOnlyOnStateChange":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":true,"ignoreCurrentStateUnavailable":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":210,"y":520,"wires":[["86d644589735f528"],["b881d836ac3adb8f"]]},{"id":"19bfc5709423763a","type":"api-call-service","z":"de3fdf315c475e0c","name":"3 Phasen Switch on","server":"xxx","version":7,"debugenabled":false,"action":"switch.turn_on","floorId":[],"areaId":[],"deviceId":[],"entityId":["switch.keba_wallbox_phasen_switch_2"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"switch","service":"turn_on","x":1860,"y":480,"wires":[[]]},{"id":"4016d5baaaf4d1fa","type":"delay","z":"de3fdf315c475e0c","name":"","pauseType":"delay","timeout":"30","timeoutUnits":"seconds","rate":"1","nbRateUnits":"30","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1570,"y":420,"wires":[["0345e7c420d3f9bb"]]},{"id":"136c87cb4a68b75f","type":"delay","z":"de3fdf315c475e0c","name":"","pauseType":"delay","timeout":"30","timeoutUnits":"seconds","rate":"1","nbRateUnits":"15","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":false,"outputs":1,"x":1590,"y":580,"wires":[["ccc0a747a55fd78f"]]},{"id":"ee60e46e2a3e8ac2","type":"api-call-service","z":"de3fdf315c475e0c","name":"3 Phasen Switch off","server":"xxx","version":7,"debugenabled":false,"action":"switch.turn_off","floorId":[],"areaId":[],"deviceId":[],"entityId":["switch.keba_wallbox_phasen_switch_2"],"labelId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","blockInputOverrides":false,"domain":"switch","service":"turn_off","x":1810,"y":640,"wires":[[]]},{"id":"tls_config_id","type":"tls-config","name":"Allow Self-Signed","cert":"","key":"","ca":"","verifyservercert":false},{"id":"xxx","type":"server","name":"Home Assistant Friek","version":5,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":false,"cacheJson":false,"heartbeat":false,"heartbeatInterval":"30","areaSelector":"friendlyName","deviceSelector":"friendlyName","entitySelector":"friendlyName","statusSeparator":": ","statusYear":"hidden","statusMonth":"short","statusDay":"numeric","statusHourCycle":"default","statusTimeFormat":"h:m","enableGlobalContextStore":false}]