Pluging Wallbox

Bonjour ,
Je sais qu’il existe un pluging Wallbox , mais j’ouvre ce sujet pour le développement d’un nouveau plugin.
Le plugin existant ne fonctionne pas , je pense que le développeur de ce plugin n’est plus sur le forum et ne répond pas aux différents message .
Wallbox a modifié et amélioré son Api ce qui explique peut etre le fait que le plugin ne fonctionne pas .
Des plugin sur Home Assistant fonctionne parfaitement avec la nouvelle application Wallbox

Y a t’il possibilité aux développeurs présent sur le forum de reprendre ou de modifer le plugin existant ou éventuellement d’en créer un nouveau avec les éléments existant ?
Ce plugin permet de controler totalement une Wallbox Cooper par exemple

Merci d’avance pour vos commentaires

1 « J'aime »

Bonjour à tous ,
j’ai cherché des réponses ,et des infos …
donc voici mon retour , j’espère que cela intérressera du monde car j’ai besoin d’un peu d’aide .
Voici le résultat sous home assistant que j’ai installé sur un Raspberry qui dormait dans une boite :

ça fonctionne très bien , un peu trop anglais à mon gout mais fonctionne c’est l’essentiel donc,

J’ai récupéré un fichier python sur :

J’ai créer grace au pluging script mon fichier Wallbox : test.PY avec au début du script :
#!/usr/bin/env python3

Script de base python modifié :
test.txt (1013 Octets)

Voila le résultat sous Jeedom :

Le résultat du script python me donne la totalité des infos de la borne avec le menu Charger Status .

Je souhaiterais comme home assistant ne récuperer que certaine info qui me sont importante :
comment faire pour sélectionner et afficher ce dont j’ai besoin ?
Dans l’arborescence des fichiers du projet python de base ( fichier wallbox.py ) il y a des lignes dans le programme qui font référence à par exemple :

def getChargerStatus(self, chargerId):
try:
response = requests.get(
f"{self.baseUrl}chargers/status/{chargerId}", headers=self.headers,
timeout=self._requestGetTimeout
)
response.raise_for_status()
except requests.exceptions.HTTPError as err:
raise (err)
return json.loads(response.text)

Retour sous forme d’un json possible ?

Je stagne un peu dans mes avancé , j’ai des notions comme beaucoup mais je patauge un peu …

Code Python fichier test.PY

from wallbox import Wallbox, Statuses
import time
import datetime

w = Wallbox("user@email", "password")

# Authenticate with the credentials above
w.authenticate()

# Print a list of chargers in the account
print(w.getChargersList())

# Get charger data for all chargers in the list, then lock and unlock chargers
for chargerId in w.getChargersList():
    chargerStatus = w.getChargerStatus(chargerId)
    print(f"Charger Status: {chargerStatus}")
    print(f"Lock Charger {chargerId}")
    endDate = datetime.datetime.now()
    startDate = endDate - datetime.timedelta(days = 30)
    sessionList = w.getSessionList(chargerId, startDate, endDate)
    print(f"Session List: {sessionList}")
    w.lockCharger(chargerId)
    time.sleep(10)
    chargerStatus = w.getChargerStatus(chargerId)
    print(f"Charger {chargerId} lock status {chargerStatus['config_data']['locked']}")
    print(f"Unlock Charger {chargerId}")
    w.unlockCharger(chargerId)
    time.sleep(10)
    chargerStatus = w.getChargerStatus(chargerId)
    print(f"Charger {chargerId} lock status {chargerStatus['config_data']['locked']}")

    # Print the status the charger is currently in using the status id
    print(f"Charger Mode: {Statuses(chargerStatus['status_id']).name}")

Code python du fichier wallbox.py

"""

Wallbox class

"""

from datetime import datetime
from time import timezone
from requests.auth import HTTPBasicAuth
import requests
import json


class Wallbox:
    def __init__(self, username, password, requestGetTimeout = None):
        self.username = username
        self.password = password
        self._requestGetTimeout = requestGetTimeout
        self.baseUrl = "https://api.wall-box.com/"
        self.authUrl = "https://user-api.wall-box.com/"
        self.jwtToken = ""
        self.jwtTokenTtl = 0
        self.headers = {
            "Accept": "application/json",
            "Content-Type": "application/json;charset=UTF-8",
        }

    @property
    def requestGetTimeout(self):
        return self._requestGetTimeout

    def authenticate(self):
        if self.jwtToken != "" and self.jwtTokenTtl > datetime.timestamp(datetime.now()):
            return

        try:
            response = requests.get(
                f"{self.authUrl}users/signin",
                auth=HTTPBasicAuth(self.username, self.password),
                headers={'Partner': 'wallbox'},
                timeout=self._requestGetTimeout
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        self.jwtToken = json.loads(response.text)["data"]["attributes"]["token"]
        self.jwtTokenTtl = json.loads(response.text)["data"]["attributes"]["ttl"]
        self.headers["Authorization"] = f"Bearer {self.jwtToken}"

    def getChargersList(self):
        chargerIds = []
        try:
            response = requests.get(
                f"{self.baseUrl}v3/chargers/groups", headers=self.headers,
                timeout=self._requestGetTimeout
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        for group in json.loads(response.text)["result"]["groups"]:
            for charger in group["chargers"]:
                chargerIds.append(charger["id"])
        return chargerIds

     

    def unlockCharger(self, chargerId):
        try:
            response = requests.put(
                f"{self.baseUrl}v2/charger/{chargerId}",
                headers=self.headers,
                data='{"locked":0}',
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

    def lockCharger(self, chargerId):
        try:
            response = requests.put(
                f"{self.baseUrl}v2/charger/{chargerId}",
                headers=self.headers,
                data='{"locked":1}',
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

    def setMaxChargingCurrent(self, chargerId, newMaxChargingCurrentValue):
        try:
            response = requests.put(
                f"{self.baseUrl}v2/charger/{chargerId}",
                headers=self.headers,
                data=f'{{ "maxChargingCurrent":{newMaxChargingCurrentValue}}}',
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

    def pauseChargingSession(self, chargerId):
        try:
            response = requests.post(
                f"{self.baseUrl}v3/chargers/{chargerId}/remote-action",
                headers=self.headers,
                data='{"action":2}',
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

    def resumeChargingSession(self, chargerId):
        try:
            response = requests.post(
                f"{self.baseUrl}v3/chargers/{chargerId}/remote-action",
                headers=self.headers,
                data='{"action":1}',
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

    def getSessionList(self, chargerId, startDate, endDate):
        try:
            payload = {'charger': chargerId, 'start_date': startDate.timestamp(), 'end_date': endDate.timestamp() }

            response = requests.get(
                f"{self.baseUrl}v4/sessions/stats", params=payload, headers=self.headers,
                timeout=self._requestGetTimeout
            )
            response.raise_for_status()
        except requests.exceptions.HTTPError as err:
            raise (err)
        return json.loads(response.text)

Code Python du fichier statuses.py

from aenum import MultiValueEnum


class Statuses(MultiValueEnum):
    WAITING = 164, 180, 181, 183, 184, 185, 186, 187, 188, 189,
    CHARGING = 193, 194, 195,
    READY = 161, 162,
    PAUSED = 178, 182,
    SCHEDULED = 177, 179,
    DISCHARGING = 196,
    ERROR = 14, 15,
    DISCONNECTED = 0, 163, None,
    LOCKED = 209, 210, 165,
    UPDATING = 166

Code du fichier init.py

# Wallbox EV module __init__.py
from wallbox.wallbox import Wallbox
from wallbox.statuses import Statuses

Hello,
Merci pour toutes ces infos, je viens d’installer une Copper SB et je cherchais a récupérer les infos depuis Jeedom.
Malheureusement, l’acces API pose le meme probleme que le plugin existant wallbox, qui est que la puissance récuperée est de 0 apres quelques minutes.
Ce n’est pas la faute du plugin, mais de l’API wallbox. J’ai le meme défaut avec l’appli Android Wallbox.
Mise à part ça, tout fonctionne plutôt bien, et le top c’est quand même les actions qui vont permettre non seulement de le monitorer mais aussi de le commander !!

A+

Bonjour
@astrosam , pourra tu faires part de tes avancée sur le sujet .
Moi je suis resté bloqué au retour du script qui me donne la totalité des infos .
J’avais fait un test en modifiant le fichier pour n’avoir qu’une info par exemple ’ si le chargeur est ready ’
Mais je n’ai pas réussi à faire un équivalent à HA avec par exemple arret , marche , changement de l’intensité en live … bref le control total de la borne sous Jeedom .
J’ai aussi la borne Cooper .

Bonjour ,
@astrosam , ioxFR à repris le développement de son plugging si tu veux suivre dans le post du plugging Wallbox
As tu aussi avancé de ton coté ?
A+

Hello,
Merci pour l’info. Non je n’ai pas avancé de mon coté mais comme au final le souci est coté API… je vais voir la nouvelle version de ioxFR… notamment le réglage de l’intensité qui devrait m’éviter de poser un carlo gavazzi !!

Bonjour ,
La nouvelle version fonctionne bien , pour le carlo gavazzi je l’ai mis en place afin de réguler l’intensité maxi de consommation sans faire disjoncter le compteur .
Avec Jeedom et le pluging ça fonctionne aussi .
A+