PyPLC: Difference between revisions

From openinverter.org wiki
Jump to navigation Jump to search
 
(11 intermediate revisions by 2 users not shown)
Line 2: Line 2:




Charging via CCS DC Fast Charge requires Powerline Communication (PLC).  The TP-Link TL-PA4010 (discontinued, but widely available used) is an inexpensive home PLC unit that is designed to use a residence's mains wiring (power lines) as a communication medium for ethernet.  It can be repurposed to be used as a CCS EV Communications Controller (EVCC)<ref>https://openinverter.org/forum/viewtopic.php?t=2262</ref>.  Additional resources have been compiled by uhi22<ref>https://github.com/uhi22/pyPLC</ref>.
Charging via CCS DC Fast Charge requires Powerline Communication (PLC).  The TP-Link TL-PA4010 (discontinued, but widely available used) is an inexpensive home PLC unit that is designed to use a residence's mains wiring (power lines) as a communication medium for ethernet.  It can be repurposed to be used as a CCS EV Communications Controller (EVCC)<ref>https://openinverter.org/forum/viewtopic.php?t=2262</ref>.  In its new role, it communicates via PLC over the CP line to the EVSE.  It can be reliable when powered by a range of low DC voltages, 12v down to under 5v.  Additional resources have been compiled by uhi22<ref>https://github.com/uhi22/pyPLC</ref>.


== TL-PA4010 ==
== TL-PA4010 ==
[[File:TL-PA4010 27b.png|alt=TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.|thumb|TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.]]
[[File:TL-PA4010 27b.png|alt=TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.|thumb|TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.]]
The TL-PA4010 utilizes the Qualcomm Atheros QCA7420 PLC comm IC.  Examples can be purchased via eBay etc. for well under USD$20 (Apr2023).  Variants include single-PCB versions as well as two-PCB, which are used when the unit provides a pass-through mains connnector.  Both variants utilize the same PLC IC and adapt well for CCS.
The TL-PA4010 utilizes the Qualcomm Atheros QCA7420 PLC comm IC.  Examples can be purchased via eBay etc. for well under USD$20 (Apr2023).  Variants include a single-PCB version, and a version with a mains pass-through which uses two PCBs.  Both variants utilize the same PLC IC, the AR7420, and both adapt well for CCS.


== Setting up a CCS Charging Station ==
== Setting up a CCS Charging Station ==
Starting point: <ref>https://github.com/uhi22/pyPLC/blob/master/doc/EvseMode.md</ref>
Starting point: <ref>https://github.com/uhi22/pyPLC/blob/master/doc/EvseMode.md</ref>


=== Hardware ===
And [[Bidirectional Charging]]


=== Software ===
==Hardware==
Modifying a TP Link TL-PA4010 firmware and settings <ref>https://openinverter.org/forum/viewtopic.php?p=55120#p55120</ref>


==== Setting up a BeagleBone for pyPLC including CAN commincation ====
==Software==
 
===Setting up a BeagleBone for pyPLC including CAN commincation===
There are a number of platforms that pyPLC will run on, for example also on a Raspberry Pi or any other linux computer. The BeagleBone is quite cheap and versatile. Make sure you grab a version with an Ethernet port like the BB green or BB black.
There are a number of platforms that pyPLC will run on, for example also on a Raspberry Pi or any other linux computer. The BeagleBone is quite cheap and versatile. Make sure you grab a version with an Ethernet port like the BB green or BB black.


Then here are the steps to get up and running:
Then here are the steps to get up and running:


# Upgrade to the latest debian image (at the time of writing that is Debian 10.3 IoT): https://beagleboard.org/latest-images
#Upgrade to the latest debian image (at the time of writing that is Debian 10.3 IoT): https://beagleboard.org/latest-images
# Plug it into your USB port. You will now be able to reach the board under two IP addresses 192.168.6.2 and 192.168.7.2
#Plug it into your USB port. You will now be able to reach the board under two IP addresses 192.168.6.2 and 192.168.7.2
# Use SSH to connect: <code>ssh debian@192.168.6.2</code>
#Use SSH to connect: <code>ssh debian@192.168.6.2</code>
# Make sure you can connect to the internet. Easiest way to achieve it is plugging the Ethernet port into your local router. You can also route traffic via the computer that the beaglebone is plugged into: on your computer type <code>sudo sysctl -w net.ipv4.ip_forward=1</code> <code>sudo iptables -t nat -A POSTROUTING -j MASQUERADE</code><code>sudo iptables -A FORWARD -j ACCEPT</code>and on the beaglebone type <code>sudo route add default gw 192.168.6.1</code> <code>sudo tee /etc/resolv.conf <<<"nameserver 192.168.xxx.1" #address of your local router here</code>
#Make sure you can connect to the internet. Easiest way to achieve it is plugging the Ethernet port into your local router. You can also route traffic via the computer that the beaglebone is plugged into (see below)
#
#Update the APT package list: <code>sudo apt update</code>
#Get the so called EXI converter OpenV2Gx: <code>git clone <nowiki>https://github.com/uhi22/OpenV2Gx</nowiki></code>
#Build it: <code>cd OpenV2Gx/Release && make</code> (this will take rather long!)
#Get pyPLC: <code>git clone <nowiki>https://github.com/uhi22/pyPLC/</nowiki></code>
#Install some necessary packages: <code>sudo apt install python3-pypcap python3-serial python3-can</code>
#Edit /etc/connman/main.conf and add eth0 to its blacklist by adding it to the line <code>NetworkInterfaceBlacklist=SoftAp0,usb0,usb1,eth0</code>
#When using CAN, enable the CAN0 "cape" by editing /boot/uEnv.txt and adding the line <code>uboot_overlay_addr0=/lib/firmware/BB-CAN0-00A0.dtbo</code> then reboot
#Bring up eth0 and (if needed) CAN: <code>sudo ip link set eth0 up && sudo ip link set can0 up type can restart-ms 100 bitrate 500000</code>
#Run pyPLC: <code>cd pyPLC && sudo python3 pevNoGui.py</code>
 
===Routing traffic via the USB connected computer===
 
====On your computer:====
 
=====Linux:=====
This is only needed for the setup phase. 
 
<code>sudo sysctl -w net.ipv4.ip_forward=1</code>
 
<code>sudo iptables -t nat -A POSTROUTING -j MASQUERADE</code>
 
<code>sudo iptables -A FORWARD -j ACCEPT</code>
 
=====Windows:=====
TBD
 
====On the Beaglebone:====
<code>sudo route add default gw 192.168.6.1</code>
 
<code>sudo tee /etc/resolv.conf <<<"nameserver 192.168.xxx.1" #address of your local router here</code>


== References ==
===pyPLC MQTT interface===
pyPLC supports various interfaces to the physical world in hardwareInterface.py. Rather than extending it to match your hardware setup consider using MQTT to get values in and out of pyPLC.


To enable MQTT for all signals set
digital_output_device=mqtt
analog_input_device=mqtt
charge_parameter_backend=mqtt
in pyPlc.ini . Also check that mqtt_broker etc. are correct


These are the current definitions. The example config defines "pyPlc/" as base topic, that's what we assume here.
{| class="wikitable"
|+
!Topic
!Meaning in PEV mode
!Meaning in EVSE mode
|-
|pyPlc/battery_voltage
|[input] Present battery voltage
|none
|-
|pyPlc/target_voltage
|[input] Target battery voltage
|[output] Target voltage requested from vehicle. Momentary battery voltage in state "PreCharge"
|-
|pyPlc/target_current
|[input] Charge current request to EVSE
|[output] current requested from vehicle
|-
|pyPlc/soc
|[input] SoC to be reported to EVSE
|[output] SoC reported by vehicle
|-
|pyPlc/inlet_voltage
|[input] physical inlet voltage
|none
|-
|pyPlc/enabled
|none
|[input] user stop request
|-
|pyPlc/fsm_state
| colspan="2" style="text-align:center;" |pyPLC state
|-
|pyPlc/cpstate
|[output] command for CP state switch, "B" or "C"
|none
|-
|pyPlc/relay_request
|[output] command for port contactor, "on" or "off"
|none
|-
|pyPlc/lock_request
|[output] command for port lock, "lock" or "unlock"
|none
|-
|pyPlc/charger_max_voltage
|[output] maximum voltage capability received from EVSE
|[input] Maximum power supply voltage
|-
|pyPlc/charger_max_current
|[output] maximum current capability received from EVSE
|[input] Maximum power supply current
|-
|pyPlc/charger_voltage
|[output] present voltage at charger
|[input] present power supply voltage
|-
|pyPlc/charger_current
|[output] present current at charger
|[input] present power supply current
|}
==References==


[[Category:Rapid Charging]]
[[Category:Rapid Charging]]
<references />
<references />
[[Category:CCS]]
[[Category:Rapid Charging]]

Latest revision as of 13:21, 20 November 2024

Overview

Charging via CCS DC Fast Charge requires Powerline Communication (PLC). The TP-Link TL-PA4010 (discontinued, but widely available used) is an inexpensive home PLC unit that is designed to use a residence's mains wiring (power lines) as a communication medium for ethernet. It can be repurposed to be used as a CCS EV Communications Controller (EVCC)[1]. In its new role, it communicates via PLC over the CP line to the EVSE. It can be reliable when powered by a range of low DC voltages, 12v down to under 5v. Additional resources have been compiled by uhi22[2].

TL-PA4010

TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.
TP-Link TL-PA4010 ("AV500") PLC Ethernet adapter.

The TL-PA4010 utilizes the Qualcomm Atheros QCA7420 PLC comm IC. Examples can be purchased via eBay etc. for well under USD$20 (Apr2023). Variants include a single-PCB version, and a version with a mains pass-through which uses two PCBs. Both variants utilize the same PLC IC, the AR7420, and both adapt well for CCS.

Setting up a CCS Charging Station

Starting point: [3]

And Bidirectional Charging

Hardware

Modifying a TP Link TL-PA4010 firmware and settings [4]

Software

Setting up a BeagleBone for pyPLC including CAN commincation

There are a number of platforms that pyPLC will run on, for example also on a Raspberry Pi or any other linux computer. The BeagleBone is quite cheap and versatile. Make sure you grab a version with an Ethernet port like the BB green or BB black.

Then here are the steps to get up and running:

  1. Upgrade to the latest debian image (at the time of writing that is Debian 10.3 IoT): https://beagleboard.org/latest-images
  2. Plug it into your USB port. You will now be able to reach the board under two IP addresses 192.168.6.2 and 192.168.7.2
  3. Use SSH to connect: ssh debian@192.168.6.2
  4. Make sure you can connect to the internet. Easiest way to achieve it is plugging the Ethernet port into your local router. You can also route traffic via the computer that the beaglebone is plugged into (see below)
  5. Update the APT package list: sudo apt update
  6. Get the so called EXI converter OpenV2Gx: git clone https://github.com/uhi22/OpenV2Gx
  7. Build it: cd OpenV2Gx/Release && make (this will take rather long!)
  8. Get pyPLC: git clone https://github.com/uhi22/pyPLC/
  9. Install some necessary packages: sudo apt install python3-pypcap python3-serial python3-can
  10. Edit /etc/connman/main.conf and add eth0 to its blacklist by adding it to the line NetworkInterfaceBlacklist=SoftAp0,usb0,usb1,eth0
  11. When using CAN, enable the CAN0 "cape" by editing /boot/uEnv.txt and adding the line uboot_overlay_addr0=/lib/firmware/BB-CAN0-00A0.dtbo then reboot
  12. Bring up eth0 and (if needed) CAN: sudo ip link set eth0 up && sudo ip link set can0 up type can restart-ms 100 bitrate 500000
  13. Run pyPLC: cd pyPLC && sudo python3 pevNoGui.py

Routing traffic via the USB connected computer

On your computer:

Linux:

This is only needed for the setup phase.

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A POSTROUTING -j MASQUERADE

sudo iptables -A FORWARD -j ACCEPT

Windows:

TBD

On the Beaglebone:

sudo route add default gw 192.168.6.1

sudo tee /etc/resolv.conf <<<"nameserver 192.168.xxx.1" #address of your local router here

pyPLC MQTT interface

pyPLC supports various interfaces to the physical world in hardwareInterface.py. Rather than extending it to match your hardware setup consider using MQTT to get values in and out of pyPLC.

To enable MQTT for all signals set

digital_output_device=mqtt
analog_input_device=mqtt
charge_parameter_backend=mqtt

in pyPlc.ini . Also check that mqtt_broker etc. are correct

These are the current definitions. The example config defines "pyPlc/" as base topic, that's what we assume here.

Topic Meaning in PEV mode Meaning in EVSE mode
pyPlc/battery_voltage [input] Present battery voltage none
pyPlc/target_voltage [input] Target battery voltage [output] Target voltage requested from vehicle. Momentary battery voltage in state "PreCharge"
pyPlc/target_current [input] Charge current request to EVSE [output] current requested from vehicle
pyPlc/soc [input] SoC to be reported to EVSE [output] SoC reported by vehicle
pyPlc/inlet_voltage [input] physical inlet voltage none
pyPlc/enabled none [input] user stop request
pyPlc/fsm_state pyPLC state
pyPlc/cpstate [output] command for CP state switch, "B" or "C" none
pyPlc/relay_request [output] command for port contactor, "on" or "off" none
pyPlc/lock_request [output] command for port lock, "lock" or "unlock" none
pyPlc/charger_max_voltage [output] maximum voltage capability received from EVSE [input] Maximum power supply voltage
pyPlc/charger_max_current [output] maximum current capability received from EVSE [input] Maximum power supply current
pyPlc/charger_voltage [output] present voltage at charger [input] present power supply voltage
pyPlc/charger_current [output] present current at charger [input] present power supply current

References