A design that is optimised for efficiency will ensure that all your parameters can be estimated with high reliability. It is therefore not necessary to have each attribute level appear equally, but I do often like to see some attribute level balance. Some people do not care about attribute level balance at all. Minimising the D-error in an efficient design ensures that all attribute levels appear a sufficient number of times to estimate the parameters, so do you not need to worry about that.
Note that you only included main effects in your utility function, therefore there is no optimisation for the estimation of interaction effects and it cannot be guaranteed that you can estimate all interaction effects. You can increase the number of rows to increase the variation in the data, which allows estimating more interaction effects, or you can include interaction effects direclty in the utility fuction, eg beta * distance * price, or beta * distance * chargingspeed.dummy[1], which will guarantee that you can estimate these interaction effects.
Michiel