Aller au contenu

Architecture logicielle

Introduction

Objectif du Document

L'objectif de ce document est de documenter l'architecture de l'application tic4eebus.

Périmètre de l'Application

L'application tic4eebus permet de limiter une borne de véhicule électrique (VE) en fonction de l'énergie disponible fournie par un compteur Linky.

Le logiciel implémente le cas d'utilisation OPEV de la norme EEBUS en agissant en tant que gestionnaire d'énergie (Energy Guard) pour piloter la borne VE (CEM) en fonction des données lues sur le compteur Linky (Smart Meter).

Diagramme de vue d'ensemble

Vue d'Ensemble de l'Architecture

Description Générale

Cas d'utilisation

L'application tic4eebus interagit avec cinq acteurs :

  • L'Horloge qui gère le déclenchement des fonctionnalités du gestionnaire d'énergie
  • Le Système de fichier qui permet de conserver les données de l'application
  • La Base de données qui permet d'accèder aux données de l'application
  • l'API TIC2WebSocket qui fournit les données métrologique du compteur Linky
  • la Stack EEBUS qui gère l'accès à la borne de recharge et au véhicule électrique

L'acteur Horloge permet de :

  • Déclencher l'ajustement de l'énergie disponible

L'acteur Système de fichier permet de :

  • Conserver les données métier de l'application

L'acteur Base de données permet de :

  • Accèder aux données métier de l'application (visualisation, traitement ...)

L'acteur API TIC2WebSocket permet de :

  • Recevoir les données du compteur Linky

L'acteur Stack EEBUS permet :

  • Limiter la charge du véhicule électrique
Description généraleDescription généraletic4eebusRecevoir données compteur LinkyLimiter charge véhicule électriqueAjuster énergie disponibleSauvegarder les données métierHorlogeSystème de fichierBase de donnéesAPI TIC2WebSocketStack EEBUSincludeincludeinclude
Description généraleDescription généraletic4eebusRecevoir données compteur LinkyLimiter charge véhicule électriqueAjuster énergie disponibleSauvegarder les données métierHorlogeSystème de fichierBase de donnéesAPI TIC2WebSocketStack EEBUSincludeincludeinclude

Principaux Composants

L'application tic4eebus contient :

  • Le composant main qui se charge du démarrage et de l'arrêt du programme
  • Le composant config qui permet de charger l'ensemble des configurations de l'application
  • Le composant ems qui contient le gestionnaire d'énergie de l'application
  • Le composant ems.data qui gère le modèle de données de l'application
  • Le composant linkymeter qui permet de recevoir les données du compteur Linky
  • Le composant evse qui permet l'accès à la borne de recharge et au véhicule électrique

Elle utilise deux dépendances externes principales :

  • Le composant TIC2WebSocket qui permet de recevoir les trames venant de la Télé Information Client (TIC) d'un compteur
  • Le composant eebus-go qui permet de communiquer en EEBUS avec un équipement (borne de recharge et véhicule)
Principaux composantsPrincipaux composantstic4eebusemsmainconfiglinkymeterevseCSVInfluxDbdataTIC2WebSocketeebus-goutiliseutiliseutilisesauvegardesauvegardeutiliseutiliseutiliseutiliseutilise
Principaux composantsPrincipaux composantstic4eebusemsmainconfiglinkymeterevseCSVInfluxDbdataTIC2WebSocketeebus-goutiliseutiliseutilisesauvegardesauvegardeutiliseutiliseutiliseutiliseutilise

Vue Détaillée de l'Architecture

Composant main

Description

Le composant main est le composant chargé du lancement et de l'arrêt du programme.

Au lancement, il gère:

  • Interprétation de la ligne de commande (fonction main.parseCommandLine)
  • Chargement de la configuration (fonction config.LoadConfig)
  • Initialisation des journaux de bord (fonction main.initLogger)
  • Lancement du gestionnaire d'énergie (méthode Start de la classe ems.EnergyGuard)

A l'arrêt, il gère:

  • L'arrêt du gestionnaire d'énergie (méthode Stop de la classe ems.EnergyGuard)

Dépendances

Dépendances internes

Le module main utilise 2 dépendances internes :

  1. Le module config
  2. Le module ems
Dépendances externes

Le module main utilise 2 dépendances externes :

  1. Le paquet file-rotatelogs pour la rotation des journaux de bord
  2. Le paquet logrus pour la gestion des journaux de bord

Diagramme de Classe

Le diagramme de classe suivant décrit le composant main et ses dépendances internes :

Classes composant mainClasses composant mainmainconfigemsInputsconfigFilePath stringshowVersion boolmaininit()parseCommandLine() (inputs Inputs)initLogger(logConfig config.LogConfig)start()stop()LogConfigConfigLog LogConfigconfigLoadConfig(configFilePath string) (Config, error)energyguardNewEnergyGuard(config Config) *EnergyGuardEnergyGuardStart()Stop()
Classes composant mainClasses composant mainmainconfigemsInputsconfigFilePath stringshowVersion boolmaininit()parseCommandLine() (inputs Inputs)initLogger(logConfig config.LogConfig)start()stop()LogConfigConfigLog LogConfigconfigLoadConfig(configFilePath string) (Config, error)energyguardNewEnergyGuard(config Config) *EnergyGuardEnergyGuardStart()Stop()

Composant configuration

Description

Le composant config est le composant qui s'occupe du chargement de l'ensemble des configurations de l'application.

Il utilise :

  • La configuration de l'algorithme de protection des surcharges implémentant le cas d'utilisation OPEV de la norme EEBUS (classe config.OverloadProtectionConfig)
  • La configuration de l'accès aux données du véhicule électrique (classe config.VehicleConfig)
  • La configuration de l'accès aux données de la borne de recharge (classe config.WallboxConfig)
  • La configuration des journaux de bord de l'application (classe config.LogConfig)
  • La configuration de la sauvegarde du modèle de données de l'application (classe config.DataModelConfig)
  • La configuration de l'accès à la TIC du compteur Linky (classe config.TeleInformationClientConfig)
  • La configuration de la communication EEBUS (classe config.EEBUSConfig)

Dépendances

Dépendances internes

Le module config n'a pas de dépendances internes.

Dépendances externes

Le module config utilise 2 dépendances externes :

  1. Le paquet logrus pour utiliser le niveau de journalisation souhaité
  2. Le paquet yaml pour décoder le fichier de configuration au format YAML

Diagramme de Classe

Le diagramme de classe suivant décrit le composant config et ses dépendances internes :

Classes composant configClasses composant configconfigCurrentLimitConfigValueInAmps float64LockDelayInSeconds float64FileRotationConfigPeriodInHours intPeriodCount intPeriodPattern stringCsvConfigFilePath stringRotation FileRotationConfigInfluxDbConfigBucket stringOrg stringToken stringIpAddress stringTcpPort intTic2WebsocketConfigIpAddress stringTcpPort intTicIdentifierConfigSerialNumber stringOverloadProtectionConfigEnable boolRunningPeriodInSeconds intCurrentLimit CurrentLimitConfigVehicleConfigUpdateDataPeriodInSeconds intDataPersistent boolWallboxConfigUpdateDataPeriodInSeconds intDataPersistent boolLogConfigLevel log.LevelFilePath stringRotation FileRotationConfigDataModelConfigCsv *CsvConfigInfluxDb *InfluxDbConfigTeleInformationClientConfigTic2Websocket Tic2WebsocketConfigTicIdentifier TicIdentifierConfigEebusConfigServerPort intRemoteSki stringCertificateFilePath stringPrivateKeyFilePath stringVendorCode stringDeviceBrand stringDeviceModel stringSerialNumber stringHeartbeatTimeoutInSeconds intConfigOverloadProtection OverloadProtectionConfigVehicle VehicleConfigWallbox WallboxConfigLog LogConfigDataModel DataModelConfigTeleInformationClient TeleInformationClientConfigEebus EebusConfigconfigLoadConfig(configFilePath string) (Config, error)
Classes composant configClasses composant configconfigCurrentLimitConfigValueInAmps float64LockDelayInSeconds float64FileRotationConfigPeriodInHours intPeriodCount intPeriodPattern stringCsvConfigFilePath stringRotation FileRotationConfigInfluxDbConfigBucket stringOrg stringToken stringIpAddress stringTcpPort intTic2WebsocketConfigIpAddress stringTcpPort intTicIdentifierConfigSerialNumber stringOverloadProtectionConfigEnable boolRunningPeriodInSeconds intCurrentLimit CurrentLimitConfigVehicleConfigUpdateDataPeriodInSeconds intDataPersistent boolWallboxConfigUpdateDataPeriodInSeconds intDataPersistent boolLogConfigLevel log.LevelFilePath stringRotation FileRotationConfigDataModelConfigCsv *CsvConfigInfluxDb *InfluxDbConfigTeleInformationClientConfigTic2Websocket Tic2WebsocketConfigTicIdentifier TicIdentifierConfigEebusConfigServerPort intRemoteSki stringCertificateFilePath stringPrivateKeyFilePath stringVendorCode stringDeviceBrand stringDeviceModel stringSerialNumber stringHeartbeatTimeoutInSeconds intConfigOverloadProtection OverloadProtectionConfigVehicle VehicleConfigWallbox WallboxConfigLog LogConfigDataModel DataModelConfigTeleInformationClient TeleInformationClientConfigEebus EebusConfigconfigLoadConfig(configFilePath string) (Config, error)

Composant linkymeter

Description

Le composant linkymeter est le composant chargé de l'accès aux données du compteur Linky.

Il gère :

  • L'accès à l'interface (serveur websocket) fournie par l'application TIC2WebSocket (classe linkymeter.TIC2WebSocketClient)
  • La récupération des données du compteur à partir des messages envoyés par TIC2WebSocket (fonction linkymeter.ComputeMeterData)

Dépendances

Dépendances internes

Le module linkymeter n'utilise aucune dépendance interne.

Dépendances externes

Le module linkymeter utilise 4 dépendances externe :

  1. Le paquet uuid pour la génération d'identifiant unique utilisé pour la souscription à un compteur auprès de l'application TIC2WebSocket
  2. Le paquet websocket pour la gestion du client websocket qui accède à l'application TIC2WebSocket
  3. Le paquet mapstructure pour la conversion de dictionnaire en structure de données
  4. Le paquet logrus pour le journal de bord de l'application

Diagramme de Classe

Le diagramme de classe suivant décrit le composant linkymeter et ses dépendances internes :

Classes composant linkymeterClasses composant linkymeterlinkymeterOnTicDataOnTicData(ticData TicData)OnTicErrorOnTicError(ticError TicError)OnTicAbnormalClosureOnTicAbnormalClosure()TicDataMode stringCaptureDateTime stringIdentifier TicIdentifierContent map[string]stringTicErrorErrorCode intErrorMessage stringIdentifier TicIdentifierTicIdentifierSerialNumber stringPortName stringPortId stringTic2WebsocketClientConnect(host string) errorGetAvailableTics() ([]TicIdentifier,error)SubscribeTic(onData OnTicData,onError OnTicError,onAbnormalClosure OnTicAbnormalClosure,identifier TicIdentifier) (string, error)UnsubscribeTic(subscriptionId string) errorClose() errorticNewTic2WebsocketClient() *Tic2WebsocketClientMeterDataSerialNumber stringDateTime stringBreakerOpened boolPhaseCount intOverloadPowerLimit intOverloadPowerLimitPerPhase []float64RmsVoltagePerPhase []intRmsCurrentPerPhase []float64ApparentImportPower intApparentImportPowerPerPhase []intAvailableCurrentPerPhase []float64dataComputeMeterData(ticContent map[string]string) MeterData
Classes composant linkymeterClasses composant linkymeterlinkymeterOnTicDataOnTicData(ticData TicData)OnTicErrorOnTicError(ticError TicError)OnTicAbnormalClosureOnTicAbnormalClosure()TicDataMode stringCaptureDateTime stringIdentifier TicIdentifierContent map[string]stringTicErrorErrorCode intErrorMessage stringIdentifier TicIdentifierTicIdentifierSerialNumber stringPortName stringPortId stringTic2WebsocketClientConnect(host string) errorGetAvailableTics() ([]TicIdentifier,error)SubscribeTic(onData OnTicData,onError OnTicError,onAbnormalClosure OnTicAbnormalClosure,identifier TicIdentifier) (string, error)UnsubscribeTic(subscriptionId string) errorClose() errorticNewTic2WebsocketClient() *Tic2WebsocketClientMeterDataSerialNumber stringDateTime stringBreakerOpened boolPhaseCount intOverloadPowerLimit intOverloadPowerLimitPerPhase []float64RmsVoltagePerPhase []intRmsCurrentPerPhase []float64ApparentImportPower intApparentImportPowerPerPhase []intAvailableCurrentPerPhase []float64dataComputeMeterData(ticContent map[string]string) MeterData

Composant evse

Description

Le composant evse est le composant chargé de la lecture des données de la borne de recharge et du véhicule électrique.

Il utilise :

  • La configuration de la borne de recharge (classe config.WallboxConfig)
  • La configuration du véhicule électrique (classe config.VehiculeConfig)
  • Le composant borne de recharge qui gère les message EEBUS liés à la borne (classe evse.Wallbox)
  • Le composant véhicule électrique qui gère les message EEBUS liés au véhicule (classe evse.Vehicle)

Dépendances

Dépendances internes

Le module evse utilise 1 dépendance interne :

  • Le module config
Dépendances externes

Le module evse utilise 5 dépendances externes :

  1. Le paquet eebus-go pour le service EEBUS et les cas d'utilisation EEBUS (EVSECC, EVCC, EVCEM, OPEV) EEBUS
  2. Le paquet spine-go pour l'accès aux équipements et entité EEBUS permettant la récupération d'information (état fonctionnel de la borne, standard de communication du VE, résultat de la limitation du VE)
  3. Le paquet gocron pour le lancement d'un tâche périodique de lecture des informations du VE et de la borne de recharge
  4. Le paquet uuid pour l'identifiant unique de souscription aux informations du VE et de la borne de recharge
  5. Le paquet logrus pour le journal de bord de l'application concernant le VE et la borne de recharge

Diagramme de Classe

Le diagramme de classe suivant décrit le composant synchroniser et ses dépendances internes :

Classes composant evseClasses composant evseconfigevseWallboxConfigUpdateDataPeriodInSeconds intDataPersistent boolVehicleConfigUpdateDataPeriodInSeconds intDataPersistent boolonWallboxDataonWallboxData(wallboxData map[string]interface{})onWallboxConnectedonWallboxConnected()onWallboxDisconnectedonWallboxDisconnected()onWallboxSupportedonWallboxSupported()onVehicleDataonVehicleData(vehicleData map[string]interface{})onVehicleConnectedonVehicleConnected()onVehicleDisconnectedonVehicleDisconnected()onVehicleOpevSupportedonVehicleOpevSupported()WallboxEnableRemoteConnection()DisableRemoteConnection()SubscribeData(onData onWallboxData,onConnected onWallboxConnected,onDisconnected onWallboxDisconnected,onSupported onWallboxSupported) (id string)UnsubscribeData(id string) errorVehicleEnableRemoteConnection()DisableRemoteConnection()SubscribeData(onData onVehicleData,onConnected onVehicleConnected,onDisconnected onVehicleDisconnected,onOPEVSupported onVehicleOpevSupported) (id string)UnsubscribeData(id string) errorwallboxNewWallbox(service api.ServiceInterface,localEntity spineapi.EntityLocalInterface,config config.WallboxConfig) *WallboxvehicleNewVehicle(service api.ServiceInterface,localEntity spineapi.EntityLocalInterface,config config.VehicleConfig) *Vehicle
Classes composant evseClasses composant evseconfigevseWallboxConfigUpdateDataPeriodInSeconds intDataPersistent boolVehicleConfigUpdateDataPeriodInSeconds intDataPersistent boolonWallboxDataonWallboxData(wallboxData map[string]interface{})onWallboxConnectedonWallboxConnected()onWallboxDisconnectedonWallboxDisconnected()onWallboxSupportedonWallboxSupported()onVehicleDataonVehicleData(vehicleData map[string]interface{})onVehicleConnectedonVehicleConnected()onVehicleDisconnectedonVehicleDisconnected()onVehicleOpevSupportedonVehicleOpevSupported()WallboxEnableRemoteConnection()DisableRemoteConnection()SubscribeData(onData onWallboxData,onConnected onWallboxConnected,onDisconnected onWallboxDisconnected,onSupported onWallboxSupported) (id string)UnsubscribeData(id string) errorVehicleEnableRemoteConnection()DisableRemoteConnection()SubscribeData(onData onVehicleData,onConnected onVehicleConnected,onDisconnected onVehicleDisconnected,onOPEVSupported onVehicleOpevSupported) (id string)UnsubscribeData(id string) errorwallboxNewWallbox(service api.ServiceInterface,localEntity spineapi.EntityLocalInterface,config config.WallboxConfig) *WallboxvehicleNewVehicle(service api.ServiceInterface,localEntity spineapi.EntityLocalInterface,config config.VehicleConfig) *Vehicle

Composant ems

Description

Le composant ems est le composant qui implémente le gestionnaire d'énergie appelé Energy Guard dans la norme EEBUS.

Il utilise :

  • La configuration globale de l'application (classe config.Config)
  • Le client TIC2WebSocket pour recevoir les données du compteur Linky (classe linkymeter.Tic2WebSocketClient)
  • La conversion des données brutes du compteur Linky en données métier (fonction linkymeter.ComputeMeterData)
  • La sauvegarde des données de l'application (classe ems.data.DataSynchronizer))
  • La récupération les données du véhicule électrique (classe evse.Vehicle)
  • La récupération les données de la borne de recharge (classe evse.Wallbox)

Dépendances

Dépendances internes

Le composant ems utilise 4 dépendances interne :

  1. Le paquet config
  2. Le paquet linkymeter
  3. Le paquet evse
  4. Le paquet ems.data
Dépendances externes

Le composant ems utilise 7 dépendances externes :

  1. Le paquet eebus-go pour la gestion du service EEBUS et le le diagnostique du gestionnaire d'énergie
  2. Le paquet ship-go pour la définition du service EEBUS distant et l'état de la connexion distante
  3. Le paquet spine-go pour l'interface de l'entité EEBUS locale et les informations de résultat de l'écriture de la consigne de limitation de courant du VE
  4. Le paquet gocron pour le lancement de la tâche de régulation périodique de la limitation de la charge du VE
  5. Le paquet cmp pour détecter les modifications des informations du VE et de la borne de recharge
  6. Le paquet uuid pour l'identifiant unique de souscription aux informations du gestionnaire d'énergie
  7. Le paquet logrus pour le journal de bord de l'application concernant le gestionnaire d'énergie

Diagramme de Classe

Le diagramme de classe suivant décrit le composant ems et ses dépendances internes :

Classes composant emsClasses composant emsemsdataconfigevselinkymeteronDataonData(data data.DataModel)EnergyGuard Start()Stop() Lancement du gestionnaire d'énergie SubscribeData(onData onData) (id string)UnsubscribeData(id string) error Souscription aux données du gestionnaire d'énergie Trace(args ...interface{})Tracef(format string, args ...interface{})Debug(args ...interface{})Debugf(format string, args ...interface{})Info(args ...interface{})Infof(format string, args ...interface{})Error(args ...interface{})Errorf(format string, args ...interface{}) Interface pour la journalisation RemoteSKIConnected(service api.ServiceInterface, ski string)RemoteSKIDisconnected(service api.ServiceInterface, ski string)VisibleRemoteServicesUpdated(service api.ServiceInterface, entries []shipapi.RemoteService)ServiceShipIDUpdate(ski string, shipdID string)ServicePairingDetailUpdate(ski string, detail *shipapi.ConnectionStateDetail)AllowWaitingForTrust(ski string) boolInterface pour le service EEBUS serviceenergyguardNewEnergyGuard(config.Config) (*EnergyGuard)DataSynchronizerDataModelOverloadProtectionDataDiagnosisDataDataModelConfigConfigVehicleWallboxMeterDataTic2WebSocketClient
Classes composant emsClasses composant emsemsdataconfigevselinkymeteronDataonData(data data.DataModel)EnergyGuard Start()Stop() Lancement du gestionnaire d'énergie SubscribeData(onData onData) (id string)UnsubscribeData(id string) error Souscription aux données du gestionnaire d'énergie Trace(args ...interface{})Tracef(format string, args ...interface{})Debug(args ...interface{})Debugf(format string, args ...interface{})Info(args ...interface{})Infof(format string, args ...interface{})Error(args ...interface{})Errorf(format string, args ...interface{}) Interface pour la journalisation RemoteSKIConnected(service api.ServiceInterface, ski string)RemoteSKIDisconnected(service api.ServiceInterface, ski string)VisibleRemoteServicesUpdated(service api.ServiceInterface, entries []shipapi.RemoteService)ServiceShipIDUpdate(ski string, shipdID string)ServicePairingDetailUpdate(ski string, detail *shipapi.ConnectionStateDetail)AllowWaitingForTrust(ski string) boolInterface pour le service EEBUS serviceenergyguardNewEnergyGuard(config.Config) (*EnergyGuard)DataSynchronizerDataModelOverloadProtectionDataDiagnosisDataDataModelConfigConfigVehicleWallboxMeterDataTic2WebSocketClient

Composant ems.data

Description

Le composant ems.data est le composant qui sauvegarde le modèle de données de l'application.

Il utilise :

  • La configuration du modèle de données de l'application (classe config.DataModelConfig)
  • Le modèle de données de l'application (classe ems.data.DataModel)
  • L'interface de gestion du modèle de données (classe ems.data.DataSynchronizer)
  • L'interface de sauvegarde du modèle de données dans un fichier CSV (classe ems.data.CsvWriter)
  • L'interface de sauvegarde du modèle de données dans une base de données InfluxDb (classe ems.data.InfluxDbWriter)

Dépendances

Dépendances internes

Le composant ems utilise 3 dépendances interne :

  1. Le paquet config
  2. Le paquet linkymeter
  3. Le paquet evse
Dépendances externes

Le composant ems utilise 6 dépendances externes :

  1. Le paquet eebus-go pour les types de données liées au véhicule électrique et à la borne de recharge
  2. Le paquet spine-go pour les types de données liées au diagnostique, à la limitation de la charge du VE et à l'état fonctionnel de la borne de recharge
  3. Le paquet influxdb-client-go pour l'accès à la base de données InfluxDb
  4. Le paquet cmp pour comparer les nouvelles données de VE et de la borne aux données actuelle
  5. Le paquet file-rotatelogs pour la rotation des fichiers CSV
  6. Le paquet logrus pour le journal de bord de l'application concernant le modèle de données

Diagramme de Classe

Le diagramme de classe suivant décrit le composant ems.data et ses dépendances internes :

Classes composant ems.dataClasses composant ems.dataemsdatalinkymeterconfigevseDataWriterSave(model DataModel)CsvWriterSave(model DataModel)InfluxDbWriterSave(model DataModel)synchronizerNewDataSynchronizer(dataModelConfig config.DataModelConfig) *DataSynchronizerDataSynchronizer  IsConnected() (isConnected bool)SetIsConnected(isConnected bool) (hasChanged bool)HasMeterData() (hasMeterData bool)SetHasMeterData(hasMeterData bool) (hasChanged bool)IsOpevSupported() (isOpevSupported bool)SetIsOpevSupported(isOpevSupported bool) (hasChanged bool) Connexions GetVehicle() (vehicle map[string]interface{})SetVehicle(vehicle map[string]interface{}) (hasChanged bool)GetWallbox() (wallbox map[string]interface{})SetWallbox(wallbox map[string]interface{}) (hasChanged bool)GetMeter() (meter linkymeter.MeterData)SetMeter(meter linkymeter.MeterData) (hasChanged bool) Données GetMeterMinAvailableCurrent() (minAvailableCurrent float64)DisableOverloadProtectionActive()GetOverloadProtectionValue() (limitValue float64)SetOverloadProtectionValue(limitValue float64)SetOverloadProtectionResult(result model.ResultDataType) (hasChanged bool)SetOverloadProtectionLockStart(lockStart time.Time) (hasChanged bool)GetOverloadProtectionLockDuration() (lockDuration time.Duration)SetOverloadProtectionLockActive(lockActive bool) (hasChanged bool) Protection surcharge GetDiagnosisState() *model.DeviceDiagnosisStateDataTypeSetDiagnosis(operatingState model.DeviceDiagnosisOperatingStateType, lastErrorCode model.LastErrorCodeType) (hasChanged bool) Diagnostique GetModel() (model DataModel)Print() ModèleOverloadProtectionDataActive boolValue float64Start time.TimeResultCode model.ErrorNumberTypeResultDescription model.DescriptionTypeLockActive boolLockStart time.TimeDiagnosisDataOperatingState model.DeviceDiagnosisOperatingStateTypeLastErrorCode model.LastErrorCodeTypeDataModelIsConnected boolHasMeterData boolIsOpevSupported boolVehicle map[string]interface{}Wallbox map[string]interface{}Meter linkymeter.MeterDataOverloadProtection OverloadProtectionDataDiagnosis DiagnosisDataMeterDataDataModelConfigvehiclewallbox
Classes composant ems.dataClasses composant ems.dataemsdatalinkymeterconfigevseDataWriterSave(model DataModel)CsvWriterSave(model DataModel)InfluxDbWriterSave(model DataModel)synchronizerNewDataSynchronizer(dataModelConfig config.DataModelConfig) *DataSynchronizerDataSynchronizer  IsConnected() (isConnected bool)SetIsConnected(isConnected bool) (hasChanged bool)HasMeterData() (hasMeterData bool)SetHasMeterData(hasMeterData bool) (hasChanged bool)IsOpevSupported() (isOpevSupported bool)SetIsOpevSupported(isOpevSupported bool) (hasChanged bool) Connexions GetVehicle() (vehicle map[string]interface{})SetVehicle(vehicle map[string]interface{}) (hasChanged bool)GetWallbox() (wallbox map[string]interface{})SetWallbox(wallbox map[string]interface{}) (hasChanged bool)GetMeter() (meter linkymeter.MeterData)SetMeter(meter linkymeter.MeterData) (hasChanged bool) Données GetMeterMinAvailableCurrent() (minAvailableCurrent float64)DisableOverloadProtectionActive()GetOverloadProtectionValue() (limitValue float64)SetOverloadProtectionValue(limitValue float64)SetOverloadProtectionResult(result model.ResultDataType) (hasChanged bool)SetOverloadProtectionLockStart(lockStart time.Time) (hasChanged bool)GetOverloadProtectionLockDuration() (lockDuration time.Duration)SetOverloadProtectionLockActive(lockActive bool) (hasChanged bool) Protection surcharge GetDiagnosisState() *model.DeviceDiagnosisStateDataTypeSetDiagnosis(operatingState model.DeviceDiagnosisOperatingStateType, lastErrorCode model.LastErrorCodeType) (hasChanged bool) Diagnostique GetModel() (model DataModel)Print() ModèleOverloadProtectionDataActive boolValue float64Start time.TimeResultCode model.ErrorNumberTypeResultDescription model.DescriptionTypeLockActive boolLockStart time.TimeDiagnosisDataOperatingState model.DeviceDiagnosisOperatingStateTypeLastErrorCode model.LastErrorCodeTypeDataModelIsConnected boolHasMeterData boolIsOpevSupported boolVehicle map[string]interface{}Wallbox map[string]interface{}Meter linkymeter.MeterDataOverloadProtection OverloadProtectionDataDiagnosis DiagnosisDataMeterDataDataModelConfigvehiclewallbox

Modèles d'Interaction

Diagrammes de Séquence

Les diagrammes de séquence permettent d'illustrer les interactions entre les composants concernant :

  • Le lancement de l'application
  • L'arrêt de l'application
  • Le démarrage du gestionnaire d'énergie
  • L'arrêt du gestionnaire d'énergie
  • La régulation périodique du gestionnaire d'énergie

Lancement de l'application

Le lancement de l'application est décrit par le diagramme de séquence suivant :

Lancement de l'applicationLancement de l'applicationmainmainmainmainmainconfigEnergyGuardSystemmainconfigInputsEnergyGuardSystemSystemmainmainconfigconfigInputsEnergyGuardmainmainmainmainmainconfigEnergyGuardmain()init()Ligne de commandeparseCommandLine()newInputsmise à jour des données d'entrée avec la ligne de commandedonnées d'entréeConfigurationLoadConfig()configurationJournal de bordinitLogger()journal de bord initialiséGestionnaire d'énergienewEnergyGuardcréation avec les paramètres de configurationapplication initialiséestart()Start()getsionnaire d'énergie démarréapplication démarrée
Lancement de l'applicationLancement de l'applicationmainmainmainmainmainconfigEnergyGuardSystemmainconfigInputsEnergyGuardSystemSystemmainmainconfigconfigInputsEnergyGuardmainmainmainmainmainconfigEnergyGuardmain()init()Ligne de commandeparseCommandLine()newInputsmise à jour des données d'entrée avec la ligne de commandedonnées d'entréeConfigurationLoadConfig()configurationJournal de bordinitLogger()journal de bord initialiséGestionnaire d'énergienewEnergyGuardcréation avec les paramètres de configurationapplication initialiséestart()Start()getsionnaire d'énergie démarréapplication démarrée

Arrêt de l'application

L'arrêt de l'application est décrit par le diagramme de séquence suivant :

Arrêt de l'applicationArrêt de l'applicationmainmainEnergyGuardSystemmainEnergyGuardSystemSystemmainmainEnergyGuardEnergyGuardmainmainEnergyGuardSIGSTOP [CTRL + C]stop()Gestionnaire d'énergieStop()gestionnaire d'énergie arrêtéapplication arrêtéeexit()
Arrêt de l'applicationArrêt de l'applicationmainmainEnergyGuardSystemmainEnergyGuardSystemSystemmainmainEnergyGuardEnergyGuardmainmainEnergyGuardSIGSTOP [CTRL + C]stop()Gestionnaire d'énergieStop()gestionnaire d'énergie arrêtéapplication arrêtéeexit()

Lancement du gestionnaire d'énergie

Le lancement du gestionnaire d'énergie est décrit par le diagramme de séquence suivant :

Lancement du gestionnaire d'énergieLancement du gestionnaire d'énergieEnergyGuardTic2WebSocketClientTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerSchedulerTICIdentifierTICIdentifiermainEnergyGuardTic2WebSocketClientService EEBUSSchedulerTICIdentifiermainmainEnergyGuardEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerTICIdentifierEnergyGuardTic2WebSocketClientTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerSchedulerTICIdentifierTICIdentifierStart()Démarrage de la réception des données venant du compteur LinkyConnect(ticServiceHost)connecté avec Tic2WebSocketGetAvailableTics()flux TIC disponiblealt[Numéro de série compteur existe dans la config]loop[flux TIC disponible]alt[Numéro de série compteur du flux TIC correspond à la config]newTICIdentifiermise à jour du numéro de sérieNuméro de série mis à jour[Numéro de série compteur vide dans la config]loop[flux TIC disponible]alt[Numéro de série compteur du flux TIC existe]newTICIdentifiermise à jour du numéro de sérieNuméro de série mis à jourSubscribeTIC(onData,onError,ticIdentifier)souscription aux données du compteur réussieDémmarage de la communication EEBUSRegisterRemoteSKI(config.EEBUS.RemoteSKI)Identifiant SKI de la borne de recharge enregistréStart()Service EEBUS démarréDémarrage de la protection contre les surchargesEvery(config.OverloadProtection.RunningPeriodInSeconds)Période d'exécution de la protection contre les surcharge définieSeconds()Période d'exécution de la protection contre les surcharge convertie en secondesDo(runOverloadProtection)Fonction de protection contre les surcharge configuréegestionnaire d'énergie démarré
Lancement du gestionnaire d'énergieLancement du gestionnaire d'énergieEnergyGuardTic2WebSocketClientTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerSchedulerTICIdentifierTICIdentifiermainEnergyGuardTic2WebSocketClientService EEBUSSchedulerTICIdentifiermainmainEnergyGuardEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerTICIdentifierEnergyGuardTic2WebSocketClientTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSSchedulerSchedulerSchedulerTICIdentifierTICIdentifierStart()Démarrage de la réception des données venant du compteur LinkyConnect(ticServiceHost)connecté avec Tic2WebSocketGetAvailableTics()flux TIC disponiblealt[Numéro de série compteur existe dans la config]loop[flux TIC disponible]alt[Numéro de série compteur du flux TIC correspond à la config]newTICIdentifiermise à jour du numéro de sérieNuméro de série mis à jour[Numéro de série compteur vide dans la config]loop[flux TIC disponible]alt[Numéro de série compteur du flux TIC existe]newTICIdentifiermise à jour du numéro de sérieNuméro de série mis à jourSubscribeTIC(onData,onError,ticIdentifier)souscription aux données du compteur réussieDémmarage de la communication EEBUSRegisterRemoteSKI(config.EEBUS.RemoteSKI)Identifiant SKI de la borne de recharge enregistréStart()Service EEBUS démarréDémarrage de la protection contre les surchargesEvery(config.OverloadProtection.RunningPeriodInSeconds)Période d'exécution de la protection contre les surcharge définieSeconds()Période d'exécution de la protection contre les surcharge convertie en secondesDo(runOverloadProtection)Fonction de protection contre les surcharge configuréegestionnaire d'énergie démarré

Arrêt du gestionnaire d'énergie

L'arrêt du gestionnaire d'énergie est décrit par le diagramme de séquence suivant :

Arrêt du gestionnaire d'énergieArrêt du gestionnaire d'énergieEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSVehicleWallboxSchedulermainEnergyGuardTic2WebSocketClientService EEBUSVehicleWallboxSchedulermainmainEnergyGuardEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSVehicleVehicleWallboxWallboxSchedulerSchedulerEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSVehicleWallboxSchedulerStop()Arrêt de la protection contre les surchargesStop()Ordonnanceur d'exécution de la protection contre les surcharge arrêtéArrêt de la communication EEBUSShutdown()Service EEBUS arrêtéDisableRemoteConnection()Mise à jour des données du véhicule désactivéeDisableRemoteConnection()Mise à jour des données de la borne de recharge désactivéeArrêt de la réception des données venant du compteur LinkyUnsubscribe(ticServiceSubcriptionId)Fin de souscription aux données du compteurClose()Fermeture de la connection avec Tic2WebSocketGestionnaire d'énergie arrêté
Arrêt du gestionnaire d'énergieArrêt du gestionnaire d'énergieEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSVehicleWallboxSchedulermainEnergyGuardTic2WebSocketClientService EEBUSVehicleWallboxSchedulermainmainEnergyGuardEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSService EEBUSVehicleVehicleWallboxWallboxSchedulerSchedulerEnergyGuardTic2WebSocketClientTic2WebSocketClientService EEBUSVehicleWallboxSchedulerStop()Arrêt de la protection contre les surchargesStop()Ordonnanceur d'exécution de la protection contre les surcharge arrêtéArrêt de la communication EEBUSShutdown()Service EEBUS arrêtéDisableRemoteConnection()Mise à jour des données du véhicule désactivéeDisableRemoteConnection()Mise à jour des données de la borne de recharge désactivéeArrêt de la réception des données venant du compteur LinkyUnsubscribe(ticServiceSubcriptionId)Fin de souscription aux données du compteurClose()Fermeture de la connection avec Tic2WebSocketGestionnaire d'énergie arrêté

Régulation périodique du gestionnaire d'énergie

La régulation périodique du gestionnaire d'énergie est expliquée par le logigramme ci-dessous :

Logigramme de la régulation périodique du gestionnaire d'énergieLogigramme de la régulation périodique du gestionnaire d'énergieCalcul de la durée de verrouillage de la limitation de la chargeDurée de verrouillage écoulée ?ouinonCalcul du courant minimal disponible sur l'ensemble des phasesProtection contre les surcharges nécessaire ?ouinonDiminuer la valeur du courant maximal de charge du véhiculeAugmenter la valeur du le courant maximal de charge du véhiculeMise à jour des paramètres de verrouillageMaintien la valeur du courant maximal de charge du véhiculeAppliquer la valeur du courant maximal de charge du véhiculeouiDonnées du compteur disponible ?
Logigramme de la régulation périodique du gestionnaire d'énergieLogigramme de la régulation périodique du gestionnaire d'énergieCalcul de la durée de verrouillage de la limitation de la chargeDurée de verrouillage écoulée ?ouinonCalcul du courant minimal disponible sur l'ensemble des phasesProtection contre les surcharges nécessaire ?ouinonDiminuer la valeur du courant maximal de charge du véhiculeAugmenter la valeur du le courant maximal de charge du véhiculeMise à jour des paramètres de verrouillageMaintien la valeur du courant maximal de charge du véhiculeAppliquer la valeur du courant maximal de charge du véhiculeouiDonnées du compteur disponible ?

La régulation périodique du gestionnaire d'énergie est décrit en détail par le diagramme de séquence suivant :

Régulation périodique du gestionnaire d'énergieRégulation périodique du gestionnaire d'énergieEnergyGuardEnergyGuardEnergyGuardEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerVehicleVehicleVehicleSchedulerEnergyGuardDataSynchronizerVehicleSchedulerSchedulerEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerVehicleVehicleEnergyGuardEnergyGuardEnergyGuardEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerVehicleVehicleVehiclerunOverloadProtection()IsConnected()État de la connexion EEBUSIsConnected()État de la connexion du VEGetVehicleCurrentLimits()Limitations de courant du VE (min, max)HasMeterData()État de la connexion avec le compteur Linkyalt[Données du compteur Linky NON disponible]currentLimit = minCurrentLimitMise à jour de la limitation de la charge du véhicule à appliquer[Données du compteur Linky disponible]GetOverloadProtectionValue()Courant maximal de charge du véhiculeGetOverloadProtectionLockDuration()Durée de verrouillage de la limitation de la chargealt[Durée de verrouillage écoulée]SetOverloadProtectionActive(false)Mise à jour de l'état d'activation de la limitation de charge du véhiculeGetMeterMinAvailableCurrent()Courant minimal disponible sur l'ensemble des phasesalt[Protection contre les surcharges nécessaire]currentLimit = loadControlLimit - abs(minAvailableCurrent)Diminution de la valeur du courant maximal de charge du véhicule[Protection contre les surcharges PAS nécessaire]currentLimit = loadControlLimit + abs(minAvailableCurrent)Augmentation de la valeur du courant maximal de charge du véhiculeSetOverloadProtectionLockStart(now)Mise à jour de l'horodate de début de verrouillage de la limitation de charge du véhicule[Durée de verrouillage PAS écoulée]currentLimit = loadControlLimitMaintien la valeur du courant maximal de charge du véhiculeWriteLoadControlLimits(currentLimit)Courant maximal de charge du véhicule appliquéSetOverloadProtectionValue(currentLimit)Mise à jour de la valeur du courant maximal de charge du véhiculeProtection contre les surcharges exécutée
Régulation périodique du gestionnaire d'énergieRégulation périodique du gestionnaire d'énergieEnergyGuardEnergyGuardEnergyGuardEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerVehicleVehicleVehicleSchedulerEnergyGuardDataSynchronizerVehicleSchedulerSchedulerEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerVehicleVehicleEnergyGuardEnergyGuardEnergyGuardEnergyGuardEnergyGuardDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerDataSynchronizerVehicleVehicleVehiclerunOverloadProtection()IsConnected()État de la connexion EEBUSIsConnected()État de la connexion du VEGetVehicleCurrentLimits()Limitations de courant du VE (min, max)HasMeterData()État de la connexion avec le compteur Linkyalt[Données du compteur Linky NON disponible]currentLimit = minCurrentLimitMise à jour de la limitation de la charge du véhicule à appliquer[Données du compteur Linky disponible]GetOverloadProtectionValue()Courant maximal de charge du véhiculeGetOverloadProtectionLockDuration()Durée de verrouillage de la limitation de la chargealt[Durée de verrouillage écoulée]SetOverloadProtectionActive(false)Mise à jour de l'état d'activation de la limitation de charge du véhiculeGetMeterMinAvailableCurrent()Courant minimal disponible sur l'ensemble des phasesalt[Protection contre les surcharges nécessaire]currentLimit = loadControlLimit - abs(minAvailableCurrent)Diminution de la valeur du courant maximal de charge du véhicule[Protection contre les surcharges PAS nécessaire]currentLimit = loadControlLimit + abs(minAvailableCurrent)Augmentation de la valeur du courant maximal de charge du véhiculeSetOverloadProtectionLockStart(now)Mise à jour de l'horodate de début de verrouillage de la limitation de charge du véhicule[Durée de verrouillage PAS écoulée]currentLimit = loadControlLimitMaintien la valeur du courant maximal de charge du véhiculeWriteLoadControlLimits(currentLimit)Courant maximal de charge du véhicule appliquéSetOverloadProtectionValue(currentLimit)Mise à jour de la valeur du courant maximal de charge du véhiculeProtection contre les surcharges exécutée

Infrastructure Technique

Langages de Programmation

Le projet tic4eebus est intégralement développé en go.

Il est compatible avec les versions go 1.23 et ultérieures.

Base de Données

La base de données utilisée pour accèder au modèle de données de l'application est une base InfluxDb.

Sa structure ne comporte qu'une seule base (bucket nommé demo-bucket) et une seule table (measurement nommé EnergyGuard) appartenant à la même organisation "demo-org".

Les données disponibles dans la table sont les suivantes :

Structure de la base de données InfluxDBStructure de la base de données InfluxDBOrg: demo-orgBucket: demo-bucket«measurement»EnergyGuardtime : timestampEnergyGuard : string «tag»  IsConnected : bool «field»HasMeterData : bool «field»IsOpevSupported : bool «field»Diagnosis_LastErrorCode : string «field»OverloadProtection_Value : float «field» Gestionnaire d'énergie Meter_DateTime : string «field»Meter_BreakerOpened : bool «field»Meter_OverLoadCurrentLimit1 : float «field»Meter_OverLoadCurrentLimit2 : float «field»Meter_OverLoadCurrentLimit3 : float «field»Meter_RmsCurrent1 : float «field»Meter_RmsCurrent2 : float «field»Meter_RmsCurrent3 : float «field» Compteur Linky EV_CurrentPerPhase1 : float «field»EV_CurrentPerPhase2 : float «field»EV_CurrentPerPhase3 : float «field»Véhicule électrique
Structure de la base de données InfluxDBStructure de la base de données InfluxDBOrg: demo-orgBucket: demo-bucket«measurement»EnergyGuardtime : timestampEnergyGuard : string «tag»  IsConnected : bool «field»HasMeterData : bool «field»IsOpevSupported : bool «field»Diagnosis_LastErrorCode : string «field»OverloadProtection_Value : float «field» Gestionnaire d'énergie Meter_DateTime : string «field»Meter_BreakerOpened : bool «field»Meter_OverLoadCurrentLimit1 : float «field»Meter_OverLoadCurrentLimit2 : float «field»Meter_OverLoadCurrentLimit3 : float «field»Meter_RmsCurrent1 : float «field»Meter_RmsCurrent2 : float «field»Meter_RmsCurrent3 : float «field» Compteur Linky EV_CurrentPerPhase1 : float «field»EV_CurrentPerPhase2 : float «field»EV_CurrentPerPhase3 : float «field»Véhicule électrique

Serveurs et Hébergement

L'application tic4eebus est installable sur de multiples plateformes (Raspberry Pi, PAC, PC Windows, Mac)

Sécurité

Mesures de Sécurité

L'ensemble de la communication avec la borne de recharge est sécurisée (voir norme EEBUS)

Gestion des Accès

L'application tic4eebus accède à la borne de recharge via son SKI qui est dans le fichier de configuration chargé au démarrage de l'application.

Gestion des Erreurs et Surveillance

Gestion des Erreurs

Au moment de la régulation périodique il y a 6 erreurs principales possibles:

  1. La perte de connexion avec TIC2WebSocket qui fourni les données du compteur Linky
  2. L'absence de flux TIC avec le compteur Linky dans le TIC2WebSocket
  3. L'absence de message venant du compteur Linky dans le TIC2WebSocket
  4. La perte de connexion EEBUS avec la borne de recharge de véhicule électrique
  5. La non implémentation du cas d'utilisation OPEV de la norme EEBUS par la borne de recharge
  6. L'échec d'application de la limitation du courant du véhicule électrique

Tous les erreurs sont tracés dans le journal de bord de l'application.

Chacune de ces erreurs modifie les données de diagnostique du gestionnaire d'énergie.

Lorsque l'état fonctionnel du gestionnaire d'énergie est en erreur (voir failure dans le tableau) la borne de recharge limite le véhicule électrique avec le courant minimal de recharge.

Perte de connexion avec TIC2WebSocket

Le client WebSocket Tic2WebSocketClient de l'application tic4eebus se connecte au serveur WebSocket de l'application TIC2WebSocket pour récupérer les données métier du compteur Linky.

Si la connexion avec le serveur échoue ou si elle se coupe alors l'application tic4eebus ne peux pas recevoir les données métier du compteur Linky.

Une tentative de reprise de connexion périodique est réalisée jusqu'à l'établissement de la connexion.

Absence de flux TIC du compteur dans TIC2WebSocket

Après connexion du client WebSocket Tic2WebSocketClient de l'application tic4eebus avec le serveur WebSocket de l'application TIC2WebSocket une requête est envoyé pour récupérer la liste des flux TIC disponible.

Lorsqu'aucun flux n'est disponible ou lorsque le compteur spécifié n'est pas présent dans les flux TIC disponible la récupération des données métier du compteur Linky n'est pas possible.

Des requêtes périodiques pour lister les flux TIC disponible sont exécutées jusqu'à la détection d'un compteur ou du compteur spécifié.

Absence de message venant du compteur dans TIC2WebSocket

Après souscription du client WebSocket Tic2WebSocketClient de l'application tic4eebus auprès du serveur WebSocket de l'application TIC2WebSocket à un compteur les messages contenant les données métier sont récupérés périodiquement (avec une période variant entre 1 et 3 secondes).

Lorsque le compteur Linky n'a pas envoyé de message (trame TIC) pendant 10 secondes les données métier du compteur sont caduques et on considère qu'il y a absence de données du compteur.

Lorsqu'un message (trame TIC) est reçu de nouveau l'absence de message s'arrête et la régulation périodique du gestionnaire d'énergie reprend normalement.

Perte de connexion avec la borne de recharge

Au démarrage de l'application tic4eebus le service EEBUS se connecte à la borne de recharge.

Lorsque la connexion avec la borne de recharge échoue ou se coupe alors l'application tic4eebus ne peut plus réguler la limitation de la charge du véhicule électrique.

Une tentative de reprise de connexion périodique avec la borne de recharge est réalisée par le service EEBUS.

Non implémentation de cas d'utilisation OPEV EEBUS dans la borne de recharge

Au démarrage de l'application tic4eebus le service EEBUS se connecte à la borne de recharge.

Lorsque la connexion avec la borne de recharge est établie les cas d'utilisation de la norme EEBUS implémenté par la borne peuvent être récupérés (pas sur toutes les bornes).

Lorsqu'un véhicule électrique se connecte de nouvelles notifications apparaissent pour renseigner sur les cas d'utilisation EEBUS lié au véhicule électrique.

Le cas d'utilisation OPEV qui nous intéresse permet de limiter la charge du véhicule électrique.

Si ce cas d'utilisation n'est pas implémenté alors la régulation du véhicule n'est pas possible.

Echec d'application de la limitation de charge du véhicule électrique

Dans la régulation périodique du gestionnaire d'énergie, la valeur de la limitation de courant du véhicule est calculée puis appliquée si elle est différent de la valeur limitation actuelle.

Pendant l'application de la limitation de courant la requête peut être rejetée et donc la régulation non opérationnelle.

La régulation périodique continue malgré tout en espérant que la prochaine requête d'application de la limitation de courant ne soit pas rejetée.

Outils de Surveillance

En l'état actuel, il n'y a pas d'outil pour surveiller l'état et les performances de l'application.

Évolutivité

Stratégies d'Évolutivité

Plusieurs axes d'évolution sont possibles :

  • Fournir l'état de l'application
  • Prendre en compte le courant soutiré par le véhicule dans la régulation périodique

Conclusion

L'application tic4eebus est une implémentation multi-plateforme qui permet d'implémenter le cas d'utilisation OPEV avec un compteur Linky et une borne de recharge compatible EEBUS.